diff --git a/.codeclimate.yml b/.codeclimate.yml index fc88d5cceb..86368f79c1 100644 --- a/.codeclimate.yml +++ b/.codeclimate.yml @@ -37,7 +37,6 @@ plugins: count_threshold: 3 exclude_patterns: - "**/test/*" - - "**/adapter-tests/lib/*" - "**/dist/*" - "**/*.dist.js" - "**/templates/*" \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index e9c1d5d1b9..9717d4df0c 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +github: [ daffl ] patreon: # Replace with a single Patreon username open_collective: feathers ko_fi: # Replace with a single Ko-fi username diff --git a/.github/lock.yml b/.github/lock.yml deleted file mode 100644 index 8edab61a7f..0000000000 --- a/.github/lock.yml +++ /dev/null @@ -1,26 +0,0 @@ -# Configuration for Lock Threads - https://github.com/dessant/lock-threads - -# Number of days of inactivity before a closed issue or pull request is locked -daysUntilLock: 90 - -# Skip issues and pull requests created before a given timestamp. Timestamp must -# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable -skipCreatedBefore: false - -# Issues and pull requests with these labels will be ignored. Set to `[]` to disable -exemptLabels: [] - -# Label to add before locking, such as `outdated`. Set to `false` to disable -lockLabel: false - -# Comment to post before locking. Set to `false` to disable -lockComment: > - This issue has been automatically locked since there has not been - any recent activity after it was closed. Please open a new issue - with a link to this issue for related bugs. - -# Assign `resolved` as the reason for locking. Set to `false` to disable -setLockReason: true - -# Limit to only `issues` or `pulls` -only: issues diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 0000000000..72fda23bd8 --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,30 @@ +name: CI + +on: [push, pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x, 13.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm install -g codeclimate-test-reporter + - run: npm install + - run: npm test + env: + CI: true + - run: | + if [ "$CODECLIMATE_REPO_TOKEN" != "" ]; then + codeclimate-test-reporter < coverage/lcov.info + fi + env: + CODECLIMATE_REPO_TOKEN: ${{ secrets.codeclimate }} diff --git a/.github/workflows/update-dependencies.yml b/.github/workflows/update-dependencies.yml new file mode 100644 index 0000000000..3a01310e7b --- /dev/null +++ b/.github/workflows/update-dependencies.yml @@ -0,0 +1,22 @@ +on: + schedule: + - cron: '0 0 * * 1' +name: Update packages +jobs: + release: + name: Update npm packages + runs-on: ubuntu-latest + steps: + - name: Update npm packages + uses: technote-space/create-pr-action@v2.0.3 + with: + EXECUTE_COMMANDS: | + npm install + npm run update-dependencies + npm run clean + npm install + COMMIT_MESSAGE: 'chore(dependencies): Update all dependencies' + COMMIT_NAME: 'GitHub Actions' + COMMIT_EMAIL: 'daff@neyeon.com' + PR_BRANCH_NAME: 'chore-npm-update-${PR_ID}' + PR_TITLE: 'chore(dependencies): Update all dependencies' diff --git a/.gitignore b/.gitignore index a83948aee3..92ae34318d 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,8 @@ node_modules # Distributables dist/ .nyc_output/ +.cache +.mocha-puppeteer # TypeScript compiled files packages/authentication/lib diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 0000000000..e1a11e4b7b --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,5 @@ +{ + "timeout": 20000, + "reporter": "Dot", + "exit": true +} \ No newline at end of file diff --git a/.mocharc.ts.json b/.mocharc.ts.json new file mode 100644 index 0000000000..cf146c72d6 --- /dev/null +++ b/.mocharc.ts.json @@ -0,0 +1,6 @@ +{ + "timeout": 20000, + "require": [ "ts-node/register", "source-map-support/register" ], + "reporter": "Dot", + "exit": true +} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0142fe144c..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -sudo: required -language: node_js -install: npm install -script: - - npm test - - if [[ "$TRAVIS_NODE_VERSION" = "node" ]]; then if [ -n "$SAUCE_ACCESS_KEY" ]; then npm run test:client; fi; fi; -node_js: - - node - - 10 - - 8 -addons: - code_climate: - repo_token: 9840b8b56f6d10209b3478d41f7ba5102d02981435df129bb18554a529359c62 -before_script: - - 'npm install -g codeclimate-test-reporter' -after_script: - - 'codeclimate-test-reporter < coverage/lcov.info' -notifications: - email: false - slack: - rooms: - secure: Y7GyAUEjnjzyazj3zo3PXcl9Z1TN7SGjfUGQacJ+U/pCKfZKzgUhezZ5hTMz71bxL6/+2TuvKHQM3NQgrgR5JhdsPlrJfIW9FK2rNNPBN9p/DWZGv2bjEKPCcstdkuF/1NCru8up9092pZ3Fa8n6bjXicswCMVKjAmYrXqsWEMU= diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 8902607dc4..0000000000 --- a/Gruntfile.js +++ /dev/null @@ -1,49 +0,0 @@ -const server = require('./packages/client/test/server'); - -module.exports = function (grunt) { - const browsers = [{ - browserName: 'firefox', - platform: 'linux' - }, { - browserName: 'chrome', - platform: 'linux' - }, { - browserName: 'internet explorer', - platform: 'Windows 8', - version: '10' - }, { - browserName: 'internet explorer', - platform: 'Windows 10', - version: '11.285' - }]; - - grunt.registerTask('server', 'Start the test server', function () { - server.on('listening', () => { - console.log('Test server listening on port 3000'); - }); - }); - - grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), - server: {}, - - 'saucelabs-mocha': { - all: { - options: { - urls: [ - 'http://127.0.0.1:3000/packages/client/browser/index.html' - ], - browsers: browsers, - build: process.env.TRAVIS_JOB_ID, - testname: 'feathers-client mocha tests', - throttled: 1 - } - } - }, - watch: {} - }); - - grunt.loadNpmTasks('grunt-saucelabs'); - - grunt.registerTask('default', [ 'server', 'saucelabs-mocha' ]); -}; diff --git a/LICENSE b/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/changelog.md b/changelog.md index 93caecbaf6..f7ea38ce47 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,351 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + + +### Bug Fixes + +* **authentication-local:** Allow to hash passwords in array data ([#1936](https://github.com/feathersjs/feathers/issues/1936)) ([64705f5](https://github.com/feathersjs/feathers/commit/64705f5d9d4dc27f799da3a074efaf74379a3398)) +* **authentication-oauth:** Add getEntity method to oAuth authentication and remove provider field for other calls ([#1935](https://github.com/feathersjs/feathers/issues/1935)) ([d925c1b](https://github.com/feathersjs/feathers/commit/d925c1bd193b5c19cb23a246f04fc46d0429fc75)) + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + + +### Bug Fixes + +* **authentication:** Remove entity from connection information on logout ([#1889](https://github.com/feathersjs/feathers/issues/1889)) ([b062753](https://github.com/feathersjs/feathers/commit/b0627530d61babe15dd84369d3093ccae4b780ca)) +* **authentication-oauth:** Allow req.feathers to be used in oAuth authentication requests ([#1886](https://github.com/feathersjs/feathers/issues/1886)) ([854c9ca](https://github.com/feathersjs/feathers/commit/854c9cac9a9a5f8f89054a90feb24ab5c4766f5f)) +* **errors:** Add 410 Gone to errors ([#1849](https://github.com/feathersjs/feathers/issues/1849)) ([6801428](https://github.com/feathersjs/feathers/commit/6801428f8fd17dbfebcdb6f1b0cd01433a4033dc)) +* **typescript:** Add type keys to service pagination options. ([#1888](https://github.com/feathersjs/feathers/issues/1888)) ([859c601](https://github.com/feathersjs/feathers/commit/859c601519c7cb399e8b1667bb50073466812d5c)) +* **typescript:** Use stricter type for HookContext 'method' prop ([#1896](https://github.com/feathersjs/feathers/issues/1896)) ([24a41b7](https://github.com/feathersjs/feathers/commit/24a41b74486ddadccad18f3ae63afdac5bd373c7)) + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + + +### Bug Fixes + +* Updated typings for express middleware ([#1839](https://github.com/feathersjs/feathers/issues/1839)) ([6b8e897](https://github.com/feathersjs/feathers/commit/6b8e8971a9dbb08913edd1be48826624645d9dc1)) +* **authentication:** Improve JWT strategy configuration error message ([#1844](https://github.com/feathersjs/feathers/issues/1844)) ([2c771db](https://github.com/feathersjs/feathers/commit/2c771dbb22d53d4f7de3c3f514e57afa1a186322)) +* **package:** update grant-profile to version 0.0.11 ([#1841](https://github.com/feathersjs/feathers/issues/1841)) ([5dcd2aa](https://github.com/feathersjs/feathers/commit/5dcd2aa3483059cc7a2546b145dd72b4705fe2fe)) +* **test:** typo in password ([#1797](https://github.com/feathersjs/feathers/issues/1797)) ([dfba6ec](https://github.com/feathersjs/feathers/commit/dfba6ec2f21adf3aa739218cf870eaaaa5df6e9c)) +* **typescript:** Make HookMap and HookObject generics. ([#1815](https://github.com/feathersjs/feathers/issues/1815)) ([d10145d](https://github.com/feathersjs/feathers/commit/d10145d91a09aef7bce5af80805a3c0fa9d94f26)) + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package feathers + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + + +### Bug Fixes + +* Add `params.authentication` type, remove `hook.connection` type ([#1732](https://github.com/feathersjs/feathers/issues/1732)) ([d46b7b2](https://github.com/feathersjs/feathers/commit/d46b7b2abac8862c0e4dbfce20d71b8b8a96692f)) + + +### Features + +* **authentication-oauth:** Set oAuth redirect URL dynamically and pass query the service ([#1737](https://github.com/feathersjs/feathers/issues/1737)) ([0b05f0b](https://github.com/feathersjs/feathers/commit/0b05f0b58a257820fa61d695a36f36455209f6a1)) +* **rest-client:** Allow for customising rest clients ([#1780](https://github.com/feathersjs/feathers/issues/1780)) ([c5cfec7](https://github.com/feathersjs/feathers/commit/c5cfec7a4aafcaffaab0cdacb9b5d297ff20320f)) + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + + +### Bug Fixes + +* **adapter-commons:** Filter arrays in queries ([#1724](https://github.com/feathersjs/feathers/issues/1724)) ([872b669](https://github.com/feathersjs/feathers/commit/872b66906a806ab92ca41b5f6f504ff0af1ce79e)) + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + + +### Bug Fixes + +* Gracefully handle errors in publishers ([#1710](https://github.com/feathersjs/feathers/issues/1710)) ([0616306](https://github.com/feathersjs/feathers/commit/061630696762e9dbf1dc4e738094992ba16989fc)) + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + + +### Bug Fixes + +* **authentication-client:** Reset authentication promise on socket disconnect ([#1696](https://github.com/feathersjs/feathers/issues/1696)) ([3951626](https://github.com/feathersjs/feathers/commit/395162633ff22e95833a3c2900cb9464bb5b056f)) +* **core:** Improve hook missing parameter message by adding the service name ([#1703](https://github.com/feathersjs/feathers/issues/1703)) ([2331c2a](https://github.com/feathersjs/feathers/commit/2331c2a3dd70d432db7d62a76ed805d359cbbba5)) +* **rest-client:** Allow to customize getting the query ([#1594](https://github.com/feathersjs/feathers/issues/1594)) ([5f21272](https://github.com/feathersjs/feathers/commit/5f212729849414c4da6f0d51edd1986feca992ee)) +* **transport-commons:** Allow to properly chain SocketIo client.off ([#1706](https://github.com/feathersjs/feathers/issues/1706)) ([a4aecbc](https://github.com/feathersjs/feathers/commit/a4aecbcd3578c1cf4ecffb3a58fb6d26e15ee513)) +* **typescript:** Allow specific service typings for `Hook` and `HookContext` ([#1688](https://github.com/feathersjs/feathers/issues/1688)) ([f5d0ddd](https://github.com/feathersjs/feathers/commit/f5d0ddd9724bf5778355535d2103d59daaad6294)) + + +### Features + +* **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) +* **authentication-oauth:** Set oAuth redirect URL dynamically ([#1608](https://github.com/feathersjs/feathers/issues/1608)) ([1293e08](https://github.com/feathersjs/feathers/commit/1293e088abbb3d23f4a44680836645a8049ceaae)) + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + + +### Bug Fixes + +* **authentication:** Retain object references in authenticate hook ([#1675](https://github.com/feathersjs/feathers/issues/1675)) ([e1939be](https://github.com/feathersjs/feathers/commit/e1939be19d4e79d3f5e2fe69ba894a11c627ae99)) +* **authentication-oauth:** Allow hash based redirects ([#1676](https://github.com/feathersjs/feathers/issues/1676)) ([ffe7cf3](https://github.com/feathersjs/feathers/commit/ffe7cf3fbb4e62d7689065cf7b61f25f602ce8cf)) + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package feathers + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + + +### Bug Fixes + +* Add jsonwebtoken TypeScript type dependency ([317c80a](https://github.com/feathersjs/feathers/commit/317c80a9205e8853bb830a12c3aa1a19e95f9abc)) +* Only initialize default Express session if oAuth is actually used ([#1648](https://github.com/feathersjs/feathers/issues/1648)) ([9b9b43f](https://github.com/feathersjs/feathers/commit/9b9b43ff09af1080e4aaa537064bac37b881c9a2)) +* Small type improvements ([#1624](https://github.com/feathersjs/feathers/issues/1624)) ([50162c6](https://github.com/feathersjs/feathers/commit/50162c6e562f0a47c6a280c4f01fff7c3afee293)) + + + + + +## [4.3.8](https://github.com/feathersjs/feathers/compare/v4.3.7...v4.3.8) (2019-10-14) + + +### Bug Fixes + +* Remove adapter commons type alternatives ([#1620](https://github.com/feathersjs/feathers/issues/1620)) ([c9f3086](https://github.com/feathersjs/feathers/commit/c9f3086344420b57dbce7c4169cf550c97509f0d)) + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + + +### Bug Fixes + +* Improve authentication client default storage initialization ([#1613](https://github.com/feathersjs/feathers/issues/1613)) ([d7f5107](https://github.com/feathersjs/feathers/commit/d7f5107ef76297b4ca6db580afc5e2b372f5ee4d)) +* improve Service and AdapterService types ([#1567](https://github.com/feathersjs/feathers/issues/1567)) ([baad6a2](https://github.com/feathersjs/feathers/commit/baad6a26f0f543b712ccb40359b3933ad3a21392)) +* make __hooks writable and configurable ([#1520](https://github.com/feathersjs/feathers/issues/1520)) ([1c6c374](https://github.com/feathersjs/feathers/commit/1c6c3742ecf1cb813be56074da89e6736d03ffe8)) +* Typings for express request and response properties ([#1609](https://github.com/feathersjs/feathers/issues/1609)) ([38cf8c9](https://github.com/feathersjs/feathers/commit/38cf8c950c1a4fb4a6d78d68d70e7fdd63b71c3c)) + + + + + +## [4.3.6](https://github.com/feathersjs/feathers/compare/v4.3.5...v4.3.6) (2019-10-07) + + +### Bug Fixes + +* Check query for NaN ([#1607](https://github.com/feathersjs/feathers/issues/1607)) ([f1a781f](https://github.com/feathersjs/feathers/commit/f1a781f)) + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + + +### Bug Fixes + +* Authentication type improvements and timeout fix ([#1605](https://github.com/feathersjs/feathers/issues/1605)) ([19854d3](https://github.com/feathersjs/feathers/commit/19854d3)) +* Change this reference in client libraries to explicitly passed app ([#1597](https://github.com/feathersjs/feathers/issues/1597)) ([4e4d10a](https://github.com/feathersjs/feathers/commit/4e4d10a)) +* Improve error message when authentication strategy is not allowed ([#1600](https://github.com/feathersjs/feathers/issues/1600)) ([317a312](https://github.com/feathersjs/feathers/commit/317a312)) + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + + +### Bug Fixes + +* Reset version number after every publish ([#1596](https://github.com/feathersjs/feathers/issues/1596)) ([f24f82f](https://github.com/feathersjs/feathers/commit/f24f82f)) +* Typing improvements ([#1580](https://github.com/feathersjs/feathers/issues/1580)) ([7818aec](https://github.com/feathersjs/feathers/commit/7818aec)) + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + + +### Bug Fixes + +* check for undefined access token ([#1571](https://github.com/feathersjs/feathers/issues/1571)) ([976369d](https://github.com/feathersjs/feathers/commit/976369d)) +* Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + + +### Bug Fixes + +* Add info to express error handler logger type ([#1557](https://github.com/feathersjs/feathers/issues/1557)) ([3e1d26c](https://github.com/feathersjs/feathers/commit/3e1d26c)) +* LocalStrategy authenticates without username ([#1560](https://github.com/feathersjs/feathers/issues/1560)) ([2b258fd](https://github.com/feathersjs/feathers/commit/2b258fd)), closes [#1559](https://github.com/feathersjs/feathers/issues/1559) + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + + +### Bug Fixes + +* Fix regression in transport commons ([#1551](https://github.com/feathersjs/feathers/issues/1551)) ([ed9e934](https://github.com/feathersjs/feathers/commit/ed9e934)) +* Omit standard protocol ports from the default hostname ([#1543](https://github.com/feathersjs/feathers/issues/1543)) ([ef16d29](https://github.com/feathersjs/feathers/commit/ef16d29)) +* Use long-timeout for JWT expiration timers ([#1552](https://github.com/feathersjs/feathers/issues/1552)) ([65637ec](https://github.com/feathersjs/feathers/commit/65637ec)) + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + + +### Bug Fixes + +* Only remove token on NotAuthenticated error in authentication client and handle error better ([#1525](https://github.com/feathersjs/feathers/issues/1525)) ([13a8758](https://github.com/feathersjs/feathers/commit/13a8758)) + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + + +### Bug Fixes + +* Fix auth publisher mistake ([08bad61](https://github.com/feathersjs/feathers/commit/08bad61)) + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Expire and remove authenticated real-time connections ([#1512](https://github.com/feathersjs/feathers/issues/1512)) ([2707c33](https://github.com/feathersjs/feathers/commit/2707c33)) +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) +* Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) + + +### Features + +* Let strategies handle the connection ([#1510](https://github.com/feathersjs/feathers/issues/1510)) ([4329feb](https://github.com/feathersjs/feathers/commit/4329feb)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + + +### Bug Fixes + +* @feathersjs/adapter-commons: `update` id is non-nullable ([#1468](https://github.com/feathersjs/feathers/issues/1468)) ([43ec802](https://github.com/feathersjs/feathers/commit/43ec802)) +* Add getEntityId to JWT strategy and fix legacy Socket authentication ([#1488](https://github.com/feathersjs/feathers/issues/1488)) ([9a3b324](https://github.com/feathersjs/feathers/commit/9a3b324)) +* Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) +* Do not error in authentication client on logout ([#1473](https://github.com/feathersjs/feathers/issues/1473)) ([8211b98](https://github.com/feathersjs/feathers/commit/8211b98)) +* Improve Params typing ([#1474](https://github.com/feathersjs/feathers/issues/1474)) ([54a3aa7](https://github.com/feathersjs/feathers/commit/54a3aa7)) + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package feathers + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + + +### Bug Fixes + +* Fix feathers-memory dependency that did not get updated ([9422b13](https://github.com/feathersjs/feathers/commit/9422b13)) +* Remove unnecessary top level export files in @feathersjs/express ([#1442](https://github.com/feathersjs/feathers/issues/1442)) ([73c3fb2](https://github.com/feathersjs/feathers/commit/73c3fb2)) + + +### Features + +* @feathersjs/express allow to pass an existing Express application instance ([#1446](https://github.com/feathersjs/feathers/issues/1446)) ([853a6b0](https://github.com/feathersjs/feathers/commit/853a6b0)) + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + + +### Bug Fixes + +* @feathersjs/adapter-commons: remove data from `remove` arguments ([#1426](https://github.com/feathersjs/feathers/issues/1426)) ([fd54ae9](https://github.com/feathersjs/feathers/commit/fd54ae9)) +* @feathersjs/express: allow middleware arrays ([#1421](https://github.com/feathersjs/feathers/issues/1421)) ([b605ab8](https://github.com/feathersjs/feathers/commit/b605ab8)) +* @feathersjs/express: replace `reduce` with `map` ([#1429](https://github.com/feathersjs/feathers/issues/1429)) ([44542e9](https://github.com/feathersjs/feathers/commit/44542e9)) +* Clean up hooks code ([#1407](https://github.com/feathersjs/feathers/issues/1407)) ([f25c88b](https://github.com/feathersjs/feathers/commit/f25c88b)) +* Fix @feathersjs/feathers typings http import ([abbc07b](https://github.com/feathersjs/feathers/commit/abbc07b)) +* Fix OpenCollective link ([28888a1](https://github.com/feathersjs/feathers/commit/28888a1)) +* Improve transport-commons types ([#1396](https://github.com/feathersjs/feathers/issues/1396)) ([f9d8536](https://github.com/feathersjs/feathers/commit/f9d8536)) +* Updated typings for ServiceMethods ([#1409](https://github.com/feathersjs/feathers/issues/1409)) ([b5ee7e2](https://github.com/feathersjs/feathers/commit/b5ee7e2)) + + +### Features + +* adapter-commons: add `allowsMulti(method)` to AdapterService ([#1431](https://github.com/feathersjs/feathers/issues/1431)) ([e688851](https://github.com/feathersjs/feathers/commit/e688851)) +* Add hook-less methods and service option types to adapter-commons ([#1433](https://github.com/feathersjs/feathers/issues/1433)) ([857f54a](https://github.com/feathersjs/feathers/commit/857f54a)) + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/greenkeeper.json b/greenkeeper.json deleted file mode 100644 index 2a7f124ca6..0000000000 --- a/greenkeeper.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "groups": { - "default": { - "packages": [ - "package.json", - "packages/authentication-client/package.json", - "packages/authentication-jwt/package.json", - "packages/authentication-local/package.json", - "packages/authentication-oauth1/package.json", - "packages/authentication-oauth2/package.json", - "packages/authentication/package.json", - "packages/commons/package.json", - "packages/configuration/package.json", - "packages/errors/package.json", - "packages/express/package.json", - "packages/feathers/package.json", - "packages/primus-client/package.json", - "packages/primus/package.json", - "packages/rest-client/package.json", - "packages/socketio-client/package.json", - "packages/socketio/package.json", - "packages/transport-commons/package.json" - ] - } - } -} diff --git a/lerna.json b/lerna.json index 24530c660f..735c11987a 100644 --- a/lerna.json +++ b/lerna.json @@ -3,14 +3,16 @@ "packages": [ "packages/*" ], - "version": "4.0.0-pre.3", + "version": "4.5.4", "command": { "bootstrap": { "hoist": true }, "publish": { "allowBranch": "master", - "conventionalCommits": true + "message": "chore(release): publish %s", + "conventionalCommits": true, + "createRelease": "github" } }, "ignoreChanges": [ @@ -20,7 +22,6 @@ "**/yarn.lock", "**/test/**", "lerna.json", - "readme.md", - "package.json" + "readme.md" ] } diff --git a/mocha.opts b/mocha.opts deleted file mode 100644 index 5d30d60930..0000000000 --- a/mocha.opts +++ /dev/null @@ -1,4 +0,0 @@ ---recursive test/ ---timeout 20000 ---reporter Dot ---exit \ No newline at end of file diff --git a/mocha.ts.opts b/mocha.ts.opts deleted file mode 100644 index aedd223132..0000000000 --- a/mocha.ts.opts +++ /dev/null @@ -1,5 +0,0 @@ ---timeout 20000 ---require ts-node/register ---require source-map-support/register ---reporter Dot ---exit diff --git a/package-lock.json b/package-lock.json index f1251b4763..57b8dd4769 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,99 +4,220 @@ "lockfileVersion": 1, "dependencies": { "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", "dev": true, "requires": { - "@babel/highlight": "^7.0.0" + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.4.tgz", + "integrity": "sha512-3A0tS0HWpy4XujGc7QtOIHTeNwUgWaZc/WuS5YQrfhU67jnVmsD6OGPc1AKHH0LJHQICGncy3+YUjIhVlfDdcA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "@babel/generator": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", - "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.4.tgz", + "integrity": "sha512-toLIHUIAgcQygFZRAQcsLQV3CBuX6yOIru1kJk/qqqvcRmZrYe6WavZTSG+bB8MxhnL9YPf+pKQfuiP161q7ng==", "dev": true, "requires": { - "@babel/types": "^7.4.4", + "@babel/types": "^7.10.4", "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" + "lodash": "^4.17.13", + "source-map": "^0.5.0" } }, "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", "dev": true, "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.4.tgz", + "integrity": "sha512-m5j85pK/KZhuSdM/8cHUABQTAslV47OjfIB9Cc7P+PvlAoBzdb79BGNfw8RhT5Mq3p+xGd0ZfAKixbrUZx0C7A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.4.tgz", + "integrity": "sha512-Er2FQX0oa3nV7eM1o0tNCTx7izmQtwAQsIiaLRWtavAAEcskb0XJ5OjJbVrYXWOTr8om921Scabn4/tzlx7j1Q==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", "dev": true, "requires": { - "@babel/types": "^7.4.4" + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/highlight": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", - "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.10.4", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.5.tgz", - "integrity": "sha512-9mUqkL1FF5T7f0WDFfAoDdiMVPWsdD1gZYzSnaXsxUCUqzuch/8of9G3VUSNiZmMBoRxT3neyVsqeiL/ZPcjew==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.4.tgz", + "integrity": "sha512-8jHII4hf+YVDsskTF6WuMB3X4Eh+PsUkC2ljq22so5rHvH+T8BzyL94VOdyFLNR8tBSVXOTbNHOKpR4TfRxVtA==", "dev": true }, "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" } }, "@babel/traverse": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.5.tgz", - "integrity": "sha512-Vc+qjynwkjRmIFGxy0KYoPj4FdVDxLej89kMHFsWScq999uX+pwcX4v9mWRjW0KcAYTPAuVQl2LKP1wEVLsp+A==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.4.tgz", + "integrity": "sha512-aSy7p5THgSYm4YyxNGz6jZpXf+Ok40QF3aA2LyIONkDHpAcJzDUqlCKXv6peqYUs2gmic849C/t2HKw2a2K20Q==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.4.4", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.4.5", - "@babel/types": "^7.4.4", + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4", "debug": "^4.1.0", "globals": "^11.1.0", - "lodash": "^4.17.11" + "lodash": "^4.17.13" }, "dependencies": { "debug": { @@ -107,114 +228,269 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true } } }, "@babel/types": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", - "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.4.tgz", + "integrity": "sha512-UTCFOxC3FsFHb7lkRMVvgLzaRVamXuAs2Tz4wajva4WxtVY82eZeaUBtC2Zt95FU9TiznuC0Zk35tsim8jeVpg==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } }, - "@lerna/add": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.14.0.tgz", - "integrity": "sha512-Sa79Ju6HqF3heSVpBiYPNrGtuS56U/jMzVq4CcVvhNwB34USLrzJJncGFVcfnuUvsjKeFJv+jHxUycHeRE8XYw==", + "@evocateur/libnpmaccess": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", + "integrity": "sha512-KSCAHwNWro0CF2ukxufCitT9K5LjL/KuMmNzSu8wuwN2rjyKHD8+cmOsiybK+W5hdnwc5M1SmRlVCaMHQo+3rg==", "dev": true, "requires": { - "@lerna/bootstrap": "3.14.0", - "@lerna/command": "3.14.0", - "@lerna/filter-options": "3.14.0", - "@lerna/npm-conf": "3.13.0", - "@lerna/validation-error": "3.13.0", - "dedent": "^0.7.0", + "@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" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + } + } + }, + "@evocateur/libnpmpublish": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@evocateur/libnpmpublish/-/libnpmpublish-1.2.2.tgz", + "integrity": "sha512-MJrrk9ct1FeY9zRlyeoyMieBjGDG9ihyyD9/Ft6MMrTxql9NyoEx2hw9casTIP4CdqEVu+3nQ2nXxoJ8RCXyFg==", + "dev": true, + "requires": { + "@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" + }, + "dependencies": { + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@evocateur/npm-registry-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@evocateur/npm-registry-fetch/-/npm-registry-fetch-4.0.0.tgz", + "integrity": "sha512-k1WGfKRQyhJpIr+P17O5vLIo2ko1PFLKwoetatdduUSt/aQ4J2sJrJwwatdI5Z3SiYk/mRH9S3JpdmMFd/IK4g==", + "dev": true, + "requires": { + "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", - "p-map": "^1.2.0", - "pacote": "^9.5.0", - "semver": "^5.5.0" + "safe-buffer": "^5.1.2" } }, - "@lerna/batch-packages": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/batch-packages/-/batch-packages-3.14.0.tgz", - "integrity": "sha512-RlBkQVNTqk1qvn6PFWiWNiskllUHh6tXbTVm43mZRNd+vhAyvrQC8RWJxH0ECVvnFAt9rSNGRIVbEJ31WnNQLg==", + "@evocateur/pacote": { + "version": "9.6.5", + "resolved": "https://registry.npmjs.org/@evocateur/pacote/-/pacote-9.6.5.tgz", + "integrity": "sha512-EI552lf0aG2nOV8NnZpTxNo2PcXKPmDbF9K8eCBFQdIZwHNGN/mi815fxtmUMa2wTa1yndotICIDt/V0vpEx2w==", "dev": true, "requires": { - "@lerna/package-graph": "3.14.0", - "npmlog": "^4.1.2" + "@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", + "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" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@lerna/add": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.21.0.tgz", + "integrity": "sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A==", + "dev": true, + "requires": { + "@evocateur/pacote": "^9.6.3", + "@lerna/bootstrap": "3.21.0", + "@lerna/command": "3.21.0", + "@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": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.14.0.tgz", - "integrity": "sha512-AvnuDp8b0kX4zZgqD3v7ItPABhUsN5CmTEvZBD2JqM+xkQKhzCfz5ABcHEwDwOPWnNQmtH+/2iQdwaD7xBcAXw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.21.0.tgz", + "integrity": "sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw==", "dev": true, "requires": { - "@lerna/batch-packages": "3.14.0", - "@lerna/command": "3.14.0", - "@lerna/filter-options": "3.14.0", - "@lerna/has-npm-version": "3.13.3", - "@lerna/npm-install": "3.13.3", - "@lerna/package-graph": "3.14.0", + "@lerna/command": "3.21.0", + "@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.13.3", - "@lerna/run-lifecycle": "3.14.0", - "@lerna/run-parallel-batches": "3.13.0", - "@lerna/symlink-binary": "3.14.0", - "@lerna/symlink-dependencies": "3.14.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": "^3.2.0", - "multimatch": "^2.1.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": "^1.2.0", + "p-map": "^2.1.0", "p-map-series": "^1.0.0", "p-waterfall": "^1.0.0", "read-package-tree": "^5.1.6", - "semver": "^5.5.0" + "semver": "^6.2.0" } }, "@lerna/changed": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.14.1.tgz", - "integrity": "sha512-G0RgYL/WLTFzbezRBLUO2J0v39EvgZIO5bHHUtYt7zUFSfzapkPfvpdpBj+5JlMtf0B2xfxwTk+lSA4LVnbfmA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.21.0.tgz", + "integrity": "sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw==", "dev": true, "requires": { - "@lerna/collect-updates": "3.14.0", - "@lerna/command": "3.14.0", - "@lerna/listable": "3.14.0", - "@lerna/output": "3.13.0", - "@lerna/version": "3.14.1" + "@lerna/collect-updates": "3.20.0", + "@lerna/command": "3.21.0", + "@lerna/listable": "3.18.5", + "@lerna/output": "3.13.0" } }, "@lerna/check-working-tree": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.14.1.tgz", - "integrity": "sha512-ae/sdZPNh4SS+6c4UDuWP/QKbtIFAn/TvKsPncA1Jdo0PqXLBlug4DzkHTGkvZ5F0nj+0JrSxYteInakJV99vg==", + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.16.5.tgz", + "integrity": "sha512-xWjVBcuhvB8+UmCSb5tKVLB5OuzSpw96WEhS2uz6hkWVa/Euh1A0/HJwn2cemyK47wUrCQXtczBUiqnq9yX5VQ==", "dev": true, "requires": { - "@lerna/collect-uncommitted": "3.14.1", - "@lerna/describe-ref": "3.13.3", + "@lerna/collect-uncommitted": "3.16.5", + "@lerna/describe-ref": "3.16.5", "@lerna/validation-error": "3.13.0" } }, "@lerna/child-process": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.13.3.tgz", - "integrity": "sha512-3/e2uCLnbU+bydDnDwyadpOmuzazS01EcnOleAnuj9235CU2U97DH6OyoG1EW/fU59x11J+HjIqovh5vBaMQjQ==", + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.16.5.tgz", + "integrity": "sha512-vdcI7mzei9ERRV4oO8Y1LHBZ3A5+ampRKg1wq5nutLsUA4mEBN6H7JqjWOMY9xZemv6+kATm2ofjJ3lW5TszQg==", "dev": true, "requires": { "chalk": "^2.3.1", @@ -223,208 +499,190 @@ } }, "@lerna/clean": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.14.0.tgz", - "integrity": "sha512-wEuAqOS9VMqh2C20KD63IySzyEnyVDqDI3LUsXw+ByUf9AJDgEHv0TCOxbDjDYaaQw1tjSBNZMyYInNeoASwhA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.21.0.tgz", + "integrity": "sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg==", "dev": true, "requires": { - "@lerna/command": "3.14.0", - "@lerna/filter-options": "3.14.0", - "@lerna/prompt": "3.13.0", + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/prompt": "3.18.5", "@lerna/pulse-till-done": "3.13.0", - "@lerna/rimraf-dir": "3.13.3", - "p-map": "^1.2.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": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.13.0.tgz", - "integrity": "sha512-HgFGlyCZbYaYrjOr3w/EsY18PdvtsTmDfpUQe8HwDjXlPeCCUgliZjXLOVBxSjiOvPeOSwvopwIHKWQmYbwywg==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.18.5.tgz", + "integrity": "sha512-erkbxkj9jfc89vVs/jBLY/fM0I80oLmJkFUV3Q3wk9J3miYhP14zgVEBsPZY68IZlEjT6T3Xlq2xO1AVaatHsA==", "dev": true, "requires": { "@lerna/global-options": "3.13.0", "dedent": "^0.7.0", "npmlog": "^4.1.2", - "yargs": "^12.0.1" + "yargs": "^14.2.2" } }, "@lerna/collect-uncommitted": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.14.1.tgz", - "integrity": "sha512-hQ67S+nlSJwsPylXbWlrQSZUcWa8tTNIdcMd9OY4+QxdJlZUG7CLbWSyaxi0g11WdoRJHT163mr9xQyAvIVT1A==", + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-3.16.5.tgz", + "integrity": "sha512-ZgqnGwpDZiWyzIQVZtQaj9tRizsL4dUOhuOStWgTAw1EMe47cvAY2kL709DzxFhjr6JpJSjXV5rZEAeU3VE0Hg==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", + "@lerna/child-process": "3.16.5", "chalk": "^2.3.1", "figgy-pudding": "^3.5.1", "npmlog": "^4.1.2" } }, "@lerna/collect-updates": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.14.0.tgz", - "integrity": "sha512-siRHo2atAwj5KpKVOo6QTVIYDYbNs7dzTG6ow9VcFMLKX5shuaEyFA22Z3LmnxQ3sakVFdgvvVeediEz6cM3VA==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.20.0.tgz", + "integrity": "sha512-qBTVT5g4fupVhBFuY4nI/3FSJtQVcDh7/gEPOpRxoXB/yCSnT38MFHXWl+y4einLciCjt/+0x6/4AG80fjay2Q==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", - "@lerna/describe-ref": "3.13.3", + "@lerna/child-process": "3.16.5", + "@lerna/describe-ref": "3.16.5", "minimatch": "^3.0.4", "npmlog": "^4.1.2", - "slash": "^1.0.0" + "slash": "^2.0.0" } }, "@lerna/command": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.14.0.tgz", - "integrity": "sha512-PtFi5EtXB2VuSruoLsjfZdus56d7oKlZAI4iSRoaS/BBxE2Wyfn7//vW7Ow4hZCzuqb9tBcpDq+4u2pdXN1d2Q==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.21.0.tgz", + "integrity": "sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", - "@lerna/package-graph": "3.14.0", - "@lerna/project": "3.13.1", + "@lerna/child-process": "3.16.5", + "@lerna/package-graph": "3.18.5", + "@lerna/project": "3.21.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": "^1.0.10", - "lodash": "^4.17.5", + "is-ci": "^2.0.0", "npmlog": "^4.1.2" } }, "@lerna/conventional-commits": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.14.0.tgz", - "integrity": "sha512-hGZ2qQZ9uEGf2eeIiIpEodSs9Qkkf/2uYEtNT7QN1RYISPUh6/lKGBssc5dpbCF64aEuxmemWLdlDf1ogG6++w==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.22.0.tgz", + "integrity": "sha512-z4ZZk1e8Mhz7+IS8NxHr64wyklHctCJyWpJKEZZPJiLFJ8yKto/x38O80R10pIzC0rr8Sy/OsjSH4bl0TbbgqA==", "dev": true, "requires": { "@lerna/validation-error": "3.13.0", "conventional-changelog-angular": "^5.0.3", "conventional-changelog-core": "^3.1.6", - "conventional-recommended-bump": "^4.0.4", - "fs-extra": "^7.0.0", + "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": "^3.0.0", - "semver": "^5.5.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "pify": "^4.0.1", + "semver": "^6.2.0" } }, "@lerna/create": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.14.0.tgz", - "integrity": "sha512-J4PeGnzVBOSV7Cih8Uhv9xIauljR9bGcfSDN9aMzFtJhSX0xFXNvmnpXRORp7xNHV2lbxk7mNxRQxzR9CQRMuw==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.22.0.tgz", + "integrity": "sha512-MdiQQzCcB4E9fBF1TyMOaAEz9lUjIHp1Ju9H7f3lXze5JK6Fl5NYkouAvsLgY6YSIhXMY8AHW2zzXeBDY4yWkw==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", - "@lerna/command": "3.14.0", - "@lerna/npm-conf": "3.13.0", + "@evocateur/pacote": "^9.6.3", + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/npm-conf": "3.16.0", "@lerna/validation-error": "3.13.0", "camelcase": "^5.0.0", "dedent": "^0.7.0", - "fs-extra": "^7.0.0", - "globby": "^8.0.1", + "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", - "pacote": "^9.5.0", - "pify": "^3.0.0", - "semver": "^5.5.0", - "slash": "^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" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, "@lerna/create-symlink": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.14.0.tgz", - "integrity": "sha512-Kw51HYOOi6UfCKncqkgEU1k/SYueSBXgkNL91FR8HAZH7EPSRTEtp9mnJo568g0+Hog5C+3cOaWySwhHpRG29A==", + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.16.2.tgz", + "integrity": "sha512-pzXIJp6av15P325sgiIRpsPXLFmkisLhMBCy4764d+7yjf2bzrJ4gkWVMhsv4AdF0NN3OyZ5jjzzTtLNqfR+Jw==", "dev": true, "requires": { - "cmd-shim": "^2.0.2", - "fs-extra": "^7.0.0", + "@zkochan/cmd-shim": "^3.1.0", + "fs-extra": "^8.1.0", "npmlog": "^4.1.2" } }, "@lerna/describe-ref": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.13.3.tgz", - "integrity": "sha512-5KcLTvjdS4gU5evW8ESbZ0BF44NM5HrP3dQNtWnOUSKJRgsES8Gj0lq9AlB2+YglZfjEftFT03uOYOxnKto4Uw==", + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.16.5.tgz", + "integrity": "sha512-c01+4gUF0saOOtDBzbLMFOTJDHTKbDFNErEY6q6i9QaXuzy9LNN62z+Hw4acAAZuJQhrVWncVathcmkkjvSVGw==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", + "@lerna/child-process": "3.16.5", "npmlog": "^4.1.2" } }, "@lerna/diff": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.14.0.tgz", - "integrity": "sha512-H6FSj0jOiQ6unVCwOK6ReT5uZN6ZIn/j/cx4YwuOtU3SMcs3UfuQRIFNeKg/tKmOcQGd39Mn9zDhmt3TAYGROA==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.21.0.tgz", + "integrity": "sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", - "@lerna/command": "3.14.0", + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", "@lerna/validation-error": "3.13.0", "npmlog": "^4.1.2" } }, "@lerna/exec": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.14.0.tgz", - "integrity": "sha512-cNFO8hWsBVLeqVQ7LsQ4rYKbbQ2eN+Ne+hWKTlUQoyRbYzgJ22TXhjKR6IMr68q0xtclcDlasfcNO+XEWESh0g==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.21.0.tgz", + "integrity": "sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", - "@lerna/command": "3.14.0", - "@lerna/filter-options": "3.14.0", - "@lerna/run-topologically": "3.14.0", + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@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": "^1.2.0" + "p-map": "^2.1.0" } }, "@lerna/filter-options": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.14.0.tgz", - "integrity": "sha512-ZmNZK9m8evxHc+2ZnDyCm8XFIKVDKpIASG1wtizr3R14t49fuYE7nR+rm4t82u9oSSmER8gb8bGzh0SKZme/jg==", + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.20.0.tgz", + "integrity": "sha512-bmcHtvxn7SIl/R9gpiNMVG7yjx7WyT0HSGw34YVZ9B+3xF/83N3r5Rgtjh4hheLZ+Q91Or0Jyu5O3Nr+AwZe2g==", "dev": true, "requires": { - "@lerna/collect-updates": "3.14.0", - "@lerna/filter-packages": "3.13.0", - "dedent": "^0.7.0" + "@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": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.13.0.tgz", - "integrity": "sha512-RWiZWyGy3Mp7GRVBn//CacSnE3Kw82PxE4+H6bQ3pDUw/9atXn7NRX+gkBVQIYeKamh7HyumJtyOKq3Pp9BADQ==", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.18.0.tgz", + "integrity": "sha512-6/0pMM04bCHNATIOkouuYmPg6KH3VkPCIgTfQmdkPJTullERyEQfNUKikrefjxo1vHOoCACDpy65JYyKiAbdwQ==", "dev": true, "requires": { "@lerna/validation-error": "3.13.0", - "multimatch": "^2.1.0", + "multimatch": "^3.0.0", "npmlog": "^4.1.2" } }, @@ -438,29 +696,40 @@ } }, "@lerna/get-packed": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.13.0.tgz", - "integrity": "sha512-EgSim24sjIjqQDC57bgXD9l22/HCS93uQBbGpkzEOzxAVzEgpZVm7Fm1t8BVlRcT2P2zwGnRadIvxTbpQuDPTg==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-3.16.0.tgz", + "integrity": "sha512-AjsFiaJzo1GCPnJUJZiTW6J1EihrPkc2y3nMu6m3uWFxoleklsSCyImumzVZJssxMi3CPpztj8LmADLedl9kXw==", "dev": true, "requires": { - "fs-extra": "^7.0.0", + "fs-extra": "^8.1.0", "ssri": "^6.0.1", "tar": "^4.4.8" } }, "@lerna/github-client": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.13.3.tgz", - "integrity": "sha512-fcJkjab4kX0zcLLSa/DCUNvU3v8wmy2c1lhdIbL7s7gABmDcV0QZq93LhnEee3VkC9UpnJ6GKG4EkD7eIifBnA==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-3.22.0.tgz", + "integrity": "sha512-O/GwPW+Gzr3Eb5bk+nTzTJ3uv+jh5jGho9BOqKlajXaOkMYGBELEAqV5+uARNGWZFvYAiF4PgqHb6aCUu7XdXg==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", - "@octokit/plugin-enterprise-rest": "^2.1.1", - "@octokit/rest": "^16.16.0", + "@lerna/child-process": "3.16.5", + "@octokit/plugin-enterprise-rest": "^6.0.1", + "@octokit/rest": "^16.28.4", "git-url-parse": "^11.1.2", "npmlog": "^4.1.2" } }, + "@lerna/gitlab-client": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-3.15.0.tgz", + "integrity": "sha512-OsBvRSejHXUBMgwWQqNoioB8sgzL/Pf1pOUhHKtkiMl6aAWjklaaq5HPMvTIsZPfS6DJ9L5OK2GGZuooP/5c8Q==", + "dev": true, + "requires": { + "node-fetch": "^2.5.0", + "npmlog": "^4.1.2", + "whatwg-url": "^7.0.0" + } + }, "@lerna/global-options": { "version": "3.13.0", "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.13.0.tgz", @@ -468,132 +737,135 @@ "dev": true }, "@lerna/has-npm-version": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.13.3.tgz", - "integrity": "sha512-mQzoghRw4dBg0R9FFfHrj0TH0glvXyzdEZmYZ8Isvx5BSuEEwpsryoywuZSdppcvLu8o7NAdU5Tac8cJ/mT52w==", + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.16.5.tgz", + "integrity": "sha512-WL7LycR9bkftyqbYop5rEGJ9sRFIV55tSGmbN1HLrF9idwOCD7CLrT64t235t3t4O5gehDnwKI5h2U3oxTrF8Q==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", - "semver": "^5.5.0" + "@lerna/child-process": "3.16.5", + "semver": "^6.2.0" } }, "@lerna/import": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.14.0.tgz", - "integrity": "sha512-j8z/m85FX1QYPgl5TzMNupdxsQF/NFZSmdCR19HQzqiVKC8ULGzF30WJEk66+KeZ94wYMSakINtYD+41s34pNQ==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.22.0.tgz", + "integrity": "sha512-uWOlexasM5XR6tXi4YehODtH9Y3OZrFht3mGUFFT3OIl2s+V85xIGFfqFGMTipMPAGb2oF1UBLL48kR43hRsOg==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", - "@lerna/command": "3.14.0", - "@lerna/prompt": "3.13.0", + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "@lerna/prompt": "3.18.5", "@lerna/pulse-till-done": "3.13.0", "@lerna/validation-error": "3.13.0", "dedent": "^0.7.0", - "fs-extra": "^7.0.0", + "fs-extra": "^8.1.0", "p-map-series": "^1.0.0" } }, + "@lerna/info": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/info/-/info-3.21.0.tgz", + "integrity": "sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA==", + "dev": true, + "requires": { + "@lerna/command": "3.21.0", + "@lerna/output": "3.13.0", + "envinfo": "^7.3.1" + } + }, "@lerna/init": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.14.0.tgz", - "integrity": "sha512-X3PQkQZds5ozA1xiarmVzAK6LPLNK3bBu24Api0w2KJXO7Ccs9ob/VcGdevZuzqdJo1Xg2H6oBhEqIClU9Uqqw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.21.0.tgz", + "integrity": "sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", - "@lerna/command": "3.14.0", - "fs-extra": "^7.0.0", - "p-map": "^1.2.0", - "write-json-file": "^2.3.0" + "@lerna/child-process": "3.16.5", + "@lerna/command": "3.21.0", + "fs-extra": "^8.1.0", + "p-map": "^2.1.0", + "write-json-file": "^3.2.0" } }, "@lerna/link": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.14.0.tgz", - "integrity": "sha512-xlwQhWTVOZrgAuoONY3/OIBWehDfZXmf5qFhnOy7lIxByRhEX5Vwx0ApaGxHTv3Flv7T+oI4s8UZVq5F6dT8Aw==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.21.0.tgz", + "integrity": "sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ==", "dev": true, "requires": { - "@lerna/command": "3.14.0", - "@lerna/package-graph": "3.14.0", - "@lerna/symlink-dependencies": "3.14.0", - "p-map": "^1.2.0", - "slash": "^1.0.0" + "@lerna/command": "3.21.0", + "@lerna/package-graph": "3.18.5", + "@lerna/symlink-dependencies": "3.17.0", + "p-map": "^2.1.0", + "slash": "^2.0.0" } }, "@lerna/list": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.14.0.tgz", - "integrity": "sha512-Gp+9gaIkBfXBwc9Ng0Y74IEfAqpQpLiXwOP4IOpdINxOeDpllhMaYP6SzLaMvrfSyHRayM7Cq5/PRnHkXQ5uuQ==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.21.0.tgz", + "integrity": "sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg==", "dev": true, "requires": { - "@lerna/command": "3.14.0", - "@lerna/filter-options": "3.14.0", - "@lerna/listable": "3.14.0", + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/listable": "3.18.5", "@lerna/output": "3.13.0" } }, "@lerna/listable": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.14.0.tgz", - "integrity": "sha512-ZK44Mo8xf/N97eQZ236SPSq0ek6+gk4HqHIx05foEMZVV1iIDH4a/nblLsJNjGQVsIdMYFPaqNJ0z+ZQfiJazQ==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.18.5.tgz", + "integrity": "sha512-Sdr3pVyaEv5A7ZkGGYR7zN+tTl2iDcinryBPvtuv20VJrXBE8wYcOks1edBTcOWsPjCE/rMP4bo1pseyk3UTsg==", "dev": true, "requires": { - "@lerna/query-graph": "3.14.0", + "@lerna/query-graph": "3.18.5", "chalk": "^2.3.1", "columnify": "^1.5.4" } }, "@lerna/log-packed": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.13.0.tgz", - "integrity": "sha512-Rmjrcz+6aM6AEcEVWmurbo8+AnHOvYtDpoeMMJh9IZ9SmZr2ClXzmD7wSvjTQc8BwOaiWjjC/ukcT0UYA2m7wg==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.16.0.tgz", + "integrity": "sha512-Fp+McSNBV/P2mnLUYTaSlG8GSmpXM7krKWcllqElGxvAqv6chk2K3c2k80MeVB4WvJ9tRjUUf+i7HUTiQ9/ckQ==", "dev": true, "requires": { - "byte-size": "^4.0.3", + "byte-size": "^5.0.1", "columnify": "^1.5.4", "has-unicode": "^2.0.1", "npmlog": "^4.1.2" } }, "@lerna/npm-conf": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.13.0.tgz", - "integrity": "sha512-Jg2kANsGnhg+fbPEzE0X9nX5oviEAvWj0nYyOkcE+cgWuT7W0zpnPXC4hA4C5IPQGhwhhh0IxhWNNHtjTuw53g==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.16.0.tgz", + "integrity": "sha512-HbO3DUrTkCAn2iQ9+FF/eisDpWY5POQAOF1m7q//CZjdC2HSW3UYbKEGsSisFxSfaF9Z4jtrV+F/wX6qWs3CuA==", "dev": true, "requires": { "config-chain": "^1.1.11", - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } + "pify": "^4.0.1" } }, "@lerna/npm-dist-tag": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.14.0.tgz", - "integrity": "sha512-DEyYEdufTGIC6E4RTJUsYPgqlz1Bs/XPeEQ5fd+ojWnICevj7dRrr2DfHucPiUCADlm2jbAraAQc3QPU0dXRhw==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.18.5.tgz", + "integrity": "sha512-xw0HDoIG6HreVsJND9/dGls1c+lf6vhu7yJoo56Sz5bvncTloYGLUppIfDHQr4ZvmPCK8rsh0euCVh2giPxzKQ==", "dev": true, "requires": { - "@lerna/otplease": "3.14.0", + "@evocateur/npm-registry-fetch": "^4.0.0", + "@lerna/otplease": "3.18.5", "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^3.9.0", "npmlog": "^4.1.2" } }, "@lerna/npm-install": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.13.3.tgz", - "integrity": "sha512-7Jig9MLpwAfcsdQ5UeanAjndChUjiTjTp50zJ+UZz4CbIBIDhoBehvNMTCL2G6pOEC7sGEg6sAqJINAqred6Tg==", + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.16.5.tgz", + "integrity": "sha512-hfiKk8Eku6rB9uApqsalHHTHY+mOrrHeWEs+gtg7+meQZMTS3kzv4oVp5cBZigndQr3knTLjwthT/FX4KvseFg==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", + "@lerna/child-process": "3.16.5", "@lerna/get-npm-exec-opts": "3.13.0", - "fs-extra": "^7.0.0", + "fs-extra": "^8.1.0", "npm-package-arg": "^6.1.0", "npmlog": "^4.1.2", "signal-exit": "^3.0.2", @@ -601,48 +873,40 @@ } }, "@lerna/npm-publish": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.14.0.tgz", - "integrity": "sha512-ShG0qEnGkWxtjQvIRATgm/CzeoVaSyyoNRag5t8gDSR/r2u9ux72oROKQUEaE8OwcTS4rL2cyBECts8XMNmyYw==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.18.5.tgz", + "integrity": "sha512-3etLT9+2L8JAx5F8uf7qp6iAtOLSMj+ZYWY6oUgozPi/uLqU0/gsMsEXh3F0+YVW33q0M61RpduBoAlOOZnaTg==", "dev": true, "requires": { - "@lerna/otplease": "3.14.0", - "@lerna/run-lifecycle": "3.14.0", + "@evocateur/libnpmpublish": "^1.2.2", + "@lerna/otplease": "3.18.5", + "@lerna/run-lifecycle": "3.16.2", "figgy-pudding": "^3.5.1", - "fs-extra": "^7.0.0", - "libnpmpublish": "^1.1.1", + "fs-extra": "^8.1.0", "npm-package-arg": "^6.1.0", "npmlog": "^4.1.2", - "pify": "^3.0.0", + "pify": "^4.0.1", "read-package-json": "^2.0.13" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, "@lerna/npm-run-script": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.13.3.tgz", - "integrity": "sha512-qR4o9BFt5hI8Od5/DqLalOJydnKpiQFEeN0h9xZi7MwzuX1Ukwh3X22vqsX4YRbipIelSFtrDzleNVUm5jj0ow==", + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.16.5.tgz", + "integrity": "sha512-1asRi+LjmVn3pMjEdpqKJZFT/3ZNpb+VVeJMwrJaV/3DivdNg7XlPK9LTrORuKU4PSvhdEZvJmSlxCKyDpiXsQ==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", + "@lerna/child-process": "3.16.5", "@lerna/get-npm-exec-opts": "3.13.0", "npmlog": "^4.1.2" } }, "@lerna/otplease": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-3.14.0.tgz", - "integrity": "sha512-rYAWzaYZ81bwnrmTkYWGgcc13bl/6DlG7pjWQWNGAJNLzO5zzj0xmXN5sMFJnNvDpSiS/ZS1sIuPvb4xnwLUkg==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-3.18.5.tgz", + "integrity": "sha512-S+SldXAbcXTEDhzdxYLU0ZBKuYyURP/ND2/dK6IpKgLxQYh/z4ScljPDMyKymmEvgiEJmBsPZAAPfmNPEzxjog==", "dev": true, "requires": { - "@lerna/prompt": "3.13.0", + "@lerna/prompt": "3.18.5", "figgy-pudding": "^3.5.1" } }, @@ -656,150 +920,90 @@ } }, "@lerna/pack-directory": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.14.0.tgz", - "integrity": "sha512-E9PmC1oWYjYN8Z0Oeoj7X98NruMg/pcdDiRxnwJ5awnB0d/kyfoquHXCYwCQQFCnWUfto7m5lM4CSostcolEVQ==", + "version": "3.16.4", + "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-3.16.4.tgz", + "integrity": "sha512-uxSF0HZeGyKaaVHz5FroDY9A5NDDiCibrbYR6+khmrhZtY0Bgn6hWq8Gswl9iIlymA+VzCbshWIMX4o2O8C8ng==", "dev": true, "requires": { - "@lerna/get-packed": "3.13.0", - "@lerna/package": "3.13.0", - "@lerna/run-lifecycle": "3.14.0", + "@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.1", + "npm-packlist": "^1.4.4", "npmlog": "^4.1.2", - "tar": "^4.4.8", + "tar": "^4.4.10", "temp-write": "^3.4.0" } }, "@lerna/package": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.13.0.tgz", - "integrity": "sha512-kSKO0RJQy093BufCQnkhf1jB4kZnBvL7kK5Ewolhk5gwejN+Jofjd8DGRVUDUJfQ0CkW1o6GbUeZvs8w8VIZDg==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.16.0.tgz", + "integrity": "sha512-2lHBWpaxcBoiNVbtyLtPUuTYEaB/Z+eEqRS9duxpZs6D+mTTZMNy6/5vpEVSCBmzvdYpyqhqaYjjSLvjjr5Riw==", "dev": true, "requires": { - "load-json-file": "^4.0.0", + "load-json-file": "^5.3.0", "npm-package-arg": "^6.1.0", "write-pkg": "^3.1.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } } }, "@lerna/package-graph": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.14.0.tgz", - "integrity": "sha512-dNpA/64STD5YXhaSlg4gT6Z474WPJVCHoX1ibsVIFu0fVgH609Y69bsdmbvTRdI7r6Dcu4ZfGxdR636RTrH+Eg==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.18.5.tgz", + "integrity": "sha512-8QDrR9T+dBegjeLr+n9WZTVxUYUhIUjUgZ0gvNxUBN8S1WB9r6H5Yk56/MVaB64tA3oGAN9IIxX6w0WvTfFudA==", "dev": true, "requires": { - "@lerna/prerelease-id-from-version": "3.14.0", + "@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": "^5.5.0" + "semver": "^6.2.0" } }, "@lerna/prerelease-id-from-version": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.14.0.tgz", - "integrity": "sha512-Ap3Z/dNhqQuSrKmK+JmzYvQYI2vowxHvUVxZJiDVilW8dyNnxkCsYFmkuZytk5sxVz4VeGLNPS2RSsU5eeSS+Q==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-3.16.0.tgz", + "integrity": "sha512-qZyeUyrE59uOK8rKdGn7jQz+9uOpAaF/3hbslJVFL1NqF9ELDTqjCPXivuejMX/lN4OgD6BugTO4cR7UTq/sZA==", + "dev": true, + "requires": { + "semver": "^6.2.0" + } + }, + "@lerna/profiler": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-3.20.0.tgz", + "integrity": "sha512-bh8hKxAlm6yu8WEOvbLENm42i2v9SsR4WbrCWSbsmOElx3foRnMlYk7NkGECa+U5c3K4C6GeBbwgqs54PP7Ljg==", "dev": true, "requires": { - "semver": "^5.5.0" + "figgy-pudding": "^3.5.1", + "fs-extra": "^8.1.0", + "npmlog": "^4.1.2", + "upath": "^1.2.0" } }, "@lerna/project": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.13.1.tgz", - "integrity": "sha512-/GoCrpsCCTyb9sizk1+pMBrIYchtb+F1uCOn3cjn9yenyG/MfYEnlfrbV5k/UDud0Ei75YBLbmwCbigHkAKazQ==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.21.0.tgz", + "integrity": "sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A==", "dev": true, "requires": { - "@lerna/package": "3.13.0", + "@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": "^3.1.0", - "globby": "^8.0.1", - "load-json-file": "^4.0.0", + "glob-parent": "^5.0.0", + "globby": "^9.2.0", + "load-json-file": "^5.3.0", "npmlog": "^4.1.2", - "p-map": "^1.2.0", + "p-map": "^2.1.0", "resolve-from": "^4.0.0", - "write-json-file": "^2.3.0" - }, - "dependencies": { - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } + "write-json-file": "^3.2.0" } }, "@lerna/prompt": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.13.0.tgz", - "integrity": "sha512-P+lWSFokdyvYpkwC3it9cE0IF2U5yy2mOUbGvvE4iDb9K7TyXGE+7lwtx2thtPvBAfIb7O13POMkv7df03HJeA==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.18.5.tgz", + "integrity": "sha512-rkKj4nm1twSbBEb69+Em/2jAERK8htUuV8/xSjN0NPC+6UjzAwY52/x9n5cfmpa9lyKf/uItp7chCI7eDmNTKQ==", "dev": true, "requires": { "inquirer": "^6.2.0", @@ -807,40 +1011,41 @@ } }, "@lerna/publish": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.14.1.tgz", - "integrity": "sha512-p+By/P84XJkndBzrmcnVLMcFpGAE+sQZCQK4e3aKQrEMLDrEwXkWt/XJxzeQskPxInFA/7Icj686LOADO7p0qg==", - "dev": true, - "requires": { - "@lerna/check-working-tree": "3.14.1", - "@lerna/child-process": "3.13.3", - "@lerna/collect-updates": "3.14.0", - "@lerna/command": "3.14.0", - "@lerna/describe-ref": "3.13.3", - "@lerna/log-packed": "3.13.0", - "@lerna/npm-conf": "3.13.0", - "@lerna/npm-dist-tag": "3.14.0", - "@lerna/npm-publish": "3.14.0", + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.22.1.tgz", + "integrity": "sha512-PG9CM9HUYDreb1FbJwFg90TCBQooGjj+n/pb3gw/eH5mEDq0p8wKdLFe0qkiqUkm/Ub5C8DbVFertIo0Vd0zcw==", + "dev": true, + "requires": { + "@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.21.0", + "@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.14.0", - "@lerna/prerelease-id-from-version": "3.14.0", - "@lerna/prompt": "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.14.0", - "@lerna/run-topologically": "3.14.0", + "@lerna/run-lifecycle": "3.16.2", + "@lerna/run-topologically": "3.18.5", "@lerna/validation-error": "3.13.0", - "@lerna/version": "3.14.1", + "@lerna/version": "3.22.1", "figgy-pudding": "^3.5.1", - "fs-extra": "^7.0.0", - "libnpmaccess": "^3.0.1", + "fs-extra": "^8.1.0", "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^3.9.0", "npmlog": "^4.1.2", "p-finally": "^1.0.0", - "p-map": "^1.2.0", + "p-map": "^2.1.0", "p-pipe": "^1.2.0", - "pacote": "^9.5.0", - "semver": "^5.5.0" + "semver": "^6.2.0" } }, "@lerna/pulse-till-done": { @@ -853,119 +1058,102 @@ } }, "@lerna/query-graph": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-3.14.0.tgz", - "integrity": "sha512-6YTh3vDMW2hUxHdKeRvx4bosc9lZClKaN+DzC1XKTkwDbWrsjmEzLcemKL6QnyyeuryN2f/eto7P9iSe3z3pQQ==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-3.18.5.tgz", + "integrity": "sha512-50Lf4uuMpMWvJ306be3oQDHrWV42nai9gbIVByPBYJuVW8dT8O8pA3EzitNYBUdLL9/qEVbrR0ry1HD7EXwtRA==", "dev": true, "requires": { - "@lerna/package-graph": "3.14.0", + "@lerna/package-graph": "3.18.5", "figgy-pudding": "^3.5.1" } }, "@lerna/resolve-symlink": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.13.0.tgz", - "integrity": "sha512-Lc0USSFxwDxUs5JvIisS8JegjA6SHSAWJCMvi2osZx6wVRkEDlWG2B1JAfXUzCMNfHoZX0/XX9iYZ+4JIpjAtg==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.16.0.tgz", + "integrity": "sha512-Ibj5e7njVHNJ/NOqT4HlEgPFPtPLWsO7iu59AM5bJDcAJcR96mLZ7KGVIsS2tvaO7akMEJvt2P+ErwCdloG3jQ==", "dev": true, "requires": { - "fs-extra": "^7.0.0", + "fs-extra": "^8.1.0", "npmlog": "^4.1.2", "read-cmd-shim": "^1.0.1" } }, "@lerna/rimraf-dir": { - "version": "3.13.3", - "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.13.3.tgz", - "integrity": "sha512-d0T1Hxwu3gpYVv73ytSL+/Oy8JitsmvOYUR5ouRSABsmqS7ZZCh5t6FgVDDGVXeuhbw82+vuny1Og6Q0k4ilqw==", + "version": "3.16.5", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.16.5.tgz", + "integrity": "sha512-bQlKmO0pXUsXoF8lOLknhyQjOZsCc0bosQDoX4lujBXSWxHVTg1VxURtWf2lUjz/ACsJVDfvHZbDm8kyBk5okA==", "dev": true, "requires": { - "@lerna/child-process": "3.13.3", + "@lerna/child-process": "3.16.5", "npmlog": "^4.1.2", "path-exists": "^3.0.0", "rimraf": "^2.6.2" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "@lerna/run": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.14.0.tgz", - "integrity": "sha512-kGGFGLYPKozAN07CSJ7kOyLY6W3oLCQcxCathg1isSkBqQH29tWUg8qNduOlhIFLmnq/nf1JEJxxoXnF6IRLjQ==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.21.0.tgz", + "integrity": "sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q==", "dev": true, "requires": { - "@lerna/command": "3.14.0", - "@lerna/filter-options": "3.14.0", - "@lerna/npm-run-script": "3.13.3", + "@lerna/command": "3.21.0", + "@lerna/filter-options": "3.20.0", + "@lerna/npm-run-script": "3.16.5", "@lerna/output": "3.13.0", - "@lerna/run-topologically": "3.14.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": "^1.2.0" + "p-map": "^2.1.0" } }, "@lerna/run-lifecycle": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.14.0.tgz", - "integrity": "sha512-GUM3L9MzGRSW0WQ8wbLW1+SYStU1OFjW0GBzShhBnFrO4nGRrU7VchsLpcLu0hk2uCzyhsrDKzifEdOdUyMoEQ==", + "version": "3.16.2", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.16.2.tgz", + "integrity": "sha512-RqFoznE8rDpyyF0rOJy3+KjZCeTkO8y/OB9orPauR7G2xQ7PTdCpgo7EO6ZNdz3Al+k1BydClZz/j78gNCmL2A==", "dev": true, "requires": { - "@lerna/npm-conf": "3.13.0", + "@lerna/npm-conf": "3.16.0", "figgy-pudding": "^3.5.1", - "npm-lifecycle": "^2.1.1", + "npm-lifecycle": "^3.1.2", "npmlog": "^4.1.2" } }, - "@lerna/run-parallel-batches": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/@lerna/run-parallel-batches/-/run-parallel-batches-3.13.0.tgz", - "integrity": "sha512-bICFBR+cYVF1FFW+Tlm0EhWDioTUTM6dOiVziDEGE1UZha1dFkMYqzqdSf4bQzfLS31UW/KBd/2z8jy2OIjEjg==", - "dev": true, - "requires": { - "p-map": "^1.2.0", - "p-map-series": "^1.0.0" - } - }, "@lerna/run-topologically": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-3.14.0.tgz", - "integrity": "sha512-y+KBpC1YExFzGynovt9MY4O/bc3RrJaKeuXieiPfKGKxrdtmZe/r33oj/xePTXZq65jnw3SaU3H8S5CrrdkwDg==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-3.18.5.tgz", + "integrity": "sha512-6N1I+6wf4hLOnPW+XDZqwufyIQ6gqoPfHZFkfWlvTQ+Ue7CuF8qIVQ1Eddw5HKQMkxqN10thKOFfq/9NQZ4NUg==", "dev": true, "requires": { - "@lerna/query-graph": "3.14.0", + "@lerna/query-graph": "3.18.5", "figgy-pudding": "^3.5.1", "p-queue": "^4.0.0" } }, "@lerna/symlink-binary": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.14.0.tgz", - "integrity": "sha512-AHFb4NlazxYmC+7guoamM3laIRbMSeKERMooKHJ7moe0ayGPBWsCGOH+ZFKZ+eXSDek+FnxdzayR3wf8B3LkTg==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.17.0.tgz", + "integrity": "sha512-RLpy9UY6+3nT5J+5jkM5MZyMmjNHxZIZvXLV+Q3MXrf7Eaa1hNqyynyj4RO95fxbS+EZc4XVSk25DGFQbcRNSQ==", "dev": true, "requires": { - "@lerna/create-symlink": "3.14.0", - "@lerna/package": "3.13.0", - "fs-extra": "^7.0.0", - "p-map": "^1.2.0" + "@lerna/create-symlink": "3.16.2", + "@lerna/package": "3.16.0", + "fs-extra": "^8.1.0", + "p-map": "^2.1.0" } }, "@lerna/symlink-dependencies": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.14.0.tgz", - "integrity": "sha512-kuSXxwAWiVZqFcXfUBKH4yLUH3lrnGyZmCYon7UnZitw3AK3LQY7HvV2LNNw/oatfjOAiKhPBxnYjYijKiV4oA==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.17.0.tgz", + "integrity": "sha512-KmjU5YT1bpt6coOmdFueTJ7DFJL4H1w5eF8yAQ2zsGNTtZ+i5SGFBWpb9AQaw168dydc3s4eu0W0Sirda+F59Q==", "dev": true, "requires": { - "@lerna/create-symlink": "3.14.0", - "@lerna/resolve-symlink": "3.13.0", - "@lerna/symlink-binary": "3.14.0", - "fs-extra": "^7.0.0", + "@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": "^1.2.0", + "p-map": "^2.1.0", "p-map-series": "^1.0.0" } }, @@ -985,35 +1173,37 @@ } }, "@lerna/version": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.14.1.tgz", - "integrity": "sha512-H/jykoxVIt4oDEYkBgwDfO5dmZFl3G6vP1UEttRVP1FIkI+gCN+olby8S0Qd8XprDuR5OrLboiDWQs3p7nJhLw==", - "dev": true, - "requires": { - "@lerna/batch-packages": "3.14.0", - "@lerna/check-working-tree": "3.14.1", - "@lerna/child-process": "3.13.3", - "@lerna/collect-updates": "3.14.0", - "@lerna/command": "3.14.0", - "@lerna/conventional-commits": "3.14.0", - "@lerna/github-client": "3.13.3", + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.22.1.tgz", + "integrity": "sha512-PSGt/K1hVqreAFoi3zjD0VEDupQ2WZVlVIwesrE5GbrL2BjXowjCsTDPqblahDUPy0hp6h7E2kG855yLTp62+g==", + "dev": true, + "requires": { + "@lerna/check-working-tree": "3.16.5", + "@lerna/child-process": "3.16.5", + "@lerna/collect-updates": "3.20.0", + "@lerna/command": "3.21.0", + "@lerna/conventional-commits": "3.22.0", + "@lerna/github-client": "3.22.0", + "@lerna/gitlab-client": "3.15.0", "@lerna/output": "3.13.0", - "@lerna/prerelease-id-from-version": "3.14.0", - "@lerna/prompt": "3.13.0", - "@lerna/run-lifecycle": "3.14.0", - "@lerna/run-topologically": "3.14.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": "^1.2.0", + "p-map": "^2.1.0", "p-pipe": "^1.2.0", "p-reduce": "^1.0.0", "p-waterfall": "^1.0.0", - "semver": "^5.5.0", - "slash": "^1.0.0", - "temp-write": "^3.4.0" + "semver": "^6.2.0", + "slash": "^2.0.0", + "temp-write": "^3.4.0", + "write-json-file": "^3.2.0" } }, "@lerna/write-log-file": { @@ -1042,93 +1232,345 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, - "@octokit/endpoint": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.1.3.tgz", - "integrity": "sha512-ePx9kcUo0agRk0HaXhl+pKMXpBH1O3CAygwWIh7GT5i5kcUr8QowS0GBaZPirr1e0PqaFYr41hQfcUBA1R5AEQ==", + "@npmcli/ci-detect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/ci-detect/-/ci-detect-1.2.0.tgz", + "integrity": "sha512-JtktVH7ASBVIWsQTFlFpeOzhBJskvoBCTfeeRhhZy7ybATcUvwiwotZ8j5rkqUUyB69lIy/AvboiiiGBjYBKBA==", + "dev": true + }, + "@npmcli/git": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.0.3.tgz", + "integrity": "sha512-c/ODsV5ppjB12VDXKc6hzVNgg6ZJX/etILUn3WgF5NLAYBhQLJ3fBq6uB2jQD4OwqOzJdPT1/xA3Xh3aaWGk5w==", "dev": true, "requires": { - "deepmerge": "3.2.0", - "is-plain-object": "^3.0.0", - "universal-user-agent": "^2.1.0", - "url-template": "^2.0.8" + "@npmcli/promise-spawn": "^1.1.0", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.3", + "npm-pick-manifest": "^6.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "semver": "^7.3.2", + "unique-filename": "^1.1.1", + "which": "^2.0.2" }, "dependencies": { - "is-plain-object": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", - "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "hosted-git-info": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", + "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "npm-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "isobject": "^4.0.0" + "isexe": "^2.0.0" } }, - "isobject": { + "yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.5.tgz", + "integrity": "sha512-aKIwguaaqb6ViwSOFytniGvLPb9SMCUm39TgM3SfUo7n0TxUMbwoXfpwyvQ4blm10lzbAwTsvjr7QZ85LvTi4A==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1", + "read-package-json-fast": "^1.1.1", + "readdir-scoped-modules": "^1.1.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@npmcli/promise-spawn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.2.0.tgz", + "integrity": "sha512-nFtqjVETliApiRdjbYwKwhlSHx2ZMagyj5b9YbNt0BWeeOVxJd47ZVE2u16vxDHyTOZvk+YLV7INwfAE9a2uow==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.3.1.tgz", + "integrity": "sha512-9Ea57XJjNLtBFRAaiKqqdoqRrL2QkM0vvCbMjPecljhog5IHupStPtZULbl0CoGN00N3lhLWJ4PaIEC0MGjqJw==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.2.0", + "infer-owner": "^1.0.4", + "node-gyp": "^6.1.0", + "read-package-json-fast": "^1.1.3" + }, + "dependencies": { + "node-gyp": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-6.1.0.tgz", + "integrity": "sha512-h4A2zDlOujeeaaTx06r4Vy+8MZ1679lU+wbCKDS4ZtvY2A37DESo37oejIw0mtmR3+rvNwts5B6Kpt1KrNYdNw==", + "dev": true, + "requires": { + "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" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@octokit/auth-token": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.2.tgz", + "integrity": "sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ==", + "dev": true, + "requires": { + "@octokit/types": "^5.0.0" + } + }, + "@octokit/endpoint": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.3.tgz", + "integrity": "sha512-Y900+r0gIz+cWp6ytnkibbD95ucEzDSKzlEnaWS52hbCDNcCJYO5mRmWW7HRAnDc7am+N/5Lnd8MppSaTYx1Yg==", + "dev": true, + "requires": { + "@octokit/types": "^5.0.0", + "is-plain-object": "^3.0.0", + "universal-user-agent": "^5.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", "dev": true + }, + "universal-user-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", + "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", + "dev": true, + "requires": { + "os-name": "^3.1.0" + } } } }, "@octokit/plugin-enterprise-rest": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-2.2.2.tgz", - "integrity": "sha512-CTZr64jZYhGWNTDGlSJ2mvIlFsm9OEO3LqWn9I/gmoHI4jRBp4kpHoFYNemG4oA75zUAcmbuWblb7jjP877YZw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", "dev": true }, + "@octokit/plugin-paginate-rest": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", + "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.1" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, + "@octokit/plugin-request-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz", + "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==", + "dev": true + }, + "@octokit/plugin-rest-endpoint-methods": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", + "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", + "dev": true, + "requires": { + "@octokit/types": "^2.0.1", + "deprecation": "^2.3.1" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } + } + }, "@octokit/request": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-4.1.0.tgz", - "integrity": "sha512-RvpQAba4i+BNH0z8i0gPRc1ShlHidj4puQjI/Tno6s+Q3/Mzb0XRSHJiOhpeFrZ22V7Mwjq1E7QS27P5CgpWYA==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.5.tgz", + "integrity": "sha512-atAs5GAGbZedvJXXdjtKljin+e2SltEs48B3naJjqWupYl2IUBbB/CJisyjbNHcKpHzb3E+OYEZ46G8eakXgQg==", "dev": true, "requires": { - "@octokit/endpoint": "^5.1.0", - "@octokit/request-error": "^1.0.1", + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.0.0", + "@octokit/types": "^5.0.0", "deprecation": "^2.0.0", "is-plain-object": "^3.0.0", "node-fetch": "^2.3.0", "once": "^1.4.0", - "universal-user-agent": "^2.1.0" + "universal-user-agent": "^5.0.0" }, "dependencies": { - "is-plain-object": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", - "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "@octokit/request-error": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.2.tgz", + "integrity": "sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw==", "dev": true, "requires": { - "isobject": "^4.0.0" + "@octokit/types": "^5.0.1", + "deprecation": "^2.0.0", + "once": "^1.4.0" } }, - "isobject": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", - "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", "dev": true + }, + "universal-user-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", + "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", + "dev": true, + "requires": { + "os-name": "^3.1.0" + } } } }, "@octokit/request-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.0.2.tgz", - "integrity": "sha512-T9swMS/Vc4QlfWrvyeSyp/GjhXtYaBzCcibjGywV4k4D2qVrQKfEMPy8OxMDEj7zkIIdpHwqdpVbKCvnUPqkXw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", + "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", "dev": true, "requires": { + "@octokit/types": "^2.0.0", "deprecation": "^2.0.0", "once": "^1.4.0" + }, + "dependencies": { + "@octokit/types": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", + "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", + "dev": true, + "requires": { + "@types/node": ">= 8" + } + } } }, "@octokit/rest": { - "version": "16.27.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.27.0.tgz", - "integrity": "sha512-UvCxVOCfHzEhOaltSKQBy81kMqQ+hglF3rAR4STut4WWr2tXvVnrIkGxeblO0TvmTt5zuxfgQfgG5kAHUT44RA==", + "version": "16.43.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.2.tgz", + "integrity": "sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ==", "dev": true, "requires": { - "@octokit/request": "^4.0.1", + "@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": "^1.4.0", + "before-after-hook": "^2.0.0", "btoa-lite": "^1.0.0", "deprecation": "^2.0.0", "lodash.get": "^4.4.2", @@ -1136,56 +1578,189 @@ "lodash.uniq": "^4.5.0", "octokit-pagination-methods": "^1.1.0", "once": "^1.4.0", - "universal-user-agent": "^2.0.0", - "url-template": "^2.0.8" + "universal-user-agent": "^4.0.0" } }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "@octokit/types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.0.1.tgz", + "integrity": "sha512-GorvORVwp244fGKEt3cgt/P+M0MGy4xEDbckw+K5ojEezxyMDgCaYPKVct+/eWQfZXOT7uq0xRpmrl/+hliabA==", "dev": true, "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" + "@types/node": ">= 8" } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", "dev": true, "requires": { - "es6-promisify": "^5.0.0" + "defer-to-connect": "^1.0.1" } }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, + "@types/node": { + "version": "14.0.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.22.tgz", + "integrity": "sha512-emeGcJvdiZ4Z3ohbmw93E/64jRzUHAItSHt8nF7M4TGgQTiWqFVGB8KNpLGFmUHmHLvjvBgFwVlqNcq+VuGv9g==", + "dev": true + }, + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", + "dev": true + }, + "@zkochan/cmd-shim": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@zkochan/cmd-shim/-/cmd-shim-3.1.0.tgz", + "integrity": "sha512-o8l0+x7C7sMZU3v9GuJIAU10qQLtwR1dtRQIOmlNMtyaqhmpXOzx1HWiYoWfmmf9HHZoAkXpc9TM9PQYF9d4Jg==", + "dev": true, + "requires": { + "is-windows": "^1.0.0", + "mkdirp-promise": "^5.0.1", + "mz": "^2.5.0" + } + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "dev": true, + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -1207,13 +1782,19 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "requires": { - "default-require-extensions": "^2.0.0" + "default-require-extensions": "^3.0.0" } }, "aproba": { @@ -1245,14 +1826,6 @@ "dev": true, "requires": { "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } } }, "arr-diff": { @@ -1274,15 +1847,9 @@ "dev": true }, "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-2.1.0.tgz", + "integrity": "sha512-KbUpJgx909ZscOc/7CLATBFam7P1Z1QRQInvgT0UztM9Q72aGKCunKASAl7WNW0tnPmPyEMeMhdsfWhfmW037w==", "dev": true }, "array-find-index": { @@ -1297,12 +1864,6 @@ "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", "dev": true }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -1357,12 +1918,6 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1388,9 +1943,9 @@ "dev": true }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", + "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", "dev": true }, "balanced-match": { @@ -1464,17 +2019,129 @@ } }, "before-after-hook": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-1.4.0.tgz", - "integrity": "sha512-l5r9ir56nda3qu14nAXIlyq1MmUSs0meCIaFAh8HwkFwP1F8eToOuS3ah2VAHHcY04jaYD7FpJC5JTXHYRbkzg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", + "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==", "dev": true }, "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "dev": true, + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1545,47 +2212,32 @@ "dev": true }, "byte-size": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.4.tgz", - "integrity": "sha512-82RPeneC6nqCdSwCX2hZUz3JPOvN5at/nTEw/CMf05Smu3Hrpo9Psb7LjN+k+XndNArG1EY8L4+BM3aTM4BCvw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", + "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", "dev": true }, "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "bluebird": "^3.5.3", + "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", + "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.2", + "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "cache-base": { @@ -1605,33 +2257,82 @@ "unset-value": "^1.0.0" } }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dev": true, + "requires": { + "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" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "dev": true + } + } + }, "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" }, "dependencies": { "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } } } }, @@ -1666,19 +2367,20 @@ "dev": true }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" } }, "caseless": { @@ -1705,15 +2407,21 @@ "dev": true }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "cint": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/cint/-/cint-8.2.1.tgz", + "integrity": "sha1-cDhrG0jidz0NYxZqVa/5TvRFahI=", "dev": true }, "class-utils": { @@ -1739,6 +2447,18 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==", + "dev": true + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -1748,27 +2468,36 @@ "restore-cursor": "^2.0.0" } }, + "cli-table": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", + "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "is-fullwidth-code-point": { @@ -1778,22 +2507,23 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } @@ -1804,14 +2534,24 @@ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, - "cmd-shim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", - "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "~0.5.0" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" } }, "code-point-at": { @@ -1820,12 +2560,6 @@ "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "coffeescript": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", - "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", - "dev": true - }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -1852,9 +2586,9 @@ "dev": true }, "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "dev": true }, "columnify": { @@ -1877,9 +2611,9 @@ } }, "commander": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", - "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, "commondir": { @@ -1889,9 +2623,9 @@ "dev": true }, "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.4.tgz", + "integrity": "sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q==", "dev": true, "requires": { "array-ify": "^1.0.0", @@ -1943,6 +2677,58 @@ "proto-list": "~1.2.1" } }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } + }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -1950,36 +2736,28 @@ "dev": true }, "conventional-changelog-angular": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz", - "integrity": "sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz", + "integrity": "sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA==", "dev": true, "requires": { "compare-func": "^1.3.1", "q": "^1.5.1" - }, - "dependencies": { - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - } } }, "conventional-changelog-core": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.2.tgz", - "integrity": "sha512-cssjAKajxaOX5LNAJLB+UOcoWjAIBvXtDMedv/58G+YEmAXMNfC16mmPl0JDOuVJVfIqM0nqQiZ8UCm8IXbE0g==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.3.tgz", + "integrity": "sha512-LMMX1JlxPIq/Ez5aYAYS5CpuwbOk6QFp8O4HLAcZxe3vxoCtABkhfjetk8IYdRB9CDQGwJFLR3Dr55Za6XKgUQ==", "dev": true, "requires": { - "conventional-changelog-writer": "^4.0.5", - "conventional-commits-parser": "^3.0.2", + "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.2", + "git-semver-tags": "^2.0.3", "lodash": "^4.2.1", "normalize-package-data": "^2.3.5", "q": "^1.5.1", @@ -1988,125 +2766,106 @@ "through2": "^3.0.0" }, "dependencies": { - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", "dev": true, "requires": { + "inherits": "^2.0.4", "readable-stream": "2 || 3" } } } }, "conventional-changelog-preset-loader": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.1.1.tgz", - "integrity": "sha512-K4avzGMLm5Xw0Ek/6eE3vdOXkqnpf9ydb68XYmCc16cJ99XMMbc2oaNMuPwAsxVK6CC1yA4/I90EhmWNj0Q6HA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true }, "conventional-changelog-writer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.6.tgz", - "integrity": "sha512-ou/sbrplJMM6KQpR5rKFYNVQYesFjN7WpNGdudQSWNi6X+RgyFUcSv871YBYkrUYV9EX8ijMohYVzn9RUb+4ag==", + "version": "4.0.16", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz", + "integrity": "sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ==", "dev": true, "requires": { "compare-func": "^1.3.1", - "conventional-commits-filter": "^2.0.2", + "conventional-commits-filter": "^2.0.6", "dateformat": "^3.0.0", - "handlebars": "^4.1.0", + "handlebars": "^4.7.6", "json-stringify-safe": "^5.0.1", - "lodash": "^4.2.1", - "meow": "^4.0.0", + "lodash": "^4.17.15", + "meow": "^7.0.0", "semver": "^6.0.0", "split": "^1.0.0", "through2": "^3.0.0" }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "conventional-commits-filter": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz", + "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==", + "dev": true, + "requires": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz", + "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.1", + "lodash": "^4.17.15", + "meow": "^7.0.0", + "split2": "^2.0.0", + "through2": "^3.0.0", + "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } + } + }, + "conventional-recommended-bump": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.1.tgz", + "integrity": "sha512-RVdt0elRcCxL90IrNP0fYCpq1uGt2MALko0eyeQ+zQuDVWtMGAy9ng6yYn3kax42lCj9+XBxQ8ZN6S9bdKxDhQ==", + "dev": true, + "requires": { + "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" + }, "dependencies": { "camelcase": { "version": "4.1.0", @@ -2125,19 +2884,16 @@ "quick-lru": "^1.0.0" } }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, "indent-string": { @@ -2146,18 +2902,6 @@ "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", @@ -2181,50 +2925,31 @@ "trim-newlines": "^2.0.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "redent": { @@ -2237,33 +2962,12 @@ "strip-indent": "^2.0.0" } }, - "semver": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz", - "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "dev": true }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - }, "trim-newlines": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", @@ -2272,378 +2976,21 @@ } } }, - "conventional-commits-filter": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", - "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", "dev": true, "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.3.tgz", - "integrity": "sha512-KaA/2EeUkO4bKjinNfGUyqPTX/6w9JGshuQRik4r/wJz7rUw3+D3fDG6sZSEqJvKILzKXFQuFkpPLclcsAuZcg==", - "dev": true, - "requires": { - "JSONStream": "^1.0.4", - "is-text-path": "^2.0.0", - "lodash": "^4.2.1", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^3.0.0", - "trim-off-newlines": "^1.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "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" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "through2": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", - "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", - "dev": true, - "requires": { - "readable-stream": "2 || 3" - } - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "conventional-recommended-bump": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-4.1.1.tgz", - "integrity": "sha512-JT2vKfSP9kR18RXXf55BRY1O3AHG8FPg5btP3l7LYfcWJsiXI6MCf30DepQ98E8Qhowvgv7a8iev0J1bEDkTFA==", - "dev": true, - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.1.1", - "conventional-commits-filter": "^2.0.2", - "conventional-commits-parser": "^3.0.2", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^2.0.2", - "meow": "^4.0.0", - "q": "^1.5.1" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, - "requires": { - "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" - } - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "readable-stream": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", - "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - } - } - }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "copy-concurrently": { @@ -2682,49 +3029,6 @@ "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - } - } - }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - }, - "dependencies": { - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - } } }, "cross-spawn": { @@ -2738,8 +3042,22 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -2750,9 +3068,9 @@ } }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, "dargs": { @@ -2774,22 +3092,26 @@ } }, "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "debuglog": { @@ -2812,6 +3134,14 @@ "requires": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } } }, "decode-uri-component": { @@ -2820,31 +3150,40 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dev": true, + "requires": { + "mimic-response": "^1.0.0" + } + }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, - "deepmerge": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", - "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==", + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", + "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", "dev": true, "requires": { - "strip-bom": "^3.0.0" + "strip-bom": "^4.0.0" }, "dependencies": { "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true } } @@ -2858,6 +3197,21 @@ "clone": "^1.0.2" } }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -2911,16 +3265,16 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, - "deprecation": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.0.0.tgz", - "integrity": "sha512-lbQN037mB3VfA2JFuguM5GCJ+zPinMeCrFe+AfSZ6eqrnJA/Fs+EYMnd6Nb2mn9lf2jO9xwEd9o9lic+D4vkcw==", + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, "detect-indent": { @@ -2940,36 +3294,18 @@ } }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "requires": { - "arrify": "^1.0.1", "path-type": "^3.0.0" - }, - "dependencies": { - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } } }, "dot-prop": { @@ -2987,6 +3323,12 @@ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -3016,23 +3358,35 @@ "dev": true }, "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "requires": { - "iconv-lite": "~0.4.13" + "iconv-lite": "^0.6.2" } }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" } }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "dev": true + }, + "envinfo": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.5.1.tgz", + "integrity": "sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ==", + "dev": true + }, "err-code": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", @@ -3048,6 +3402,36 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.17.6", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz", + "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.0", + "is-regex": "^1.1.0", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es6-error": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", @@ -3055,9 +3439,9 @@ "dev": true }, "es6-promise": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", - "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, "es6-promisify": { @@ -3069,6 +3453,12 @@ "es6-promise": "^4.0.3" } }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -3081,18 +3471,6 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, "eventemitter3": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", @@ -3114,12 +3492,6 @@ "strip-eof": "^1.0.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3135,6 +3507,15 @@ "to-regex": "^3.0.1" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -3152,18 +3533,15 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3192,14 +3570,25 @@ } }, "external-editor": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", - "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "extglob": { @@ -3274,9 +3663,9 @@ "dev": true }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-glob": { @@ -3293,51 +3682,39 @@ "micromatch": "^3.1.10" }, "dependencies": { - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } } } } }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, - "fg-lodash": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/fg-lodash/-/fg-lodash-0.0.2.tgz", - "integrity": "sha1-mINSU39CfaavIiEpu2OsyknmL6M=", - "dev": true, - "requires": { - "lodash": "^2.4.1", - "underscore.string": "~2.3.3" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } - } - }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, "figures": { @@ -3373,145 +3750,79 @@ } }, "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", "dev": true, "requires": { "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" }, "dependencies": { "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "p-try": "^2.0.0" + "semver": "^6.0.0" } }, "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "p-limit": "^2.2.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { - "find-up": "^3.0.0" + "find-up": "^4.0.0" } } } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "requires": { - "glob": "~5.0.0" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "locate-path": "^3.0.0" } }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -3528,50 +3839,56 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" }, "dependencies": { "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "shebang-regex": "^3.0.0" } }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -3611,24 +3928,30 @@ "readable-stream": "^2.0.0" } }, + "fromentries": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.0.tgz", + "integrity": "sha512-33X7H/wdfO99GdRLLgkjUrD4geAFdq/Uv0kl3HD4da6HDixd2GUg8Mw7dahLCV9r/EARkmtYBB6Tch4EEokFTQ==", + "dev": true + }, "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", + "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", "universalify": "^0.1.0" } }, "fs-minipass": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.6.tgz", - "integrity": "sha512-crhvyXcMejjv3Z5d2Fa9sf5xLYVCF5O1c71QxbVnbLsmYMBEvDAftewesN/HhY03YRoA7zOMxjNGrF5svGaaeQ==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.6.0" } }, "fs-write-stream-atomic": { @@ -3649,6 +3972,12 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "gauge": { "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", @@ -3671,10 +4000,22 @@ "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", "dev": true }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, "get-pkg-repo": { @@ -3688,12 +4029,176 @@ "normalize-package-data": "^2.3.0", "parse-github-repo-url": "^1.3.0", "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } } }, "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-4.2.0.tgz", + "integrity": "sha512-/b3jarXkH8KJoOMQc3uVGHASwGLPq3gSFJ7tgJm2diza+bydJPTGOibin2steecKeOylE8oY2JERlVWkAJO6yw==", "dev": true }, "get-stdin": { @@ -3717,12 +4222,6 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -3762,33 +4261,12 @@ "quick-lru": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", @@ -3812,52 +4290,22 @@ "trim-newlines": "^2.0.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, "redent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", @@ -3868,12 +4316,6 @@ "strip-indent": "^2.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -3896,16 +4338,24 @@ "requires": { "gitconfiglocal": "^1.0.0", "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, "git-semver-tags": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.2.tgz", - "integrity": "sha512-34lMF7Yo1xEmsK2EkbArdoU79umpvm0MfzaDkSNYSJqtM5QLAVTPWgpiXSVI5o/O9EvZPSrP4Zvnec/CqhSd5w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.3.tgz", + "integrity": "sha512-tj4FD4ww2RX2ae//jSrXZzrocla9db5h0V7ikPl1P/WwoZar9epdUhwR7XHXSgc+ZkNq72BEEerqQuicoEQfzA==", "dev": true, "requires": { "meow": "^4.0.0", - "semver": "^5.5.0" + "semver": "^6.0.0" }, "dependencies": { "camelcase": { @@ -3925,33 +4375,12 @@ "quick-lru": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", @@ -3975,52 +4404,22 @@ "trim-newlines": "^2.0.0" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, "redent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", @@ -4031,12 +4430,6 @@ "strip-indent": "^2.0.0" } }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -4080,27 +4473,26 @@ } }, "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.2", + "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "^4.0.1" } }, "glob-to-regexp": { @@ -4109,28 +4501,13 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "ini": "^1.3.5" } }, "globals": { @@ -4140,185 +4517,57 @@ "dev": true }, "globby": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", - "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", "dev": true, "requires": { - "array-union": "^1.0.1", - "dir-glob": "2.0.0", - "fast-glob": "^2.0.2", - "glob": "^7.1.2", - "ignore": "^3.3.5", - "pify": "^3.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "grunt": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", - "integrity": "sha512-PYsMOrOC+MsdGEkFVwMaMyc6Ob7pKmq+deg1Sjr+vvMWp35sztfwKE7qoN51V+UEtHsyNuMcGdgMLFkBHvMxHQ==", - "dev": true, - "requires": { - "coffeescript": "~1.10.0", - "dateformat": "~1.0.12", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.3.0", - "glob": "~7.0.0", - "grunt-cli": "~1.2.0", - "grunt-known-options": "~1.1.0", - "grunt-legacy-log": "~2.0.0", - "grunt-legacy-util": "~1.1.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.13.0", - "minimatch": "~3.0.2", - "mkdirp": "~0.5.1", - "nopt": "~3.0.6", - "path-is-absolute": "~1.0.0", - "rimraf": "~2.6.2" - }, - "dependencies": { - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", - "dev": true, - "requires": { - "findup-sync": "~0.3.0", - "grunt-known-options": "~1.1.0", - "nopt": "~3.0.6", - "resolve": "~1.1.0" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "@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" } }, - "grunt-cli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz", - "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==", + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "dev": true, "requires": { - "grunt-known-options": "~1.1.0", - "interpret": "~1.1.0", - "liftoff": "~2.5.0", - "nopt": "~4.0.1", - "v8flags": "~3.1.1" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } + "@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" } }, - "grunt-known-options": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", - "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, - "grunt-legacy-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", - "integrity": "sha512-1m3+5QvDYfR1ltr8hjiaiNjddxGdQWcH0rw1iKKiQnF0+xtgTazirSTGu68RchPyh1OBng1bBUjLmX8q9NpoCw==", - "dev": true, - "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.5" - } - }, - "grunt-legacy-log-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", - "integrity": "sha512-o7uHyO/J+i2tXG8r2bZNlVk20vlIFJ9IEYyHMCQGfWYru8Jv3wTqKZzvV30YW9rWEjq0eP3cflQ1qWojIe9VFA==", - "dev": true, - "requires": { - "chalk": "~2.4.1", - "lodash": "~4.17.10" - } - }, - "grunt-legacy-util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", - "integrity": "sha512-9zyA29w/fBe6BIfjGENndwoe1Uy31BIXxTH3s8mga0Z5Bz2Sp4UCjkeyv2tI449ymkx3x26B+46FV4fXEddl5A==", - "dev": true, - "requires": { - "async": "~1.5.2", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.10", - "underscore.string": "~3.3.4", - "which": "~1.3.0" - } - }, - "grunt-saucelabs": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/grunt-saucelabs/-/grunt-saucelabs-9.0.1.tgz", - "integrity": "sha512-3WD5/RtSp8AyEnmtN5HK1NUkU7o/kBl6rGQILnfg7WHTe0g0uG3LtecWPwTRYrD7kop79WkDfeVQ85WjvwDUZw==", - "dev": true, - "requires": { - "colors": "~1.1.2", - "lodash": "^4.17.11", - "q": "~1.4.1", - "requestretry": "~1.9.0", - "sauce-tunnel": "~2.5.0", - "saucelabs": "^1.5.0" - } - }, "handlebars": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", - "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", "dev": true, "requires": { + "minimist": "^1.2.5", "neo-async": "^2.6.0", - "optimist": "^0.6.1", "source-map": "^0.6.1", - "uglify-js": "^3.1.4" + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" }, "dependencies": { "source-map": { @@ -4345,13 +4594,19 @@ "har-schema": "^2.0.0" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "function-bind": "^1.1.1" } }, "has-flag": { @@ -4360,6 +4615,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -4398,34 +4659,46 @@ } } }, - "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, + "hasha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.0.tgz", + "integrity": "sha512-2W+jKdQbAdSIrggA8Q35Br8qKadTrqCTC8+XZvBWepKDK6m9XkX6Iz1a2yh2KP01kzAR/dpuMeUnocoLYDcskw==", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "dependencies": { + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } } }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-cache-semantics": { @@ -4442,17 +4715,6 @@ "requires": { "agent-base": "4", "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } } }, "http-signature": { @@ -4467,30 +4729,13 @@ } }, "https-proxy-agent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", - "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { - "agent-base": "^4.1.0", + "agent-base": "^4.3.0", "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "humanize-ms": { @@ -4503,12 +4748,12 @@ } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", "dev": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "iferr": { @@ -4518,15 +4763,15 @@ "dev": true }, "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "ignore-walk": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", - "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "requires": { "minimatch": "^3.0.4" @@ -4550,13 +4795,19 @@ } } }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, "import-local": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", - "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", "dev": true, "requires": { - "pkg-dir": "^2.0.0", + "pkg-dir": "^3.0.0", "resolve-cwd": "^2.0.0" } }, @@ -4567,13 +4818,16 @@ "dev": true }, "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "^2.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true }, "inflight": { "version": "1.0.6", @@ -4586,9 +4840,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { @@ -4613,26 +4867,18 @@ "validate-npm-package-name": "^3.0.0" }, "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, "inquirer": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", - "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", + "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", @@ -4641,7 +4887,7 @@ "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", - "lodash": "^4.17.11", + "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", @@ -4702,34 +4948,12 @@ } } }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, "is-accessor-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", @@ -4762,13 +4986,19 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "is-callable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz", + "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==", + "dev": true + }, "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { - "ci-info": "^1.5.0" + "ci-info": "^2.0.0" } }, "is-data-descriptor": { @@ -4791,6 +5021,12 @@ } } }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -4829,13 +5065,10 @@ "dev": true }, "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", @@ -4847,14 +5080,36 @@ } }, "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-installed-globally": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" } }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -4881,6 +5136,12 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "dev": true + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -4896,19 +5157,13 @@ "isobject": "^3.0.1" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "is-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz", + "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==", "dev": true, "requires": { - "is-unc-path": "^1.0.0" + "has-symbols": "^1.0.1" } }, "is-ssh": { @@ -4926,13 +5181,22 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, "is-text-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", - "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", "dev": true, "requires": { - "text-extensions": "^2.0.0" + "text-extensions": "^1.0.0" } }, "is-typedarray": { @@ -4941,15 +5205,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -4962,6 +5217,12 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -4987,91 +5248,162 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", "dev": true }, "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { - "append-transform": "^1.0.0" + "append-transform": "^2.0.0" } }, "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { - "@babel/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" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-processinfo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz", + "integrity": "sha512-kOwpa7z9hme+IBPZMzQ5vdQj8srYgAtaRqeI48NGmAQ+/5yKiHLV0QbYqQpxsdEF0+w14SoB8YbnHKcXE2KnYw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.0", + "istanbul-lib-coverage": "^3.0.0-alpha.1", + "make-dir": "^3.0.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^3.3.3" }, "dependencies": { - "semver": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.1.0.tgz", - "integrity": "sha512-kCqEOOHoBcFs/2Ccuk4Xarm/KiWRSLEX9CAZF8xkJ6ZPlIoTZ8V5f7J16vYLJqDbR7KrxTJpR2lqjIEm2Qx9cQ==", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", + "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", "dev": true, "requires": { "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", + "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "dependencies": { @@ -5084,28 +5416,6 @@ "ms": "^2.1.1" } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5115,14 +5425,21 @@ } }, "istanbul-reports": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.6.tgz", - "integrity": "sha512-SKi4rnMyLBKe0Jy2uUdx28h8oG7ph2PPuQPvIAh31d+Ci+lSiEu4C+h3oBPuJ9+mPKhOyW0M8gY4U5NM1WLeXA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", "dev": true, "requires": { - "handlebars": "^4.1.2" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" } }, + "jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", + "dev": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5130,9 +5447,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5151,12 +5468,33 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-parse-even-better-errors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.2.0.tgz", + "integrity": "sha512-2tLgY7LRNZ9Hd6gmCuBG5/OjRHQpSgJQqJoYyLLOhUgn8LdOYrjaZLcxkWnDads+AD/haWWioPNziXQcgvQJ/g==", + "dev": true + }, + "json-parse-helpfulerror": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz", + "integrity": "sha1-E/FM4C7tTpgSl7ZOueO5MuLdE9w=", + "dev": true, + "requires": { + "jju": "^1.1.0" + } + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -5175,6 +5513,15 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -5202,156 +5549,106 @@ "verror": "1.10.0" } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "lerna": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.14.1.tgz", - "integrity": "sha512-lQxmGeEECjOMI3pRh2+I6jazoEWhEfvZNIs7XaX71op33AVwyjlY/nQ1GJGrPhxYBuQnlPgH0vH/nC/lcLaVkw==", - "dev": true, - "requires": { - "@lerna/add": "3.14.0", - "@lerna/bootstrap": "3.14.0", - "@lerna/changed": "3.14.1", - "@lerna/clean": "3.14.0", - "@lerna/cli": "3.13.0", - "@lerna/create": "3.14.0", - "@lerna/diff": "3.14.0", - "@lerna/exec": "3.14.0", - "@lerna/import": "3.14.0", - "@lerna/init": "3.14.0", - "@lerna/link": "3.14.0", - "@lerna/list": "3.14.0", - "@lerna/publish": "3.14.1", - "@lerna/run": "3.14.0", - "@lerna/version": "3.14.1", - "import-local": "^1.0.0", - "npmlog": "^4.1.2" - } - }, - "libnpmaccess": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-3.0.1.tgz", - "integrity": "sha512-RlZ7PNarCBt+XbnP7R6PoVgOq9t+kou5rvhaInoNibhPO7eMlRfS0B8yjatgn2yaHIwWNyoJDolC/6Lc5L/IQA==", - "dev": true, - "requires": { - "aproba": "^2.0.0", - "get-stream": "^4.0.0", - "npm-package-arg": "^6.1.0", - "npm-registry-fetch": "^3.8.0" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - } + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dev": true, + "requires": { + "json-buffer": "3.0.0" } }, - "libnpmpublish": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-1.1.1.tgz", - "integrity": "sha512-nefbvJd/wY38zdt+b9SHL6171vqBrMtZ56Gsgfd0duEKb/pB8rDT4/ObUQLrHz1tOfht1flt2zM+UGaemzAG5g==", + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "dev": true, "requires": { - "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", - "npm-registry-fetch": "^3.8.0", - "semver": "^5.5.1", - "ssri": "^6.0.1" - }, - "dependencies": { - "aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", - "dev": true - } + "package-json": "^6.3.0" } }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "lerna": { + "version": "3.22.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.22.1.tgz", + "integrity": "sha512-vk1lfVRFm+UuEFA7wkLKeSF7Iz13W+N/vFd48aW2yuS7Kv0RbNm2/qcDPV863056LMfkRlsEe+QYOw3palj5Lg==", + "dev": true, + "requires": { + "@lerna/add": "3.21.0", + "@lerna/bootstrap": "3.21.0", + "@lerna/changed": "3.21.0", + "@lerna/clean": "3.21.0", + "@lerna/cli": "3.18.5", + "@lerna/create": "3.22.0", + "@lerna/diff": "3.21.0", + "@lerna/exec": "3.21.0", + "@lerna/import": "3.22.0", + "@lerna/info": "3.21.0", + "@lerna/init": "3.21.0", + "@lerna/link": "3.21.0", + "@lerna/list": "3.21.0", + "@lerna/publish": "3.22.1", + "@lerna/run": "3.21.0", + "@lerna/version": "3.22.1", + "import-local": "^2.0.0", + "npmlog": "^4.1.2" + } + }, + "libnpmconfig": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/libnpmconfig/-/libnpmconfig-1.2.1.tgz", + "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", "dev": true, "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - } + "figgy-pudding": "^3.5.1", + "find-up": "^3.0.0", + "ini": "^1.3.5" } }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" } }, "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "p-locate": "^2.0.0", + "p-locate": "^3.0.0", "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", "dev": true }, "lodash._reinterpolate": { @@ -5397,22 +5694,22 @@ "dev": true }, "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", "dev": true, "requires": { - "lodash._reinterpolate": "~3.0.0", + "lodash._reinterpolate": "^3.0.0", "lodash.templatesettings": "^4.0.0" } }, "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", "dev": true, "requires": { - "lodash._reinterpolate": "~3.0.0" + "lodash._reinterpolate": "^3.0.0" } }, "lodash.uniq": { @@ -5431,6 +5728,12 @@ "signal-exit": "^3.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5441,9 +5744,9 @@ } }, "macos-release": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.2.0.tgz", - "integrity": "sha512-iV2IDxZaX8dIcM7fG6cI46uNmHUxHE4yN+Z8tKHAW1TBPMZDIKHf/3L+YnOuj/FK9il14UaVdHmiQ1tsi90ltA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.0.tgz", + "integrity": "sha512-ko6deozZYiAkqa/0gmcsz+p4jSy3gY7/ZsCEokPaYd8k+6/aXGkiTgr61+Owup7Sf+xjqW8u2ElhoM9SEcEfuA==", "dev": true }, "make-dir": { @@ -5464,58 +5767,22 @@ } }, "make-fetch-happen": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", - "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", "dev": true, "requires": { "agentkeepalive": "^3.4.1", - "cacache": "^11.0.1", + "cacache": "^12.0.0", "http-cache-semantics": "^3.8.1", "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.1", - "lru-cache": "^4.1.2", + "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" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" } }, "map-cache": { @@ -5525,9 +5792,9 @@ "dev": true }, "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz", + "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==", "dev": true }, "map-visit": { @@ -5539,64 +5806,154 @@ "object-visit": "^1.0.0" } }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - }, - "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - } - } - }, "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz", + "integrity": "sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw==", + "dev": true, + "requires": { + "@types/minimist": "^1.2.0", + "arrify": "^2.0.1", + "camelcase": "^6.0.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "^4.0.2", + "normalize-package-data": "^2.5.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.13.1", + "yargs-parser": "^18.1.3" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1", + "lines-and-columns": "^1.1.6" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true + } + } + }, + "type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", "dev": true + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } } } }, "merge2": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", - "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, "micromatch": { @@ -5621,18 +5978,18 @@ } }, "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", "dev": true }, "mime-types": { - "version": "2.1.24", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", - "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dev": true, "requires": { - "mime-db": "1.40.0" + "mime-db": "1.44.0" } }, "mimic-fn": { @@ -5641,48 +5998,232 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "dev": true + }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-fetch": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.2.1.tgz", + "integrity": "sha512-ssHt0dkljEDaKmTgQ04DQgx2ag6G2gMPxA5hpcsoeTbfDgRf2fC2gNSRc6kISjD7ckCpHwwQvXxuTBK8402fXg==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-pipeline": "^1.2.2", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "minipass-pipeline": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz", + "integrity": "sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ==", "dev": true, "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, - "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } } }, "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^2.9.0" } }, "mississippi": { @@ -5704,9 +6245,9 @@ } }, "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { "for-in": "^1.0.2", @@ -5725,20 +6266,21 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" + } + }, + "mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha1-6bj2jlUsaKnBcTuEiD96HdA5uKE=", + "dev": true, + "requires": { + "mkdirp": "*" } }, "modify-values": { @@ -5762,21 +6304,21 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-3.0.0.tgz", + "integrity": "sha512-22foS/gqQfANZ3o+W7ST2x25ueHDVNWl/b9OlGcLpy/iKxjCpvcNCM51YCenUi7Mt/jAjjqv8JwZRs8YP5sRjA==", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" + "array-differ": "^2.0.3", + "array-union": "^1.0.2", + "arrify": "^1.0.1", + "minimatch": "^3.0.4" } }, "mute-stream": { @@ -5785,6 +6327,17 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -5805,15 +6358,15 @@ } }, "neo-async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", + "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", "dev": true }, "nice-try": { @@ -5829,9 +6382,9 @@ "dev": true }, "node-fetch-npm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", - "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", "dev": true, "requires": { "encoding": "^0.1.11", @@ -5840,39 +6393,49 @@ } }, "node-gyp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-4.0.0.tgz", - "integrity": "sha512-2XiryJ8sICNo6ej8d0idXDEMKfVfFK7kekGCtJAuelGsYHQxhj13KTf95swTCN2dZ/4lTfZ84Fu31jqJEEgjWA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.1.tgz", + "integrity": "sha512-WH0WKGi+a4i4DUt2mHnvocex/xPLp9pYt5R6M2JdFB7pJ7Z34hveZ4nDTGTiLXCkitA9T8HFZjhinBCiVHYcWw==", "dev": true, "requires": { - "glob": "^7.0.3", - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "nopt": "2 || 3", - "npmlog": "0 || 1 || 2 || 3 || 4", - "osenv": "0", - "request": "^2.87.0", - "rimraf": "2", - "semver": "~5.3.0", - "tar": "^4.4.8", - "which": "1" + "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" }, "dependencies": { "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, + "node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "requires": { + "process-on-spawn": "^1.0.0" + } + }, "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "requires": { - "abbrev": "1" + "abbrev": "1", + "osenv": "^0.1.4" } }, "normalize-package-data": { @@ -5885,6 +6448,14 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "normalize-url": { @@ -5894,20 +6465,174 @@ "dev": true }, "npm-bundled": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", - "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-check-updates": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-7.0.1.tgz", + "integrity": "sha512-z/i1nhxW1OJ2a8wZtm92PS+4vCZ5Y5d86pLDPJScWf8G3vTYJlxd11UqUymnaZWK2nYPMmgxnneAKnFGODDxjw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "cint": "^8.2.1", + "cli-table": "^0.3.1", + "commander": "^5.1.0", + "find-up": "4.1.0", + "get-stdin": "^8.0.0", + "json-parse-helpfulerror": "^1.0.3", + "libnpmconfig": "^1.2.1", + "lodash": "^4.17.15", + "p-map": "^4.0.0", + "pacote": "^11.1.10", + "progress": "^2.0.3", + "prompts": "^2.3.2", + "rc-config-loader": "^3.0.0", + "requireg": "^0.2.2", + "semver": "^7.3.2", + "semver-utils": "^1.1.4", + "spawn-please": "^0.3.0", + "update-notifier": "^4.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + }, + "dependencies": { + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + } + } }, "npm-lifecycle": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-2.1.1.tgz", - "integrity": "sha512-+Vg6I60Z75V/09pdcH5iUo/99Q/vop35PaI99elvxk56azSVVsdsSsS/sXqKDNwbRRNN1qSxkcO45ZOu0yOWew==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz", + "integrity": "sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==", "dev": true, "requires": { "byline": "^5.0.0", "graceful-fs": "^4.1.15", - "node-gyp": "^4.0.0", + "node-gyp": "^5.0.2", "resolve-from": "^4.0.0", "slide": "^1.1.6", "uid-number": "0.0.6", @@ -5915,67 +6640,313 @@ "which": "^1.3.1" } }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, "npm-package-arg": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", - "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", "dev": true, "requires": { - "hosted-git-info": "^2.6.0", + "hosted-git-info": "^2.7.1", "osenv": "^0.1.5", - "semver": "^5.5.0", + "semver": "^5.6.0", "validate-npm-package-name": "^3.0.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "npm-packlist": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", - "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "requires": { "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npm-pick-manifest": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", - "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", "dev": true, "requires": { "figgy-pudding": "^3.5.1", "npm-package-arg": "^6.0.0", "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "npm-registry-fetch": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz", - "integrity": "sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw==", - "dev": true, - "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^4.1.3", - "make-fetch-happen": "^4.0.1", - "npm-package-arg": "^6.1.0" + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-8.1.2.tgz", + "integrity": "sha512-/m5W4t5xSAO0vwI+nDMh/msTimROztmrQcMxWRoWqWQsNYUavE4zSQCvpfDZb+V6CVs4J2tHvCP0g3me2nNU7w==", + "dev": true, + "requires": { + "@npmcli/ci-detect": "^1.0.0", + "lru-cache": "^6.0.0", + "make-fetch-happen": "^8.0.8", + "minipass": "^3.1.3", + "minipass-fetch": "^1.1.2", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" }, "dependencies": { + "agent-base": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", + "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.1.3.tgz", + "integrity": "sha512-wn8fw19xKZwdGPO47jivonaHRTd+nGOMP1z11sgGeQzDy2xd5FG0R67dIMcKHDE2cJ5y+YXV30XVGUBPRSY7Hg==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", + "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-fetch-happen": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-8.0.8.tgz", + "integrity": "sha512-kILd4WtBFqylc65LRq9sTx/GG0r9yMoomjz9ZMGxzZKWXhnidDhROhnjtZEQDHSWbwQJ5ojI4XZk46DdHwslGg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.0", + "cacache": "^15.0.0", + "http-cache-semantics": "^4.0.4", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.1.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^5.0.0", + "ssri": "^8.0.0" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "npm-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "socks-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.0.tgz", + "integrity": "sha512-lEpa1zsWCChxiynk+lCycKuC502RxDWLKJZoIhnxrWNjLSDGYRFflHA1/228VkRcnv9TIb8w98derGbpKxJRgA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4", + "socks": "^2.3.3" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" } }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } @@ -6008,212 +6979,215 @@ "dev": true }, "nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" }, "dependencies": { "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } }, "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "locate-path": "^3.0.0" + "color-name": "~1.1.4" } }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "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" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" } }, "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" } }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-try": "^2.0.0" + "p-limit": "^2.2.0" } }, - "p-locate": { + "p-map": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "aggregate-error": "^3.0.0" } }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.0" } }, "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "yargs": { - "version": "13.2.4", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.4.tgz", - "integrity": "sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg==", + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.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", + "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^13.1.0" + "yargs-parser": "^18.1.2" } }, "yargs-parser": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", - "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -6265,6 +7239,18 @@ } } }, + "object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -6274,26 +7260,26 @@ "isobject": "^3.0.0" } }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", "dev": true, "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" } }, "object.pick": { @@ -6329,41 +7315,12 @@ "mimic-fn": "^1.0.0" } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - }, - "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true - } - } - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-name": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", @@ -6390,10 +7347,10 @@ "os-tmpdir": "^1.0.0" } }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, "p-finally": { @@ -6402,34 +7359,28 @@ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" } }, "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "^2.0.0" } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, "p-map-series": { @@ -6463,9 +7414,9 @@ "dev": true }, "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "p-waterfall": { @@ -6478,90 +7429,239 @@ } }, "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", + "hasha": "^5.0.0", "lodash.flattendeep": "^4.4.0", "release-zalgo": "^1.0.0" } }, - "pacote": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.0.tgz", - "integrity": "sha512-aUplXozRbzhaJO48FaaeClmN+2Mwt741MC6M3bevIGZwdCaP7frXzbUOfOWa91FPHoLITzG0hYaKY363lxO3bg==", + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", "dev": true, "requires": { - "bluebird": "^3.5.3", - "cacache": "^11.3.2", - "figgy-pudding": "^3.5.1", - "get-stream": "^4.1.0", - "glob": "^7.1.3", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^4.0.1", - "minimatch": "^3.0.4", - "minipass": "^2.3.5", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "normalize-package-data": "^2.4.0", - "npm-package-arg": "^6.1.0", - "npm-packlist": "^1.1.12", - "npm-pick-manifest": "^2.2.3", - "npm-registry-fetch": "^3.8.0", - "osenv": "^0.1.5", - "promise-inflight": "^1.0.1", + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, + "pacote": { + "version": "11.1.10", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.10.tgz", + "integrity": "sha512-xJSSSxcHLo1CZJESvIZ2hbC5/5WP2oDHeUeTV2FvVDPOZG7+ixbxnV0n3TkdaUqlbC0RwnwMQ3wkJ/YywYM0Cg==", + "dev": true, + "requires": { + "@npmcli/git": "^2.0.1", + "@npmcli/installed-package-contents": "^1.0.5", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^1.3.0", + "cacache": "^15.0.3", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^2.1.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^8.0.3", "promise-retry": "^1.1.1", - "protoduck": "^5.0.1", - "rimraf": "^2.6.2", - "safe-buffer": "^5.1.2", - "semver": "^5.6.0", - "ssri": "^6.0.1", - "tar": "^4.4.8", - "unique-filename": "^1.1.1", - "which": "^1.3.1" + "read-package-json-fast": "^1.1.3", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.1" }, "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "hosted-git-info": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.5.tgz", + "integrity": "sha512-i4dpK6xj9BIpVOTboXIlKG9+8HMKggcrMX7WA24xZtKwX0TPelq/rbaS5rCKeNX8sJXZJGdSxpnEGtta+wismQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "npm-package-arg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.0.1.tgz", + "integrity": "sha512-/h5Fm6a/exByzFSTm7jAyHbgOqErl9qSNJDQF32Si/ZzgwT2TERVxRxn3Jurw1wflgyVVAxnFR4fRHPM7y1ClQ==", + "dev": true, + "requires": { + "hosted-git-info": "^3.0.2", + "semver": "^7.0.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.2.tgz", + "integrity": "sha512-eByPaP+wsKai0BJX5pmb58d3mfR0zUATcnyuvSxIudTEn+swCPFLxh7srCmqB4hr7i9V24/DPjjq5b2qUtbgXQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^3.0.3", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.0.tgz", + "integrity": "sha512-ygs4k6f54ZxJXrzT0x34NybRlLeZ4+6nECAIbr2i0foTnijtS1TJiyzpqtuUAJOps/hO0tNDr8fRV5g+BtRlTw==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-package-arg": "^8.0.0", + "semver": "^7.0.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.2.tgz", + "integrity": "sha512-Glo3jkRtPcvpDlAs/0+hozav78yoXKFr+c4wgw62NNMO3oo4AaJdCo21Uu7lcwr55h39W2XD1LMERc64wtbItg==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true } } }, "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "~0.2.2", + "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, "parse-github-repo-url": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", @@ -6569,20 +7669,15 @@ "dev": true }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, "parse-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.1.tgz", @@ -6618,13 +7713,10 @@ "dev": true }, "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", @@ -6644,30 +7736,21 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "performance-now": { @@ -6677,9 +7760,9 @@ "dev": true }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "pinkie": { @@ -6698,23 +7781,12 @@ } }, "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "^2.1.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - } + "find-up": "^3.0.0" } }, "posix-character-classes": { @@ -6723,10 +7795,31 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, - "process-nextick-args": { + "prepend-http": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "requires": { + "fromentries": "^1.2.0" + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "promise-inflight": { @@ -6745,6 +7838,16 @@ "retry": "^0.10.0" } }, + "prompts": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", + "dev": true, + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.4" + } + }, "promzard": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", @@ -6775,16 +7878,10 @@ "genfun": "^5.0.0" } }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, "psl": { - "version": "1.1.32", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.32.tgz", - "integrity": "sha512-MHACAkHpihU/REGGPLj4sEfc/XKW2bheigvHO1dUqjaKigMp1C8+WLQYRGgeKFMsw5PMfegZcaN8IDXK/cD0+g==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { @@ -6826,10 +7923,19 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, "q": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", - "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", "dev": true }, "qs": { @@ -6839,11 +7945,46 @@ "dev": true }, "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "rc-config-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-3.0.0.tgz", + "integrity": "sha512-bwfUSB37TWkHfP+PPjb/x8BUjChFmmBK44JMfVnU7paisWqZl/o5k7ttCH+EQLnrbn2Aq8Fo1LAsyUiz+WF4CQ==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "js-yaml": "^3.12.0", + "json5": "^2.1.1", + "require-from-string": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -6854,81 +7995,138 @@ } }, "read-cmd-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", - "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", + "integrity": "sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==", "dev": true, "requires": { "graceful-fs": "^4.1.2" } }, "read-package-json": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", - "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", + "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", "dev": true, "requires": { "glob": "^7.1.1", "graceful-fs": "^4.1.2", "json-parse-better-errors": "^1.0.1", "normalize-package-data": "^2.0.0", - "slash": "^1.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-json-fast": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-1.1.3.tgz", + "integrity": "sha512-MmFqiyfCXV2Dmm4jH24DEGhxdkUDFivJQj4oPZQPOKywxR7HWBE6WnMWDAapfFHi3wm1b+mhR+XHlUH0CL8axg==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "read-package-tree": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.2.tgz", - "integrity": "sha512-rW3XWUUkhdKmN2JKB4FL563YAgtINifso5KShykufR03nJ5loGFlkUMe1g/yxmqX073SoYYTsgXu7XdDinKZuA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", "dev": true, "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "once": "^1.3.0", "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0" + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" } }, "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "^1.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "path-type": "^3.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -6938,12 +8136,20 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "readdir-scoped-modules": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", - "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", "dev": true, "requires": { "debuglog": "^1.0.1", @@ -6952,23 +8158,14 @@ "once": "^1.3.0" } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" } }, "regex-not": { @@ -6981,6 +8178,24 @@ "safe-regex": "^1.1.0" } }, + "registry-auth-token": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -7012,9 +8227,9 @@ } }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -7024,7 +8239,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -7034,39 +8249,55 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, - "requestretry": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.9.1.tgz", - "integrity": "sha1-CioATq8hGWnEzCz+vz/p5XuSx04=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "fg-lodash": "0.0.2", - "request": "^2.74.x", - "when": "~3.7.5" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, + "requireg": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", + "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", + "dev": true, + "requires": { + "nested-error-stacks": "~2.0.1", + "rc": "~1.2.7", + "resolve": "~1.7.1" + }, + "dependencies": { + "resolve": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", + "dev": true, + "requires": { + "path-parse": "^1.0.5" + } + } + } + }, "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -7089,16 +8320,6 @@ } } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -7111,6 +8332,15 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dev": true, + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -7134,38 +8364,19 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true }, "run-queue": { "version": "1.0.3", @@ -7177,86 +8388,54 @@ } }, "rxjs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", - "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz", + "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "sauce-tunnel": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/sauce-tunnel/-/sauce-tunnel-2.5.0.tgz", - "integrity": "sha1-DuTE/5tH4BPosHLL+sSVt/7Y6Os=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "request": "^2.72.0", - "split": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true }, - "saucelabs": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", - "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1" + "ret": "~0.1.10" } }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, + "semver-utils": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver-utils/-/semver-utils-1.1.4.tgz", + "integrity": "sha512-EjnoLE5OGmDAVV/8YDoN5KiajNadjzIp9BAHOhYeQHt7j0UWxjmgsx4YD48wp4Ue1Qogq38F1GNUJNqF1kKKxA==", "dev": true }, "set-blocking": { @@ -7266,9 +8445,9 @@ "dev": true }, "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { "extend-shallow": "^2.0.1", @@ -7288,6 +8467,15 @@ } } }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -7304,15 +8492,21 @@ "dev": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, "slide": { @@ -7322,9 +8516,9 @@ "dev": true }, "smart-buffer": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", - "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", "dev": true }, "snapdragon": { @@ -7343,6 +8537,15 @@ "use": "^3.1.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "define-property": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", @@ -7360,6 +8563,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, @@ -7435,13 +8644,13 @@ } }, "socks": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.2.tgz", - "integrity": "sha512-pCpjxQgOByDHLlNqlnh/mNSAxIUkyBBuwwhTcV+enZGbDaClPvHdvm6uvOwZfFJkam7cGhBNbb4JxiP8UZkRvQ==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", "dev": true, "requires": { - "ip": "^1.1.5", - "smart-buffer": "4.0.2" + "ip": "1.1.5", + "smart-buffer": "^4.1.0" } }, "socks-proxy-agent": { @@ -7452,6 +8661,17 @@ "requires": { "agent-base": "~4.2.1", "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } } }, "sort-keys": { @@ -7470,12 +8690,12 @@ "dev": true }, "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "dev": true, "requires": { - "atob": "^2.1.1", + "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", @@ -7488,24 +8708,59 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spawn-please": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/spawn-please/-/spawn-please-0.3.0.tgz", + "integrity": "sha1-2zOOxM/2Orxp8dDgjO6euL69nRE=", + "dev": true + }, "spawn-wrap": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz", - "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", "signal-exit": "^3.0.2", - "which": "^1.3.0" + "which": "^2.0.1" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -7513,15 +8768,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -7529,9 +8784,9 @@ } }, "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split": { @@ -7562,9 +8817,9 @@ } }, "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { @@ -7625,9 +8880,9 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "string-width": { @@ -7641,6 +8896,26 @@ "strip-ansi": "^3.0.0" } }, + "string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -7648,6 +8923,14 @@ "dev": true, "requires": { "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "strip-ansi": { @@ -7660,13 +8943,10 @@ } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true }, "strip-eof": { "version": "1.0.0", @@ -7675,14 +8955,20 @@ "dev": true }, "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "requires": { - "get-stdin": "^4.0.1" + "min-indent": "^1.0.0" } }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, "strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -7704,18 +8990,18 @@ } }, "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" } }, "temp-dir": { @@ -7746,159 +9032,47 @@ } } }, + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==", + "dev": true + }, "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - } + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" } }, "text-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.0.0.tgz", - "integrity": "sha512-F91ZqLgvi1E0PdvmxMgp+gcf6q8fMH7mhdwWfzXnl1k+GbpQDmi8l7DzLC5JTASKbwpY3TfxajAUzAXcv2NmsQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -7950,6 +9124,12 @@ } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "dev": true + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -7973,21 +9153,13 @@ } }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "tr46": { @@ -8000,9 +9172,9 @@ } }, "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz", + "integrity": "sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA==", "dev": true }, "trim-off-newlines": { @@ -8011,52 +9183,44 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", "dev": true }, "tslint": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", - "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.2.tgz", + "integrity": "sha512-UyNrLdK3E0fQG/xWNqAFAC5ugtFyPO4JJR1KyyfQAyzR8W0fTRrC91A8Wej4BntFzcvETdCSDa/4PnNYJQLYiA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", - "diff": "^3.2.0", + "diff": "^4.0.1", "glob": "^7.1.1", - "js-yaml": "^3.13.0", + "js-yaml": "^3.13.1", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", + "mkdirp": "^0.5.3", "resolve": "^1.3.2", "semver": "^5.3.0", - "tslib": "^1.8.0", + "tslib": "^1.10.0", "tsutils": "^2.29.0" }, "dependencies": { - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true } } }, @@ -8084,32 +9248,34 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "uglify-js": { - "version": "3.5.15", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.15.tgz", - "integrity": "sha512-fe7aYFotptIddkwcm6YuA0HmknBZ52ZzOsUxZEdhhkSsz7RfjHDX2QDxwKTiv4JQ5t5NhfmpgAK+J7LiDhKSqg==", + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "optional": true, "requires": { - "commander": "~2.20.0", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } + "is-typedarray": "^1.0.0" } }, + "uglify-js": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.0.tgz", + "integrity": "sha512-Esj5HG5WAyrLIdYU74Z3JdG2PxdIusvj6IWHMtlyESxc7kcDz7zYlYjpnSokn1UbpV0d/QX9fan7gkCNd/9BQA==", + "dev": true, + "optional": true + }, "uid-number": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", @@ -8122,55 +9288,16 @@ "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", "dev": true }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", - "dev": true, - "requires": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" - } - }, "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } + "set-value": "^2.0.1" } }, "unique-filename": { @@ -8183,21 +9310,30 @@ } }, "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { "imurmurhash": "^0.1.4" } }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "universal-user-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-2.1.0.tgz", - "integrity": "sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", + "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", "dev": true, "requires": { - "os-name": "^3.0.0" + "os-name": "^3.1.0" } }, "universalify": { @@ -8246,6 +9382,85 @@ } } }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "update-notifier": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", + "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -8261,11 +9476,14 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha1-/FZaPMy/93MMd19WQflVV5FDnyE=", - "dev": true + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } }, "use": { "version": "3.1.1", @@ -8279,21 +9497,21 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "v8flags": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz", - "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==", + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "object.getownpropertydescriptors": "^2.0.3" } }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -8340,9 +9558,9 @@ "dev": true }, "whatwg-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", - "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { "lodash.sortby": "^4.7.0", @@ -8350,12 +9568,6 @@ "webidl-conversions": "^4.0.2" } }, - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=", - "dev": true - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -8380,29 +9592,113 @@ "string-width": "^1.0.2 || 2" } }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "requires": { + "string-width": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "windows-release": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", - "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.1.tgz", + "integrity": "sha512-Pngk/RDCaI/DkuHPlGTdIkDiTAnAkyMjoQMZqRsxydNl1qGXNIoZrB7RK8g53F2tEgQBMqQJHQdYZuQEEAu54A==", "dev": true, "requires": { "execa": "^1.0.0" } }, "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } } }, "wrappy": { @@ -8423,23 +9719,33 @@ } }, "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", "dev": true, "requires": { "detect-indent": "^5.0.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "pify": "^3.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.0.0" + "write-file-atomic": "^2.4.2" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } @@ -8452,12 +9758,40 @@ "requires": { "sort-keys": "^2.0.0", "write-json-file": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "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" + } + } } }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { @@ -8467,129 +9801,72 @@ "dev": true }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", "dev": true, "requires": { - "cliui": "^4.0.0", + "cliui": "^5.0.0", "decamelize": "^1.2.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } } } } diff --git a/package.json b/package.json index 6da4a99485..ef1b89b01a 100644 --- a/package.json +++ b/package.json @@ -12,25 +12,28 @@ "url": "https://feathersjs.com" }, "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "bugs": { "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 8" + "node": ">= 10" }, "scripts": { "install": "lerna bootstrap", - "publish": "lerna publish && git commit -am \"Update version and changelog\" && git push origin master", + "publish": "lerna publish && git commit -am \"chore: Update version and changelog\" && git push origin master", "lint": "tslint 'packages/**/*.js' 'packages/**/*.ts' -c tslint.json --fix", - "test": "npm run lint && nyc lerna run test", - "test:client": "grunt" + "update-dependencies": "ncu -u && lerna exec -- ncu -u", + "clean": "find . -name node_modules -exec rm -rf '{}' + && find . -name package-lock.json -exec rm -rf '{}' +", + "test": "npm run lint && nyc lerna run test" }, "devDependencies": { - "grunt": "^1.0.4", - "grunt-cli": "^1.3.2", - "grunt-saucelabs": "^9.0.1", - "lerna": "^3.13.1", - "nyc": "^14.0.0", - "tslint": "^5.15.0" + "lerna": "^3.22.1", + "npm-check-updates": "^7.0.1", + "nyc": "^15.1.0", + "tslint": "^6.1.2" } } diff --git a/packages/adapter-commons/.npmignore b/packages/adapter-commons/.npmignore deleted file mode 100644 index 65e3ba2eda..0000000000 --- a/packages/adapter-commons/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test/ diff --git a/packages/adapter-commons/CHANGELOG.md b/packages/adapter-commons/CHANGELOG.md deleted file mode 100644 index e5737e3c4b..0000000000 --- a/packages/adapter-commons/CHANGELOG.md +++ /dev/null @@ -1,176 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - - -### Bug Fixes - -* Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - - - - - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -**Note:** Version bump only for package @feathersjs/adapter-commons - - - - - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/adapter-commons - - - - - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - - -### Bug Fixes - -* Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) -* **adapter-commons:** Keep Symbols when filtering a query ([#1141](https://github.com/feathersjs/feathers/issues/1141)) ([c9f55d8](https://github.com/feathersjs/feathers/commit/c9f55d8)) -* **chore:** Add .npmignore to adapter-commons ([8e129d8](https://github.com/feathersjs/feathers/commit/8e129d8)) -* Add whitelist and filter support to common adapter service ([#1132](https://github.com/feathersjs/feathers/issues/1132)) ([df1daaa](https://github.com/feathersjs/feathers/commit/df1daaa)) -* Fix AdapterService multi option when set to true ([#1134](https://github.com/feathersjs/feathers/issues/1134)) ([40402fc](https://github.com/feathersjs/feathers/commit/40402fc)) -* Throw error in `filterQuery` when query parameter is unknown ([#1131](https://github.com/feathersjs/feathers/issues/1131)) ([cd1a183](https://github.com/feathersjs/feathers/commit/cd1a183)) -* Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) -* Update adapter common tests to check for falsy ([#1140](https://github.com/feathersjs/feathers/issues/1140)) ([2856722](https://github.com/feathersjs/feathers/commit/2856722)) - - -### chore - -* **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - - -### Features - -* Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -* Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) -* Common database adapter utilities and test suite ([#1130](https://github.com/feathersjs/feathers/issues/1130)) ([17b3dc8](https://github.com/feathersjs/feathers/commit/17b3dc8)) - - -### BREAKING CHANGES - -* **package:** Removes adapter tests from @feathersjs/adapter-commons -* Move database adapter utilities from @feathersjs/commons into its own module - - - - - -# [2.0.0](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.7...@feathersjs/adapter-commons@2.0.0) (2019-01-10) - - -### chore - -* **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - - -### BREAKING CHANGES - -* **package:** Removes adapter tests from @feathersjs/adapter-commons - - - - - -## [1.0.7](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.6...@feathersjs/adapter-commons@1.0.7) (2019-01-02) - - -### Bug Fixes - -* **chore:** Add .npmignore to adapter-commons ([8e129d8](https://github.com/feathersjs/feathers/commit/8e129d8)) - - - - - -## [1.0.6](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.5...@feathersjs/adapter-commons@1.0.6) (2018-12-21) - - -### Bug Fixes - -* **adapter-commons:** Keep Symbols when filtering a query ([#1141](https://github.com/feathersjs/feathers/issues/1141)) ([c9f55d8](https://github.com/feathersjs/feathers/commit/c9f55d8)) - - - - - -## [1.0.5](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.4...@feathersjs/adapter-commons@1.0.5) (2018-12-20) - - -### Bug Fixes - -* Update adapter common tests to check for falsy ([#1140](https://github.com/feathersjs/feathers/issues/1140)) ([2856722](https://github.com/feathersjs/feathers/commit/2856722)) - - - - - -## [1.0.4](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.3...@feathersjs/adapter-commons@1.0.4) (2018-12-17) - - -### Bug Fixes - -* Update adapter common tests ([#1135](https://github.com/feathersjs/feathers/issues/1135)) ([8166dda](https://github.com/feathersjs/feathers/commit/8166dda)) - - - - - - -## [1.0.3](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.2...@feathersjs/adapter-commons@1.0.3) (2018-12-17) - - -### Bug Fixes - -* Fix AdapterService multi option when set to true ([#1134](https://github.com/feathersjs/feathers/issues/1134)) ([40402fc](https://github.com/feathersjs/feathers/commit/40402fc)) - - - - - - -## [1.0.2](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.1...@feathersjs/adapter-commons@1.0.2) (2018-12-17) - - -### Bug Fixes - -* Add whitelist and filter support to common adapter service ([#1132](https://github.com/feathersjs/feathers/issues/1132)) ([df1daaa](https://github.com/feathersjs/feathers/commit/df1daaa)) - - - - - - -## [1.0.1](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-commons@1.0.0...@feathersjs/adapter-commons@1.0.1) (2018-12-17) - - -### Bug Fixes - -* Throw error in `filterQuery` when query parameter is unknown ([#1131](https://github.com/feathersjs/feathers/issues/1131)) ([cd1a183](https://github.com/feathersjs/feathers/commit/cd1a183)) - - - - - - -# 1.0.0 (2018-12-16) - - -### Features - -* Common database adapter utilities and test suite ([#1130](https://github.com/feathersjs/feathers/issues/1130)) ([17b3dc8](https://github.com/feathersjs/feathers/commit/17b3dc8)) - - -### BREAKING CHANGES - -* Move database adapter utilities from @feathersjs/commons into its own module diff --git a/packages/adapter-commons/LICENSE b/packages/adapter-commons/LICENSE deleted file mode 100644 index 6bfc0adefc..0000000000 --- a/packages/adapter-commons/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Feathers - -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/adapter-commons/README.md b/packages/adapter-commons/README.md deleted file mode 100644 index f797e4658a..0000000000 --- a/packages/adapter-commons/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Feathers Adapter Commons - -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) -[![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/adapter-commons)](https://david-dm.org/feathersjs/feathers?path=packages/adapter-commons) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-commons) - -> Shared utility functions for Feathers adatabase adapters - -## About - -This is a repository for handling Feathers common database syntax. - - -## Authors - -[Feathers contributors](https://github.com/feathersjs/adapter-commons/graphs/contributors) - -## License - -Copyright (c) 2018 Feathers contributors - -Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-commons/lib/filter-query.js b/packages/adapter-commons/lib/filter-query.js deleted file mode 100644 index 6f63677cbb..0000000000 --- a/packages/adapter-commons/lib/filter-query.js +++ /dev/null @@ -1,112 +0,0 @@ -const { _ } = require('@feathersjs/commons'); -const { BadRequest } = require('@feathersjs/errors'); - -function parse (number) { - if (typeof number !== 'undefined') { - return Math.abs(parseInt(number, 10)); - } -} - -// Returns the pagination limit and will take into account the -// default and max pagination settings -function getLimit (limit, paginate) { - if (paginate && paginate.default) { - const lower = typeof limit === 'number' ? limit : paginate.default; - const upper = typeof paginate.max === 'number' ? paginate.max : Number.MAX_VALUE; - - return Math.min(lower, upper); - } - - return limit; -} - -// Makes sure that $sort order is always converted to an actual number -function convertSort (sort) { - if (typeof sort !== 'object' || Array.isArray(sort)) { - return sort; - } - - return Object.keys(sort).reduce((result, key) => { - result[key] = typeof sort[key] === 'object' - ? sort[key] : parseInt(sort[key], 10); - - return result; - }, {}); -} - -function cleanQuery (query, operators, filters) { - if (_.isObject(query) && query.constructor === {}.constructor) { - const result = {}; - - _.each(query, (value, key) => { - if (key[0] === '$') { - if (filters[key] !== undefined) { - return; - } - - if (!operators.includes(key)) { - throw new BadRequest(`Invalid query parameter ${key}`, query); - } - } - - result[key] = cleanQuery(value, operators, filters); - }); - - Object.getOwnPropertySymbols(query).forEach(symbol => { - result[symbol] = query[symbol]; - }); - - return result; - } - - return query; -} - -function assignFilters (object, query, filters, options) { - if (Array.isArray(filters)) { - _.each(filters, (key) => { - if (query[key] !== undefined) { - object[key] = query[key]; - } - }); - } else { - _.each(filters, (converter, key) => { - const converted = converter(query[key], options); - - if (converted !== undefined) { - object[key] = converted; - } - }); - } - - return object; -} - -const FILTERS = { - $sort: (value) => convertSort(value), - $limit: (value, options) => getLimit(parse(value), options.paginate), - $skip: (value) => parse(value), - $select: (value) => value -}; - -const OPERATORS = ['$in', '$nin', '$lt', '$lte', '$gt', '$gte', '$ne', '$or']; - -// Converts Feathers special query parameters and pagination settings -// and returns them separately a `filters` and the rest of the query -// as `query` -module.exports = function filterQuery (query, options = {}) { - const { - filters: additionalFilters = {}, - operators: additionalOperators = [] - } = options; - const result = {}; - - result.filters = assignFilters({}, query, FILTERS, options); - result.filters = assignFilters(result.filters, query, additionalFilters, options); - - result.query = cleanQuery(query, OPERATORS.concat(additionalOperators), result.filters); - - return result; -}; - -Object.assign(module.exports, { OPERATORS, FILTERS }); diff --git a/packages/adapter-commons/lib/index.js b/packages/adapter-commons/lib/index.js deleted file mode 100644 index ee2ab501e1..0000000000 --- a/packages/adapter-commons/lib/index.js +++ /dev/null @@ -1,38 +0,0 @@ -const { _ } = require('@feathersjs/commons'); - -const AdapterService = require('./service'); -const filterQuery = require('./filter-query'); -const sort = require('./sort'); - -// Return a function that filters a result object or array -// and picks only the fields passed as `params.query.$select` -// and additional `otherFields` -const select = function select (params, ...otherFields) { - const fields = params && params.query && params.query.$select; - - if (Array.isArray(fields) && otherFields.length) { - fields.push(...otherFields); - } - - const convert = result => { - if (!Array.isArray(fields)) { - return result; - } - - return _.pick(result, ...fields); - }; - - return result => { - if (Array.isArray(result)) { - return result.map(convert); - } - - return convert(result); - }; -}; - -module.exports = Object.assign({ - select, - filterQuery, - AdapterService -}, sort); diff --git a/packages/adapter-commons/lib/service.js b/packages/adapter-commons/lib/service.js deleted file mode 100644 index 2e2780075a..0000000000 --- a/packages/adapter-commons/lib/service.js +++ /dev/null @@ -1,92 +0,0 @@ -const { NotImplemented, BadRequest, MethodNotAllowed } = require('@feathersjs/errors'); -const filterQuery = require('./filter-query'); - -const callMethod = (self, name, ...args) => { - if (typeof self[name] !== 'function') { - return Promise.reject(new NotImplemented(`Method ${name} not available`)); - } - - return self[name](...args); -}; - -const checkMulti = (method, option) => { - if (option === true) { - return true; - } - - return Array.isArray(option) ? option.includes(method) : false; -}; - -module.exports = class AdapterService { - constructor (options) { - this.options = Object.assign({ - events: [], - paginate: {}, - multi: false - }, options); - } - - get id () { - return this.options.id; - } - - get events () { - return this.options.events; - } - - filterQuery (params = {}, opts = {}) { - const paginate = typeof params.paginate !== 'undefined' - ? params.paginate : this.options.paginate; - const { query = {} } = params; - const options = Object.assign({ - operators: this.options.whitelist || [], - filters: this.options.filters, - paginate - }, opts); - const result = filterQuery(query, options); - - return Object.assign(result, { paginate }); - } - - find (params) { - return callMethod(this, '_find', params); - } - - get (id, params) { - return callMethod(this, '_get', id, params); - } - - create (data, params) { - if (Array.isArray(data) && !checkMulti('create', this.options.multi)) { - return Promise.reject(new MethodNotAllowed(`Can not create multiple entries`)); - } - - return callMethod(this, '_create', data, params); - } - - update (id, data, params) { - if (id === null || Array.isArray(data)) { - return Promise.reject(new BadRequest( - `You can not replace multiple instances. Did you mean 'patch'?` - )); - } - - return callMethod(this, '_update', id, data, params); - } - - patch (id, data, params) { - if (id === null && !checkMulti('patch', this.options.multi)) { - return Promise.reject(new MethodNotAllowed(`Can not patch multiple entries`)); - } - - return callMethod(this, '_patch', id, data, params); - } - - remove (id, data, params) { - if (id === null && !checkMulti('remove', this.options.multi)) { - return Promise.reject(new MethodNotAllowed(`Can not remove multiple entries`)); - } - - return callMethod(this, '_remove', id, data, params); - } -}; diff --git a/packages/adapter-commons/lib/sort.js b/packages/adapter-commons/lib/sort.js deleted file mode 100644 index a1aba4fde6..0000000000 --- a/packages/adapter-commons/lib/sort.js +++ /dev/null @@ -1,93 +0,0 @@ -// Sorting algorithm taken from NeDB (https://github.com/louischatriot/nedb) -// See https://github.com/louischatriot/nedb/blob/e3f0078499aa1005a59d0c2372e425ab789145c1/lib/model.js#L189 - -exports.compareNSB = function (a, b) { - if (a < b) { return -1; } - if (a > b) { return 1; } - return 0; -}; - -exports.compareArrays = function (a, b) { - var i; - var comp; - - for (i = 0; i < Math.min(a.length, b.length); i += 1) { - comp = exports.compare(a[i], b[i]); - - if (comp !== 0) { return comp; } - } - - // Common section was identical, longest one wins - return exports.compareNSB(a.length, b.length); -}; - -exports.compare = function (a, b, compareStrings = exports.compareNSB) { - const { compareNSB, compare, compareArrays } = exports; - - // undefined - if (a === undefined) { return b === undefined ? 0 : -1; } - if (b === undefined) { return a === undefined ? 0 : 1; } - - // null - if (a === null) { return b === null ? 0 : -1; } - if (b === null) { return a === null ? 0 : 1; } - - // Numbers - if (typeof a === 'number') { return typeof b === 'number' ? compareNSB(a, b) : -1; } - if (typeof b === 'number') { return typeof a === 'number' ? compareNSB(a, b) : 1; } - - // Strings - if (typeof a === 'string') { return typeof b === 'string' ? compareStrings(a, b) : -1; } - if (typeof b === 'string') { return typeof a === 'string' ? compareStrings(a, b) : 1; } - - // Booleans - if (typeof a === 'boolean') { return typeof b === 'boolean' ? compareNSB(a, b) : -1; } - if (typeof b === 'boolean') { return typeof a === 'boolean' ? compareNSB(a, b) : 1; } - - // Dates - if (a instanceof Date) { return b instanceof Date ? compareNSB(a.getTime(), b.getTime()) : -1; } - if (b instanceof Date) { return a instanceof Date ? compareNSB(a.getTime(), b.getTime()) : 1; } - - // Arrays (first element is most significant and so on) - if (Array.isArray(a)) { return Array.isArray(b) ? compareArrays(a, b) : -1; } - if (Array.isArray(b)) { return Array.isArray(a) ? compareArrays(a, b) : 1; } - - // Objects - const aKeys = Object.keys(a).sort(); - const bKeys = Object.keys(b).sort(); - let comp = 0; - - for (let i = 0; i < Math.min(aKeys.length, bKeys.length); i += 1) { - comp = compare(a[aKeys[i]], b[bKeys[i]]); - - if (comp !== 0) { return comp; } - } - - return compareNSB(aKeys.length, bKeys.length); -}; - -// An in-memory sorting function according to the -// $sort special query parameter -exports.sorter = function ($sort) { - const criteria = Object.keys($sort).map(key => { - const direction = $sort[key]; - - return { key, direction }; - }); - - return function (a, b) { - let compare; - - for (let i = 0; i < criteria.length; i++) { - const criterion = criteria[i]; - - compare = criterion.direction * exports.compare(a[criterion.key], b[criterion.key]); - - if (compare !== 0) { - return compare; - } - } - - return 0; - }; -}; diff --git a/packages/adapter-commons/package.json b/packages/adapter-commons/package.json deleted file mode 100644 index 2fddc9e49d..0000000000 --- a/packages/adapter-commons/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "@feathersjs/adapter-commons", - "version": "4.0.0-pre.3", - "description": "Shared database adapter utility functions", - "homepage": "https://feathersjs.com", - "keywords": [ - "feathers" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git" - }, - "author": { - "name": "Feathers contributor", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 6" - }, - "main": "lib/index.js", - "scripts": { - "test": "mocha --opts ../../mocha.opts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "devDependencies": { - "mocha": "^6.1.4", - "mongodb": "^3.2.6" - }, - "dependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", - "@feathersjs/errors": "^4.0.0-pre.3" - }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" -} diff --git a/packages/adapter-commons/test/commons.test.js b/packages/adapter-commons/test/commons.test.js deleted file mode 100644 index fb818af934..0000000000 --- a/packages/adapter-commons/test/commons.test.js +++ /dev/null @@ -1,72 +0,0 @@ -const assert = require('assert'); -const { select } = require('../lib'); - -describe('@feathersjs/adapter-commons', () => { - describe('select', () => { - it('select', () => { - const selector = select({ - query: { $select: ['name', 'age'] } - }); - - return Promise.resolve({ - name: 'David', - age: 3, - test: 'me' - }).then(selector).then(result => assert.deepStrictEqual(result, { - name: 'David', - age: 3 - })); - }); - - it('select with arrays', () => { - const selector = select({ - query: { $select: ['name', 'age'] } - }); - - return Promise.resolve([{ - name: 'David', - age: 3, - test: 'me' - }, { - name: 'D', - age: 4, - test: 'you' - }]).then(selector).then(result => assert.deepStrictEqual(result, [{ - name: 'David', - age: 3 - }, { - name: 'D', - age: 4 - }])); - }); - - it('select with no query', () => { - const selector = select({}); - const data = { - name: 'David' - }; - - return Promise.resolve(data).then(selector).then(result => - assert.deepStrictEqual(result, data) - ); - }); - - it('select with other fields', () => { - const selector = select({ - query: { $select: [ 'name' ] } - }, 'id'); - const data = { - id: 'me', - name: 'David', - age: 10 - }; - - return Promise.resolve(data) - .then(selector) - .then(result => assert.deepStrictEqual(result, { - id: 'me', - name: 'David' - })); - }); - }); -}); diff --git a/packages/adapter-commons/test/filter-query.test.js b/packages/adapter-commons/test/filter-query.test.js deleted file mode 100644 index 585bcae206..0000000000 --- a/packages/adapter-commons/test/filter-query.test.js +++ /dev/null @@ -1,233 +0,0 @@ -const assert = require('assert'); -const { ObjectId } = require('mongodb'); -const { filterQuery } = require('../lib'); - -describe('@feathersjs/adapter-commons/filterQuery', () => { - describe('$sort', () => { - it('returns $sort when present in query', () => { - const originalQuery = { $sort: { name: 1 } }; - const { filters, query } = filterQuery(originalQuery); - - assert.strictEqual(filters.$sort.name, 1); - assert.deepStrictEqual(query, {}); - assert.deepStrictEqual(originalQuery, { - $sort: { name: 1 } - }, 'does not modify original query'); - }); - - it('returns $sort when present in query as an object', () => { - const { filters, query } = filterQuery({ $sort: { name: { something: 10 } } }); - - assert.strictEqual(filters.$sort.name.something, 10); - assert.deepStrictEqual(query, {}); - }); - - it('converts strings in $sort', () => { - const { filters, query } = filterQuery({ $sort: { test: '-1' } }); - - assert.strictEqual(filters.$sort.test, -1); - assert.deepStrictEqual(query, {}); - }); - - it('does not convert $sort arrays', () => { - const $sort = [ [ 'test', '-1' ], [ 'a', '1' ] ]; - const { filters, query } = filterQuery({ $sort }); - - assert.strictEqual(filters.$sort, $sort); - assert.deepStrictEqual(query, {}); - }); - - it('throws an error when special parameter is not known', () => { - try { - const query = { $foo: 1 }; - filterQuery(query); - assert.ok(false, 'Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'BadRequest'); - assert.strictEqual(error.message, 'Invalid query parameter $foo'); - } - }); - - it('returns undefined when not present in query', () => { - const query = { foo: 1 }; - const { filters } = filterQuery(query); - - assert.strictEqual(filters.$sort, undefined); - }); - }); - - describe('$limit', () => { - beforeEach(() => { - this.query = { $limit: 1 }; - }); - - it('returns $limit when present in query', () => { - const { filters, query } = filterQuery(this.query); - - assert.strictEqual(filters.$limit, 1); - assert.deepStrictEqual(query, {}); - }); - - it('returns undefined when not present in query', () => { - const query = { foo: 1 }; - const { filters } = filterQuery(query); - - assert.strictEqual(filters.$limit, undefined); - }); - - it('removes $limit from query when present', () => { - assert.deepStrictEqual(filterQuery(this.query).query, {}); - }); - - it('parses $limit strings into integers (#4)', () => { - const { filters } = filterQuery({ $limit: '2' }); - - assert.strictEqual(filters.$limit, 2); - }); - - it('allows $limit 0', () => { - const { filters } = filterQuery({ $limit: 0 }, { default: 10 }); - - assert.strictEqual(filters.$limit, 0); - }); - - describe('pagination', () => { - it('limits with default pagination', () => { - const { filters } = filterQuery({}, { paginate: { default: 10 } }); - - assert.strictEqual(filters.$limit, 10); - }); - - it('limits with max pagination', () => { - const { filters } = filterQuery({ $limit: 20 }, { paginate: { default: 5, max: 10 } }); - const { filters: filtersNeg } = filterQuery({ $limit: -20 }, { paginate: { default: 5, max: 10 } }); - - assert.strictEqual(filters.$limit, 10); - assert.strictEqual(filtersNeg.$limit, 10); - }); - }); - }); - - describe('$skip', () => { - beforeEach(() => { - this.query = { $skip: 1 }; - }); - - it('returns $skip when present in query', () => { - const { filters } = filterQuery(this.query); - - assert.strictEqual(filters.$skip, 1); - }); - - it('removes $skip from query when present', () => { - assert.deepStrictEqual(filterQuery(this.query).query, {}); - }); - - it('returns undefined when not present in query', () => { - const query = { foo: 1 }; - const { filters } = filterQuery(query); - - assert.strictEqual(filters.$skip, undefined); - }); - - it('parses $skip strings into integers (#4)', () => { - const { filters } = filterQuery({ $skip: '33' }); - - assert.strictEqual(filters.$skip, 33); - }); - }); - - describe('$select', () => { - beforeEach(() => { - this.query = { $select: 1 }; - }); - - it('returns $select when present in query', () => { - const { filters } = filterQuery(this.query); - - assert.strictEqual(filters.$select, 1); - }); - - it('removes $select from query when present', () => { - assert.deepStrictEqual(filterQuery(this.query).query, {}); - }); - - it('returns undefined when not present in query', () => { - const query = { foo: 1 }; - const { filters } = filterQuery(query); - - assert.strictEqual(filters.$select, undefined); - }); - - it('includes Symbols', () => { - const TEST = Symbol('testing'); - const original = { - [TEST]: 'message', - other: true, - sub: { [TEST]: 'othermessage' } - }; - - const { query } = filterQuery(original); - - assert.deepStrictEqual(query, { - [TEST]: 'message', - other: true, - sub: { [TEST]: 'othermessage' } - }); - }); - - it('only converts plain objects', () => { - const userId = ObjectId(); - const original = { - userId - }; - - const { query } = filterQuery(original); - - assert.deepStrictEqual(query, original); - }); - }); - - describe('additional filters', () => { - it('throw error when not set as additionals', () => { - try { - filterQuery({ $select: 1, $known: 1 }); - assert.ok(false, 'Should never get here'); - } catch (error) { - assert.strictEqual(error.message, 'Invalid query parameter $known'); - } - }); - - it('returns default and known additional filters (array)', () => { - const query = { $select: ['a', 'b'], $known: 1, $unknown: 1 }; - const { filters } = filterQuery(query, { filters: [ '$known', '$unknown' ] }); - - assert.strictEqual(filters.$unknown, 1); - assert.strictEqual(filters.$known, 1); - assert.deepStrictEqual(filters.$select, [ 'a', 'b' ]); - }); - - it('returns default and known additional filters (object)', () => { - const { filters } = filterQuery({ - $known: 1, - $select: 1 - }, { filters: { $known: (value) => value.toString() } }); - - assert.strictEqual(filters.$unknown, undefined); - assert.strictEqual(filters.$known, '1'); - assert.strictEqual(filters.$select, 1); - }); - }); - - describe('additional operators', () => { - it('returns query with default and known additional operators', () => { - const { query } = filterQuery({ - $ne: 1, $known: 1 - }, { operators: [ '$known' ] }); - - assert.strictEqual(query.$ne, 1); - assert.strictEqual(query.$known, 1); - assert.strictEqual(query.$unknown, undefined); - }); - }); -}); diff --git a/packages/adapter-commons/test/service.test.js b/packages/adapter-commons/test/service.test.js deleted file mode 100644 index 712cc771fb..0000000000 --- a/packages/adapter-commons/test/service.test.js +++ /dev/null @@ -1,136 +0,0 @@ -const assert = require('assert'); -const { NotImplemented } = require('@feathersjs/errors'); -const { AdapterService } = require('../lib'); -const METHODS = [ 'find', 'get', 'create', 'update', 'patch', 'remove' ]; - -describe('@feathersjs/adapter-commons/service', () => { - class CustomService extends AdapterService { - } - - describe('errors when method does not exit', () => { - METHODS.forEach(method => { - it(`${method}`, () => { - const service = new CustomService(); - - return service[method]().then(() => { - throw new Error('Should never get here'); - }).catch(error => { - assert.ok(error instanceof NotImplemented); - assert.strictEqual(error.message, `Method _${method} not available`); - }); - }); - }); - }); - - describe('works when methods exist', () => { - class MethodService extends AdapterService { - _find () { - return Promise.resolve([]); - } - - _get (id) { - return Promise.resolve({ id }); - } - - _create (data) { - return Promise.resolve(data); - } - - _update (id) { - return Promise.resolve({ id }); - } - - _patch (id) { - return Promise.resolve({ id }); - } - - _remove (id) { - return Promise.resolve({ id }); - } - } - - METHODS.forEach(method => { - it(`${method}`, () => { - const service = new MethodService(); - const args = []; - - if (method !== 'find') { - args.push('test'); - } - - if (method === 'update' || method === 'patch') { - args.push({}); - } - - return service[method](...args); - }); - }); - - it('does not allow multi patch', () => { - const service = new MethodService(); - - return service.patch(null, {}) - .then(() => assert.ok(false)) - .catch(error => { - assert.strictEqual(error.name, 'MethodNotAllowed'); - assert.strictEqual(error.message, 'Can not patch multiple entries'); - }); - }); - - it('does not allow multi remove', () => { - const service = new MethodService(); - - return service.remove(null, {}) - .then(() => assert.ok(false)) - .catch(error => { - assert.strictEqual(error.name, 'MethodNotAllowed'); - assert.strictEqual(error.message, 'Can not remove multiple entries'); - }); - }); - - it('does not allow multi create', () => { - const service = new MethodService(); - - return service.create([]) - .then(() => assert.ok(false)) - .catch(error => { - assert.strictEqual(error.name, 'MethodNotAllowed'); - assert.strictEqual(error.message, 'Can not create multiple entries'); - }); - }); - - it('multi can be set to true', () => { - const service = new MethodService(); - - service.options.multi = true; - - return service.create([]) - .then(() => assert.ok(true)); - }); - }); - - it('filterQuery', () => { - const service = new CustomService({ - whitelist: [ '$something' ] - }); - const filtered = service.filterQuery({ - query: { $limit: 10, test: 'me' } - }); - - assert.deepStrictEqual(filtered, { - paginate: {}, - filters: { $limit: 10 }, - query: { test: 'me' } - }); - - const withWhitelisted = service.filterQuery({ - query: { $limit: 10, $something: 'else' } - }); - - assert.deepStrictEqual(withWhitelisted, { - paginate: {}, - filters: { $limit: 10 }, - query: { $something: 'else' } - }); - }); -}); diff --git a/packages/adapter-commons/test/sort.test.js b/packages/adapter-commons/test/sort.test.js deleted file mode 100644 index 8f8221dbee..0000000000 --- a/packages/adapter-commons/test/sort.test.js +++ /dev/null @@ -1,180 +0,0 @@ -/* eslint-disable no-unused-expressions */ -const assert = require('assert'); -const { sorter } = require('../lib'); - -describe('@feathersjs/adapter-commons', () => { - describe('sorter', () => { - it('simple sorter', () => { - const array = [{ - name: 'David' - }, { - name: 'Eric' - }]; - - const sort = sorter({ - name: -1 - }); - - assert.deepStrictEqual(array.sort(sort), [{ - name: 'Eric' - }, { - name: 'David' - }]); - }); - - it('simple sorter with arrays', () => { - const array = [{ - names: [ 'a', 'b' ] - }, { - names: [ 'c', 'd' ] - }]; - - const sort = sorter({ - names: -1 - }); - - assert.deepStrictEqual(array.sort(sort), [{ - names: [ 'c', 'd' ] - }, { - names: [ 'a', 'b' ] - }]); - }); - - it('simple sorter with objects', () => { - const array = [{ - names: { - first: 'Dave', - last: 'L' - } - }, { - names: { - first: 'A', - last: 'B' - } - }]; - - const sort = sorter({ - names: 1 - }); - - assert.deepStrictEqual(array.sort(sort), [{ - names: { - first: 'A', - last: 'B' - } - }, { - names: { - first: 'Dave', - last: 'L' - } - }]); - }); - - it('two property sorter', () => { - const array = [{ - name: 'David', - counter: 0 - }, { - name: 'Eric', - counter: 1 - }, { - name: 'David', - counter: 1 - }, { - name: 'Eric', - counter: 0 - }]; - - const sort = sorter({ - name: -1, - counter: 1 - }); - - assert.deepStrictEqual(array.sort(sort), [ - { name: 'Eric', counter: 0 }, - { name: 'Eric', counter: 1 }, - { name: 'David', counter: 0 }, - { name: 'David', counter: 1 } - ]); - }); - - it('two property sorter with names', () => { - const array = [{ - name: 'David', - counter: 0 - }, { - name: 'Eric', - counter: 1 - }, { - name: 'Andrew', - counter: 1 - }, { - name: 'David', - counter: 1 - }, { - name: 'Andrew', - counter: 0 - }, { - name: 'Eric', - counter: 0 - }]; - - const sort = sorter({ - name: -1, - counter: 1 - }); - - assert.deepStrictEqual(array.sort(sort), [ - { name: 'Eric', counter: 0 }, - { name: 'Eric', counter: 1 }, - { name: 'David', counter: 0 }, - { name: 'David', counter: 1 }, - { name: 'Andrew', counter: 0 }, - { name: 'Andrew', counter: 1 } - ]); - }); - - it('three property sorter with names', () => { - const array = [{ - name: 'David', - counter: 0, - age: 2 - }, { - name: 'Eric', - counter: 1, - age: 2 - }, { - name: 'David', - counter: 1, - age: 1 - }, { - name: 'Eric', - counter: 0, - age: 1 - }, { - name: 'Andrew', - counter: 0, - age: 2 - }, { - name: 'Andrew', - counter: 0, - age: 1 - }]; - - const sort = sorter({ - name: -1, - counter: 1, - age: -1 - }); - - assert.deepStrictEqual(array.sort(sort), [ - { name: 'Eric', counter: 0, age: 1 }, - { name: 'Eric', counter: 1, age: 2 }, - { name: 'David', counter: 0, age: 2 }, - { name: 'David', counter: 1, age: 1 }, - { name: 'Andrew', counter: 0, age: 2 }, - { name: 'Andrew', counter: 0, age: 1 } - ]); - }); - }); -}); diff --git a/packages/adapter-tests/.npmignore b/packages/adapter-tests/.npmignore deleted file mode 100644 index 65e3ba2eda..0000000000 --- a/packages/adapter-tests/.npmignore +++ /dev/null @@ -1 +0,0 @@ -test/ diff --git a/packages/adapter-tests/CHANGELOG.md b/packages/adapter-tests/CHANGELOG.md deleted file mode 100644 index 4ea95bd928..0000000000 --- a/packages/adapter-tests/CHANGELOG.md +++ /dev/null @@ -1,83 +0,0 @@ -# Change Log - -All notable changes to this project will be documented in this file. -See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. - -# [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) - - -### Bug Fixes - -* Update dependencies and fix tests ([#1373](https://github.com/feathersjs/feathers/issues/1373)) ([d743a7f](https://github.com/feathersjs/feathers/commit/d743a7f)) - - - - - -# [4.0.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.1...v4.0.0-pre.2) (2019-05-15) - -**Note:** Version bump only for package @feathersjs/adapter-tests - - - - - -# [4.0.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.0...v4.0.0-pre.1) (2019-05-08) - -**Note:** Version bump only for package @feathersjs/adapter-tests - - - - - -# [4.0.0-pre.0](https://github.com/feathersjs/feathers/compare/v3.2.0-pre.1...v4.0.0-pre.0) (2019-04-21) - - -### Bug Fixes - -* Add test to make sure different id in adapter query works ([#1165](https://github.com/feathersjs/feathers/issues/1165)) ([0ba4580](https://github.com/feathersjs/feathers/commit/0ba4580)) -* Update adapter tests to not rely on error instance ([#1202](https://github.com/feathersjs/feathers/issues/1202)) ([6885e0e](https://github.com/feathersjs/feathers/commit/6885e0e)) -* Update all dependencies to latest ([#1206](https://github.com/feathersjs/feathers/issues/1206)) ([e51e0f6](https://github.com/feathersjs/feathers/commit/e51e0f6)) - - -### chore - -* **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - - -### Features - -* Add TypeScript definitions ([#1275](https://github.com/feathersjs/feathers/issues/1275)) ([9dd6713](https://github.com/feathersjs/feathers/commit/9dd6713)) -* Authentication v3 core server implementation ([#1205](https://github.com/feathersjs/feathers/issues/1205)) ([1bd7591](https://github.com/feathersjs/feathers/commit/1bd7591)) - - -### BREAKING CHANGES - -* **package:** Removes adapter tests from @feathersjs/adapter-commons - - - - - -## [1.0.1](https://github.com/feathersjs/feathers/compare/@feathersjs/adapter-tests@1.0.0...@feathersjs/adapter-tests@1.0.1) (2019-01-10) - - -### Bug Fixes - -* Add test to make sure different id in adapter query works ([#1165](https://github.com/feathersjs/feathers/issues/1165)) ([0ba4580](https://github.com/feathersjs/feathers/commit/0ba4580)) - - - - - -# 1.0.0 (2019-01-10) - - -### chore - -* **package:** Move adapter tests into their own module ([#1164](https://github.com/feathersjs/feathers/issues/1164)) ([dcc1e6b](https://github.com/feathersjs/feathers/commit/dcc1e6b)) - - -### BREAKING CHANGES - -* **package:** Removes adapter tests from @feathersjs/adapter-commons diff --git a/packages/adapter-tests/LICENSE b/packages/adapter-tests/LICENSE deleted file mode 100644 index dcd8248aa9..0000000000 --- a/packages/adapter-tests/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2019 Feathers - -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/adapter-tests/README.md b/packages/adapter-tests/README.md deleted file mode 100644 index 6d096346ad..0000000000 --- a/packages/adapter-tests/README.md +++ /dev/null @@ -1,22 +0,0 @@ -# Feathers Adapter Tests - -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) -[![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/adapter-tests)](https://david-dm.org/feathersjs/feathers?path=packages/adapter-tests) -[![Download Status](https://img.shields.io/npm/dm/@feathersjs/adapter-commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/adapter-commons) - -> Feathers shared database adapter test suite - -## About - -This is a repository that contains the test suite for the common database adapter syntax. - - -## Authors - -[Feathers contributors](https://github.com/feathersjs/adapter-tests/graphs/contributors) - -## License - -Copyright (c) 2018 Feathers contributors - -Licensed under the [MIT license](LICENSE). diff --git a/packages/adapter-tests/lib/basic.js b/packages/adapter-tests/lib/basic.js deleted file mode 100644 index e5e8bc03da..0000000000 --- a/packages/adapter-tests/lib/basic.js +++ /dev/null @@ -1,53 +0,0 @@ -const assert = require('assert'); - -module.exports = (test, app, errors, serviceName, idProp) => { - describe('Basic Functionality', () => { - let service; - - beforeEach(() => { - service = app.service(serviceName); - }); - - it('.id', () => { - assert.strictEqual(service.id, idProp, - 'id property is set to expected name' - ); - }); - - test('.options', () => { - assert.ok(service.options, 'Options are available in service.options'); - }); - - test('.events', () => { - assert.ok(service.events.includes('testing'), - 'service.events is set and includes "testing"' - ); - }); - - describe('Raw Methods', () => { - test('._get', () => { - assert.strictEqual(typeof service._get, 'function'); - }); - - test('._find', () => { - assert.strictEqual(typeof service._find, 'function'); - }); - - test('._create', () => { - assert.strictEqual(typeof service._create, 'function'); - }); - - test('._update', () => { - assert.strictEqual(typeof service._update, 'function'); - }); - - test('._patch', () => { - assert.strictEqual(typeof service._patch, 'function'); - }); - - test('._remove', () => { - assert.strictEqual(typeof service._remove, 'function'); - }); - }); - }); -}; diff --git a/packages/adapter-tests/lib/index.js b/packages/adapter-tests/lib/index.js deleted file mode 100644 index 2a2ce948e6..0000000000 --- a/packages/adapter-tests/lib/index.js +++ /dev/null @@ -1,47 +0,0 @@ -/* tslint:disable:no-console */ -const basicTests = require('./basic'); -const methodTests = require('./methods'); -const syntaxTests = require('./syntax'); - -module.exports = testNames => { - return (app, errors, serviceName, idProp = 'id') => { - if (!serviceName) { - throw new Error('You must pass a service name'); - } - - const skippedTests = []; - const allTests = []; - - const test = (name, runner) => { - const skip = !testNames.includes(name); - const its = skip ? it.skip : it; - - if (skip) { - skippedTests.push(name); - } - - allTests.push(name); - - its(name, runner); - }; - - describe(`Adapter tests for '${serviceName}' service with '${idProp}' id property`, () => { - after(() => { - console.log('\n'); - testNames.forEach(name => { - if (!allTests.includes(name)) { - console.error(`WARNING: '${name}' test is not part of the test suite`); - } - }); - if (skippedTests.length) { - console.log(`\nSkipped the following ${skippedTests.length} Feathers adapter test(s) out of ${allTests.length} total:`); - console.log(JSON.stringify(skippedTests, null, ' ')); - } - }); - - basicTests(test, app, errors, serviceName, idProp); - methodTests(test, app, errors, serviceName, idProp); - syntaxTests(test, app, errors, serviceName, idProp); - }); - }; -}; diff --git a/packages/adapter-tests/lib/methods.js b/packages/adapter-tests/lib/methods.js deleted file mode 100644 index 51b3a0333a..0000000000 --- a/packages/adapter-tests/lib/methods.js +++ /dev/null @@ -1,538 +0,0 @@ -const assert = require('assert'); - -module.exports = (test, app, errors, serviceName, idProp) => { - describe(' Methods', () => { - let doug; - let service; - - beforeEach(async () => { - service = app.service(serviceName); - doug = await app.service(serviceName).create({ - name: 'Doug', - age: 32 - }); - }); - - afterEach(async () => { - try { - await app.service(serviceName).remove(doug[idProp]); - } catch (error) {} - }); - - describe('get', () => { - test('.get', async () => { - const data = await service.get(doug[idProp]); - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), - `${idProp} id matches` - ); - assert.strictEqual(data.name, 'Doug', 'data.name matches'); - assert.strictEqual(data.age, 32, 'data.age matches'); - }); - - test('.get + $select', async () => { - const data = await service.get(doug[idProp], { - query: { $select: [ 'name' ] } - }); - - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), - `${idProp} id property matches` - ); - assert.strictEqual(data.name, 'Doug', 'data.name matches'); - assert.ok(!data.age, 'data.age is falsy'); - }); - - test('.get + id + query', async () => { - try { - await service.get(doug[idProp], { - query: { name: 'Tester' } - }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Got a NotFound Feathers error' - ); - } - }); - - test('.get + NotFound', async () => { - try { - await service.get('568225fbfe21222432e836ff'); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Error is a NotFound Feathers error' - ); - } - }); - - test('.get + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }); - - try { - await service.get(doug[idProp], { - query: { [idProp]: alice[idProp] } - }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Got a NotFound Feathers error' - ); - } - - await service.remove(alice[idProp]); - }); - }); - - describe('find', () => { - test('.find', async () => { - const data = await service.find(); - - assert.ok(Array.isArray(data), 'Data is an array'); - assert.strictEqual(data.length, 1, 'Got one entry'); - }); - }); - - describe('remove', () => { - test('.remove', async () => { - const data = await service.remove(doug[idProp]); - - assert.strictEqual(data.name, 'Doug', 'data.name matches'); - }); - - test('.remove + $select', async () => { - const data = await service.remove(doug[idProp], { - query: { $select: [ 'name' ] } - }); - - assert.strictEqual(data.name, 'Doug', 'data.name matches'); - assert.ok(!data.age, 'data.age is falsy'); - }); - - test('.remove + id + query', async () => { - try { - await service.remove(doug[idProp], { - query: { name: 'Tester' } - }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Got a NotFound Feathers error' - ); - } - }); - - test('.remove + multi', async () => { - try { - await service.remove(null); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'MethodNotAllowed', - 'Removing multiple without option set throws MethodNotAllowed' - ); - } - - service.options.multi = [ 'remove' ]; - - await service.create({ name: 'Dave', age: 29, created: true }); - await service.create({ - name: 'David', - age: 3, - created: true - }); - - const data = await service.remove(null, { - query: { created: true } - }); - - assert.strictEqual(data.length, 2); - - let names = data.map(person => person.name); - - assert.ok(names.includes('Dave'), 'Dave removed'); - assert.ok(names.includes('David'), 'David removed'); - }); - - test('.remove + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }); - - try { - await service.remove(doug[idProp], { - query: { [idProp]: alice[idProp] } - }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Got a NotFound Feathers error' - ); - } - - await service.remove(alice[idProp]); - }); - }); - - describe('update', () => { - test('.update', async () => { - const originalData = { [idProp]: doug[idProp], name: 'Dougler' }; - const originalCopy = Object.assign({}, originalData); - - const data = await service.update(doug[idProp], originalData); - - assert.deepStrictEqual(originalData, originalCopy, - 'data was not modified' - ); - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), - `${idProp} id matches` - ); - assert.strictEqual(data.name, 'Dougler', 'data.name matches'); - assert.ok(!data.age, 'data.age is falsy'); - }); - - test('.update + $select', async () => { - const originalData = { - [idProp]: doug[idProp], - name: 'Dougler', - age: 10 - }; - - const data = await service.update(doug[idProp], originalData, { - query: { $select: [ 'name' ] } - }); - - assert.strictEqual(data.name, 'Dougler', 'data.name matches'); - assert.ok(!data.age, 'data.age is falsy'); - }); - - test('.update + id + query', async () => { - try { - await service.update(doug[idProp], { - name: 'Dougler' - }, { - query: { name: 'Tester' } - }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Got a NotFound Feathers error' - ); - } - }); - - test('.update + NotFound', async () => { - try { - await service.update('568225fbfe21222432e836ff', { name: 'NotFound' }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Error is a NotFound Feathers error' - ); - } - }); - - test('.update + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }); - - try { - await service.update(doug[idProp], { - name: 'Dougler', - age: 33 - }, { - query: { [idProp]: alice[idProp] } - }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Got a NotFound Feathers error' - ); - } - - await service.remove(alice[idProp]); - }); - }); - - describe('patch', () => { - test('.patch', async () => { - const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' }; - const originalCopy = Object.assign({}, originalData); - - const data = await service.patch(doug[idProp], originalData); - - assert.deepStrictEqual(originalData, originalCopy, - 'original data was not modified' - ); - assert.strictEqual(data[idProp].toString(), doug[idProp].toString(), - `${idProp} id matches` - ); - assert.strictEqual(data.name, 'PatchDoug', 'data.name matches'); - assert.strictEqual(data.age, 32, 'data.age matches'); - }); - - test('.patch + $select', async () => { - const originalData = { [idProp]: doug[idProp], name: 'PatchDoug' }; - - const data = await service.patch(doug[idProp], originalData, { - query: { $select: [ 'name' ] } - }); - - assert.strictEqual(data.name, 'PatchDoug', 'data.name matches'); - assert.ok(!data.age, 'data.age is falsy'); - }); - - test('.patch + id + query', async () => { - try { - await service.patch(doug[idProp], { - name: 'id patched doug' - }, { - query: { name: 'Tester' } - }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Got a NotFound Feathers error' - ); - } - }); - - test('.patch multiple', async () => { - try { - await service.patch(null, {}); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'MethodNotAllowed', - 'Removing multiple without option set throws MethodNotAllowed' - ); - } - - const params = { - query: { created: true } - }; - const dave = await service.create({ - name: 'Dave', - age: 29, - created: true - }); - const david = await service.create({ - name: 'David', - age: 3, - created: true - }); - - service.options.multi = [ 'patch' ]; - - const data = await service.patch(null, { - age: 2 - }, params); - - assert.strictEqual(data.length, 2, 'returned two entries'); - assert.strictEqual(data[0].age, 2, 'First entry age was updated'); - assert.strictEqual(data[1].age, 2, 'Sceond entry age was updated'); - - await service.remove(dave[idProp], params); - await service.remove(david[idProp], params); - }); - - test('.patch multi query', async () => { - const service = app.service(serviceName); - const params = { - query: { age: { $lt: 10 } } - }; - const dave = await service.create({ - name: 'Dave', - age: 8, - created: true - }); - const david = await service.create({ - name: 'David', - age: 4, - created: true - }); - - const data = await service.patch(null, { - age: 2 - }, params); - - assert.strictEqual(data.length, 2, 'returned two entries'); - assert.strictEqual(data[0].age, 2, 'First entry age was updated'); - assert.strictEqual(data[1].age, 2, 'Sceond entry age was updated'); - - await service.remove(dave[idProp], params); - await service.remove(david[idProp], params); - }); - - test('.patch + NotFound', async () => { - try { - await service.patch('568225fbfe21222432e836ff', { name: 'PatchDoug' }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Error is a NotFound Feathers error' - ); - } - }); - - test('.patch + id + query id', async () => { - const alice = await service.create({ - name: 'Alice', - age: 12 - }); - - try { - await service.patch(doug[idProp], { - age: 33 - }, { - query: { [idProp]: alice[idProp] } - }); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'NotFound', - 'Got a NotFound Feathers error' - ); - } - - await service.remove(alice[idProp]); - }); - }); - - describe('create', () => { - test('.create', async () => { - const originalData = { - name: 'Bill', - age: 40 - }; - const originalCopy = Object.assign({}, originalData); - - const data = await service.create(originalData); - - assert.deepStrictEqual(originalData, originalCopy, - 'original data was not modified' - ); - assert.ok(data instanceof Object, 'data is an object'); - assert.strictEqual(data.name, 'Bill', 'data.name matches'); - - await service.remove(data[idProp]); - }); - - test('.create + $select', async () => { - const originalData = { - name: 'William', - age: 23 - }; - - const data = await service.create(originalData, { - query: { $select: [ 'name' ] } - }); - - assert.strictEqual(data.name, 'William', 'data.name matches'); - assert.ok(!data.age, 'data.age is falsy'); - - await service.remove(data[idProp]); - }); - - test('.create multi', async () => { - try { - await service.create([], {}); - throw new Error('Should never get here'); - } catch (error) { - assert.strictEqual(error.name, 'MethodNotAllowed', - 'Removing multiple without option set throws MethodNotAllowed' - ); - } - - const items = [ - { - name: 'Gerald', - age: 18 - }, - { - name: 'Herald', - age: 18 - } - ]; - - service.options.multi = [ 'create', 'patch' ]; - - const data = await service.create(items); - - assert.ok(Array.isArray(data), 'data is an array'); - assert.ok(typeof data[0][idProp] !== 'undefined', 'id is set'); - assert.strictEqual(data[0].name, 'Gerald', 'first name matches'); - assert.ok(typeof data[1][idProp] !== 'undefined', 'id is set'); - assert.strictEqual(data[1].name, 'Herald', 'second name macthes'); - - await service.remove(data[0][idProp]); - await service.remove(data[1][idProp]); - }); - }); - - describe('doesn\'t call public methods internally', () => { - let throwing; - - before(() => { - throwing = app.service(serviceName).extend({ - get store () { - return app.service(serviceName).store; - }, - - find () { - throw new Error('find method called'); - }, - get () { - throw new Error('get method called'); - }, - create () { - throw new Error('create method called'); - }, - update () { - throw new Error('update method called'); - }, - patch () { - throw new Error('patch method called'); - }, - remove () { - throw new Error('remove method called'); - } - }); - }); - - test('internal .find', () => app.service(serviceName).find.call(throwing)); - - test('internal .get', () => - service.get.call(throwing, doug[idProp]) - ); - - test('internal .create', async () => { - const bob = await service.create.call(throwing, { - name: 'Bob', - age: 25 - }); - - await service.remove(bob[idProp]); - }); - - test('internal .update', () => - service.update.call(throwing, doug[idProp], { - name: 'Dougler' - }) - ); - - test('internal .patch', () => - service.patch.call(throwing, doug[idProp], { - name: 'PatchDoug' - }) - ); - - test('internal .remove', () => - service.remove.call(throwing, doug[idProp]) - ); - }); - }); -}; diff --git a/packages/adapter-tests/lib/syntax.js b/packages/adapter-tests/lib/syntax.js deleted file mode 100644 index eff662a06b..0000000000 --- a/packages/adapter-tests/lib/syntax.js +++ /dev/null @@ -1,342 +0,0 @@ -const assert = require('assert'); - -module.exports = (test, app, errors, serviceName, idProp) => { - describe('Query Syntax', () => { - let bob; - let alice; - let doug; - let service; - - beforeEach(async () => { - service = app.service(serviceName); - bob = await app.service(serviceName).create({ - name: 'Bob', - age: 25 - }); - doug = await app.service(serviceName).create({ - name: 'Doug', - age: 32 - }); - alice = await app.service(serviceName).create({ - name: 'Alice', - age: 19 - }); - }); - - afterEach(async () => { - await service.remove(bob[idProp]); - await service.remove(alice[idProp]); - await service.remove(doug[idProp]); - }); - - test('.find + equal', async () => { - const params = { query: { name: 'Alice' } }; - const data = await service.find(params); - - assert.ok(Array.isArray(data)); - assert.strictEqual(data.length, 1); - assert.strictEqual(data[0].name, 'Alice'); - }); - - test('.find + equal multiple', async () => { - const data = await service.find({ - query: { name: 'Alice', age: 20 } - }); - - assert.strictEqual(data.length, 0); - }); - - describe('special filters', () => { - test('.find + $sort', async () => { - let data = await service.find({ - query: { - $sort: { name: 1 } - } - }); - - assert.strictEqual(data.length, 3); - assert.strictEqual(data[0].name, 'Alice'); - assert.strictEqual(data[1].name, 'Bob'); - assert.strictEqual(data[2].name, 'Doug'); - - data = await service.find({ - query: { - $sort: { name: -1 } - } - }); - - assert.strictEqual(data.length, 3); - assert.strictEqual(data[0].name, 'Doug'); - assert.strictEqual(data[1].name, 'Bob'); - assert.strictEqual(data[2].name, 'Alice'); - }); - - test('.find + $sort + string', async () => { - const data = await service.find({ - query: { - $sort: { name: '1' } - } - }); - - assert.strictEqual(data.length, 3); - assert.strictEqual(data[0].name, 'Alice'); - assert.strictEqual(data[1].name, 'Bob'); - assert.strictEqual(data[2].name, 'Doug'); - }); - - test('.find + $limit', async () => { - const data = await service.find({ - query: { - $limit: 2 - } - }); - - assert.strictEqual(data.length, 2); - }); - - test('.find + $limit 0', async () => { - const data = await service.find({ - query: { - $limit: 0 - } - }); - - assert.strictEqual(data.length, 0); - }); - - test('.find + $skip', async () => { - const data = await service.find({ - query: { - $sort: { name: 1 }, - $skip: 1 - } - }); - - assert.strictEqual(data.length, 2); - assert.strictEqual(data[0].name, 'Bob'); - assert.strictEqual(data[1].name, 'Doug'); - }); - - test('.find + $select', async () => { - const data = await service.find({ - query: { - name: 'Alice', - $select: ['name'] - } - }); - - assert.strictEqual(data.length, 1); - assert.strictEqual(data[0].name, 'Alice'); - assert.strictEqual(data[0].age, undefined); - }); - - test('.find + $or', async () => { - const data = await service.find({ - query: { - $or: [ - { name: 'Alice' }, - { name: 'Bob' } - ], - $sort: { name: 1 } - } - }); - - assert.strictEqual(data.length, 2); - assert.strictEqual(data[0].name, 'Alice'); - assert.strictEqual(data[1].name, 'Bob'); - }); - - test('.find + $in', async () => { - const data = await service.find({ - query: { - name: { - $in: ['Alice', 'Bob'] - }, - $sort: { name: 1 } - } - }); - - assert.strictEqual(data.length, 2); - assert.strictEqual(data[0].name, 'Alice'); - assert.strictEqual(data[1].name, 'Bob'); - }); - - test('.find + $nin', async () => { - const data = await service.find({ - query: { - name: { - $nin: [ 'Alice', 'Bob' ] - } - } - }); - - assert.strictEqual(data.length, 1); - assert.strictEqual(data[0].name, 'Doug'); - }); - - test('.find + $lt', async () => { - const data = await service.find({ - query: { - age: { - $lt: 30 - } - } - }); - - assert.strictEqual(data.length, 2); - }); - - test('.find + $lte', async () => { - const data = await service.find({ - query: { - age: { - $lte: 25 - } - } - }); - - assert.strictEqual(data.length, 2); - }); - - test('.find + $gt', async () => { - const data = await service.find({ - query: { - age: { - $gt: 30 - } - } - }); - - assert.strictEqual(data.length, 1); - }); - - test('.find + $gte', async () => { - const data = await service.find({ - query: { - age: { - $gte: 25 - } - } - }); - - assert.strictEqual(data.length, 2); - }); - - test('.find + $ne', async () => { - const data = await service.find({ - query: { - age: { - $ne: 25 - } - } - }); - - assert.strictEqual(data.length, 2); - }); - }); - - test('.find + $gt + $lt + $sort', async () => { - const params = { - query: { - age: { - $gt: 18, - $lt: 30 - }, - $sort: { name: 1 } - } - }; - - const data = await service.find(params); - - assert.strictEqual(data.length, 2); - assert.strictEqual(data[0].name, 'Alice'); - assert.strictEqual(data[1].name, 'Bob'); - }); - - test('.find + $or nested + $sort', async () => { - const params = { - query: { - $or: [ - { name: 'Doug' }, - { - age: { - $gte: 18, - $lt: 25 - } - } - ], - $sort: { name: 1 } - } - }; - - const data = await service.find(params); - - assert.strictEqual(data.length, 2); - assert.strictEqual(data[0].name, 'Alice'); - assert.strictEqual(data[1].name, 'Doug'); - }); - - describe('paginate', function () { - beforeEach(() => { - service.options.paginate = { - default: 1, - max: 2 - }; - }); - - afterEach(() => { - service.options.paginate = {}; - }); - - test('.find + paginate', async () => { - const page = await service.find({ - query: { $sort: { name: -1 } } - }); - - assert.strictEqual(page.total, 3); - assert.strictEqual(page.limit, 1); - assert.strictEqual(page.skip, 0); - assert.strictEqual(page.data[0].name, 'Doug'); - }); - - test('.find + paginate + $limit + $skip', async () => { - const params = { - query: { - $skip: 1, - $limit: 4, - $sort: { name: -1 } - } - }; - - const page = await service.find(params); - - assert.strictEqual(page.total, 3); - assert.strictEqual(page.limit, 2); - assert.strictEqual(page.skip, 1); - assert.strictEqual(page.data[0].name, 'Bob'); - assert.strictEqual(page.data[1].name, 'Alice'); - }); - - test('.find + paginate + $limit 0', async () => { - const page = await service.find({ - query: { $limit: 0 } - }); - - assert.strictEqual(page.total, 3); - assert.strictEqual(page.data.length, 0); - }); - - test('.find + paginate + params', async () => { - const page = await service.find({ paginate: { default: 3 } }); - - assert.strictEqual(page.limit, 3); - assert.strictEqual(page.skip, 0); - - const results = await service.find({ paginate: false }); - - assert.ok(Array.isArray(results)); - assert.strictEqual(results.length, 3); - }); - }); - }); -}; diff --git a/packages/adapter-tests/package.json b/packages/adapter-tests/package.json deleted file mode 100644 index d6d38d548a..0000000000 --- a/packages/adapter-tests/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "@feathersjs/adapter-tests", - "version": "4.0.0-pre.3", - "description": "Feathers shared database adapter test suite", - "homepage": "https://feathersjs.com", - "keywords": [ - "feathers" - ], - "license": "MIT", - "repository": { - "type": "git", - "url": "git://github.com/feathersjs/feathers.git" - }, - "author": { - "name": "Feathers contributor", - "email": "hello@feathersjs.com", - "url": "https://feathersjs.com" - }, - "contributors": [], - "bugs": { - "url": "https://github.com/feathersjs/feathers/issues" - }, - "engines": { - "node": ">= 8" - }, - "main": "lib/index.js", - "scripts": { - "test": "mocha --opts ../../mocha.opts" - }, - "directories": { - "lib": "lib" - }, - "publishConfig": { - "access": "public" - }, - "devDependencies": { - "@feathersjs/errors": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", - "feathers-memory": "^3.0.2", - "mocha": "^6.1.4" - }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" -} diff --git a/packages/adapter-tests/test/index.test.js b/packages/adapter-tests/test/index.test.js deleted file mode 100644 index ebb5289c1a..0000000000 --- a/packages/adapter-tests/test/index.test.js +++ /dev/null @@ -1,80 +0,0 @@ -const memory = require('feathers-memory'); -const errors = require('@feathersjs/errors'); -const feathers = require('@feathersjs/feathers'); - -const adapterTests = require('../lib'); -const testSuite = adapterTests([ - '.events', - '._get', - '._find', - '._create', - '._update', - '._patch', - '._remove', - '.get', - '.get + $select', - '.get + id + query', - '.get + NotFound', - '.find', - '.remove', - '.remove + $select', - '.remove + id + query', - '.remove + multi', - '.update', - '.update + $select', - '.update + id + query', - '.update + NotFound', - '.patch', - '.patch + $select', - '.patch + id + query', - '.patch multiple', - '.patch multi query', - '.patch + NotFound', - '.create', - '.create + $select', - '.create multi', - 'internal .find', - 'internal .get', - 'internal .create', - 'internal .update', - 'internal .patch', - 'internal .remove', - '.find + equal', - '.find + equal multiple', - '.find + $sort', - '.find + $sort + string', - '.find + $limit', - '.find + $limit 0', - '.find + $skip', - '.find + $select', - '.find + $or', - '.find + $in', - '.find + $nin', - '.find + $lt', - '.find + $lte', - '.find + $gt', - '.find + $gte', - '.find + $ne', - '.find + $gt + $lt + $sort', - '.find + $or nested + $sort', - '.find + paginate', - '.find + paginate + $limit + $skip', - '.find + paginate + $limit 0', - '.find + paginate + params', - '.get + id + query id', - '.remove + id + query id', - '.update + id + query id', - '.patch + id + query id' -]); - -describe('Feathers Memory Service', () => { - const events = [ 'testing' ]; - const app = feathers() - .use('/people', memory({ events })) - .use('/people-customid', memory({ - id: 'customid', events - })); - - testSuite(app, errors, 'people'); - testSuite(app, errors, 'people-customid', 'customid'); -}); diff --git a/packages/authentication-client/.npmignore b/packages/authentication-client/.npmignore index d7819044b6..ef86d5f1e7 100644 --- a/packages/authentication-client/.npmignore +++ b/packages/authentication-client/.npmignore @@ -1,3 +1,3 @@ test/ -src/ tsconfig.json +coverage/ diff --git a/packages/authentication-client/CHANGELOG.md b/packages/authentication-client/CHANGELOG.md index 3c5b5056df..2bc97945a6 100644 --- a/packages/authentication-client/CHANGELOG.md +++ b/packages/authentication-client/CHANGELOG.md @@ -3,6 +3,227 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + + +### Bug Fixes + +* **authentication-client:** Reset authentication promise on socket disconnect ([#1696](https://github.com/feathersjs/feathers/issues/1696)) ([3951626](https://github.com/feathersjs/feathers/commit/395162633ff22e95833a3c2900cb9464bb5b056f)) + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + + +### Bug Fixes + +* Improve authentication client default storage initialization ([#1613](https://github.com/feathersjs/feathers/issues/1613)) ([d7f5107](https://github.com/feathersjs/feathers/commit/d7f5107ef76297b4ca6db580afc5e2b372f5ee4d)) + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + + +### Bug Fixes + +* Authentication type improvements and timeout fix ([#1605](https://github.com/feathersjs/feathers/issues/1605)) ([19854d3](https://github.com/feathersjs/feathers/commit/19854d3)) + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + + +### Bug Fixes + +* Typing improvements ([#1580](https://github.com/feathersjs/feathers/issues/1580)) ([7818aec](https://github.com/feathersjs/feathers/commit/7818aec)) + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + + +### Bug Fixes + +* Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + + +### Bug Fixes + +* Only remove token on NotAuthenticated error in authentication client and handle error better ([#1525](https://github.com/feathersjs/feathers/issues/1525)) ([13a8758](https://github.com/feathersjs/feathers/commit/13a8758)) + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) + + +### Features + +* Let strategies handle the connection ([#1510](https://github.com/feathersjs/feathers/issues/1510)) ([4329feb](https://github.com/feathersjs/feathers/commit/4329feb)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + + +### Bug Fixes + +* Do not error in authentication client on logout ([#1473](https://github.com/feathersjs/feathers/issues/1473)) ([8211b98](https://github.com/feathersjs/feathers/commit/8211b98)) + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/authentication-client + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/authentication-client/LICENSE b/packages/authentication-client/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/authentication-client/LICENSE +++ b/packages/authentication-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/authentication-client/README.md b/packages/authentication-client/README.md index d0b28d2046..f9df012857 100644 --- a/packages/authentication-client/README.md +++ b/packages/authentication-client/README.md @@ -1,10 +1,10 @@ # @feathersjs/authentication-client -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/authentication-client)](https://david-dm.org/feathersjs/feathers?path=packages/authentication-client) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/authentication-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication-client) -> The authentication plugin for feathers-client +> Feathers authentication client ## Installation @@ -12,26 +12,12 @@ npm install @feathersjs/authentication-client --save ``` -## Quick example - -```js -const feathers = require('@feathersjs/feathers'); -const auth = require('@feathersjs/authentication-client'); - -const app = feathers(); - -// Available options are listed in the "Options" section -app.configure(auth({ - storage: window.localStorage -})) -``` - ## Documentation -Please refer to the [@feathersjs/authentication-client documentation](https://docs.feathersjs.com/api/authentication/client.html) for more details. +Refer to the [Feathers authentication client API documentation](https://docs.feathersjs.com/api/authentication/client.html) for more details. ## License -Copyright (c) 2018 +Copyright (c) 2019 Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-client/package.json b/packages/authentication-client/package.json index fc0cdff937..c89f002444 100644 --- a/packages/authentication-client/package.json +++ b/packages/authentication-client/package.json @@ -1,14 +1,19 @@ { "name": "@feathersjs/authentication-client", "description": "The authentication plugin for feathers-client", - "version": "4.0.0-pre.3", + "version": "4.5.4", "homepage": "https://feathersjs.com", - "main": "lib/index.js", + "main": "lib/", + "types": "lib/", "keywords": [ "feathers", "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -23,13 +28,13 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --opts ../../mocha.ts.opts --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -38,28 +43,28 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", - "@feathersjs/errors": "^4.0.0-pre.3", + "@feathersjs/authentication": "^4.5.3", + "@feathersjs/commons": "^4.5.3", + "@feathersjs/errors": "^4.5.3", + "@feathersjs/feathers": "^4.5.3", "debug": "^4.1.1" }, "devDependencies": { - "@feathersjs/authentication": "^4.0.0-pre.3", - "@feathersjs/authentication-local": "^4.0.0-pre.3", - "@feathersjs/express": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", - "@feathersjs/primus": "^4.0.0-pre.3", - "@feathersjs/primus-client": "^4.0.0-pre.3", - "@feathersjs/rest-client": "^4.0.0-pre.3", - "@feathersjs/socketio": "^4.0.0-pre.3", - "@feathersjs/socketio-client": "^4.0.0-pre.3", - "@types/debug": "^4.1.4", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.2", - "axios": "^0.19.0", - "mocha": "^6.1.4", + "@feathersjs/authentication-local": "^4.5.4", + "@feathersjs/express": "^4.5.4", + "@feathersjs/primus": "^4.5.4", + "@feathersjs/primus-client": "^4.5.4", + "@feathersjs/rest-client": "^4.5.4", + "@feathersjs/socketio": "^4.5.4", + "@feathersjs/socketio-client": "^4.5.4", + "@types/debug": "^4.1.5", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.22", + "axios": "^0.19.2", + "mocha": "^8.0.1", "shx": "^0.3.2", - "ts-node": "^8.2.0", - "typescript": "^3.4.5" + "ts-node": "^8.10.2", + "typescript": "^3.9.6" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/authentication-client/src/core.ts b/packages/authentication-client/src/core.ts index 4c0c898c20..77178872f4 100644 --- a/packages/authentication-client/src/core.ts +++ b/packages/authentication-client/src/core.ts @@ -1,5 +1,5 @@ -import { NotAuthenticated } from '@feathersjs/errors'; -import { Application } from '@feathersjs/feathers'; +import { NotAuthenticated, FeathersError } from '@feathersjs/errors'; +import { Application, Params } from '@feathersjs/feathers'; import { AuthenticationRequest, AuthenticationResult } from '@feathersjs/authentication'; import { Storage, StorageWrapper } from './storage'; @@ -61,14 +61,18 @@ export class AuthenticationClient { handleSocket (socket: any) { // Connection events happen on every reconnect const connected = this.app.io ? 'connect' : 'open'; + const disconnected = this.app.io ? 'disconnect' : 'disconnection'; - socket.on(connected, () => { + socket.on(disconnected, () => { + const authPromise = new Promise(resolve => + socket.once(connected, () => resolve()) + ) // Only reconnect when `reAuthenticate()` or `authenticate()` // has been called explicitly first - if (this.authenticated) { - // Force reauthentication with the server - this.reAuthenticate(true); - } + // Force reauthentication with the server + .then(() => this.authenticated ? this.reAuthenticate(true) : null); + + this.app.set('authentication', authPromise); }); } @@ -118,6 +122,16 @@ export class AuthenticationClient { return Promise.resolve(null); } + handleError (error: FeathersError, type: 'authenticate'|'logout') { + if (error.code === 401 || error.code === 403) { + const promise = this.removeAccessToken().then(() => this.reset()); + + return type === 'logout' ? promise : promise.then(() => Promise.reject(error)); + } + + return Promise.reject(error); + } + reAuthenticate (force: boolean = false): Promise { // Either returns the authentication state or // tries to re-authenticate with the stored JWT and strategy @@ -133,20 +147,18 @@ export class AuthenticationClient { strategy: this.options.jwtStrategy, accessToken }); - }).catch((error: Error) => - this.removeAccessToken().then(() => Promise.reject(error)) - ); + }); } return authPromise; } - authenticate (authentication: AuthenticationRequest): Promise { + authenticate (authentication?: AuthenticationRequest, params?: Params): Promise { if (!authentication) { return this.reAuthenticate(); } - const promise = this.service.create(authentication) + const promise = this.service.create(authentication, params) .then((authResult: AuthenticationResult) => { const { accessToken } = authResult; @@ -155,8 +167,8 @@ export class AuthenticationClient { this.app.emit('authenticated', authResult); return this.setAccessToken(accessToken).then(() => authResult); - }).catch((error: Error) => - this.reset().then(() => Promise.reject(error)) + }).catch((error: FeathersError) => + this.handleError(error, 'authenticate') ); this.app.set('authentication', promise); @@ -164,9 +176,9 @@ export class AuthenticationClient { return promise; } - logout () { + logout (): Promise { return Promise.resolve(this.app.get('authentication')) - .then(() => this.service.remove(null)) + .then(() => this.service.remove(null) .then((authResult: AuthenticationResult) => this.removeAccessToken() .then(() => this.reset()) .then(() => { @@ -174,6 +186,9 @@ export class AuthenticationClient { return authResult; }) + )) + .catch((error: FeathersError) => + this.handleError(error, 'logout') ); } } diff --git a/packages/authentication-client/src/index.ts b/packages/authentication-client/src/index.ts index f6650418da..d2f7d49354 100644 --- a/packages/authentication-client/src/index.ts +++ b/packages/authentication-client/src/index.ts @@ -1,7 +1,6 @@ import { AuthenticationClient, AuthenticationClientOptions } from './core'; import * as hooks from './hooks'; import { Application } from '@feathersjs/feathers'; -import { AuthenticationResult, AuthenticationRequest } from '@feathersjs/authentication'; import { Storage, MemoryStorage, StorageWrapper } from './storage'; declare module '@feathersjs/feathers' { @@ -10,18 +9,25 @@ declare module '@feathersjs/feathers' { rest?: any; primus?: any; authentication: AuthenticationClient; - authenticate (authentication?: AuthenticationRequest): Promise; - reAuthenticate (force: boolean): Promise; - logout (): Promise; + authenticate: AuthenticationClient['authenticate']; + reAuthenticate: AuthenticationClient['reAuthenticate']; + logout: AuthenticationClient['logout']; } } +export const getDefaultStorage = () => { + try { + return new StorageWrapper(window.localStorage); + } catch (error) {} + + return new MemoryStorage(); +}; + export { AuthenticationClient, AuthenticationClientOptions, Storage, MemoryStorage, hooks }; export type ClientConstructor = new (app: Application, options: AuthenticationClientOptions) => AuthenticationClient; -export const defaultStorage: Storage = typeof window !== 'undefined' ? - new StorageWrapper(window.localStorage) : new MemoryStorage(); +export const defaultStorage: Storage = getDefaultStorage(); export const defaults: AuthenticationClientOptions = { header: 'Authorization', diff --git a/packages/authentication-client/test/index.test.ts b/packages/authentication-client/test/index.test.ts index e0f84d3d00..fb6f669a14 100644 --- a/packages/authentication-client/test/index.test.ts +++ b/packages/authentication-client/test/index.test.ts @@ -1,7 +1,9 @@ import assert from 'assert'; import feathers, { Application } from '@feathersjs/feathers'; -import client, { AuthenticationClient } from '../src'; +import client from '../src'; +import { AuthenticationClient } from '../src'; +import { NotAuthenticated } from '@feathersjs/errors'; describe('@feathersjs/authentication-client', () => { const accessToken = 'testing'; @@ -15,7 +17,11 @@ describe('@feathersjs/authentication-client', () => { app.configure(client()); app.use('/authentication', { - create (data) { + create (data: any) { + if (data.error) { + return Promise.reject(new Error('Did not work')); + } + return Promise.resolve({ accessToken, data, @@ -24,6 +30,10 @@ describe('@feathersjs/authentication-client', () => { }, remove (id) { + if (!app.get('authentication')) { + throw new NotAuthenticated('Not logged in'); + } + return Promise.resolve({ id }); } }); @@ -131,6 +141,21 @@ describe('@feathersjs/authentication-client', () => { }); }); + it('does not remove AccessToken on other errors', () => { + return app.authenticate({ + strategy: 'testing' + }).then(() => app.authenticate({ + strategy: 'testing' + })).then(() => app.authentication.getAccessToken()) + .then(at => assert.strictEqual(at, accessToken)); + }); + + it('logout when not logged in without error', async () => { + const result = await app.logout(); + + assert.strictEqual(result, null); + }); + describe('reauthenticate', () => { it('fails when no token in storage', () => { return app.authentication.reAuthenticate().then(() => { diff --git a/packages/authentication-client/test/integration/express.test.ts b/packages/authentication-client/test/integration/express.test.ts index 3879cb6e89..43a4bb4573 100644 --- a/packages/authentication-client/test/integration/express.test.ts +++ b/packages/authentication-client/test/integration/express.test.ts @@ -1,6 +1,6 @@ import axios from 'axios'; import feathers, { Application as FeathersApplication } from '@feathersjs/feathers'; -import * as express from '@feathersjs/express'; +import express from '@feathersjs/express'; import rest from '@feathersjs/rest-client'; import authClient from '../../src'; diff --git a/packages/authentication-client/test/integration/socketio.test.ts b/packages/authentication-client/test/integration/socketio.test.ts index dee7b1871c..2e7594cf75 100644 --- a/packages/authentication-client/test/integration/socketio.test.ts +++ b/packages/authentication-client/test/integration/socketio.test.ts @@ -1,4 +1,5 @@ import io from 'socket.io-client'; +import assert from 'assert'; import feathers, { Application } from '@feathersjs/feathers'; import socketio from '@feathersjs/socketio'; import socketioClient from '@feathersjs/socketio-client'; @@ -18,6 +19,43 @@ describe('@feathersjs/authentication-client Socket.io integration', () => { after(done => app.io.close(() => done())); + it('allows to authenticate with handshake headers and sends login event', async () => { + const user = { email: 'authtest@example.com', password: 'alsosecret' }; + + await app.service('users').create(user); + + const { accessToken } = await app.service('authentication').create({ + strategy: 'local', + ...user + }); + + const socket = io('http://localhost:9777', { + transports: [ 'websocket' ], + transportOptions: { + websocket: { + extraHeaders: { + Authorization: `Bearer ${accessToken}` + } + } + } + }); + const authResult: any = await new Promise(resolve => + app.once('login', res => resolve(res)) + ); + + assert.strictEqual(authResult.accessToken, accessToken); + + const dummy: any = await new Promise((resolve, reject) => { + socket.emit('find', 'dummy', {}, (error: Error, page: any) => + error ? reject(error) : resolve(page) + ); + }); + + assert.strictEqual(dummy.user.email, user.email); + assert.strictEqual(dummy.authentication.accessToken, accessToken); + assert.strictEqual(dummy.headers.authorization, `Bearer ${accessToken}`); + }); + commonTests(() => app, () => { return feathers() .configure(socketioClient(io('http://localhost:9777'))) diff --git a/packages/authentication-local/.npmignore b/packages/authentication-local/.npmignore index d7819044b6..ef86d5f1e7 100644 --- a/packages/authentication-local/.npmignore +++ b/packages/authentication-local/.npmignore @@ -1,3 +1,3 @@ test/ -src/ tsconfig.json +coverage/ diff --git a/packages/authentication-local/CHANGELOG.md b/packages/authentication-local/CHANGELOG.md index 1b7f318a9c..c9f6ef04d0 100644 --- a/packages/authentication-local/CHANGELOG.md +++ b/packages/authentication-local/CHANGELOG.md @@ -3,6 +3,219 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + + +### Bug Fixes + +* **authentication-local:** Allow to hash passwords in array data ([#1936](https://github.com/feathersjs/feathers/issues/1936)) ([64705f5](https://github.com/feathersjs/feathers/commit/64705f5d9d4dc27f799da3a074efaf74379a3398)) + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + + +### Bug Fixes + +* **test:** typo in password ([#1797](https://github.com/feathersjs/feathers/issues/1797)) ([dfba6ec](https://github.com/feathersjs/feathers/commit/dfba6ec2f21adf3aa739218cf870eaaaa5df6e9c)) + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + + +### Features + +* **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + + +### Bug Fixes + +* Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + + +### Bug Fixes + +* LocalStrategy authenticates without username ([#1560](https://github.com/feathersjs/feathers/issues/1560)) ([2b258fd](https://github.com/feathersjs/feathers/commit/2b258fd)), closes [#1559](https://github.com/feathersjs/feathers/issues/1559) + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + + +### Bug Fixes + +* Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/authentication-local + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/authentication-local/LICENSE b/packages/authentication-local/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/authentication-local/LICENSE +++ b/packages/authentication-local/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/authentication-local/README.md b/packages/authentication-local/README.md index 3d92339bc6..5a5bf406e1 100644 --- a/packages/authentication-local/README.md +++ b/packages/authentication-local/README.md @@ -1,10 +1,10 @@ # @feathersjs/authentication-local -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/authentication-local)](https://david-dm.org/feathersjs/feathers?path=packages/authentication-local) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/authentication-local.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication-local) -> Local authentication strategy for feathers-authentication using Passport without all the boilerplate. +> Local username and password authentication strategy for Feathers authentication ## Installation @@ -12,35 +12,12 @@ npm install @feathersjs/authentication-local --save ``` -## Quick example - -```js -const feathers = require('@feathersjs/feathers'); -const authentication = require('feathers-authentication'); -const local = require('@feathersjs/authentication-local'); -const app = feathers(); - -// Setup authentication -app.configure(authentication(settings)); -app.configure(local()); - -// Setup a hook to only allow valid JWTs or successful -// local auth to authenticate and get new JWT access tokens -app.service('authentication').hooks({ - before: { - create: [ - authentication.hooks.authenticate(['local', 'jwt']) - ] - } -}); -``` - ## Documentation -Please refer to the [@feathersjs/authentication-local API documentation](https://docs.feathersjs.com/api/authentication/local.html) for more details. +Refer to the [Feathers local authentication API documentation](https://docs.feathersjs.com/api/authentication/local.html) for more details. ## License -Copyright (c) 2018 +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-local/package.json b/packages/authentication-local/package.json index b04a366c8d..8c99abb6c0 100644 --- a/packages/authentication-local/package.json +++ b/packages/authentication-local/package.json @@ -1,14 +1,19 @@ { "name": "@feathersjs/authentication-local", "description": "Local authentication strategy for @feathers/authentication", - "version": "4.0.0-pre.3", + "version": "4.5.4", "homepage": "https://feathersjs.com", "main": "lib/", + "types": "lib/", "keywords": [ "feathers", "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -23,13 +28,13 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --opts ../../mocha.ts.opts --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -38,23 +43,23 @@ "access": "public" }, "dependencies": { - "@feathersjs/errors": "^4.0.0-pre.3", + "@feathersjs/authentication": "^4.5.3", + "@feathersjs/errors": "^4.5.3", + "@feathersjs/feathers": "^4.5.3", "bcryptjs": "^2.4.3", "debug": "^4.1.1", - "lodash": "^4.17.11" + "lodash": "^4.17.19" }, "devDependencies": { - "@feathersjs/authentication": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", "@types/bcryptjs": "^2.4.2", - "@types/debug": "^4.1.4", - "@types/lodash": "^4.14.132", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.2", - "mocha": "^6.1.4", + "@types/debug": "^4.1.5", + "@types/lodash": "^4.14.157", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.22", + "mocha": "^8.0.1", "shx": "^0.3.2", - "ts-node": "^8.2.0", - "typescript": "^3.4.5" + "ts-node": "^8.10.2", + "typescript": "^3.9.6" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/authentication-local/src/hooks/hash-password.ts b/packages/authentication-local/src/hooks/hash-password.ts index 69ed6d7a27..f97a7cde38 100644 --- a/packages/authentication-local/src/hooks/hash-password.ts +++ b/packages/authentication-local/src/hooks/hash-password.ts @@ -1,7 +1,10 @@ -import { get, set, cloneDeep } from 'lodash'; +import get from 'lodash/get'; +import set from 'lodash/set'; +import cloneDeep from 'lodash/cloneDeep'; import { BadRequest } from '@feathersjs/errors'; import Debug from 'debug'; import { HookContext } from '@feathersjs/feathers'; +import { LocalStrategy } from '../strategy'; const debug = Debug('@feathersjs/authentication-local/hooks/hash-password'); @@ -21,30 +24,40 @@ export default function hashPassword (field: string, options: HashPasswordOption } const { app, data, params } = context; - const password = get(data, field); - if (data === undefined || password === undefined) { - debug(`hook.data or hook.data.${field} is undefined. Skipping hashPassword hook.`); + if (data === undefined) { + debug(`hook.data is undefined. Skipping hashPassword hook.`); return context; } - const serviceName = options.authentication || app.get('defaultAuthentication'); - const authService = app.service(serviceName); + const authService = app.defaultAuthentication(options.authentication); const { strategy = 'local' } = options; if (!authService || typeof authService.getStrategies !== 'function') { - throw new BadRequest(`Could not find '${serviceName}' service to hash password`); + throw new BadRequest(`Could not find an authentication service to hash password`); } - const [ localStrategy ] = authService.getStrategies(strategy); + const [ localStrategy ] = authService.getStrategies(strategy) as LocalStrategy[]; if (!localStrategy || typeof localStrategy.hashPassword !== 'function') { throw new BadRequest(`Could not find '${strategy}' strategy to hash password`); } - const hashedPassword: string = await localStrategy.hashPassword(password, params); + const addHashedPassword = async (data: any) => { + const password = get(data, field); - context.data = set(cloneDeep(data), field, hashedPassword); + if (password === undefined) { + debug(`hook.data.${field} is undefined, not hashing password`); + return data; + } + + const hashedPassword: string = await localStrategy.hashPassword(password, params); + + return set(cloneDeep(data), field, hashedPassword); + } + + context.data = Array.isArray(data) ? await Promise.all(data.map(addHashedPassword)) : + await addHashedPassword(data); return context; }; diff --git a/packages/authentication-local/src/hooks/protect.ts b/packages/authentication-local/src/hooks/protect.ts index 7af052d276..c430927f69 100644 --- a/packages/authentication-local/src/hooks/protect.ts +++ b/packages/authentication-local/src/hooks/protect.ts @@ -1,4 +1,4 @@ -import { omit } from 'lodash'; +import omit from 'lodash/omit'; import { HookContext } from '@feathersjs/feathers'; export default (...fields: string[]) => (context: HookContext) => { diff --git a/packages/authentication-local/src/strategy.ts b/packages/authentication-local/src/strategy.ts index febde71737..fda41e91e2 100644 --- a/packages/authentication-local/src/strategy.ts +++ b/packages/authentication-local/src/strategy.ts @@ -1,5 +1,6 @@ import bcrypt from 'bcryptjs'; -import { get, omit } from 'lodash'; +import get from 'lodash/get'; +import omit from 'lodash/omit'; import Debug from 'debug'; import { NotAuthenticated } from '@feathersjs/errors'; import { Query, Params } from '@feathersjs/feathers'; @@ -45,6 +46,10 @@ export class LocalStrategy extends AuthenticationBaseStrategy { async findEntity (username: string, params: Params) { const { entityUsernameField, service, errorMessage } = this.configuration; + if (!username) { // don't query for users without any condition set. + throw new NotAuthenticated(errorMessage); + } + const query = await this.getEntityQuery({ [entityUsernameField]: username }, params); @@ -108,7 +113,7 @@ export class LocalStrategy extends AuthenticationBaseStrategy { throw new NotAuthenticated(errorMessage); } - async hashPassword (password: string) { + async hashPassword (password: string, _params: Params) { return bcrypt.hash(password, this.configuration.hashSize); } diff --git a/packages/authentication-local/test/fixture.js b/packages/authentication-local/test/fixture.js index 7772bcdc1a..7bbd89de21 100644 --- a/packages/authentication-local/test/fixture.js +++ b/packages/authentication-local/test/fixture.js @@ -13,6 +13,7 @@ module.exports = (app = feathers()) => { service: 'users', secret: 'supersecret', authStrategies: [ 'local', 'jwt' ], + parseStrategies: [ 'jwt' ], local: { usernameField: 'email', passwordField: 'password' @@ -24,6 +25,7 @@ module.exports = (app = feathers()) => { app.use('/authentication', authentication); app.use('/users', memory({ + multi: [ 'create' ], paginate: { default: 10, max: 20 diff --git a/packages/authentication-local/test/hooks/hash-password.test.ts b/packages/authentication-local/test/hooks/hash-password.test.ts index 8cfbe56360..37170fc54c 100644 --- a/packages/authentication-local/test/hooks/hash-password.test.ts +++ b/packages/authentication-local/test/hooks/hash-password.test.ts @@ -35,7 +35,7 @@ describe('@feathersjs/authentication-local/hooks/hash-password', () => { assert.fail('Should never get here'); } catch (error) { assert.strictEqual(error.message, - `Could not find 'authentication' service to hash password` + 'Could not find an authentication service to hash password' ); } }); @@ -89,6 +89,21 @@ describe('@feathersjs/authentication-local/hooks/hash-password', () => { assert.notStrictEqual(user.password, password); }); + it('hashes password on array data', async () => { + const password = 'supersecret'; + + const users = await app.service('users').create([{ + email: 'dave@hashpassword.com', + password + }, { + email: 'dave2@hashpassword.com', + password: 'secret2' + }]); + + assert.notStrictEqual(users[0].password, password); + assert.notStrictEqual(users[1].password, 'secret2'); + }); + it('does nothing when field is not present', async () => { const user = await app.service('users').create({ email: 'dave@hashpassword.com' diff --git a/packages/authentication-local/test/strategy.test.ts b/packages/authentication-local/test/strategy.test.ts index 3207b1de70..8fa9b02b98 100644 --- a/packages/authentication-local/test/strategy.test.ts +++ b/packages/authentication-local/test/strategy.test.ts @@ -1,5 +1,5 @@ import assert from 'assert'; -import { omit } from 'lodash'; +import omit from 'lodash/omit'; import { LocalStrategy } from '../src'; // @ts-ignore import createApplication from './fixture'; @@ -151,7 +151,7 @@ describe('@feathersjs/authentication-local/strategy', () => { assert.ok(accessToken); assert.strictEqual(authResult.user.email, email); - assert.strictEqual(authResult.user.passsword, undefined); + assert.strictEqual(authResult.user.password, undefined); assert.ok(authResult.user.fromGet); const decoded = await authService.verifyAccessToken(accessToken); diff --git a/packages/authentication-oauth/.npmignore b/packages/authentication-oauth/.npmignore index d7819044b6..ef86d5f1e7 100644 --- a/packages/authentication-oauth/.npmignore +++ b/packages/authentication-oauth/.npmignore @@ -1,3 +1,3 @@ test/ -src/ tsconfig.json +coverage/ diff --git a/packages/authentication-oauth/CHANGELOG.md b/packages/authentication-oauth/CHANGELOG.md index 01fcb60a16..412d32a2aa 100644 --- a/packages/authentication-oauth/CHANGELOG.md +++ b/packages/authentication-oauth/CHANGELOG.md @@ -3,6 +3,232 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + + +### Bug Fixes + +* **authentication-oauth:** Add getEntity method to oAuth authentication and remove provider field for other calls ([#1935](https://github.com/feathersjs/feathers/issues/1935)) ([d925c1b](https://github.com/feathersjs/feathers/commit/d925c1bd193b5c19cb23a246f04fc46d0429fc75)) + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + + +### Bug Fixes + +* **authentication-oauth:** Allow req.feathers to be used in oAuth authentication requests ([#1886](https://github.com/feathersjs/feathers/issues/1886)) ([854c9ca](https://github.com/feathersjs/feathers/commit/854c9cac9a9a5f8f89054a90feb24ab5c4766f5f)) + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + + +### Bug Fixes + +* **package:** update grant-profile to version 0.0.11 ([#1841](https://github.com/feathersjs/feathers/issues/1841)) ([5dcd2aa](https://github.com/feathersjs/feathers/commit/5dcd2aa3483059cc7a2546b145dd72b4705fe2fe)) + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + + +### Features + +* **authentication-oauth:** Set oAuth redirect URL dynamically and pass query the service ([#1737](https://github.com/feathersjs/feathers/issues/1737)) ([0b05f0b](https://github.com/feathersjs/feathers/commit/0b05f0b58a257820fa61d695a36f36455209f6a1)) + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + + +### Features + +* **authentication-oauth:** Set oAuth redirect URL dynamically ([#1608](https://github.com/feathersjs/feathers/issues/1608)) ([1293e08](https://github.com/feathersjs/feathers/commit/1293e088abbb3d23f4a44680836645a8049ceaae)) + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + + +### Bug Fixes + +* **authentication-oauth:** Allow hash based redirects ([#1676](https://github.com/feathersjs/feathers/issues/1676)) ([ffe7cf3](https://github.com/feathersjs/feathers/commit/ffe7cf3fbb4e62d7689065cf7b61f25f602ce8cf)) + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + + +### Bug Fixes + +* Only initialize default Express session if oAuth is actually used ([#1648](https://github.com/feathersjs/feathers/issues/1648)) ([9b9b43f](https://github.com/feathersjs/feathers/commit/9b9b43ff09af1080e4aaa537064bac37b881c9a2)) + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + + +### Bug Fixes + +* Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + + +### Bug Fixes + +* Omit standard protocol ports from the default hostname ([#1543](https://github.com/feathersjs/feathers/issues/1543)) ([ef16d29](https://github.com/feathersjs/feathers/commit/ef16d29)) + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) +* Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + + +### Bug Fixes + +* Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/authentication-oauth + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/authentication-oauth/LICENSE b/packages/authentication-oauth/LICENSE index 25f2251eae..b4fa961994 100644 --- a/packages/authentication-oauth/LICENSE +++ b/packages/authentication-oauth/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/authentication-oauth/README.md b/packages/authentication-oauth/README.md index 991e9d22f1..512d2ab44f 100644 --- a/packages/authentication-oauth/README.md +++ b/packages/authentication-oauth/README.md @@ -1,6 +1,6 @@ # @feathersjs/authentication-oauth -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/authentication-oauth)](https://david-dm.org/feathersjs/feathers?path=packages/authentication-oauth) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/authentication-oauth.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication-oauth) @@ -11,3 +11,13 @@ ``` npm install @feathersjs/authentication-oauth --save ``` + +## Documentation + +Refer to the [Feathers oAuth authentication API documentation](https://docs.feathersjs.com/api/authentication/oauth.html) for more details. + +## License + +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) + +Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication-oauth/package-lock.json b/packages/authentication-oauth/package-lock.json deleted file mode 100644 index 9a21a3fccc..0000000000 --- a/packages/authentication-oauth/package-lock.json +++ /dev/null @@ -1,1407 +0,0 @@ -{ - "name": "@feathersjs/authentication-oauth", - "version": "4.0.0-pre.2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@feathersjs/authentication": { - "version": "4.0.0-pre.2", - "requires": { - "@feathersjs/errors": "^4.0.0-pre.2", - "debug": "^4.1.1", - "jsonwebtoken": "^8.5.1", - "lodash": "^4.17.11", - "uuid": "^3.3.2" - } - }, - "@feathersjs/errors": { - "version": "4.0.0-pre.2", - "requires": { - "debug": "^4.1.1" - } - }, - "@feathersjs/express": { - "version": "4.0.0-pre.2", - "requires": { - "@feathersjs/commons": "^4.0.0-pre.0", - "@feathersjs/errors": "^4.0.0-pre.2", - "@types/express": "^4.16.1", - "debug": "^4.1.1", - "express": "^4.17.1", - "uberproto": "^2.0.4" - } - }, - "@feathersjs/feathers": { - "version": "4.0.0-pre.2", - "dev": true, - "requires": { - "@feathersjs/commons": "^4.0.0-pre.0", - "debug": "^4.1.1", - "events": "^3.0.0", - "uberproto": "^2.0.4" - } - }, - "@types/body-parser": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", - "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/debug": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.4.tgz", - "integrity": "sha512-D9MyoQFI7iP5VdpEyPZyjjqIJ8Y8EDNQFIFVLOmeg1rI1xiHOChyUPMPRUVfqFCerxfE+yS3vMyj37F6IdtOoQ==", - "dev": true - }, - "@types/express": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", - "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.6.tgz", - "integrity": "sha512-8wr3CA/EMybyb6/V8qvTRKiNkPmgUA26uA9XWD6hlA0yFDuqi4r2L0C2B0U2HAYltJamoYJszlkaWM31vrKsHg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/range-parser": "*" - } - }, - "@types/express-session": { - "version": "1.15.12", - "resolved": "https://registry.npmjs.org/@types/express-session/-/express-session-1.15.12.tgz", - "integrity": "sha512-DHZXzWy6Nu5Ng0syXUiVFRpZ6/1DOXoTCWa6RG3itGrub2ioBYvgtDbkT6VHHNo3iOdHRROyWANsMBJVaflblQ==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/node": "*" - } - }, - "@types/lodash": { - "version": "4.14.132", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.132.tgz", - "integrity": "sha512-RNUU1rrh85NgUJcjOOr96YXr+RHwInGbaQCZmlitqOaCKXffj8bh+Zxwuq5rjDy5OgzFldDVoqk4pyLEDiwxIw==", - "dev": true - }, - "@types/mime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", - "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", - "dev": true - }, - "@types/mocha": { - "version": "5.2.6", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.6.tgz", - "integrity": "sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw==", - "dev": true - }, - "@types/node": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.2.tgz", - "integrity": "sha512-5tabW/i+9mhrfEOUcLDu2xBPsHJ+X5Orqy9FKpale3SjDA17j5AEpYq5vfy3oAeAHGcvANRCO3NV3d2D6q3NiA==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", - "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", - "dev": true - }, - "@types/serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", - "dev": true, - "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" - } - }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "arg": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", - "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "axios": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", - "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", - "dev": true, - "requires": { - "follow-redirects": "^1.3.0", - "is-buffer": "^1.1.5" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "es-abstract": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", - "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-keys": "^1.0.12" - } - }, - "es-to-primitive": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", - "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "express-session": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.16.1.tgz", - "integrity": "sha512-pWvUL8Tl5jUy1MLH7DhgUlpoKeVPUTe+y6WQD9YhcN0C5qAhsh4a8feVjiUXo3TFhIy191YGZ4tewW9edbl2xQ==", - "requires": { - "cookie": "0.3.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-headers": "~1.0.2", - "parseurl": "~1.3.2", - "safe-buffer": "5.1.2", - "uid-safe": "~2.1.5" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - }, - "dependencies": { - "is-buffer": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", - "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", - "dev": true - } - } - }, - "follow-redirects": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", - "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", - "dev": true, - "requires": { - "debug": "^3.2.6" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "grant": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/grant/-/grant-4.5.2.tgz", - "integrity": "sha512-96hyS0ouJ5CaO30YWLb9zatc2r23aLKvaM+81qnZWCpmL3l4/KTdaRoNG4X/e93vlmryyJr5jus/jrqctT6iFw==", - "requires": { - "qs": "^6.7.0", - "request-compose": "^1.2.0", - "request-oauth": "0.0.3" - } - }, - "grant-profile": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/grant-profile/-/grant-profile-0.0.3.tgz", - "integrity": "sha512-U79+WESxuaJkPaF/lETHQ8MHqKSao2o7LoleAblqp0/RwkZ0W03VsZ4Axt/1gEpoCirdoQehJeEP15bHy6A3+w==", - "requires": { - "qs": "^6.7.0", - "request-compose": "^1.2.0", - "request-oauth": "0.0.3" - } - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", - "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", - "dev": true - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "^1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-symbol": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", - "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.0" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", - "dev": true - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", - "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.2.2", - "yargs-parser": "13.0.0", - "yargs-unparser": "1.5.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", - "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "random-bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", - "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "request-compose": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/request-compose/-/request-compose-1.2.0.tgz", - "integrity": "sha512-kvWsOZhYsoIJw6cLQHgcENHktD/dozkjvTFi30+OwAoaXcnTS0dGD1Pp2Auq3Kf54wVP7Sf4hUJCkzySKMe/vA==" - }, - "request-oauth": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/request-oauth/-/request-oauth-0.0.3.tgz", - "integrity": "sha512-q7WdJlpIcPaIDac0FZSy/yH37FO3UkUuPDIsiLALiLjuC6vzvuKIU14YIC3Lm0wtQRXS9GqvSo/fCYj8n75xSw==", - "requires": { - "oauth-sign": "^0.8.2", - "qs": "^6.5.1", - "uuid": "^3.2.1" - }, - "dependencies": { - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", - "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shelljs": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", - "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", - "dev": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shx": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/shx/-/shx-0.3.2.tgz", - "integrity": "sha512-aS0mWtW3T2sHAenrSrip2XGv39O9dXIFUqxAEWHEOS1ePtGIBavdPJY1kE2IHl14V/4iCbUiNDPGdyYTtmhSoA==", - "dev": true, - "requires": { - "es6-object-assign": "^1.0.3", - "minimist": "^1.2.0", - "shelljs": "^0.8.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "ts-node": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.2.0.tgz", - "integrity": "sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.6", - "yn": "^3.0.0" - }, - "dependencies": { - "diff": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", - "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", - "dev": true - } - } - }, - "typescript": { - "version": "3.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", - "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", - "dev": true - }, - "uid-safe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", - "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", - "requires": { - "random-bytes": "~1.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.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.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", - "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", - "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.11", - "yargs": "^12.0.5" - }, - "dependencies": { - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "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-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", - "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==", - "dev": true - } - } -} diff --git a/packages/authentication-oauth/package.json b/packages/authentication-oauth/package.json index 9a4ccf9f9e..f352ed20fe 100644 --- a/packages/authentication-oauth/package.json +++ b/packages/authentication-oauth/package.json @@ -1,14 +1,19 @@ { "name": "@feathersjs/authentication-oauth", "description": "oAuth 1 and 2 authentication for Feathers. Powered by Grant.", - "version": "4.0.0-pre.3", + "version": "4.5.4", "homepage": "https://feathersjs.com", "main": "lib/", + "types": "lib/", "keywords": [ "feathers", "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -23,13 +28,13 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { "start": "ts-node test/app", "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", - "test": "mocha --opts ../../mocha.ts.opts --recursive test/**.test.ts test/**/*.test.ts" + "test": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -38,28 +43,28 @@ "access": "public" }, "dependencies": { - "@feathersjs/authentication": "^4.0.0-pre.3", - "@feathersjs/errors": "^4.0.0-pre.3", - "@feathersjs/express": "^4.0.0-pre.3", + "@feathersjs/authentication": "^4.5.3", + "@feathersjs/errors": "^4.5.3", + "@feathersjs/express": "^4.5.4", + "@feathersjs/feathers": "^4.5.3", "debug": "^4.1.1", - "express-session": "^1.16.1", - "grant": "^4.5.2", - "grant-profile": "^0.0.3", - "lodash": "^4.17.11" + "express-session": "^1.17.1", + "grant": "^4.7.0", + "grant-profile": "^0.0.11", + "lodash": "^4.17.19" }, "devDependencies": { - "@feathersjs/feathers": "^4.0.0-pre.3", - "@types/debug": "^4.1.4", - "@types/express": "^4.16.1", - "@types/express-session": "^1.15.12", - "@types/lodash": "^4.14.132", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.2", - "axios": "^0.18.0", - "mocha": "^6.1.4", + "@types/debug": "^4.1.5", + "@types/express": "^4.17.7", + "@types/express-session": "^1.17.0", + "@types/lodash": "^4.14.157", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.22", + "axios": "^0.19.2", + "mocha": "^8.0.1", "shx": "^0.3.2", - "ts-node": "^8.2.0", - "typescript": "^3.4.5" + "ts-node": "^8.10.2", + "typescript": "^3.9.6" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/authentication-oauth/src/express.ts b/packages/authentication-oauth/src/express.ts index 8c36b257b4..5beef2b30c 100644 --- a/packages/authentication-oauth/src/express.ts +++ b/packages/authentication-oauth/src/express.ts @@ -1,8 +1,9 @@ // @ts-ignore import { express as grantExpress } from 'grant'; import Debug from 'debug'; +import session from 'express-session'; import { Application } from '@feathersjs/feathers'; -import { AuthenticationService, AuthenticationResult } from '@feathersjs/authentication'; +import { AuthenticationResult } from '@feathersjs/authentication'; import qs from 'querystring'; import { Application as ExpressApplication, @@ -26,20 +27,28 @@ export default (options: OauthSetupSettings) => { } const { path } = config.defaults; + const expressSession = options.expressSession || session({ + secret: Math.random().toString(36).substring(7), + saveUninitialized: true, + resave: true + }); const grantApp = grant(config); const authApp = express(); - authApp.use(options.expressSession); + authApp.use(expressSession); authApp.get('/:name', (req, res) => { - const { feathers_token, ...query } = req.query; + const { feathers_token, redirect, ...query } = req.query; + const { name } = req.params as any; if (feathers_token) { debug(`Got feathers_token query parameter to link accounts`, feathers_token); req.session.accessToken = feathers_token; } + req.session.redirect = redirect; + req.session.query = query; - res.redirect(`${path}/connect/${req.params.name}?${qs.stringify(query)}`); + res.redirect(`${path}/connect/${name}?${qs.stringify(query as any)}`); }); authApp.get('/:name/callback', (req: any, res: any) => { @@ -47,13 +56,23 @@ export default (options: OauthSetupSettings) => { }); authApp.get('/:name/authenticate', async (req, res, next) => { - const { name } = req.params; - const { accessToken, grant } = req.session; - const service: AuthenticationService = app.service(authService); + const { name } = req.params as any; + const { accessToken, grant, query = {}, redirect } = req.session; + const service = app.defaultAuthentication(authService); const [ strategy ] = service.getStrategies(name) as OAuthStrategy[]; + const params = { + ...req.feathers, + authStrategies: [ name ], + authentication: accessToken ? { + strategy: linkStrategy, + accessToken + } : null, + query, + redirect + }; const sendResponse = async (data: AuthenticationResult|Error) => { try { - const redirect = await strategy.getRedirect(data); + const redirect = await strategy.getRedirect(data, params); if (redirect !== null) { res.redirect(redirect); @@ -71,15 +90,6 @@ export default (options: OauthSetupSettings) => { try { const payload = config.defaults.transport === 'session' ? grant.response : req.query; - - const params = { - authStrategies: [ name ], - authentication: accessToken ? { - strategy: linkStrategy, - accessToken - } : null - }; - const authentication = { strategy: name, ...payload diff --git a/packages/authentication-oauth/src/index.ts b/packages/authentication-oauth/src/index.ts index 25f616b3cf..2c666b6e5e 100644 --- a/packages/authentication-oauth/src/index.ts +++ b/packages/authentication-oauth/src/index.ts @@ -1,7 +1,8 @@ import Debug from 'debug'; -import { merge, each, omit } from 'lodash'; +import merge from 'lodash/merge'; +import each from 'lodash/each'; +import omit from 'lodash/omit'; import { Application } from '@feathersjs/feathers'; -import { AuthenticationService } from '@feathersjs/authentication'; import { OAuthStrategy, OAuthProfile } from './strategy'; import { default as setupExpress } from './express'; import { OauthSetupSettings, getDefaultSettings } from './utils'; @@ -11,33 +12,46 @@ const debug = Debug('@feathersjs/authentication-oauth'); export { OauthSetupSettings, OAuthStrategy, OAuthProfile }; export const setup = (options: OauthSetupSettings) => (app: Application) => { - const authPath = options.authService; - const service: AuthenticationService = app.service(authPath); + const service = app.defaultAuthentication ? app.defaultAuthentication(options.authService) : null; if (!service) { - throw new Error(`'${authPath}' authentication service must exist before registering @feathersjs/authentication-oauth`); + throw new Error('An authentication service must exist before registering @feathersjs/authentication-oauth'); } const { oauth } = service.configuration; if (!oauth) { - debug(`No oauth configuration found at '${authPath}'. Skipping oAuth setup.`); + debug(`No oauth configuration found in authentication configuration. Skipping oAuth setup.`); return; } const { strategyNames } = service; + + // Set up all the defaults const { path = '/oauth' } = oauth.defaults || {}; + const port = app.get('port'); + let host = app.get('host'); + let protocol = 'https'; + + // Development environments commonly run on HTTP with an extended port + if (app.get('env') === 'development') { + protocol = 'http'; + if (String(port) !== '80') { + host += ':' + port; + } + } + const grant = merge({ defaults: { path, - host: `${app.get('host')}:${app.get('port')}`, - protocol: app.get('env') === 'production' ? 'https' : 'http', + host, + protocol, transport: 'session' } }, omit(oauth, 'redirect')); + const getUrl = (url: string) => { const { defaults } = grant; - return `${defaults.protocol}://${defaults.host}${path}/${url}`; }; diff --git a/packages/authentication-oauth/src/strategy.ts b/packages/authentication-oauth/src/strategy.ts index cf4ef9dbda..86bdef0b63 100644 --- a/packages/authentication-oauth/src/strategy.ts +++ b/packages/authentication-oauth/src/strategy.ts @@ -6,6 +6,7 @@ import { AuthenticationRequest, AuthenticationBaseStrategy, AuthenticationResult } from '@feathersjs/authentication'; import { Params } from '@feathersjs/feathers'; +import { NotAuthenticated } from '@feathersjs/errors'; const debug = Debug('@feathersjs/authentication-oauth/strategy'); @@ -72,14 +73,17 @@ export class OAuthStrategy extends AuthenticationBaseStrategy { return null; } - async getRedirect (data: AuthenticationResult|Error) { + async getRedirect (data: AuthenticationResult|Error, params?: Params): Promise { + const queryRedirect = (params && params.redirect) || ''; const { redirect } = this.authentication.configuration.oauth; if (!redirect) { return null; } - const separator = redirect.endsWith('?') ? '' : '#'; + const redirectUrl = redirect + queryRedirect; + const separator = redirect.endsWith('?') ? '' : + (redirect.indexOf('#') !== -1 ? '?' : '#'); const authResult: AuthenticationResult = data; const query = authResult.accessToken ? { access_token: authResult.accessToken @@ -87,7 +91,7 @@ export class OAuthStrategy extends AuthenticationBaseStrategy { error: data.message || 'OAuth Authentication not successful' }; - return redirect + separator + querystring.stringify(query); + return redirectUrl + separator + querystring.stringify(query); } async findEntity (profile: OAuthProfile, params: Params) { @@ -99,7 +103,8 @@ export class OAuthStrategy extends AuthenticationBaseStrategy { ...params, query }); - const [ entity = null ] = result.data ? result.data : result; + + const [ entity = null ] = Array.isArray(result) ? result : result.data debug('findEntity returning', entity); @@ -123,8 +128,27 @@ export class OAuthStrategy extends AuthenticationBaseStrategy { return this.entityService.patch(id, data, params); } - async authenticate (authentication: AuthenticationRequest, params: Params) { + async getEntity (result: any, params: Params) { + const { entityService } = this; + const { entityId = entityService.id, entity } = this.configuration; + + if (!entityId || result[entityId] === undefined) { + throw new NotAuthenticated('Could not get oAuth entity'); + } + + if (!params.provider) { + return result; + } + + return entityService.get(result[entityId], { + ...params, + [entity]: result + }); + } + + async authenticate (authentication: AuthenticationRequest, originalParams: Params) { const entity: string = this.configuration.entity; + const { provider, ...params } = originalParams; const profile = await this.getProfile(authentication, params); const existingEntity = await this.findEntity(profile, params) || await this.getCurrentEntity(params); @@ -136,7 +160,7 @@ export class OAuthStrategy extends AuthenticationBaseStrategy { return { authentication: { strategy: this.name }, - [entity]: authEntity + [entity]: await this.getEntity(authEntity, originalParams) }; } } diff --git a/packages/authentication-oauth/src/utils.ts b/packages/authentication-oauth/src/utils.ts index 7f21a7e5fe..847a040d54 100644 --- a/packages/authentication-oauth/src/utils.ts +++ b/packages/authentication-oauth/src/utils.ts @@ -1,22 +1,15 @@ import { RequestHandler } from 'express'; -import session from 'express-session'; import { Application } from '@feathersjs/feathers'; export interface OauthSetupSettings { - authService: string; + authService?: string; + expressSession?: RequestHandler; linkStrategy: string; - expressSession: RequestHandler; } -export const getDefaultSettings = (app: Application, other?: Partial) => { +export const getDefaultSettings = (_app: Application, other?: Partial) => { const defaults: OauthSetupSettings = { - authService: app.get('defaultAuthentication'), linkStrategy: 'jwt', - expressSession: session({ - secret: Math.random().toString(36).substring(7), - saveUninitialized: true, - resave: true - }), ...other }; diff --git a/packages/authentication-oauth/test/express.test.ts b/packages/authentication-oauth/test/express.test.ts index 26c19b3d78..967be8f2f6 100644 --- a/packages/authentication-oauth/test/express.test.ts +++ b/packages/authentication-oauth/test/express.test.ts @@ -27,6 +27,7 @@ describe('@feathersjs/authentication-oauth/express', () => { assert.ok(data.accessToken); assert.equal(data.user.testId, 'expressTest'); + assert.equal(data.fromMiddleware, 'testing'); }); it('oauth/test/authenticate with redirect', async () => { diff --git a/packages/authentication-oauth/test/fixture.ts b/packages/authentication-oauth/test/fixture.ts index a10dc540d1..0bede592e6 100644 --- a/packages/authentication-oauth/test/fixture.ts +++ b/packages/authentication-oauth/test/fixture.ts @@ -1,11 +1,9 @@ import feathers, { Params } from '@feathersjs/feathers'; -import express, { rest, errorHandler } from '@feathersjs/express'; +import express from '@feathersjs/express'; +import memory from 'feathers-memory'; import { AuthenticationService, JWTStrategy, AuthenticationRequest } from '@feathersjs/authentication'; import { express as oauth, OAuthStrategy } from '../src'; -// @ts-ignore -import memory from 'feathers-memory'; - export class TestOAuthStrategy extends OAuthStrategy { async getProfile (data: AuthenticationRequest, _params: Params) { if (!data.id) { @@ -14,16 +12,28 @@ export class TestOAuthStrategy extends OAuthStrategy { return data; } + + async authenticate (data: AuthenticationRequest, params: Params) { + const { fromMiddleware } = params; + const authResult = await super.authenticate(data, params); + + if (fromMiddleware) { + authResult.fromMiddleware = fromMiddleware; + } + + return authResult; + } } +export const app = express(feathers()); + const port = 3000; -const app = express(feathers()); const auth = new AuthenticationService(app); auth.register('jwt', new JWTStrategy()); auth.register('test', new TestOAuthStrategy()); -app.configure(rest()); +app.configure(express.rest()); app.set('host', '127.0.0.1'); app.set('port', port); app.set('authentication', { @@ -46,10 +56,12 @@ app.set('authentication', { } }); +app.use((req, _res, next) => { + req.feathers = { fromMiddleware: 'testing' }; + next(); +}); app.use('/authentication', auth); app.use('/users', memory()); app.configure(oauth()); -app.use(errorHandler({ logger: null })); - -export { app }; +app.use(express.errorHandler({ logger: null })); diff --git a/packages/authentication-oauth/test/index.test.ts b/packages/authentication-oauth/test/index.test.ts index 834f065666..014a50b7d8 100644 --- a/packages/authentication-oauth/test/index.test.ts +++ b/packages/authentication-oauth/test/index.test.ts @@ -13,7 +13,7 @@ describe('@feathersjs/authentication-oauth', () => { assert.fail('Should never get here'); } catch (error) { assert.equal(error.message, - `'something' authentication service must exist before registering @feathersjs/authentication-oauth` + 'An authentication service must exist before registering @feathersjs/authentication-oauth' ); } }); diff --git a/packages/authentication-oauth/test/strategy.test.ts b/packages/authentication-oauth/test/strategy.test.ts index 9217a0f1ed..7f178a34a9 100644 --- a/packages/authentication-oauth/test/strategy.test.ts +++ b/packages/authentication-oauth/test/strategy.test.ts @@ -24,6 +24,11 @@ describe('@feathersjs/authentication-oauth/strategy', () => { let redirect = await strategy.getRedirect({ accessToken: 'testing' }); assert.equal(redirect, '/home#access_token=testing'); + redirect = await strategy.getRedirect({ accessToken: 'testing' }, { + redirect: '/hi-there' + }); + assert.strictEqual('/home/hi-there#access_token=testing', redirect); + redirect = await strategy.getRedirect(new Error('something went wrong')); assert.equal(redirect, '/home#error=something%20went%20wrong'); @@ -39,6 +44,11 @@ describe('@feathersjs/authentication-oauth/strategy', () => { redirect = await strategy.getRedirect({ accessToken: 'testing' }); assert.equal(redirect, null); + + app.get('authentication').oauth.redirect = '/#dashboard'; + + redirect = await strategy.getRedirect({ accessToken: 'testing' }); + assert.equal(redirect, '/#dashboard?access_token=testing'); }); it('getProfile', async () => { diff --git a/packages/authentication-oauth/test/utils.test.ts b/packages/authentication-oauth/test/utils.test.ts index 20fd70a5c1..04aee35b22 100644 --- a/packages/authentication-oauth/test/utils.test.ts +++ b/packages/authentication-oauth/test/utils.test.ts @@ -6,7 +6,7 @@ describe('@feathersjs/authentication-oauth/utils', () => { it('getDefaultSettings', () => { const settings = getDefaultSettings(app); - assert.equal(settings.authService, 'authentication'); + assert.equal(settings.authService, undefined); assert.equal(settings.linkStrategy, 'jwt'); }); }); diff --git a/packages/authentication/.npmignore b/packages/authentication/.npmignore index d7819044b6..ef86d5f1e7 100644 --- a/packages/authentication/.npmignore +++ b/packages/authentication/.npmignore @@ -1,3 +1,3 @@ test/ -src/ tsconfig.json +coverage/ diff --git a/packages/authentication/CHANGELOG.md b/packages/authentication/CHANGELOG.md index b537ffb3c9..390f5df20e 100644 --- a/packages/authentication/CHANGELOG.md +++ b/packages/authentication/CHANGELOG.md @@ -3,6 +3,236 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + + +### Bug Fixes + +* **authentication:** Remove entity from connection information on logout ([#1889](https://github.com/feathersjs/feathers/issues/1889)) ([b062753](https://github.com/feathersjs/feathers/commit/b0627530d61babe15dd84369d3093ccae4b780ca)) + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + + +### Bug Fixes + +* **authentication:** Improve JWT strategy configuration error message ([#1844](https://github.com/feathersjs/feathers/issues/1844)) ([2c771db](https://github.com/feathersjs/feathers/commit/2c771dbb22d53d4f7de3c3f514e57afa1a186322)) + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + + +### Bug Fixes + +* Add `params.authentication` type, remove `hook.connection` type ([#1732](https://github.com/feathersjs/feathers/issues/1732)) ([d46b7b2](https://github.com/feathersjs/feathers/commit/d46b7b2abac8862c0e4dbfce20d71b8b8a96692f)) + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + + +### Bug Fixes + +* **authentication:** Retain object references in authenticate hook ([#1675](https://github.com/feathersjs/feathers/issues/1675)) ([e1939be](https://github.com/feathersjs/feathers/commit/e1939be19d4e79d3f5e2fe69ba894a11c627ae99)) + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + + +### Bug Fixes + +* Add jsonwebtoken TypeScript type dependency ([317c80a](https://github.com/feathersjs/feathers/commit/317c80a9205e8853bb830a12c3aa1a19e95f9abc)) +* Small type improvements ([#1624](https://github.com/feathersjs/feathers/issues/1624)) ([50162c6](https://github.com/feathersjs/feathers/commit/50162c6e562f0a47c6a280c4f01fff7c3afee293)) + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + + +### Bug Fixes + +* Authentication type improvements and timeout fix ([#1605](https://github.com/feathersjs/feathers/issues/1605)) ([19854d3](https://github.com/feathersjs/feathers/commit/19854d3)) +* Improve error message when authentication strategy is not allowed ([#1600](https://github.com/feathersjs/feathers/issues/1600)) ([317a312](https://github.com/feathersjs/feathers/commit/317a312)) + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + + +### Bug Fixes + +* check for undefined access token ([#1571](https://github.com/feathersjs/feathers/issues/1571)) ([976369d](https://github.com/feathersjs/feathers/commit/976369d)) +* Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + + +### Bug Fixes + +* Use long-timeout for JWT expiration timers ([#1552](https://github.com/feathersjs/feathers/issues/1552)) ([65637ec](https://github.com/feathersjs/feathers/commit/65637ec)) + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + + +### Bug Fixes + +* Fix auth publisher mistake ([08bad61](https://github.com/feathersjs/feathers/commit/08bad61)) + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Expire and remove authenticated real-time connections ([#1512](https://github.com/feathersjs/feathers/issues/1512)) ([2707c33](https://github.com/feathersjs/feathers/commit/2707c33)) +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) + + +### Features + +* Let strategies handle the connection ([#1510](https://github.com/feathersjs/feathers/issues/1510)) ([4329feb](https://github.com/feathersjs/feathers/commit/4329feb)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + + +### Bug Fixes + +* Add getEntityId to JWT strategy and fix legacy Socket authentication ([#1488](https://github.com/feathersjs/feathers/issues/1488)) ([9a3b324](https://github.com/feathersjs/feathers/commit/9a3b324)) +* Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/authentication + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + + +### Bug Fixes + +* Updated typings for ServiceMethods ([#1409](https://github.com/feathersjs/feathers/issues/1409)) ([b5ee7e2](https://github.com/feathersjs/feathers/commit/b5ee7e2)) + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/authentication/LICENSE b/packages/authentication/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/authentication/LICENSE +++ b/packages/authentication/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/authentication/README.md b/packages/authentication/README.md index deeea4b2a1..2d0a28501a 100644 --- a/packages/authentication/README.md +++ b/packages/authentication/README.md @@ -1,85 +1,23 @@ # @feathersjs/authentication -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/authentication)](https://david-dm.org/feathersjs/feathers?path=packages/authentication) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/authentication.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/authentication) > Add Authentication to your FeathersJS app. -`@feathersjs/authentication` adds shared [PassportJS](http://passportjs.org/) authentication for Feathers HTTP REST and WebSocket transports using [JSON Web Tokens](http://jwt.io/). - ## Installation ``` npm install @feathersjs/authentication --save ``` -## Quick example - -```js -const feathers = require('@feathersjs/feathers'); -const express = require('@feathersjs/express'); -const socketio = require('@feathersjs/socketio'); -const auth = require('@feathersjs/authentication'); -const local = require('@feathersjs/authentication-local'); -const jwt = require('@feathersjs/authentication-jwt'); -const memory = require('feathers-memory'); - -const app = express(feathers()); -app.configure(express.rest()) - .configure(socketio()) - .use(express.json()) - .use(express.urlencoded({ extended: true })) - .configure(auth({ secret: 'supersecret' })) - .configure(local()) - .configure(jwt()) - .use('/users', memory()) - .use('/', express.static(__dirname + '/public')) - .use(express.errorHandler()); - -app.service('users').hooks({ - // Make sure `password` never gets sent to the client - after: local.hooks.protect('password') -}); - -app.service('authentication').hooks({ - before: { - create: [ - // You can chain multiple strategies - auth.hooks.authenticate(['jwt', 'local']) - ], - remove: [ - auth.hooks.authenticate('jwt') - ] - } -}); - -// Add a hook to the user service that automatically replaces -// the password with a hash of the password before saving it. -app.service('users').hooks({ - before: { - find: [ - auth.hooks.authenticate('jwt') - ], - create: [ - local.hooks.hashPassword({ passwordField: 'password' }) - ] - } -}); - -const port = 3030; -let server = app.listen(port); -server.on('listening', function() { - console.log(`Feathers application started on localhost:${port}`); -}); -``` - ## Documentation -Please refer to the [@feathersjs/authentication API documentation](https://docs.feathersjs.com/api/authentication/server.html) for more details. +Refer to the [Feathers authentication API documentation](https://docs.feathersjs.com/api/authentication/) for more details. ## License -Copyright (c) 2018 +Copyright (c) 2019 Licensed under the [MIT license](LICENSE). diff --git a/packages/authentication/package.json b/packages/authentication/package.json index a4b5ee10d8..51fd6abb10 100644 --- a/packages/authentication/package.json +++ b/packages/authentication/package.json @@ -1,14 +1,19 @@ { "name": "@feathersjs/authentication", "description": "Add Authentication to your FeathersJS app.", - "version": "4.0.0-pre.3", + "version": "4.5.3", "homepage": "https://feathersjs.com", "main": "lib/", + "types": "lib/", "keywords": [ "feathers", "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -23,13 +28,13 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --opts ../../mocha.ts.opts --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -38,25 +43,27 @@ "access": "public" }, "dependencies": { - "@feathersjs/errors": "^4.0.0-pre.3", + "@feathersjs/errors": "^4.5.3", + "@feathersjs/feathers": "^4.5.3", + "@feathersjs/transport-commons": "^4.5.3", + "@types/jsonwebtoken": "^8.5.0", "debug": "^4.1.1", "jsonwebtoken": "^8.5.1", - "lodash": "^4.17.11", - "uuid": "^3.3.2" + "lodash": "^4.17.19", + "long-timeout": "^0.1.1", + "uuid": "^8.2.0" }, "devDependencies": { - "@feathersjs/feathers": "^4.0.0-pre.3", - "@types/debug": "^4.1.4", - "@types/jsonwebtoken": "^8.3.2", - "@types/lodash": "^4.14.132", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.2", - "@types/uuid": "^3.4.4", - "feathers-memory": "^3.0.2", - "mocha": "^6.1.4", + "@types/debug": "^4.1.5", + "@types/lodash": "^4.14.157", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.22", + "@types/uuid": "^8.0.0", + "feathers-memory": "^4.1.0", + "mocha": "^8.0.1", "shx": "^0.3.2", - "ts-node": "^8.2.0", - "typescript": "^3.4.5" + "ts-node": "^8.10.2", + "typescript": "^3.9.6" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/authentication/src/core.ts b/packages/authentication/src/core.ts index e9f145630f..376d0ea28b 100644 --- a/packages/authentication/src/core.ts +++ b/packages/authentication/src/core.ts @@ -1,7 +1,6 @@ -import { promisify } from 'util'; -import { merge } from 'lodash'; +import merge from 'lodash/merge'; import jsonwebtoken, { SignOptions, Secret, VerifyOptions } from 'jsonwebtoken'; -import uuidv4 from 'uuid/v4'; +import { v4 as uuidv4 } from 'uuid'; import { NotAuthenticated } from '@feathersjs/errors'; import Debug from 'debug'; import { Application, Params } from '@feathersjs/feathers'; @@ -9,8 +8,6 @@ import { IncomingMessage, ServerResponse } from 'http'; import defaultOptions from './options'; const debug = Debug('@feathersjs/authentication/base'); -const verifyJWT = promisify(jsonwebtoken.verify); -const createJWT = promisify(jsonwebtoken.sign); export interface AuthenticationResult { [key: string]: any; @@ -21,6 +18,8 @@ export interface AuthenticationRequest { [key: string]: any; } +export type ConnectionEvent = 'login' | 'logout' | 'disconnect'; + export interface AuthenticationStrategy { /** * Implement this method to get access to the AuthenticationService @@ -49,16 +48,23 @@ export interface AuthenticationStrategy { * @param params The service call parameters */ authenticate? (authentication: AuthenticationRequest, params: Params): Promise; + /** + * Update a real-time connection according to this strategy. + * + * @param connection The real-time connection + * @param context The hook context + */ + handleConnection? (event: ConnectionEvent, connection: any, authResult?: AuthenticationResult): Promise; /** * Parse a basic HTTP request and response for authentication request information. * @param req The HTTP request * @param res The HTTP response */ - parse? (req: IncomingMessage, res: ServerResponse): Promise; + parse? (req: IncomingMessage, res: ServerResponse): Promise; } export interface JwtVerifyOptions extends VerifyOptions { - algorithm?: string|string[]; + algorithm?: string | string[]; } /** @@ -134,11 +140,9 @@ export class AuthenticationBase { /** * Get the registered authentication strategies for a list of names. - * The return value may contain `undefined` if the strategy does not exist. * @param names The list or strategy names */ getStrategies (...names: string[]) { - // Returns all strategies for a list of names (including undefined) return names.map(name => this.strategies[name]) .filter(current => !!current); } @@ -161,8 +165,7 @@ export class AuthenticationBase { options.jwtid = uuidv4(); } - // @ts-ignore - return createJWT(payload, jwtSecret, options); + return jsonwebtoken.sign(payload, jwtSecret, options); } /** @@ -184,10 +187,9 @@ export class AuthenticationBase { } try { - // @ts-ignore - const isValid = await verifyJWT(accessToken, jwtSecret, options); + const verified = await jsonwebtoken.verify(accessToken, jwtSecret, options); - return isValid; + return verified as any; } catch (error) { throw new NotAuthenticated(error.message, error); } @@ -200,14 +202,18 @@ export class AuthenticationBase { * @param allowed A list of allowed strategy names */ async authenticate (authentication: AuthenticationRequest, params: Params, ...allowed: string[]) { - const { strategy } = authentication || ({} as AuthenticationRequest); + const { strategy } = authentication || {}; const [ authStrategy ] = this.getStrategies(strategy); + const strategyAllowed = allowed.includes(strategy); debug('Running authenticate for strategy', strategy, allowed); - if (!authentication || !authStrategy || !allowed.includes(strategy)) { + if (!authentication || !authStrategy || !strategyAllowed) { + const additionalInfo = (!strategy && ' (no `strategy` set)') || + (!strategyAllowed && ' (strategy not allowed in authStrategies)') || ''; + // If there are no valid strategies or `authentication` is not an object - throw new NotAuthenticated(`Invalid authentication information` + (!strategy ? ' (no `strategy` set)' : '')); + throw new NotAuthenticated('Invalid authentication information' + additionalInfo); } return authStrategy.authenticate(authentication, { @@ -216,6 +222,15 @@ export class AuthenticationBase { }); } + async handleConnection (event: ConnectionEvent, connection: any, authResult?: AuthenticationResult) { + const strategies = this.getStrategies(...Object.keys(this.strategies)) + .filter(current => typeof current.handleConnection === 'function'); + + for (const strategy of strategies) { + await strategy.handleConnection(event, connection, authResult); + } + } + /** * Parse an HTTP request and response for authentication request information. * @param req The HTTP request @@ -224,7 +239,7 @@ export class AuthenticationBase { */ async parse (req: IncomingMessage, res: ServerResponse, ...names: string[]) { const strategies = this.getStrategies(...names) - .filter(current => current && typeof current.parse === 'function'); + .filter(current => typeof current.parse === 'function'); debug('Strategies parsing HTTP header for authentication information', names); diff --git a/packages/authentication/src/hooks/authenticate.ts b/packages/authentication/src/hooks/authenticate.ts index 21650cbc07..0ec2faaf40 100644 --- a/packages/authentication/src/hooks/authenticate.ts +++ b/packages/authentication/src/hooks/authenticate.ts @@ -1,8 +1,8 @@ -import { flatten, omit, merge } from 'lodash'; +import flatten from 'lodash/flatten'; +import omit from 'lodash/omit'; import { HookContext } from '@feathersjs/feathers'; import { NotAuthenticated } from '@feathersjs/errors'; import Debug from 'debug'; -import { AuthenticationService } from '../service'; const debug = Debug('@feathersjs/authentication/hooks/authenticate'); @@ -11,7 +11,7 @@ export interface AuthenticateHookSettings { strategies: string[]; } -export default (originalSettings: string|AuthenticateHookSettings, ...originalStrategies: string[]) => { +export default (originalSettings: string | AuthenticateHookSettings, ...originalStrategies: string[]) => { const settings = typeof originalSettings === 'string' ? { strategies: flatten([ originalSettings, ...originalStrategies ]) } : originalSettings; @@ -22,12 +22,9 @@ export default (originalSettings: string|AuthenticateHookSettings, ...originalSt return async (context: HookContext) => { const { app, params, type, path, service } = context; - const { - service: authPath = app.get('defaultAuthentication'), - strategies - } = settings; + const { strategies } = settings; const { provider, authentication } = params; - const authService = app.service(authPath) as unknown as AuthenticationService; + const authService = app.defaultAuthentication(settings.service); debug(`Running authenticate hook on '${path}'`); @@ -36,7 +33,7 @@ export default (originalSettings: string|AuthenticateHookSettings, ...originalSt } if (!authService || typeof authService.authenticate !== 'function') { - throw new NotAuthenticated(`Could not find authentication service at '${authPath}'`); + throw new NotAuthenticated('Could not find a valid authentication service'); } // @ts-ignore @@ -49,16 +46,16 @@ export default (originalSettings: string|AuthenticateHookSettings, ...originalSt } if (authentication) { - const authParams = omit(params, 'provider', 'authentication', 'query'); + const authParams = omit(params, 'provider', 'authentication'); debug('Authenticating with', authentication, strategies); const authResult = await authService.authenticate(authentication, authParams, ...strategies); - context.params = merge({}, params, omit(authResult, 'accessToken'), { authenticated: true }); + context.params = Object.assign({}, params, omit(authResult, 'accessToken'), { authenticated: true }); return context; - } else if (!authentication && provider) { + } else if (provider) { throw new NotAuthenticated('Not authenticated'); } diff --git a/packages/authentication/src/hooks/connection.ts b/packages/authentication/src/hooks/connection.ts index 53e87dbbb9..e378248d80 100644 --- a/packages/authentication/src/hooks/connection.ts +++ b/packages/authentication/src/hooks/connection.ts @@ -1,27 +1,19 @@ import { HookContext } from '@feathersjs/feathers'; -import Debug from 'debug'; +import omit from 'lodash/omit'; +import { AuthenticationBase, ConnectionEvent } from '../core'; -const debug = Debug('@feathersjs/authentication/hooks/connection'); - -export default (strategy = 'jwt') => (context: HookContext) => { - const { method, result, params: { connection } } = context; - const { accessToken, ...rest } = result; +export default (event: ConnectionEvent) => async (context: HookContext) => { + const { result, params: { connection } } = context; if (!connection) { return context; } - const { authentication = {} } = connection; + const service = context.service as unknown as AuthenticationBase; - if (method === 'remove' && accessToken === authentication.accessToken) { - debug('Removing authentication information from real-time connection'); - delete connection.authentication; - } else if (method === 'create' && accessToken) { - debug('Adding authentication information to real-time connection'); - Object.assign(connection, rest, { - authentication: { strategy, accessToken } - }); - } + Object.assign(connection, omit(result, 'accessToken', 'authentication')); + + await service.handleConnection(event, connection, result); return context; }; diff --git a/packages/authentication/src/hooks/events.ts b/packages/authentication/src/hooks/event.ts similarity index 51% rename from packages/authentication/src/hooks/events.ts rename to packages/authentication/src/hooks/event.ts index b45fca232d..1520f76f15 100644 --- a/packages/authentication/src/hooks/events.ts +++ b/packages/authentication/src/hooks/event.ts @@ -1,17 +1,13 @@ import Debug from 'debug'; import { HookContext } from '@feathersjs/feathers'; +import { ConnectionEvent } from '../core'; const debug = Debug('@feathersjs/authentication/hooks/connection'); -const EVENTS: { [key: string]: string } = { - create: 'login', - remove: 'logout' -}; -export default () => (context: HookContext) => { - const { method, app, result, params } = context; - const event = EVENTS[method]; +export default (event: ConnectionEvent) => async (context: HookContext) => { + const { app, result, params } = context; - if (event && params.provider && result) { + if (params.provider && result) { debug(`Sending authentication event '${event}'`); app.emit(event, result, params, context); } diff --git a/packages/authentication/src/hooks/index.ts b/packages/authentication/src/hooks/index.ts index 3870bb495e..775f3e0943 100644 --- a/packages/authentication/src/hooks/index.ts +++ b/packages/authentication/src/hooks/index.ts @@ -1,3 +1,3 @@ export { default as authenticate } from './authenticate'; export { default as connection } from './connection'; -export { default as events } from './events'; +export { default as event } from './event'; diff --git a/packages/authentication/src/index.ts b/packages/authentication/src/index.ts index d6e9840c92..06dcc6e7f8 100644 --- a/packages/authentication/src/index.ts +++ b/packages/authentication/src/index.ts @@ -8,7 +8,8 @@ export { AuthenticationBase, AuthenticationRequest, AuthenticationResult, - AuthenticationStrategy + AuthenticationStrategy, + ConnectionEvent } from './core'; export { AuthenticationBaseStrategy } from './strategy'; export { AuthenticationService } from './service'; diff --git a/packages/authentication/src/jwt.ts b/packages/authentication/src/jwt.ts index ff3ef85cd4..f1208d99a4 100644 --- a/packages/authentication/src/jwt.ts +++ b/packages/authentication/src/jwt.ts @@ -1,13 +1,20 @@ +import Debug from 'debug'; +import omit from 'lodash/omit'; +import { IncomingMessage } from 'http'; import { NotAuthenticated } from '@feathersjs/errors'; -import { omit } from 'lodash'; -import { AuthenticationRequest } from './core'; import { Params } from '@feathersjs/feathers'; -import { IncomingMessage } from 'http'; +// @ts-ignore +import lt from 'long-timeout'; + import { AuthenticationBaseStrategy } from './strategy'; +import { AuthenticationRequest, AuthenticationResult, ConnectionEvent } from './core'; +const debug = Debug('@feathersjs/authentication/jwt'); const SPLIT_HEADER = /(\S+)\s+(\S+)/; export class JWTStrategy extends AuthenticationBaseStrategy { + expirationTimers = new WeakMap(); + get configuration () { const authConfig = this.authentication.configuration; const config = super.configuration; @@ -21,6 +28,43 @@ export class JWTStrategy extends AuthenticationBaseStrategy { }; } + async handleConnection (event: ConnectionEvent, connection: any, authResult?: AuthenticationResult): Promise { + const isValidLogout = event === 'logout' && connection.authentication && authResult && + connection.authentication.accessToken === authResult.accessToken; + + const { accessToken } = authResult || {}; + + if (accessToken && event === 'login') { + debug('Adding authentication information to connection'); + const { exp } = await this.authentication.verifyAccessToken(accessToken); + // The time (in ms) until the token expires + const duration = (exp * 1000) - Date.now(); + // This may have to be a `logout` event but right now we don't want + // the whole context object lingering around until the timer is gone + const timer = lt.setTimeout(() => this.app.emit('disconnect', connection), duration); + + debug(`Registering connection expiration timer for ${duration}ms`); + lt.clearTimeout(this.expirationTimers.get(connection)); + this.expirationTimers.set(connection, timer); + + debug('Adding authentication information to connection'); + connection.authentication = { + strategy: this.name, + accessToken + }; + } else if (event === 'disconnect' || isValidLogout) { + debug('Removing authentication information and expiration timer from connection'); + + const { entity } = this.configuration; + + delete connection[entity]; + delete connection.authentication; + + lt.clearTimeout(this.expirationTimers.get(connection)); + this.expirationTimers.delete(connection); + } + } + verifyConfiguration () { const allowedKeys = [ 'entity', 'service', 'header', 'schemes' ]; @@ -29,6 +73,10 @@ export class JWTStrategy extends AuthenticationBaseStrategy { throw new Error(`Invalid JwtStrategy option 'authentication.${this.name}.${key}'. Did you mean to set it in 'authentication.jwtOptions'?`); } } + + if (typeof this.configuration.header !== 'string') { + throw new Error(`The 'header' option for the ${this.name} strategy must be a string`); + } } /** @@ -40,6 +88,8 @@ export class JWTStrategy extends AuthenticationBaseStrategy { const { entity } = this.configuration; const entityService = this.entityService; + debug('Getting entity', id); + if (entityService === null) { throw new NotAuthenticated(`Could not find entity service`); } @@ -53,6 +103,10 @@ export class JWTStrategy extends AuthenticationBaseStrategy { return entityService.get(id, { ...params, [entity]: result }); } + async getEntityId (authResult: AuthenticationResult, _params: Params) { + return authResult.authentication.payload.sub; + } + async authenticate (authentication: AuthenticationRequest, params: Params) { const { accessToken } = authentication; const { entity } = this.configuration; @@ -62,11 +116,11 @@ export class JWTStrategy extends AuthenticationBaseStrategy { } const payload = await this.authentication.verifyAccessToken(accessToken, params.jwt); - const entityId = payload.sub; const result = { accessToken, authentication: { strategy: 'jwt', + accessToken, payload } }; @@ -75,6 +129,7 @@ export class JWTStrategy extends AuthenticationBaseStrategy { return result; } + const entityId = await this.getEntityId(result, params); const value = await this.getEntity(entityId, params); return { @@ -84,15 +139,16 @@ export class JWTStrategy extends AuthenticationBaseStrategy { } async parse (req: IncomingMessage) { - const result = { strategy: this.name }; - const { header, schemes }: { header: any, schemes: string[] } = this.configuration; + const { header, schemes }: { header: string, schemes: string[] } = this.configuration; const headerValue = req.headers && req.headers[header.toLowerCase()]; if (!headerValue || typeof headerValue !== 'string') { return null; } - const [ , scheme = null, schemeValue = null ] = headerValue.match(SPLIT_HEADER) || []; + debug('Found parsed header value'); + + const [ , scheme, schemeValue ] = headerValue.match(SPLIT_HEADER) || []; const hasScheme = scheme && schemes.some( current => new RegExp(current, 'i').test(scheme) ); @@ -102,7 +158,7 @@ export class JWTStrategy extends AuthenticationBaseStrategy { } return { - ...result, + strategy: this.name, accessToken: hasScheme ? schemeValue : headerValue }; } diff --git a/packages/authentication/src/service.ts b/packages/authentication/src/service.ts index 4ea00c0ea4..9d05f21b63 100644 --- a/packages/authentication/src/service.ts +++ b/packages/authentication/src/service.ts @@ -1,13 +1,48 @@ import Debug from 'debug'; -import { merge, get } from 'lodash'; +import merge from 'lodash/merge'; import { NotAuthenticated } from '@feathersjs/errors'; import { AuthenticationBase, AuthenticationResult, AuthenticationRequest } from './core'; -import { connection, events } from './hooks'; -import { Params, ServiceMethods } from '@feathersjs/feathers'; +import { connection, event } from './hooks'; +import '@feathersjs/transport-commons'; +import { Application, Params, ServiceMethods, ServiceAddons } from '@feathersjs/feathers'; const debug = Debug('@feathersjs/authentication/service'); -export class AuthenticationService extends AuthenticationBase implements ServiceMethods { +declare module '@feathersjs/feathers' { + interface Application { + + /** + * Returns the default authentication service or the + * authentication service for a given path. + * + * @param location The service path to use (optional) + */ + defaultAuthentication (location?: string): AuthenticationService; + } + + interface Params { + authenticated?: boolean; + authentication?: AuthenticationRequest; + } +} + +export interface AuthenticationService extends ServiceAddons {} + +export class AuthenticationService extends AuthenticationBase implements Partial> { + constructor (app: Application, configKey: string = 'authentication', options = {}) { + super(app, configKey, options); + + if (typeof app.defaultAuthentication !== 'function') { + app.defaultAuthentication = function (location?: string) { + const configKey = app.get('defaultAuthentication'); + const path = location || Object.keys(this.services).find(current => + this.service(current).configKey === configKey + ); + + return path ? this.service(path) : null; + }; + } + } /** * Return the payload for a JWT based on the authentication result. * Called internally by the `create` method. @@ -30,12 +65,12 @@ export class AuthenticationService extends AuthenticationBase implements Service async getTokenOptions (authResult: AuthenticationResult, params: Params) { const { service, entity, entityId } = this.configuration; const jwtOptions = merge({}, params.jwtOptions, params.jwt); - const hasEntity = service && entity && authResult[entity]; + const value = service && entity && authResult[entity]; // Set the subject to the entity id if it is available - if (hasEntity && !jwtOptions.subject) { + if (value && !jwtOptions.subject) { const idProperty = entityId || this.app.service(service).id; - const subject = get(authResult, [ entity, idProperty ]); + const subject = value[idProperty]; if (subject === undefined) { throw new NotAuthenticated(`Can not set subject from ${entity}.${idProperty}`); @@ -64,15 +99,15 @@ export class AuthenticationService extends AuthenticationBase implements Service debug('Got authentication result', authResult); + if (authResult.accessToken) { + return authResult; + } + const [ payload, jwtOptions ] = await Promise.all([ this.getPayload(authResult, params), this.getTokenOptions(authResult, params) ]); - if (authResult.accessToken) { - return authResult; - } - debug('Creating JWT with', payload, jwtOptions); const accessToken = await this.createAccessToken(payload, jwtOptions, params.secret); @@ -86,7 +121,7 @@ export class AuthenticationService extends AuthenticationBase implements Service * @param id The JWT to remove or null * @param params Service call parameters */ - async remove (id: null|string, params: Params) { + async remove (id: string | null, params: Params) { const { authentication } = params; const { authStrategies } = this.configuration; @@ -126,7 +161,19 @@ export class AuthenticationService extends AuthenticationBase implements Service } } - // @ts-ignore - this.hooks({ after: [ connection(), events() ] }); + this.hooks({ + after: { + create: [ connection('login'), event('login') ], + remove: [ connection('logout'), event('logout') ] + } + }); + + this.app.on('disconnect', async (connection) => { + await this.handleConnection('disconnect', connection); + }); + + if (typeof this.publish === 'function') { + this.publish(() => null); + } } } diff --git a/packages/authentication/test/core.test.ts b/packages/authentication/test/core.test.ts index efe40cab66..0e93fc5519 100644 --- a/packages/authentication/test/core.test.ts +++ b/packages/authentication/test/core.test.ts @@ -190,7 +190,7 @@ describe('authentication/core', () => { assert.fail('Should never get here'); } catch (error) { assert.strictEqual(error.name, 'NotAuthenticated'); - assert.strictEqual(error.message, 'Invalid authentication information'); + assert.strictEqual(error.message, 'Invalid authentication information (strategy not allowed in authStrategies)'); } }); @@ -302,6 +302,7 @@ describe('authentication/core', () => { }; try { + // @ts-ignore await auth.createAccessToken({}, overrides); assert.fail('Should never get here'); } catch (error) { diff --git a/packages/authentication/test/hooks/authenticate.test.ts b/packages/authentication/test/hooks/authenticate.test.ts index b565255216..3758731d48 100644 --- a/packages/authentication/test/hooks/authenticate.test.ts +++ b/packages/authentication/test/hooks/authenticate.test.ts @@ -95,7 +95,7 @@ describe('authentication/hooks/authenticate', () => { assert.fail('Should never get here'); } catch (error) { assert.strictEqual(error.name, 'NotAuthenticated'); - assert.strictEqual(error.message, `Could not find authentication service at 'authentication'`); + assert.strictEqual(error.message, `Could not find a valid authentication service`); } }); @@ -112,6 +112,29 @@ describe('authentication/hooks/authenticate', () => { assert.deepStrictEqual(result, Object.assign({}, params, Strategy1.result)); }); + it('authenticates with first strategy, keeps references alive (#1629)', async () => { + const connection = {}; + const params = { + connection, + authentication: { + strategy: 'first', + username: 'David' + } + }; + + app.service('users').hooks({ + after: { + get: context => { + context.result.params = context.params; + } + } + }); + + const result = await app.service('users').get(1, params); + + assert.ok(result.params.connection === connection); + }); + it('authenticates with different authentication service', async () => { const params = { authentication: { diff --git a/packages/authentication/test/hooks/connection.test.ts b/packages/authentication/test/hooks/connection.test.ts deleted file mode 100644 index af3ce1adf0..0000000000 --- a/packages/authentication/test/hooks/connection.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import assert from 'assert'; -import feathers, { Params, Service } from '@feathersjs/feathers'; - -import { AuthenticationRequest } from '../../src/core'; -import hook from '../../src/hooks/connection'; -import { AuthenticationService } from '../../src'; -import { AuthenticationResult } from '../../src/core'; - -describe('authentication/hooks/connection', () => { - const app = feathers().use('/authentication', { - async create (_data: AuthenticationRequest, params: Params) { - if (params.noAccessToken) { - return {}; - } - - return { - accessToken: '1234', - authentication: { strategy: 'test' }, - additionalParams: true - }; - }, - - async remove () { - return { accessToken: '1234' }; - } - }); - - const service = app.service('authentication') as AuthenticationService & Service; - - service.hooks({ - after: { - all: [ hook() ] - } - }); - - it('create does nothing when there is no connection', async () => { - const result = await service.create({}, {}); - - assert.deepStrictEqual(result, { - accessToken: '1234', - authentication: { strategy: 'test' }, - additionalParams: true - }); - }); - - it('create (login) updates `params.connection.authentication` with all params', async () => { - const connection = {}; - - await service.create({}, { connection }); - - assert.deepStrictEqual(connection, { - authentication: { - strategy: 'jwt', - accessToken: '1234' - }, - additionalParams: true - }); - }); - - it('create (login) does nothing when there is no accessToken', async () => { - const connection = {}; - - await service.create({}, { - connection, - noAccessToken: true - }); - - assert.deepStrictEqual(connection, {}); - }); - - it('remove (logout) deletes `connection.authentication` if token matches', async () => { - const connection = { - authentication: { strategy: 'jwt', accessToken: '1234' } - }; - - await service.remove('test', { connection }); - - assert.deepStrictEqual(connection, {}); - }); - - it('remove (logout) does nothing if token does not match', async () => { - const connection = { - authentication: { strategy: 'jwt', accessToken: '12343' } - }; - - await service.remove('test', { connection }); - - assert.deepStrictEqual(connection, { - authentication: { strategy: 'jwt', accessToken: '12343' } - }); - }); -}); diff --git a/packages/authentication/test/hooks/events.test.ts b/packages/authentication/test/hooks/event.test.ts similarity index 94% rename from packages/authentication/test/hooks/events.test.ts rename to packages/authentication/test/hooks/event.test.ts index b2ce6e161e..ecd212a4fb 100644 --- a/packages/authentication/test/hooks/events.test.ts +++ b/packages/authentication/test/hooks/event.test.ts @@ -1,7 +1,7 @@ import assert from 'assert'; import feathers, { Params, HookContext } from '@feathersjs/feathers'; -import hook from '../../src/hooks/events'; +import hook from '../../src/hooks/event'; import { AuthenticationRequest, AuthenticationResult } from '../../src/core'; describe('authentication/hooks/events', () => { @@ -19,7 +19,8 @@ describe('authentication/hooks/events', () => { service.hooks({ after: { - all: [ hook() ] + create: [ hook('login') ], + remove: [ hook('logout') ] } }); diff --git a/packages/authentication/test/jwt.test.ts b/packages/authentication/test/jwt.test.ts index 8761644e25..932fa0ed74 100644 --- a/packages/authentication/test/jwt.test.ts +++ b/packages/authentication/test/jwt.test.ts @@ -1,5 +1,5 @@ import assert from 'assert'; -import { merge } from 'lodash'; +import merge from 'lodash/merge'; import feathers, { Application, Service } from '@feathersjs/feathers'; // @ts-ignore import memory from 'feathers-memory'; @@ -72,6 +72,7 @@ describe('authentication/jwt', () => { }); payload = await service.verifyAccessToken(accessToken); + app.setup(); }); it('getEntity', async () => { @@ -91,6 +92,90 @@ describe('authentication/jwt', () => { }); }); + describe('handleConnection', () => { + it('adds authentication information on create', async () => { + const connection: any = {}; + + await app.service('authentication').create({ + strategy: 'jwt', + accessToken + }, { connection }); + + assert.deepStrictEqual(connection.user, user); + assert.deepStrictEqual(connection.authentication, { + strategy: 'jwt', + accessToken + }); + }); + + it('sends disconnect event when connection token expires and removes all connection information', async () => { + const connection: any = {}; + const token: string = await app.service('authentication').createAccessToken({}, { + subject: `${user.id}`, + expiresIn: '1s' + }); + + const result = await app.service('authentication').create({ + strategy: 'jwt', + accessToken: token + }, { connection }); + + assert.ok(connection.authentication); + + assert.strictEqual(result.accessToken, token); + + const disconnection = await new Promise(resolve => app.once('disconnect', resolve)); + + assert.strictEqual(disconnection, connection); + + assert.ok(!connection.authentication); + assert.ok(!connection.user); + assert.strictEqual(Object.keys(connection).length, 0); + }); + + it('deletes authentication information on remove', async () => { + const connection: any = {}; + + await app.service('authentication').create({ + strategy: 'jwt', + accessToken + }, { connection }); + + assert.ok(connection.authentication); + + await app.service('authentication').remove(null, { + authentication: connection.authentication, + connection + }); + + assert.ok(!connection.authentication); + assert.ok(!connection.user); + }); + + it('does not remove if accessToken does not match', async () => { + const connection: any = {}; + + await app.service('authentication').create({ + strategy: 'jwt', + accessToken + }, { connection }); + + assert.ok(connection.authentication); + + await app.service('authentication').remove(null, { + authentication: { + strategy: 'jwt', + accessToken: await app.service('authentication').createAccessToken({}, { + subject: `${user.id}` + }) + }, + connection + }); + + assert.ok(connection.authentication); + }); + }); + describe('with authenticate hook', () => { it('fails for protected service and external call when not set', async () => { try { @@ -224,6 +309,16 @@ describe('authentication/jwt', () => { assert.strictEqual(error.message, `Invalid JwtStrategy option 'authentication.otherJwt.expiresIn'. Did you mean to set it in 'authentication.jwtOptions'?`); } }); + + it('errors when `header` option is an object`', () => { + app.get('authentication').otherJwt = { + header: { message: 'This is wrong' } + }; + + assert.throws(() => app.service('authentication').register('otherJwt', new JWTStrategy()), { + message: `The 'header' option for the otherJwt strategy must be a string` + }); + }); }); describe('parse', () => { diff --git a/packages/authentication/test/service.test.ts b/packages/authentication/test/service.test.ts index 5b6a3e9d3a..932e7b6b62 100644 --- a/packages/authentication/test/service.test.ts +++ b/packages/authentication/test/service.test.ts @@ -1,13 +1,12 @@ import assert from 'assert'; -import { omit } from 'lodash'; +import omit from 'lodash/omit'; import jwt from 'jsonwebtoken'; import feathers, { Application, Service } from '@feathersjs/feathers'; // @ts-ignore import memory from 'feathers-memory'; import defaultOptions from '../src/options'; -import { AuthenticationService } from '../src/service'; -import { AuthenticationResult } from '../src/core'; +import { AuthenticationService, AuthenticationResult } from '../src'; import { Strategy1 } from './fixtures'; @@ -38,6 +37,11 @@ describe('authentication/service', () => { assert.deepStrictEqual(app.service('authentication').configuration, Object.assign({}, defaultOptions, app.get('authentication'))); }); + it('app.defaultAuthentication()', () => { + assert.strictEqual(app.defaultAuthentication(), app.service('authentication')); + assert.strictEqual(app.defaultAuthentication('dummy'), undefined); + }); + describe('create', () => { it('creates a valid accessToken and includes strategy result', async () => { const service = app.service('authentication'); diff --git a/packages/client/.npmignore b/packages/client/.npmignore index d2e82e5d67..fa363003a1 100644 --- a/packages/client/.npmignore +++ b/packages/client/.npmignore @@ -1,4 +1,4 @@ src/ test/ browser/ -!dist/ \ No newline at end of file +!dist/coverage/ diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md index 90cf40ac01..88ed943ff8 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -3,6 +3,201 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/client + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/client + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/client + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/client + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/client + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/client + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + +**Note:** Version bump only for package @feathersjs/client + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/client + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/client + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + + +### Bug Fixes + +* Fix feathers-memory dependency that did not get updated ([9422b13](https://github.com/feathersjs/feathers/commit/9422b13)) + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/client + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/client/README.md b/packages/client/README.md index d6a31203e8..46bd1ccf33 100644 --- a/packages/client/README.md +++ b/packages/client/README.md @@ -1,51 +1,23 @@ # @feathersjs/client -[![Greenkeeper badge](https://badges.greenkeeper.io/feathersjs/client.svg)](https://greenkeeper.io/) - -[![Build Status](https://travis-ci.org/feathersjs/client.png?branch=master)](https://travis-ci.org/feathersjs/client) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/client.svg?style=flat-square)](https://david-dm.org/feathersjs/client) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/client) -[![Sauce Test Status](https://saucelabs.com/browser-matrix/feathersjs.svg)](https://saucelabs.com/u/feathersjs) - -> A client for Feathers services supporting many different transport libraries. - -## About - -While Feathers and its modules can be used on the client with an NPM compatible module loader like [Browserify](http://browserify.org/), [Webpack](https://webpack.github.io/) or [StealJS](http://stealjs.com), `@feathersjs/client` consolidates a standard set of client plugins into a single distributable that can be used standalone in the browser or with other module loaders (like [RequireJS](http://requirejs.org/)) that don't support NPM. The following modules are included: - -- [@feathersjs/feathers](https://github.com/feathersjs/feathers) as `feathers` (or the default module export) -- [@feathersjs/errors](https://github.com/feathersjs/errors) as `feathers.errors` -- [@feathersjs/rest-client](https://github.com/feathersjs/rest-client) as `feathers.rest` -- [@feathersjs/socketio-client](https://github.com/feathersjs/socketio-client) as `feathers.socketio` -- [@feathers/primus-client](https://github.com/feathersjs/primus-client) as `feathers.primus` -- [@feathersjs/authentication-client](https://github.com/feathersjs/authentication-client) as `feathers.authentication` - -In the browser a client that connects to the local server via websockets can be initialized like this: - -```html - - - +> A client build for FeathersJS + +## Installation + ``` +npm install @feathersjs/client --save +``` + +## Documentation -For the full documentation see [the Feathers documentation](http://docs.feathersjs.com/clients/feathers.html). +Refer to the [Feathers client API documentation](https://docs.feathersjs.com/api/client.html) for more details. ## License -Copyright (c) 2018 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/client/browser/index.html b/packages/client/browser/index.html deleted file mode 100644 index a3e3b9891f..0000000000 --- a/packages/client/browser/index.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - Mocha - - - - -
- - - - - - - - - \ No newline at end of file diff --git a/packages/client/browser/test.dist.js b/packages/client/browser/test.dist.js deleted file mode 100644 index 2f24ac3806..0000000000 --- a/packages/client/browser/test.dist.js +++ /dev/null @@ -1,1617 +0,0 @@ -/******/ (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] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = 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; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { -/******/ configurable: false, -/******/ enumerable: true, -/******/ get: getter -/******/ }); -/******/ } -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 2); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; -/* WEBPACK VAR INJECTION */(function(global) { - -// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js -// original notice: - -/*! - * The buffer module from node.js, for the browser. - * - * @author Feross Aboukhadijeh - * @license MIT - */ -function compare(a, b) { - if (a === b) { - return 0; - } - - var x = a.length; - var y = b.length; - - for (var i = 0, len = Math.min(x, y); i < len; ++i) { - if (a[i] !== b[i]) { - x = a[i]; - y = b[i]; - break; - } - } - - if (x < y) { - return -1; - } - if (y < x) { - return 1; - } - return 0; -} -function isBuffer(b) { - if (global.Buffer && typeof global.Buffer.isBuffer === 'function') { - return global.Buffer.isBuffer(b); - } - return !!(b != null && b._isBuffer); -} - -// based on node assert, original notice: - -// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 -// -// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! -// -// Originally from narwhal.js (http://narwhaljs.org) -// Copyright (c) 2009 Thomas Robinson <280north.com> -// -// 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 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. - -var util = __webpack_require__(3); -var hasOwn = Object.prototype.hasOwnProperty; -var pSlice = Array.prototype.slice; -var functionsHaveNames = (function () { - return function foo() {}.name === 'foo'; -}()); -function pToString (obj) { - return Object.prototype.toString.call(obj); -} -function isView(arrbuf) { - if (isBuffer(arrbuf)) { - return false; - } - if (typeof global.ArrayBuffer !== 'function') { - return false; - } - if (typeof ArrayBuffer.isView === 'function') { - return ArrayBuffer.isView(arrbuf); - } - if (!arrbuf) { - return false; - } - if (arrbuf instanceof DataView) { - return true; - } - if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) { - return true; - } - return false; -} -// 1. The assert module provides functions that throw -// AssertionError's when particular conditions are not met. The -// assert module must conform to the following interface. - -var assert = module.exports = ok; - -// 2. The AssertionError is defined in assert. -// new assert.AssertionError({ message: message, -// actual: actual, -// expected: expected }) - -var regex = /\s*function\s+([^\(\s]*)\s*/; -// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js -function getName(func) { - if (!util.isFunction(func)) { - return; - } - if (functionsHaveNames) { - return func.name; - } - var str = func.toString(); - var match = str.match(regex); - return match && match[1]; -} -assert.AssertionError = function AssertionError(options) { - this.name = 'AssertionError'; - this.actual = options.actual; - this.expected = options.expected; - this.operator = options.operator; - if (options.message) { - this.message = options.message; - this.generatedMessage = false; - } else { - this.message = getMessage(this); - this.generatedMessage = true; - } - var stackStartFunction = options.stackStartFunction || fail; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, stackStartFunction); - } else { - // non v8 browsers so we can have a stacktrace - var err = new Error(); - if (err.stack) { - var out = err.stack; - - // try to strip useless frames - var fn_name = getName(stackStartFunction); - var idx = out.indexOf('\n' + fn_name); - if (idx >= 0) { - // once we have located the function frame - // we need to strip out everything before it (and its line) - var next_line = out.indexOf('\n', idx + 1); - out = out.substring(next_line + 1); - } - - this.stack = out; - } - } -}; - -// assert.AssertionError instanceof Error -util.inherits(assert.AssertionError, Error); - -function truncate(s, n) { - if (typeof s === 'string') { - return s.length < n ? s : s.slice(0, n); - } else { - return s; - } -} -function inspect(something) { - if (functionsHaveNames || !util.isFunction(something)) { - return util.inspect(something); - } - var rawname = getName(something); - var name = rawname ? ': ' + rawname : ''; - return '[Function' + name + ']'; -} -function getMessage(self) { - return truncate(inspect(self.actual), 128) + ' ' + - self.operator + ' ' + - truncate(inspect(self.expected), 128); -} - -// At present only the three keys mentioned above are used and -// understood by the spec. Implementations or sub modules can pass -// other keys to the AssertionError's constructor - they will be -// ignored. - -// 3. All of the following functions must throw an AssertionError -// when a corresponding condition is not met, with a message that -// may be undefined if not provided. All assertion methods provide -// both the actual and expected values to the assertion error for -// display purposes. - -function fail(actual, expected, message, operator, stackStartFunction) { - throw new assert.AssertionError({ - message: message, - actual: actual, - expected: expected, - operator: operator, - stackStartFunction: stackStartFunction - }); -} - -// EXTENSION! allows for well behaved errors defined elsewhere. -assert.fail = fail; - -// 4. Pure assertion tests whether a value is truthy, as determined -// by !!guard. -// assert.ok(guard, message_opt); -// This statement is equivalent to assert.equal(true, !!guard, -// message_opt);. To test strictly for the value true, use -// assert.strictEqual(true, guard, message_opt);. - -function ok(value, message) { - if (!value) fail(value, true, message, '==', assert.ok); -} -assert.ok = ok; - -// 5. The equality assertion tests shallow, coercive equality with -// ==. -// assert.equal(actual, expected, message_opt); - -assert.equal = function equal(actual, expected, message) { - if (actual != expected) fail(actual, expected, message, '==', assert.equal); -}; - -// 6. The non-equality assertion tests for whether two objects are not equal -// with != assert.notEqual(actual, expected, message_opt); - -assert.notEqual = function notEqual(actual, expected, message) { - if (actual == expected) { - fail(actual, expected, message, '!=', assert.notEqual); - } -}; - -// 7. The equivalence assertion tests a deep equality relation. -// assert.deepEqual(actual, expected, message_opt); - -assert.deepEqual = function deepEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'deepEqual', assert.deepEqual); - } -}; - -assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) { - if (!_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual); - } -}; - -function _deepEqual(actual, expected, strict, memos) { - // 7.1. All identical values are equivalent, as determined by ===. - if (actual === expected) { - return true; - } else if (isBuffer(actual) && isBuffer(expected)) { - return compare(actual, expected) === 0; - - // 7.2. If the expected value is a Date object, the actual value is - // equivalent if it is also a Date object that refers to the same time. - } else if (util.isDate(actual) && util.isDate(expected)) { - return actual.getTime() === expected.getTime(); - - // 7.3 If the expected value is a RegExp object, the actual value is - // equivalent if it is also a RegExp object with the same source and - // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). - } else if (util.isRegExp(actual) && util.isRegExp(expected)) { - return actual.source === expected.source && - actual.global === expected.global && - actual.multiline === expected.multiline && - actual.lastIndex === expected.lastIndex && - actual.ignoreCase === expected.ignoreCase; - - // 7.4. Other pairs that do not both pass typeof value == 'object', - // equivalence is determined by ==. - } else if ((actual === null || typeof actual !== 'object') && - (expected === null || typeof expected !== 'object')) { - return strict ? actual === expected : actual == expected; - - // If both values are instances of typed arrays, wrap their underlying - // ArrayBuffers in a Buffer each to increase performance - // This optimization requires the arrays to have the same type as checked by - // Object.prototype.toString (aka pToString). Never perform binary - // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their - // bit patterns are not identical. - } else if (isView(actual) && isView(expected) && - pToString(actual) === pToString(expected) && - !(actual instanceof Float32Array || - actual instanceof Float64Array)) { - return compare(new Uint8Array(actual.buffer), - new Uint8Array(expected.buffer)) === 0; - - // 7.5 For all other Object pairs, including Array objects, equivalence is - // determined by having the same number of owned properties (as verified - // with Object.prototype.hasOwnProperty.call), the same set of keys - // (although not necessarily the same order), equivalent values for every - // corresponding key, and an identical 'prototype' property. Note: this - // accounts for both named and indexed properties on Arrays. - } else if (isBuffer(actual) !== isBuffer(expected)) { - return false; - } else { - memos = memos || {actual: [], expected: []}; - - var actualIndex = memos.actual.indexOf(actual); - if (actualIndex !== -1) { - if (actualIndex === memos.expected.indexOf(expected)) { - return true; - } - } - - memos.actual.push(actual); - memos.expected.push(expected); - - return objEquiv(actual, expected, strict, memos); - } -} - -function isArguments(object) { - return Object.prototype.toString.call(object) == '[object Arguments]'; -} - -function objEquiv(a, b, strict, actualVisitedObjects) { - if (a === null || a === undefined || b === null || b === undefined) - return false; - // if one is a primitive, the other must be same - if (util.isPrimitive(a) || util.isPrimitive(b)) - return a === b; - if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b)) - return false; - var aIsArgs = isArguments(a); - var bIsArgs = isArguments(b); - if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs)) - return false; - if (aIsArgs) { - a = pSlice.call(a); - b = pSlice.call(b); - return _deepEqual(a, b, strict); - } - var ka = objectKeys(a); - var kb = objectKeys(b); - var key, i; - // having the same number of owned properties (keys incorporates - // hasOwnProperty) - if (ka.length !== kb.length) - return false; - //the same set of keys (although not necessarily the same order), - ka.sort(); - kb.sort(); - //~~~cheap key test - for (i = ka.length - 1; i >= 0; i--) { - if (ka[i] !== kb[i]) - return false; - } - //equivalent values for every corresponding key, and - //~~~possibly expensive deep test - for (i = ka.length - 1; i >= 0; i--) { - key = ka[i]; - if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects)) - return false; - } - return true; -} - -// 8. The non-equivalence assertion tests for any deep inequality. -// assert.notDeepEqual(actual, expected, message_opt); - -assert.notDeepEqual = function notDeepEqual(actual, expected, message) { - if (_deepEqual(actual, expected, false)) { - fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); - } -}; - -assert.notDeepStrictEqual = notDeepStrictEqual; -function notDeepStrictEqual(actual, expected, message) { - if (_deepEqual(actual, expected, true)) { - fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual); - } -} - - -// 9. The strict equality assertion tests strict equality, as determined by ===. -// assert.strictEqual(actual, expected, message_opt); - -assert.strictEqual = function strictEqual(actual, expected, message) { - if (actual !== expected) { - fail(actual, expected, message, '===', assert.strictEqual); - } -}; - -// 10. The strict non-equality assertion tests for strict inequality, as -// determined by !==. assert.notStrictEqual(actual, expected, message_opt); - -assert.notStrictEqual = function notStrictEqual(actual, expected, message) { - if (actual === expected) { - fail(actual, expected, message, '!==', assert.notStrictEqual); - } -}; - -function expectedException(actual, expected) { - if (!actual || !expected) { - return false; - } - - if (Object.prototype.toString.call(expected) == '[object RegExp]') { - return expected.test(actual); - } - - try { - if (actual instanceof expected) { - return true; - } - } catch (e) { - // Ignore. The instanceof check doesn't work for arrow functions. - } - - if (Error.isPrototypeOf(expected)) { - return false; - } - - return expected.call({}, actual) === true; -} - -function _tryBlock(block) { - var error; - try { - block(); - } catch (e) { - error = e; - } - return error; -} - -function _throws(shouldThrow, block, expected, message) { - var actual; - - if (typeof block !== 'function') { - throw new TypeError('"block" argument must be a function'); - } - - if (typeof expected === 'string') { - message = expected; - expected = null; - } - - actual = _tryBlock(block); - - message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + - (message ? ' ' + message : '.'); - - if (shouldThrow && !actual) { - fail(actual, expected, 'Missing expected exception' + message); - } - - var userProvidedMessage = typeof message === 'string'; - var isUnwantedException = !shouldThrow && util.isError(actual); - var isUnexpectedException = !shouldThrow && actual && !expected; - - if ((isUnwantedException && - userProvidedMessage && - expectedException(actual, expected)) || - isUnexpectedException) { - fail(actual, expected, 'Got unwanted exception' + message); - } - - if ((shouldThrow && actual && expected && - !expectedException(actual, expected)) || (!shouldThrow && actual)) { - throw actual; - } -} - -// 11. Expected to throw an error: -// assert.throws(block, Error_opt, message_opt); - -assert.throws = function(block, /*optional*/error, /*optional*/message) { - _throws(true, block, error, message); -}; - -// EXTENSION! This is annoying to write outside this module. -assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) { - _throws(false, block, error, message); -}; - -assert.ifError = function(err) { if (err) throw err; }; - -var objectKeys = Object.keys || function (obj) { - var keys = []; - for (var key in obj) { - if (hasOwn.call(obj, key)) keys.push(key); - } - return keys; -}; - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1))) - -/***/ }), -/* 1 */ -/***/ (function(module, exports) { - -var g; - -// This works in non-strict mode -g = (function() { - return this; -})(); - -try { - // This works if eval is allowed (see CSP) - g = g || Function("return this")() || (1,eval)("this"); -} catch(e) { - // This works if the window reference is available - if(typeof window === "object") - g = window; -} - -// g can still be undefined, but nothing to do about it... -// We return undefined, instead of nothing here, so it's -// easier to handle this case. if(!global) { ...} - -module.exports = g; - - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -var assert = __webpack_require__(0); -var baseTests = __webpack_require__(7); - -var feathers = window.feathers; -var socket = window.io(); - -describe('Universal Feathers client browser tests', function () { - var app = feathers().configure(feathers.socketio(socket)).use('/myservice', { - get: function get(id) { - return Promise.resolve({ - id: id, description: 'You have to do ' + id + '!' - }); - }, - create: function create(data) { - return Promise.resolve(data); - } - }); - - app.service('myservice').hooks({ - before: { - create: function create(hook) { - hook.data.hook = true; - } - }, - after: { - get: function get(hook) { - hook.result.ran = true; - } - } - }); - - after(function () { - return app.service('todos').remove(null); - }); - - baseTests(app, 'todos'); - - describe('Client side hooks and services', function () { - it('initialized myservice and works with hooks', function (done) { - app.service('myservice').get('dishes').then(function (todo) { - assert.deepEqual(todo, { - id: 'dishes', - description: 'You have to do dishes!', - ran: true - }); - done(); - }).catch(done); - }); - - it('create and event with hook', function (done) { - var myservice = app.service('myservice'); - - myservice.once('created', function (data) { - assert.deepEqual(data, { - description: 'Test todo', - hook: true - }); - done(); - }); - - myservice.create({ description: 'Test todo' }); - }); - - describe('Feathers Errors', function () { - describe('successful error creation', function () { - describe('without custom message', function () { - it('default error', function () { - var error = new feathers.errors.GeneralError(); - assert.equal(error.code, 500); - assert.equal(error.message, 'Error'); - assert.equal(error.className, 'general-error'); - assert.equal(error instanceof feathers.errors.GeneralError, true); - assert.equal(error instanceof feathers.errors.FeathersError, true); - }); - }); - }); - }); - }); -}); - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors. -// -// 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. - -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - return str; -}; - - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); - }; - } - - if (process.noDeprecation === true) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -}; - - -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; - - -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); -} -exports.inspect = inspect; - - -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; - -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; - - -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; - - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } -} - - -function stylizeNoColor(str, styleType) { - return str; -} - - -function arrayToHash(array) { - var hash = {}; - - array.forEach(function(val, idx) { - hash[val] = true; - }); - - return hash; -} - - -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } - - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); - - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } - - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } - - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } - - var base = '', array = false, braces = ['{', '}']; - - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } - - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } - - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } - - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } - - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } - - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; - } - - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); - } - } - - ctx.seen.push(value); - - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } - - ctx.seen.pop(); - - return reduceToSingleString(output, base, braces); -} - - -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} - - -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} - - -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} - - -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); - } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); - } - } - - return name + ': ' + str; -} - - -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); - - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } - - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; -} - - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = __webpack_require__(5); - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - - -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); -} - - -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; - -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); -} - - -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; - - -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ -exports.inherits = __webpack_require__(6); - -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; - - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -}; - -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); -} - -/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(4))) - -/***/ }), -/* 4 */ -/***/ (function(module, exports) { - -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; - -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; - } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); - } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); - } - } - - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; - } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); - } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; -} -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; -process.prependListener = noop; -process.prependOnceListener = noop; - -process.listeners = function (name) { return [] } - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; - -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; - - -/***/ }), -/* 5 */ -/***/ (function(module, exports) { - -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; -} - -/***/ }), -/* 6 */ -/***/ (function(module, exports) { - -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } - }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor - } -} - - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", { - value: true -}); - -exports.default = function (app, name) { - var getService = function getService() { - return name && typeof app.service === 'function' ? app.service(name) : app; - }; - - describe('Service base tests', function () { - it('.find', function (done) { - getService().find().then(function (todos) { - return _assert2.default.deepEqual(todos, [{ - text: 'some todo', - complete: false, - id: 0 - }]); - }).then(function () { - return done(); - }).catch(done); - }); - - it('.get and params passing', function (done) { - var query = { - some: 'thing', - other: ['one', 'two'], - nested: { a: { b: 'object' } } - }; - - getService().get(0, { query: query }).then(function (todo) { - return _assert2.default.deepEqual(todo, { - id: 0, - text: 'some todo', - complete: false, - query: query - }); - }).then(function () { - return done(); - }).catch(done); - }); - - it('.create and created event', function (done) { - getService().once('created', function (data) { - _assert2.default.equal(data.text, 'created todo'); - _assert2.default.ok(data.complete); - done(); - }); - - getService().create({ text: 'created todo', complete: true }); - }); - - it('.update and updated event', function (done) { - getService().once('updated', function (data) { - _assert2.default.equal(data.text, 'updated todo'); - _assert2.default.ok(data.complete); - done(); - }); - - getService().create({ text: 'todo to update', complete: false }).then(function (todo) { - return getService().update(todo.id, { - text: 'updated todo', - complete: true - }); - }); - }); - - it('.patch and patched event', function (done) { - getService().once('patched', function (data) { - _assert2.default.equal(data.text, 'todo to patch'); - _assert2.default.ok(data.complete); - done(); - }); - - getService().create({ text: 'todo to patch', complete: false }).then(function (todo) { - return getService().patch(todo.id, { complete: true }); - }); - }); - - it('.remove and removed event', function (done) { - getService().once('removed', function (data) { - _assert2.default.equal(data.text, 'todo to remove'); - _assert2.default.equal(data.complete, false); - done(); - }); - - getService().create({ text: 'todo to remove', complete: false }).then(function (todo) { - return getService().remove(todo.id); - }).catch(done); - }); - - it('.get with error', function (done) { - var query = { error: true }; - getService().get(0, { query: query }).then(done, function (error) { - _assert2.default.ok(error && error.message); - done(); - }); - }); - }); -}; - -var _assert = __webpack_require__(0); - -var _assert2 = _interopRequireDefault(_assert); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -module.exports = exports['default']; - -/***/ }) -/******/ ]); \ No newline at end of file diff --git a/packages/client/browser/test.js b/packages/client/browser/test.js index 3d81900dfd..98abdddf9a 100644 --- a/packages/client/browser/test.js +++ b/packages/client/browser/test.js @@ -1,12 +1,24 @@ -var assert = require('assert'); -var baseTests = require('@feathersjs/tests/lib//client'); +const assert = require('assert'); +const baseTests = require('@feathersjs/tests/lib/client'); +const memory = require('feathers-memory'); -var feathers = window.feathers; -var socket = window.io(); +const feathers = require('../dist/feathers'); -describe('Universal Feathers client browser tests', function () { - var app = feathers() - .configure(feathers.socketio(socket)) +// Create an in-memory CRUD service for our Todos +class TodoService extends memory.Service { + get (id, params) { + if (params.query.error) { + return Promise.reject(new Error('Something went wrong')); + } + + return super.get(id).then(data => + Object.assign({ query: params.query }, data) + ); + } +} + +describe('Feathers client browser smoke tests', function () { + const app = feathers() .use('/myservice', { get (id) { return Promise.resolve({ @@ -17,7 +29,10 @@ describe('Universal Feathers client browser tests', function () { create (data) { return Promise.resolve(data); } - }); + }) + .use('/todos', new TodoService({ + multi: true + })); app.service('myservice').hooks({ before: { @@ -32,6 +47,11 @@ describe('Universal Feathers client browser tests', function () { } }); + before(() => app.service('todos').create({ + text: 'some todo', + complete: false + })); + after(() => app.service('todos').remove(null)); baseTests(app, 'todos'); @@ -49,7 +69,7 @@ describe('Universal Feathers client browser tests', function () { }); it('create and event with hook', done => { - var myservice = app.service('myservice'); + const myservice = app.service('myservice'); myservice.once('created', data => { assert.deepEqual(data, { @@ -66,7 +86,7 @@ describe('Universal Feathers client browser tests', function () { describe('successful error creation', () => { describe('without custom message', () => { it('default error', () => { - var error = new feathers.errors.GeneralError(); + const error = new feathers.errors.GeneralError(); assert.equal(error.code, 500); assert.equal(error.message, 'Error'); assert.equal(error.className, 'general-error'); diff --git a/packages/client/browser/webpack.config.js b/packages/client/browser/webpack.config.js deleted file mode 100644 index 5c28d58a07..0000000000 --- a/packages/client/browser/webpack.config.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - entry: './test.js', - output: { - filename: './test.dist.js' - }, - module: { - rules: [{ - test: /\.js/, - exclude: /node_modules\/(?!(@feathersjs))/, - loader: 'babel-loader' - }] - } -}; diff --git a/packages/client/package.json b/packages/client/package.json index 4f9b40d254..df90efe9fe 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,12 +1,16 @@ { "name": "@feathersjs/client", "description": "A module that consolidates Feathers client modules for REST (jQuery, Request, Superagent) and Websocket (Socket.io, Primus) connections", - "version": "4.0.0-pre.3", + "version": "4.5.4", "repository": { "type": "git", "url": "https://github.com/feathersjs/feathers.git" }, "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "bugs": { "url": "https://github.com/feathersjs/feathers/issues" }, @@ -17,17 +21,17 @@ ], "author": "Feathers contributors", "engines": { - "node": ">= 6" + "node": ">= 10" }, "main": "index.js", "types": "index.d.ts", "scripts": { "clean": "../../node_modules/.bin/shx rm -rf dist/ && ../../node_modules/.bin/shx mkdir -p dist", "version": "npm run build", - "mocha": "mocha --opts ../../mocha.opts", + "mocha": "mocha --config ../../.mocharc.json test/ --recursive", "test": "npm run build && npm run mocha", + "test:browser": "mocha-puppeteer browser/test.js", "build": "npm run clean && npm run webpack", - "build:test": "cd browser && webpack", "webpack": "parallel-webpack" }, "browserslist": [ @@ -35,35 +39,35 @@ "IE 10" ], "devDependencies": { - "@babel/core": "^7.4.5", - "@babel/polyfill": "^7.4.4", - "@babel/preset-env": "^7.4.5", - "@feathersjs/authentication-client": "^4.0.0-pre.3", - "@feathersjs/errors": "^4.0.0-pre.3", - "@feathersjs/express": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", - "@feathersjs/primus": "^4.0.0-pre.3", - "@feathersjs/primus-client": "^4.0.0-pre.3", - "@feathersjs/rest-client": "^4.0.0-pre.3", - "@feathersjs/socketio": "^4.0.0-pre.3", - "@feathersjs/socketio-client": "^4.0.0-pre.3", - "@feathersjs/tests": "^4.0.0-pre.3", - "babel-loader": "^8.0.6", + "@babel/core": "^7.10.4", + "@babel/preset-env": "^7.10.4", + "@feathersjs/authentication-client": "^4.5.4", + "@feathersjs/errors": "^4.5.3", + "@feathersjs/express": "^4.5.4", + "@feathersjs/feathers": "^4.5.3", + "@feathersjs/primus": "^4.5.4", + "@feathersjs/primus-client": "^4.5.4", + "@feathersjs/rest-client": "^4.5.4", + "@feathersjs/socketio": "^4.5.4", + "@feathersjs/socketio-client": "^4.5.4", + "@feathersjs/tests": "^4.5.3", + "babel-loader": "^8.1.0", "body-parser": "^1.19.0", - "feathers-memory": "^3.0.2", - "jquery": "^3.4.1", - "jsdom": "^15.1.0", - "mocha": "^6.1.4", + "feathers-memory": "^4.1.0", + "jquery": "^3.5.1", + "jsdom": "^16.3.0", + "mocha": "^8.0.1", + "mocha-puppeteer": "^0.14.0", "node-fetch": "^2.6.0", - "parallel-webpack": "^2.3.0", - "request": "^2.88.0", - "socket.io-client": "^2.2.0", - "superagent": "^5.0.5", - "uglifyjs-webpack-plugin": "^2.1.3", - "webpack": "^4.32.2", - "webpack-merge": "^4.2.1", - "ws": "^7.0.0", - "xhr2": "^0.1.4" + "parallel-webpack": "^2.6.0", + "request": "^2.88.2", + "socket.io-client": "^2.3.0", + "superagent": "^5.3.1", + "uglifyjs-webpack-plugin": "^2.2.0", + "webpack": "^4.43.0", + "webpack-merge": "^5.0.9", + "ws": "^7.3.1", + "xhr2": "^0.2.0" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/client/test/rest/fetch.test.js b/packages/client/test/rest/fetch.test.js index e040928d31..60e508de1c 100644 --- a/packages/client/test/rest/fetch.test.js +++ b/packages/client/test/rest/fetch.test.js @@ -1,5 +1,5 @@ const fetch = require('node-fetch'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const app = require('../fixture'); const feathers = require('../../index'); diff --git a/packages/client/test/rest/request.test.js b/packages/client/test/rest/request.test.js index 2276c2b72e..b02e52bd0c 100644 --- a/packages/client/test/rest/request.test.js +++ b/packages/client/test/rest/request.test.js @@ -1,5 +1,5 @@ const request = require('request'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const app = require('../fixture'); const feathers = require('../../'); diff --git a/packages/client/test/rest/superagent.test.js b/packages/client/test/rest/superagent.test.js index 11d22ede9d..accea2634e 100644 --- a/packages/client/test/rest/superagent.test.js +++ b/packages/client/test/rest/superagent.test.js @@ -1,5 +1,5 @@ const superagent = require('superagent'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const app = require('../fixture'); const feathers = require('../../'); diff --git a/packages/client/test/sockets/primus.test.js b/packages/client/test/sockets/primus.test.js index 0592207266..38c00275de 100644 --- a/packages/client/test/sockets/primus.test.js +++ b/packages/client/test/sockets/primus.test.js @@ -1,5 +1,5 @@ const primus = require('@feathersjs/primus'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const app = require('../fixture'); const feathers = require('../../'); diff --git a/packages/client/test/sockets/socketio.test.js b/packages/client/test/sockets/socketio.test.js index f67b32cdf3..31ad9bff94 100644 --- a/packages/client/test/sockets/socketio.test.js +++ b/packages/client/test/sockets/socketio.test.js @@ -1,6 +1,6 @@ const io = require('socket.io-client'); const socketio = require('@feathersjs/socketio'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const app = require('../fixture'); const feathers = require('../../'); diff --git a/packages/client/webpack.config.js b/packages/client/webpack.config.js index 137839964f..ac04391402 100644 --- a/packages/client/webpack.config.js +++ b/packages/client/webpack.config.js @@ -1,6 +1,6 @@ const path = require('path'); const webpack = require('webpack'); -const merge = require('webpack-merge'); +const { merge } = require('webpack-merge'); const UglifyJSPlugin = require('uglifyjs-webpack-plugin'); function createConfig (name, isProduction = false) { diff --git a/packages/commons/.npmignore b/packages/commons/.npmignore index d7819044b6..ef86d5f1e7 100644 --- a/packages/commons/.npmignore +++ b/packages/commons/.npmignore @@ -1,3 +1,3 @@ test/ -src/ tsconfig.json +coverage/ diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md index 798d4a2ad8..fe45147957 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -3,6 +3,124 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + + +### Bug Fixes + +* make __hooks writable and configurable ([#1520](https://github.com/feathersjs/feathers/issues/1520)) ([1c6c374](https://github.com/feathersjs/feathers/commit/1c6c3742ecf1cb813be56074da89e6736d03ffe8)) + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/commons + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/commons + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/commons/LICENSE b/packages/commons/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/commons/LICENSE +++ b/packages/commons/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/commons/README.md b/packages/commons/README.md index 01541b44f4..e25d8fa181 100644 --- a/packages/commons/README.md +++ b/packages/commons/README.md @@ -1,6 +1,6 @@ # Feathers Commons -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/commons)](https://david-dm.org/feathersjs/feathers?path=packages/commons) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/commons) @@ -10,13 +10,8 @@ This is a repository for utility functionality that is shared between different Feathers plugin and used by the main repository. - -## Authors - -[Feathers contributors](https://github.com/feathersjs/commons/graphs/contributors) - ## License -Copyright (c) 2018 Feathers contributors +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/commons/package.json b/packages/commons/package.json index 85ab01679c..abc1180a0d 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,12 +1,16 @@ { "name": "@feathersjs/commons", - "version": "4.0.0-pre.3", + "version": "4.5.3", "description": "Shared Feathers utility functions", "homepage": "https://feathersjs.com", "keywords": [ "feathers" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -21,13 +25,14 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, - "main": "lib/index.js", + "main": "lib/", + "types": "lib/", "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", - "test": "mocha --opts ../../mocha.ts.opts --recursive test/**.test.ts test/**/*.test.ts" + "test": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -36,14 +41,12 @@ "access": "public" }, "devDependencies": { - "@types/chai": "^4.1.7", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.2", - "chai": "^4.2.0", - "mocha": "^6.1.4", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.22", + "mocha": "^8.0.1", "shx": "^0.3.2", - "ts-node": "^8.2.0", - "typescript": "^3.4.5" + "ts-node": "^8.10.2", + "typescript": "^3.9.6" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/commons/src/hooks.ts b/packages/commons/src/hooks.ts index f8d3882db2..9852c01422 100644 --- a/packages/commons/src/hooks.ts +++ b/packages/commons/src/hooks.ts @@ -154,7 +154,9 @@ export function enableHooks (obj: any, methods: string[], types: string[]) { // Add non-enumerable `__hooks` property to the object Object.defineProperty(obj, '__hooks', { - value: hookData + configurable: true, + value: hookData, + writable: true }); return Object.assign(obj, { diff --git a/packages/commons/test/hooks.test.ts b/packages/commons/test/hooks.test.ts index d110639701..5253b08051 100644 --- a/packages/commons/test/hooks.test.ts +++ b/packages/commons/test/hooks.test.ts @@ -1,4 +1,4 @@ -import { expect } from 'chai'; +import { strict as assert } from 'assert'; import { hooks } from '../src'; describe('hook utilities', () => { @@ -11,7 +11,7 @@ describe('hook utilities', () => { method: 'update' }); - expect(args).to.deep.equal([2, { my: 'data' }, { some: 'thing' }]); + assert.deepEqual(args, [2, { my: 'data' }, { some: 'thing' }]); args = hooks.makeArguments({ id: 0, @@ -20,14 +20,14 @@ describe('hook utilities', () => { method: 'update' }); - expect(args).to.deep.equal([0, { my: 'data' }, { some: 'thing' }]); + assert.deepEqual(args, [0, { my: 'data' }, { some: 'thing' }]); args = hooks.makeArguments({ params: { some: 'thing' }, method: 'find' }); - expect(args).to.deep.equal([ + assert.deepEqual(args, [ { some: 'thing' } ]); }); @@ -39,7 +39,7 @@ describe('hook utilities', () => { data: { test: 'me' } }); - expect(args).to.deep.equal([ + assert.deepEqual(args, [ { test: 'me' }, { some: 'thing' } ]); @@ -49,7 +49,7 @@ describe('hook utilities', () => { method: 'something' }); - expect(args).to.deep.equal([ + assert.deepEqual(args, [ 'testing', {} ]); }); @@ -61,7 +61,7 @@ describe('hook utilities', () => { method: 'update' }); - expect(args).to.deep.equal([undefined, { my: 'data' }, { some: 'thing' }]); + assert.deepEqual(args, [undefined, { my: 'data' }, { some: 'thing' }]); args = hooks.makeArguments({ id: 2, @@ -70,7 +70,7 @@ describe('hook utilities', () => { method: 'remove' }); - expect(args).to.deep.equal([2, { some: 'thing' }]); + assert.deepEqual(args, [2, { some: 'thing' }]); args = hooks.makeArguments({ id: 2, @@ -79,49 +79,48 @@ describe('hook utilities', () => { method: 'create' }); - expect(args).to.deep.equal([{ my: 'data' }, { some: 'thing' }]); + assert.deepEqual(args, [{ my: 'data' }, { some: 'thing' }]); }); }); describe('.convertHookData', () => { it('converts existing', () => { - expect(hooks.convertHookData('test')).to.deep.equal({ + assert.deepEqual(hooks.convertHookData('test'), { all: [ 'test' ] }); }); it('converts to `all`', () => { - expect(hooks.convertHookData([ 'test', 'me' ])).to.deep.equal({ + assert.deepEqual(hooks.convertHookData([ 'test', 'me' ]), { all: [ 'test', 'me' ] }); }); it('converts all properties into arrays', () => { - expect(hooks.convertHookData({ + assert.deepEqual(hooks.convertHookData({ all: 'thing', other: 'value', hi: [ 'foo', 'bar' ] - })) - .to.deep.equal({ - all: [ 'thing' ], - other: [ 'value' ], - hi: [ 'foo', 'bar' ] - }); + }), { + all: [ 'thing' ], + other: [ 'value' ], + hi: [ 'foo', 'bar' ] + }); }); }); describe('.isHookObject', () => { it('with a valid hook object', () => { - expect(hooks.isHookObject({ + assert.ok(hooks.isHookObject({ type: 'before', method: 'here' - })).to.equal(true); + })); }); it('with an invalid hook object', () => { - expect(hooks.isHookObject({ + assert.ok(!hooks.isHookObject({ type: 'before' - })).to.equal(false); + })); }); }); @@ -137,12 +136,12 @@ describe('hook utilities', () => { it('.toJSON', () => { const hookObject = hooks.createHookObject('find', hookData); - expect(hookObject.toJSON()).to.deep.equal({ + assert.deepEqual(hookObject.toJSON(), { method: 'find', path: 'testing' }); - expect(JSON.stringify(hookObject)).to.equal(JSON.stringify({ + assert.equal(JSON.stringify(hookObject), JSON.stringify({ method: 'find', path: 'testing' })); @@ -151,7 +150,7 @@ describe('hook utilities', () => { it('for find', () => { let hookObject = hooks.createHookObject('find', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'find', app, service, @@ -160,14 +159,14 @@ describe('hook utilities', () => { hookObject = hooks.createHookObject('find'); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'find', path: null }); hookObject = hooks.createHookObject('find', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'find', app, service, @@ -178,7 +177,7 @@ describe('hook utilities', () => { it('for get', () => { let hookObject = hooks.createHookObject('get', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'get', app, service, @@ -187,7 +186,7 @@ describe('hook utilities', () => { hookObject = hooks.createHookObject('get', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'get', app, service, @@ -198,7 +197,7 @@ describe('hook utilities', () => { it('for remove', () => { let hookObject = hooks.createHookObject('remove', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'remove', app, service, @@ -207,7 +206,7 @@ describe('hook utilities', () => { hookObject = hooks.createHookObject('remove', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'remove', app, service, @@ -218,7 +217,7 @@ describe('hook utilities', () => { it('for create', () => { const hookObject = hooks.createHookObject('create', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'create', app, service, @@ -229,7 +228,7 @@ describe('hook utilities', () => { it('for update', () => { const hookObject = hooks.createHookObject('update', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'update', app, service, @@ -240,7 +239,7 @@ describe('hook utilities', () => { it('for patch', () => { const hookObject = hooks.createHookObject('patch', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'patch', app, service, @@ -251,7 +250,7 @@ describe('hook utilities', () => { it('for custom method', () => { const hookObject = hooks.createHookObject('custom', hookData); - expect(hookObject).to.deep.equal({ + assert.deepEqual(hookObject, { method: 'custom', app, service, @@ -286,7 +285,7 @@ describe('hook utilities', () => { ], dummyHook); return promise.then((result: any) => { - expect(result).to.deep.equal({ + assert.deepEqual(result, { type: 'dummy', method: 'something', chain: [ 'first', 'second', 'third' ] @@ -307,8 +306,8 @@ describe('hook utilities', () => { ], dummyHook); return promise.catch((e: any) => { - expect(e.message).to.equal(`dummy hook for 'something' method returned invalid hook object`); - expect(typeof e.hook).to.equal('object'); + assert.equal(e.message, `dummy hook for 'something' method returned invalid hook object`); + assert.equal(typeof e.hook, 'object'); }); }); }); @@ -319,9 +318,9 @@ describe('hook utilities', () => { hooks.enableHooks(base, [], ['test']); - expect(typeof base.__hooks).to.equal('object'); - expect(typeof base.__hooks.test).to.equal('object'); - expect(typeof base.__hooks.before).to.equal('undefined'); + assert.equal(typeof base.__hooks, 'object'); + assert.equal(typeof base.__hooks.test, 'object'); + assert.equal(typeof base.__hooks.before, 'undefined'); }); it('does nothing when .hooks method exists', () => { @@ -330,7 +329,7 @@ describe('hook utilities', () => { }; hooks.enableHooks(base, [], ['test']); - expect(typeof base.__hooks).to.equal('undefined'); + assert.equal(typeof base.__hooks, 'undefined'); }); describe('.hooks method', () => { @@ -341,13 +340,13 @@ describe('hook utilities', () => { }); it('registers hook with custom type and `all` method', () => { - expect(typeof base.hooks).to.equal('function'); + assert.equal(typeof base.hooks, 'function'); const fn = function () {}; base.hooks({ dummy: fn }); - expect(base.__hooks.dummy.testMethod).to.deep.equal([ fn ]); + assert.deepEqual(base.__hooks.dummy.testMethod, [ fn ]); }); it('registers hook with custom type and specific method', () => { @@ -357,7 +356,7 @@ describe('hook utilities', () => { } }); - expect(base.__hooks.dummy.testMethod.length).to.equal(1); + assert.equal(base.__hooks.dummy.testMethod.length, 1); }); it('throws an error when registering invalid hook type', () => { @@ -365,7 +364,7 @@ describe('hook utilities', () => { base.hooks({ wrong () {} }); throw new Error('Should never get here'); } catch (e) { - expect(e.message).to.equal(`'wrong' is not a valid hook type`); + assert.equal(e.message, `'wrong' is not a valid hook type`); } }); @@ -376,7 +375,7 @@ describe('hook utilities', () => { } }); throw new Error('Should never get here'); } catch (e) { - expect(e.message).to.equal(`'wrongMethod' is not a valid hook method`); + assert.equal(e.message, `'wrongMethod' is not a valid hook method`); } }); }); @@ -397,13 +396,15 @@ describe('hook utilities', () => { }); it('combines app and service hooks', () => { - expect(hooks.getHooks(app, service, 'dummy', 'testMethod')) - .to.deep.equal([ appHook, serviceHook ]); + assert.deepEqual(hooks.getHooks(app, service, 'dummy', 'testMethod'), [ + appHook, serviceHook + ]); }); it('combines app and service hooks with appLast', () => { - expect(hooks.getHooks(app, service, 'dummy', 'testMethod', true)) - .to.deep.equal([ serviceHook, appHook ]); + assert.deepEqual(hooks.getHooks(app, service, 'dummy', 'testMethod', true), [ + serviceHook, appHook + ]); }); }); }); diff --git a/packages/commons/test/module.test.ts b/packages/commons/test/module.test.ts index 042c51b2d7..77458be989 100644 --- a/packages/commons/test/module.test.ts +++ b/packages/commons/test/module.test.ts @@ -1,28 +1,28 @@ -import { expect } from 'chai'; +import { strict as assert } from 'assert'; import { _ } from '../src'; describe('module', () => { it('is commonjs compatible', () => { const commons = require('../lib'); - expect(typeof commons).to.equal('object'); - expect(typeof commons.stripSlashes).to.equal('function'); - expect(typeof commons.hooks).to.equal('object'); - expect(typeof commons._).to.equal('object'); + assert.equal(typeof commons, 'object'); + assert.equal(typeof commons.stripSlashes, 'function'); + assert.equal(typeof commons.hooks, 'object'); + assert.equal(typeof commons._, 'object'); }); it('exposes lodash methods under _', () => { - expect(typeof _.each).to.equal('function'); - expect(typeof _.some).to.equal('function'); - expect(typeof _.every).to.equal('function'); - expect(typeof _.keys).to.equal('function'); - expect(typeof _.values).to.equal('function'); - expect(typeof _.isMatch).to.equal('function'); - expect(typeof _.isEmpty).to.equal('function'); - expect(typeof _.isObject).to.equal('function'); - expect(typeof _.extend).to.equal('function'); - expect(typeof _.omit).to.equal('function'); - expect(typeof _.pick).to.equal('function'); - expect(typeof _.merge).to.equal('function'); + assert.equal(typeof _.each, 'function'); + assert.equal(typeof _.some, 'function'); + assert.equal(typeof _.every, 'function'); + assert.equal(typeof _.keys, 'function'); + assert.equal(typeof _.values, 'function'); + assert.equal(typeof _.isMatch, 'function'); + assert.equal(typeof _.isEmpty, 'function'); + assert.equal(typeof _.isObject, 'function'); + assert.equal(typeof _.extend, 'function'); + assert.equal(typeof _.omit, 'function'); + assert.equal(typeof _.pick, 'function'); + assert.equal(typeof _.merge, 'function'); }); }); diff --git a/packages/commons/test/utils.test.ts b/packages/commons/test/utils.test.ts index 21ea9cb504..0a3a152f18 100644 --- a/packages/commons/test/utils.test.ts +++ b/packages/commons/test/utils.test.ts @@ -1,6 +1,6 @@ /* tslint:disable:no-unused-expression */ -import { expect } from 'chai'; +import { strict as assert } from 'assert'; import { _, @@ -12,154 +12,152 @@ import { describe('@feathersjs/commons utils', () => { it('stripSlashes', () => { - expect(stripSlashes('some/thing')).to.equal('some/thing'); - expect(stripSlashes('/some/thing')).to.equal('some/thing'); - expect(stripSlashes('some/thing/')).to.equal('some/thing'); - expect(stripSlashes('/some/thing/')).to.equal('some/thing'); - expect(stripSlashes('//some/thing/')).to.equal('some/thing'); - expect(stripSlashes('//some//thing////')).to.equal('some//thing'); + assert.equal(stripSlashes('some/thing'), 'some/thing'); + assert.equal(stripSlashes('/some/thing'), 'some/thing'); + assert.equal(stripSlashes('some/thing/'), 'some/thing'); + assert.equal(stripSlashes('/some/thing/'), 'some/thing'); + assert.equal(stripSlashes('//some/thing/'), 'some/thing'); + assert.equal(stripSlashes('//some//thing////'), 'some//thing'); }); it('isPromise', () => { - expect(isPromise(Promise.resolve())).to.equal(true); - expect(isPromise({ + assert.equal(isPromise(Promise.resolve()), true); + assert.ok(isPromise({ then () {} - })).to.equal(true); - expect(isPromise(null)).to.equal(false); + })); + assert.equal(isPromise(null), false); }); it('createSymbol', () => { - expect(typeof createSymbol('a test')).to.equal('symbol'); + assert.equal(typeof createSymbol('a test'), 'symbol'); }); describe('_', () => { it('isObject', () => { - expect(_.isObject({})).to.equal(true); - expect(_.isObject([])).to.equal(false); - expect(_.isObject(null)).to.equal(false); + assert.equal(_.isObject({}), true); + assert.equal(_.isObject([]), false); + assert.equal(_.isObject(null), false); }); it('isObjectOrArray', () => { - expect(_.isObjectOrArray({})).to.equal(true); - expect(_.isObjectOrArray([])).to.equal(true); - expect(_.isObjectOrArray(null)).to.equal(false); + assert.equal(_.isObjectOrArray({}), true); + assert.equal(_.isObjectOrArray([]), true); + assert.equal(_.isObjectOrArray(null), false); }); it('each', () => { _.each({ hi: 'there' }, (value, key) => { - expect(key).to.equal('hi'); - expect(value).to.equal('there'); + assert.equal(key, 'hi'); + assert.equal(value, 'there'); }); _.each([ 'hi' ], (value, key) => { - expect(key).to.equal(0); - expect(value).to.equal('hi'); + assert.equal(key, 0); + assert.equal(value, 'hi'); }); - _.each('moo', () => expect(false) - .to.equal(true, 'Should never get here') - ); + _.each('moo', () => assert.fail('Should never get here')); }); it('some', () => { - expect(_.some([ 'a', 'b' ], current => current === 'a')).to.be.ok; - expect(!_.some([ 'a', 'b' ], current => current === 'c')).to.be.ok; + assert.ok(_.some([ 'a', 'b' ], current => current === 'a')); + assert.ok(!_.some([ 'a', 'b' ], current => current === 'c')); }); it('every', () => { - expect(_.every([ 'a', 'a' ], current => current === 'a')).to.be.ok; - expect(!_.every([ 'a', 'b' ], current => current === 'a')).to.be.ok; + assert.ok(_.every([ 'a', 'a' ], current => current === 'a')); + assert.ok(!_.every([ 'a', 'b' ], current => current === 'a')); }); it('keys', () => { const data = { hi: 'there', name: 'David' }; - expect(_.keys(data)).to.deep.equal([ 'hi', 'name' ]); + assert.deepEqual(_.keys(data), [ 'hi', 'name' ]); }); it('values', () => { const data = { hi: 'there', name: 'David' }; - expect(_.values(data)).to.deep.equal([ 'there', 'David' ]); + assert.deepEqual(_.values(data), [ 'there', 'David' ]); }); it('isMatch', () => { - expect(_.isMatch({ + assert.ok(_.isMatch({ test: 'me', hi: 'you', more: true }, { test: 'me', hi: 'you' - })).to.be.ok; + })); - expect(!_.isMatch({ + assert.ok(!_.isMatch({ test: 'me', hi: 'you', more: true }, { test: 'me', hi: 'there' - })).to.be.ok; + })); }); it('isEmpty', () => { - expect(_.isEmpty({})).to.be.ok; - expect(!_.isEmpty({ name: 'David' })).to.be.ok; + assert.ok(_.isEmpty({})); + assert.ok(!_.isEmpty({ name: 'David' })); }); it('extend', () => { - expect(_.extend({ hi: 'there' }, { name: 'david' })).to.deep.equal({ + assert.deepEqual(_.extend({ hi: 'there' }, { name: 'david' }), { hi: 'there', name: 'david' }); }); it('omit', () => { - expect(_.omit({ + assert.deepEqual(_.omit({ name: 'David', first: 1, second: 2 - }, 'first', 'second')).to.deep.equal({ + }, 'first', 'second'), { name: 'David' }); }); it('pick', () => { - expect(_.pick({ + assert.deepEqual(_.pick({ name: 'David', first: 1, second: 2 - }, 'first', 'second')).to.deep.equal({ + }, 'first', 'second'), { first: 1, second: 2 }); - expect(_.pick({ + assert.deepEqual(_.pick({ name: 'David', first: 1 - }, 'first', 'second')).to.deep.equal({ + }, 'first', 'second'), { first: 1 }); }); it('merge', () => { - expect(_.merge({ hi: 'there' }, { name: 'david' })).to.deep.equal({ + assert.deepEqual(_.merge({ hi: 'there' }, { name: 'david' }), { hi: 'there', name: 'david' }); - expect(_.merge({}, { + assert.deepEqual(_.merge({}, { name: 'david', nested: { obj: true } - })).to.deep.equal({ + }), { name: 'david', nested: { obj: true } }); - expect(_.merge({ name: 'david' }, {})).to.deep.equal({ + assert.deepEqual(_.merge({ name: 'david' }, {}), { name: 'david' }); - expect(_.merge({ + assert.deepEqual(_.merge({ hi: 'there', my: { name: { is: 'david' }, number: { is: 1 } } - }, { my: { name: { is: 'eric' } } })).to.deep.equal({ + }, { my: { name: { is: 'eric' } } }), { hi: 'there', my: { number: { is: 1 }, @@ -167,7 +165,7 @@ describe('@feathersjs/commons utils', () => { } }); - expect(_.merge('hello', {})).to.equal('hello'); + assert.equal(_.merge('hello', {}), 'hello'); }); }); @@ -190,44 +188,44 @@ describe('@feathersjs/commons utils', () => { it('when in development mode returns the correct url', () => { const uri = makeUrl('test', mockApp); - expect(uri).to.equal('http://feathersjs.com:3030/test'); + assert.equal(uri, 'http://feathersjs.com:3030/test'); }); it('when in test mode returns the correct url', () => { mockApp.env = 'test'; const uri = makeUrl('test', mockApp); - expect(uri).to.equal('http://feathersjs.com:3030/test'); + assert.equal(uri, 'http://feathersjs.com:3030/test'); }); it('when in production mode returns the correct url', () => { mockApp.env = 'production'; const uri = makeUrl('test', mockApp); - expect(uri).to.equal('https://feathersjs.com/test'); + assert.equal(uri, 'https://feathersjs.com/test'); }); it('when path is not provided returns a default url', () => { const uri = makeUrl(null, mockApp); - expect(uri).to.equal('http://feathersjs.com:3030/'); + assert.equal(uri, 'http://feathersjs.com:3030/'); }); it('when app is not defined returns the correct url', () => { const uri = makeUrl('test'); - expect(uri).to.equal('http://localhost:3030/test'); + assert.equal(uri, 'http://localhost:3030/test'); }); it('strips leading slashes on path', () => { const uri = makeUrl('/test'); - expect(uri).to.equal('http://localhost:3030/test'); + assert.equal(uri, 'http://localhost:3030/test'); }); it('strips trailing slashes on path', () => { const uri = makeUrl('test/'); - expect(uri).to.equal('http://localhost:3030/test'); + assert.equal(uri, 'http://localhost:3030/test'); }); it('works with query strings', () => { const uri = makeUrl('test?admin=true'); - expect(uri).to.equal('http://localhost:3030/test?admin=true'); + assert.equal(uri, 'http://localhost:3030/test?admin=true'); }); }); }); diff --git a/packages/configuration/.npmignore b/packages/configuration/.npmignore index d7819044b6..ef86d5f1e7 100644 --- a/packages/configuration/.npmignore +++ b/packages/configuration/.npmignore @@ -1,3 +1,3 @@ test/ -src/ tsconfig.json +coverage/ diff --git a/packages/configuration/CHANGELOG.md b/packages/configuration/CHANGELOG.md index 2e369ed00a..07fa2aeb45 100644 --- a/packages/configuration/CHANGELOG.md +++ b/packages/configuration/CHANGELOG.md @@ -3,6 +3,188 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + + +### Bug Fixes + +* Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/configuration + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/configuration/LICENSE b/packages/configuration/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/configuration/LICENSE +++ b/packages/configuration/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/configuration/README.md b/packages/configuration/README.md index 5069ca8ce8..55207ac319 100644 --- a/packages/configuration/README.md +++ b/packages/configuration/README.md @@ -1,29 +1,23 @@ # @feathersjs/configuration -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/configuration)](https://david-dm.org/feathersjs/feathers?path=packages/configuration) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/configuration.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/configuration) > A small configuration module for your Feathers application. -## About +## Installation -`@feathersjs/configuration` is a module that wraps [node-config](https://github.com/lorenwest/node-config) to configure your Feathers application. - -> npm install @feathersjs/configuration - -```js -const feathers = require('@feathersjs/feathers'); -const configuration = require('@feathersjs/configuration'); - -// Use the application root and `config/` as the configuration folder -let app = feathers().configure(configuration()) ``` +npm install @feathersjs/configuration --save +``` + +## Documentation -See the [Feathers configuration docs](https://docs.feathersjs.com/api/configuration.html) for the full API usage. +Refer to the [Feathers configuration API documentation](https://docs.feathersjs.com/api/configuration.html) for more details. ## License -Copyright (c) 2018 +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/configuration/package.json b/packages/configuration/package.json index cc4648f528..b5053c8eff 100644 --- a/packages/configuration/package.json +++ b/packages/configuration/package.json @@ -1,14 +1,19 @@ { "name": "@feathersjs/configuration", "description": "A small configuration module for your Feathers application.", - "version": "4.0.0-pre.3", + "version": "4.5.3", "homepage": "https://feathersjs.com", "main": "lib/", + "types": "lib/", "keywords": [ "feathers", "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -23,13 +28,13 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --opts ../../mocha.ts.opts --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" }, "semistandard": { "env": [ @@ -43,19 +48,19 @@ "access": "public" }, "dependencies": { - "config": "^3.1.0", + "@feathersjs/feathers": "^4.5.3", + "config": "^3.3.1", "debug": "^4.1.1" }, "devDependencies": { - "@feathersjs/feathers": "^4.0.0-pre.3", - "@types/config": "^0.0.34", - "@types/debug": "^4.1.4", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.2", - "mocha": "^6.1.4", + "@types/config": "^0.0.36", + "@types/debug": "^4.1.5", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.22", + "mocha": "^8.0.1", "shx": "^0.3.2", - "ts-node": "^8.2.0", - "typescript": "^3.4.5" + "ts-node": "^8.10.2", + "typescript": "^3.9.6" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/configuration/src/index.ts b/packages/configuration/src/index.ts index 9c900acd38..4f6079a560 100644 --- a/packages/configuration/src/index.ts +++ b/packages/configuration/src/index.ts @@ -7,7 +7,7 @@ const debug = Debug('@feathersjs/configuration'); const separator = path.sep; export default function init () { - return (app: Application|undefined) => { + return (app?: Application) => { const convert = (current: any) => { const result: { [key: string]: any } = Array.isArray(current) ? [] : {}; @@ -24,7 +24,8 @@ export default function init () { } else { if (process.env[value]) { value = process.env[value]; - } else if (value.indexOf('.') === 0 || value.indexOf('..') === 0) { + } + if (value.indexOf('.') === 0 || value.indexOf('..') === 0) { // Make relative paths absolute value = path.resolve( path.join(config.util.getEnv('NODE_CONFIG_DIR')), @@ -52,7 +53,7 @@ export default function init () { Object.keys(conf).forEach(name => { const value = conf[name]; debug(`Setting ${name} configuration value to`, value); - (app as Application).set(name, value); + app!.set(name, value); }); return conf; diff --git a/packages/configuration/test/config/default.json b/packages/configuration/test/config/default.json index f611831160..ea3280fe15 100644 --- a/packages/configuration/test/config/default.json +++ b/packages/configuration/test/config/default.json @@ -2,6 +2,7 @@ "port": 3030, "environment": "NODE_ENV", "path": "../something", + "pathFromEnv": "PATH_ENV", "unescaped": "\\NODE_ENV", "from": "default", "deeply": { "nested": { "env": "NODE_ENV" } }, diff --git a/packages/configuration/test/index.test.ts b/packages/configuration/test/index.test.ts index a6a1f2007a..f22facbc89 100644 --- a/packages/configuration/test/index.test.ts +++ b/packages/configuration/test/index.test.ts @@ -13,6 +13,7 @@ describe('@feathersjs/configuration', () => { process.env.NODE_ENV = 'testing'; process.env.NODE_CONFIG_DIR = join(__dirname, 'config'); + process.env.PATH_ENV = '../something'; plugin = require('../lib'); app = feathers().configure(plugin()); @@ -59,6 +60,10 @@ describe('@feathersjs/configuration', () => { assert.strictEqual(app.get('path'), join(__dirname, 'something')) ); + it('normalizes relative path names from environment variable', () => + assert.strictEqual(app.get('pathFromEnv'), join(__dirname, 'something')) + ); + it('converts environment variables recursively', () => assert.strictEqual(app.get('deeply').nested.env, 'testing') ); diff --git a/packages/errors/.npmignore b/packages/errors/.npmignore index 65e3ba2eda..33b30624f5 100644 --- a/packages/errors/.npmignore +++ b/packages/errors/.npmignore @@ -1 +1,2 @@ test/ +coverage/ diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index 0ebe30a7c9..7726dfb437 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -3,6 +3,188 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + + +### Bug Fixes + +* **errors:** Add 410 Gone to errors ([#1849](https://github.com/feathersjs/feathers/issues/1849)) ([6801428](https://github.com/feathersjs/feathers/commit/6801428f8fd17dbfebcdb6f1b0cd01433a4033dc)) + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + + +### Bug Fixes + +* Small type improvements ([#1624](https://github.com/feathersjs/feathers/issues/1624)) ([50162c6](https://github.com/feathersjs/feathers/commit/50162c6e562f0a47c6a280c4f01fff7c3afee293)) + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/errors + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/errors + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/errors/LICENSE b/packages/errors/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/errors/LICENSE +++ b/packages/errors/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/errors/README.md b/packages/errors/README.md index 9640ebd746..936004f627 100644 --- a/packages/errors/README.md +++ b/packages/errors/README.md @@ -1,6 +1,6 @@ # @feathersjs/errors -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/errors)](https://david-dm.org/feathersjs/feathers?path=packages/errors) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/errors.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/errors) @@ -12,46 +12,12 @@ npm install @feathersjs/errors --save ``` -Quick usage: - -```js -const errors = require('@feathersjs/errors'); - -// If you were to create an error yourself. -const notFound = new errors.NotFound('User does not exist'); - -// You can wrap existing errors -const existing = new errors.GeneralError(new Error('I exist')); - -// You can also pass additional data -const data = new errors.BadRequest('Invalid email', { - email: 'sergey@google.com' -}); - -// You can also pass additional data without a message -const dataWithoutMessage = new errors.BadRequest({ - email: 'sergey@google.com' -}); - -// If you need to pass multiple errors -const validationErrors = new errors.BadRequest('Invalid Parameters', { - errors: { email: 'Email already taken' } -}); - -// You can also omit the error message and we'll put in a default one for you -const validationErrors = new errors.BadRequest({ - errors: { - email: 'Invalid Email' - } -}); -``` - ## Documentation -Please refer to the [@feathersjs/errors API documentation](https://docs.feathersjs.com/api/errors.html) for more details. +Refer to the [Feathers errors API documentation](https://docs.feathersjs.com/api/errors.html) for more details. ## License -Copyright (c) 2018 Feathers Contributors +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/errors/index.d.ts b/packages/errors/index.d.ts index 7b79548a2e..ae1dff39e9 100644 --- a/packages/errors/index.d.ts +++ b/packages/errors/index.d.ts @@ -98,6 +98,22 @@ export interface Errors { NotImplemented: NotImplemented; BadGateway: BadGateway; Unavailable: Unavailable; + 400: BadRequest; + 401: NotAuthenticated; + 402: PaymentError; + 403: Forbidden; + 404: NotFound; + 405: MethodNotAllowed; + 406: NotAcceptable; + 408: Timeout; + 409: Conflict; + 411: LengthRequired; + 422: Unprocessable; + 429: TooManyRequests; + 500: GeneralError; + 501: NotImplemented; + 502: BadGateway; + 503: Unavailable; } export function convert (error: any): FeathersError; diff --git a/packages/errors/lib/index.js b/packages/errors/lib/index.js index b775ed174a..b1f5ca7127 100644 --- a/packages/errors/lib/index.js +++ b/packages/errors/lib/index.js @@ -144,6 +144,13 @@ function Conflict (message, data) { inheritsFrom(Conflict, FeathersError); +// 410 - Gone +function Gone (message, data) { + FeathersError(this, message, 'Gone', 410, 'gone', data); +} + +inheritsFrom(Gone, FeathersError); + // 411 - Length Required function LengthRequired (message, data) { FeathersError.call(this, message, 'LengthRequired', 411, 'length-required', data); @@ -204,6 +211,7 @@ const errors = { NotAcceptable, Timeout, Conflict, + Gone, LengthRequired, Unprocessable, TooManyRequests, @@ -220,6 +228,7 @@ const errors = { 406: NotAcceptable, 408: Timeout, 409: Conflict, + 410: Gone, 411: LengthRequired, 422: Unprocessable, 429: TooManyRequests, diff --git a/packages/errors/package.json b/packages/errors/package.json index f56f4efae7..fc38ac159f 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/errors", "description": "Common error types for Feathers apps", - "version": "4.0.0-pre.3", + "version": "4.5.3", "homepage": "https://feathersjs.com", "main": "lib/index", "types": "index.d.ts", @@ -24,13 +24,13 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "directories": { "lib": "lib" }, "scripts": { - "test": "mocha --opts ../../mocha.opts" + "test": "mocha --config ../../.mocharc.json" }, "publishConfig": { "access": "public" @@ -39,12 +39,9 @@ "debug": "^4.1.1" }, "devDependencies": { - "@feathersjs/feathers": "^4.0.0-pre.3", - "chai": "^4.2.0", + "@feathersjs/feathers": "^4.5.3", "express": "^4.17.1", - "mocha": "^6.1.4", - "sinon": "^7.3.2", - "sinon-chai": "^3.3.0" + "mocha": "^8.0.1" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/errors/test/index.test.js b/packages/errors/test/index.test.js index ec55d1e9d1..1b14ae4bc1 100644 --- a/packages/errors/test/index.test.js +++ b/packages/errors/test/index.test.js @@ -78,6 +78,10 @@ describe('@feathersjs/errors', () => { assert.notStrictEqual(typeof errors.Conflict, 'undefined', 'has Conflict'); }); + it('Gone', () => { + assert.notStrictEqual(typeof errors.Gone, 'undefined', 'has Gone'); + }); + it('Length Required', () => { assert.notStrictEqual(typeof errors.LengthRequired, 'undefined', 'has LengthRequired'); }); @@ -142,6 +146,10 @@ describe('@feathersjs/errors', () => { assert.notStrictEqual(typeof errors[409], 'undefined', 'has Conflict alias'); }); + it('410', () => { + assert.notStrictEqual(typeof errors[410], 'undefined', 'has Gone alias'); + }); + it('411', () => { assert.notStrictEqual(typeof errors[411], 'undefined', 'has LengthRequired alias'); }); diff --git a/packages/express/.npmignore b/packages/express/.npmignore index 65e3ba2eda..33b30624f5 100644 --- a/packages/express/.npmignore +++ b/packages/express/.npmignore @@ -1 +1,2 @@ test/ +coverage/ diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index d7e981e9c9..334b4211e2 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -3,6 +3,232 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + +**Note:** Version bump only for package @feathersjs/express + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/express + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + + +### Bug Fixes + +* Updated typings for express middleware ([#1839](https://github.com/feathersjs/feathers/issues/1839)) ([6b8e897](https://github.com/feathersjs/feathers/commit/6b8e8971a9dbb08913edd1be48826624645d9dc1)) + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/express + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/express + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/express + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/express + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + + +### Features + +* **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/express + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/express + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + + +### Bug Fixes + +* Small type improvements ([#1624](https://github.com/feathersjs/feathers/issues/1624)) ([50162c6](https://github.com/feathersjs/feathers/commit/50162c6e562f0a47c6a280c4f01fff7c3afee293)) + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + + +### Bug Fixes + +* Typings for express request and response properties ([#1609](https://github.com/feathersjs/feathers/issues/1609)) ([38cf8c9](https://github.com/feathersjs/feathers/commit/38cf8c950c1a4fb4a6d78d68d70e7fdd63b71c3c)) + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + +**Note:** Version bump only for package @feathersjs/express + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/express + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/express + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + + +### Bug Fixes + +* Add info to express error handler logger type ([#1557](https://github.com/feathersjs/feathers/issues/1557)) ([3e1d26c](https://github.com/feathersjs/feathers/commit/3e1d26c)) + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/express + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/express + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/express + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + + +### Bug Fixes + +* Add method to reliably get default authentication service ([#1470](https://github.com/feathersjs/feathers/issues/1470)) ([e542cb3](https://github.com/feathersjs/feathers/commit/e542cb3)) + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/express + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + + +### Bug Fixes + +* Remove unnecessary top level export files in @feathersjs/express ([#1442](https://github.com/feathersjs/feathers/issues/1442)) ([73c3fb2](https://github.com/feathersjs/feathers/commit/73c3fb2)) + + +### Features + +* @feathersjs/express allow to pass an existing Express application instance ([#1446](https://github.com/feathersjs/feathers/issues/1446)) ([853a6b0](https://github.com/feathersjs/feathers/commit/853a6b0)) + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + + +### Bug Fixes + +* @feathersjs/express: allow middleware arrays ([#1421](https://github.com/feathersjs/feathers/issues/1421)) ([b605ab8](https://github.com/feathersjs/feathers/commit/b605ab8)) +* @feathersjs/express: replace `reduce` with `map` ([#1429](https://github.com/feathersjs/feathers/issues/1429)) ([44542e9](https://github.com/feathersjs/feathers/commit/44542e9)) +* Clean up hooks code ([#1407](https://github.com/feathersjs/feathers/issues/1407)) ([f25c88b](https://github.com/feathersjs/feathers/commit/f25c88b)) + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/express/LICENSE b/packages/express/LICENSE index 25f2251eae..b4fa961994 100644 --- a/packages/express/LICENSE +++ b/packages/express/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/express/README.md b/packages/express/README.md index 8e1129b310..f144c39122 100644 --- a/packages/express/README.md +++ b/packages/express/README.md @@ -1,51 +1,23 @@ # @feathersjs/express -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/express)](https://david-dm.org/feathersjs/feathers?path=packages/express) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/express.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/express) > Feathers Express framework bindings and REST provider -This plugin turns a Feathers v3+ application into a drop-in replacement for any Express application. - ## Installation ``` -npm install @feathersjs/express --save +npm install @feathersjs/client --save ``` -> _Important:_ This plugin only works with `feathers` 3.0 and later - ## Documentation -Please refer to the [@feathersjs/express API documentation](https://docs.feathersjs.com/api/express.html) for more details. - -## Complete Example - -Here's an example of a Feathers server that uses `@feathersjs/express`. - -```js -const feathers = require('@feathersjs/feathers'); -const express = require('@feathersjs/express'); - -const app = express(feathers()); - -app.configure(express.rest()); -app.use('/myservice', { - get(id) { - return Promise.resolve({ id }); - } -}); - -app.use((req, res) => res.json({ message: 'Hello world' })); - -app.listen(3030); - -console.log('Feathers app started on 127.0.0.1:3030'); -``` +Refer to the [Feathers Express API documentation](https://docs.feathersjs.com/api/express.html) for more details. ## License -Copyright (c) 2017 +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/express/errors.js b/packages/express/errors.js deleted file mode 100644 index 694b0648df..0000000000 --- a/packages/express/errors.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@feathersjs/errors/handler'); diff --git a/packages/express/index.d.ts b/packages/express/index.d.ts index 1ab9bbcfae..05d329d7a2 100644 --- a/packages/express/index.d.ts +++ b/packages/express/index.d.ts @@ -1,4 +1,4 @@ -import { Application as FeathersApplication } from '@feathersjs/feathers'; +import { Application as FeathersApplication, Params as FeathersParams, HookContext, SetupMethod, ServiceMethods } from '@feathersjs/feathers'; import express from 'express'; declare const feathersExpress: FeathersExpress; @@ -16,13 +16,14 @@ interface FeathersExpress extends Express { rest: { (handler?: express.RequestHandler): () => void; formatter: express.RequestHandler; + httpMethod: (verb: string, uris?: string | string[]) => (method: T) => T; }; original: Express; errorHandler (options?: { public?: string, - logger?: { error?: (msg: string) => void | null }, + logger?: { error: (msg: any) => void, info: (msg: any) => void }, html?: any, json?: any }): express.ErrorRequestHandler; @@ -36,3 +37,24 @@ interface FeathersExpress extends Express { declare namespace feathersExpress { type Application = express.Express & FeathersApplication; } + +declare module 'express-serve-static-core' { + interface Request { + feathers?: Partial; + } + + interface Response { + data?: any; + hook?: HookContext; + } + + type FeathersService = Partial & SetupMethod>; + + interface IRouterMatcher { + // tslint:disable-next-line callable-types (Required for declaration merging) +

( + path: PathParams, + ...handlers: (RequestHandler | FeathersService | Application)[] + ): T; + } +} diff --git a/packages/express/lib/authentication.js b/packages/express/lib/authentication.js index 2728f2bf90..a937bb53f2 100644 --- a/packages/express/lib/authentication.js +++ b/packages/express/lib/authentication.js @@ -1,43 +1,38 @@ -const { flatten, merge } = require('lodash'); +const flatten = require('lodash/flatten'); +const merge = require('lodash/merge'); const debug = require('debug')('@feathersjs/express/authentication'); const normalizeStrategy = (_settings = [], ..._strategies) => typeof _settings === 'string' ? { strategies: flatten([ _settings, ..._strategies ]) } : _settings; -const getService = (settings, app) => { - const path = settings.service || app.get('defaultAuthentication'); - - if (typeof path !== 'string') { - return null; - } - - return app.service(path) || null; -}; exports.parseAuthentication = (settings = {}) => { return function (req, res, next) { const { app } = req; - const service = getService(settings, app); + const service = app.defaultAuthentication ? app.defaultAuthentication(settings.service) : null; if (service === null) { return next(); } - const { authStrategies = [] } = service.configuration; + const config = service.configuration; + const authStrategies = config.parseStrategies || config.authStrategies || []; if (authStrategies.length === 0) { - debug('No `authStrategies` found in authentication configuration'); + debug('No `authStrategies` or `parseStrategies` found in authentication configuration'); return next(); } service.parse(req, res, ...authStrategies) .then(authentication => { - debug('Parsed authentication from HTTP header', authentication); - merge(req, { - authentication, - feathers: { authentication } - }); + if (authentication) { + debug('Parsed authentication from HTTP header', authentication); + merge(req, { + authentication, + feathers: { authentication } + }); + } next(); }).catch(next); @@ -53,7 +48,7 @@ exports.authenticate = (...strategies) => { return function (req, res, next) { const { app, authentication } = req; - const service = getService(settings, app); + const service = app.defaultAuthentication(settings.service); debug('Authenticating with Express middleware and strategies', settings.strategies); diff --git a/packages/express/lib/index.js b/packages/express/lib/index.js index b6ae0c55c9..ee38524335 100644 --- a/packages/express/lib/index.js +++ b/packages/express/lib/index.js @@ -7,9 +7,9 @@ const authentication = require('./authentication'); const notFound = require('./not-found-handler'); const rest = require('./rest'); -function feathersExpress (feathersApp) { +function feathersExpress (feathersApp, expressApp = express()) { if (!feathersApp) { - return express(); + return expressApp; } if (typeof feathersApp.setup !== 'function') { @@ -20,7 +20,6 @@ function feathersExpress (feathersApp) { throw new Error(`@feathersjs/express requires an instance of a Feathers application version 3.x or later (got ${feathersApp.version || 'unknown'})`); } - const expressApp = express(); // An Uberproto mixin that provides the extended functionality const mixin = { use (location) { @@ -28,7 +27,7 @@ function feathersExpress (feathersApp) { let middleware = Array.from(arguments) .slice(1) .reduce(function (middleware, arg) { - if (typeof arg === 'function') { + if (typeof arg === 'function' || Array.isArray(arg)) { middleware[service ? 'after' : 'before'].push(arg); } else if (!service) { service = arg; @@ -42,7 +41,7 @@ function feathersExpress (feathersApp) { }); const hasMethod = methods => methods.some(name => - (service && !Array.isArray(service) && typeof service[name] === 'function') + (service && typeof service[name] === 'function') ); // Check for service (any object with at least one service method) @@ -52,7 +51,7 @@ function feathersExpress (feathersApp) { } debug('Registering service with middleware', middleware); - // Since this is a serivce, call Feathers `.use` + // Since this is a service, call Feathers `.use` feathersApp.use.call(this, location, service, { middleware }); return this; diff --git a/packages/express/lib/rest/getHandler.js b/packages/express/lib/rest/getHandler.js index 4805b5a1fa..42954e4b21 100644 --- a/packages/express/lib/rest/getHandler.js +++ b/packages/express/lib/rest/getHandler.js @@ -32,16 +32,16 @@ function getAllowedMethods (service, routes) { } function makeArgsGetter (argsOrder) { - return (req, params) => argsOrder.reduce((result, argName) => { + return (req, params) => argsOrder.map((argName) => { switch (argName) { case 'id': - return [ ...result, req.params.__feathersId || null ]; + return req.params.__feathersId || null; case 'data': - return [ ...result, req.body ]; + return req.body; case 'params': - return [ ...result, params ]; + return params; } - }, []); + }); } // A function that returns the middleware for a given method and service diff --git a/packages/express/package.json b/packages/express/package.json index 59289b8463..91c4ec6508 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/express", "description": "Feathers Express framework bindings and REST provider", - "version": "4.0.0-pre.3", + "version": "4.5.4", "homepage": "https://feathersjs.com", "main": "lib/", "types": "index.d.ts", @@ -10,6 +10,10 @@ "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -24,10 +28,10 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { - "test": "mocha --opts ../../mocha.opts" + "test": "mocha --config ../../.mocharc.json" }, "directories": { "lib": "lib" @@ -36,22 +40,22 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", - "@feathersjs/errors": "^4.0.0-pre.3", - "@types/express": "^4.16.1", + "@feathersjs/commons": "^4.5.3", + "@feathersjs/errors": "^4.5.3", + "@types/express": "^4.17.7", "debug": "^4.1.1", "express": "^4.17.1", - "uberproto": "^2.0.4" + "lodash": "^4.17.19", + "uberproto": "^2.0.6" }, "devDependencies": { - "@feathersjs/authentication": "^4.0.0-pre.3", - "@feathersjs/authentication-local": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", - "@feathersjs/tests": "^4.0.0-pre.3", - "axios": "^0.19.0", - "chai": "^4.2.0", - "lodash": "^4.17.11", - "mocha": "^6.1.4" - }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "@feathersjs/authentication": "^4.5.3", + "@feathersjs/authentication-local": "^4.5.4", + "@feathersjs/feathers": "^4.5.3", + "@feathersjs/tests": "^4.5.3", + "axios": "^0.19.2", + "lodash": "^4.17.19", + "mocha": "^8.0.1" + }, + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/express/test/authentication.test.js b/packages/express/test/authentication.test.js index 6121413e1d..a96ba63d83 100644 --- a/packages/express/test/authentication.test.js +++ b/packages/express/test/authentication.test.js @@ -116,9 +116,10 @@ describe('@feathersjs/express/authentication', () => { }); }); - it('errors when there are no authStrategies', () => { + it('errors when there are no authStrategies and parseStrategies', () => { const { accessToken } = authResult; app.get('authentication').authStrategies = []; + delete app.get('authentication').parseStrategies; return axios.get('/dummy/dave', { headers: { diff --git a/packages/express/test/error-handler.test.js b/packages/express/test/error-handler.test.js index 20216545ef..ba649feee9 100644 --- a/packages/express/test/error-handler.test.js +++ b/packages/express/test/error-handler.test.js @@ -1,37 +1,31 @@ /* tsline:disable:handle-callback-err */ /* tslint:disable:no-unused-expression */ +const { strict: assert } = require('assert'); const express = require('express'); - const errors = require('@feathersjs/errors'); -const chai = require('chai'); -const sinon = require('sinon'); -const sinonChai = require('sinon-chai'); const request = require('request'); const fs = require('fs'); const { join } = require('path'); const handler = require('../lib/error-handler'); -chai.use(sinonChai); - -const { expect } = chai; const content = 'Error'; -let htmlHandler = sinon.spy(function (error, req, res, next) { +let htmlHandler = function (error, req, res, next) { res.send(content); -}); +}; -const jsonHandler = sinon.spy(function (error, req, res, next) { +const jsonHandler = function (error, req, res, next) { res.json(error); -}); +}; describe('error-handler', () => { it('is CommonJS compatible', () => { - expect(typeof require('../lib/error-handler')).to.equal('function'); + assert.equal(typeof require('../lib/error-handler'), 'function'); }); it('is import compatible', () => { - expect(typeof handler).to.equal('function'); + assert.equal(typeof handler, 'function'); }); describe('supports catch-all custom handlers', function () { @@ -66,23 +60,16 @@ describe('error-handler', () => { } }; - it('is called', done => { - request(options, (error, res, body) => { - expect(htmlHandler).to.be.called; // eslint-disable-line - done(); - }); - }); - it('logs the error', done => { request(options, (error, res, body) => { - expect(currentError.message).to.equal('Something went wrong'); + assert.equal(currentError.message, 'Something went wrong'); done(); }); }); it('can send a custom response', done => { request(options, (error, res, body) => { - expect(body).to.equal(content); + assert.equal(body, content); done(); }); }); @@ -97,13 +84,6 @@ describe('error-handler', () => { } }; - it('is called', done => { - request(options, (error, res, body) => { - expect(jsonHandler).to.be.called; - done(); - }); - }); - it('can send a custom response', done => { const expected = JSON.stringify({ name: 'GeneralError', @@ -114,7 +94,7 @@ describe('error-handler', () => { errors: {} }); request(options, (error, res, body) => { - expect(body).to.deep.equal(expected); + assert.deepEqual(body, expected); done(); }); }); @@ -130,7 +110,7 @@ describe('error-handler', () => { return Object.assign({ set () {}, status (code) { - expect(code).to.equal(errCode); + assert.equal(code, errCode); } }, props); }; @@ -143,7 +123,7 @@ describe('error-handler', () => { }); const res = makeRes(401, { sendFile (f) { - expect(f).to.equal('path/to/401.html'); + assert.equal(f, 'path/to/401.html'); done(); } }); @@ -156,9 +136,9 @@ describe('error-handler', () => { const middleware = handler({ logger: null, html: { 402: (_err, _req, _res) => { - expect(_err).to.equal(err); - expect(_req).to.equal(req); - expect(_res).to.equal(res); + assert.equal(_err, err); + assert.equal(_req, req); + assert.equal(_res, res); done(); } } }); @@ -171,9 +151,9 @@ describe('error-handler', () => { const middleware = handler({ logger: null, html: { default: (_err, _req, _res) => { - expect(_err).to.equal(err); - expect(_req).to.equal(req); - expect(_res).to.equal(res); + assert.equal(_err, err); + assert.equal(_req, req); + assert.equal(_res, res); done(); } } }); @@ -189,7 +169,7 @@ describe('error-handler', () => { return Object.assign({ set () {}, status (code) { - expect(code).to.equal(errCode); + assert.equal(code, errCode); } }, props); }; @@ -202,7 +182,7 @@ describe('error-handler', () => { }); const res = makeRes(401, { json (obj) { - expect(obj).to.deep.equal(err.toJSON()); + assert.deepEqual(obj, err.toJSON()); done(); } }); @@ -215,9 +195,9 @@ describe('error-handler', () => { const middleware = handler({ logger: null, json: { 402: (_err, _req, _res) => { - expect(_err).to.equal(err); - expect(_req).to.equal(req); - expect(_res).to.equal(res); + assert.equal(_err, err); + assert.equal(_req, req); + assert.equal(_res, res); done(); } } }); @@ -230,9 +210,9 @@ describe('error-handler', () => { const middleware = handler({ logger: null, json: { default: (_err, _req, _res) => { - expect(_err).to.equal(err); - expect(_req).to.equal(req); - expect(_res).to.equal(res); + assert.equal(_err, err); + assert.equal(_req, req); + assert.equal(_res, res); done(); } } }); @@ -283,8 +263,8 @@ describe('error-handler', () => { url: 'http://localhost:5050/error', json: true }, (error, res, body) => { - expect(res.statusCode).to.equal(500); - expect(body).to.deep.equal({ + assert.equal(res.statusCode, 500); + assert.deepEqual(body, { name: 'GeneralError', message: 'Something went wrong', code: 500, @@ -295,10 +275,6 @@ describe('error-handler', () => { done(); }); }); - - it.skip('still has a stack trace', () => { - expect(handler).to.equal('function'); - }); }); describe('text/html format', () => { @@ -311,8 +287,8 @@ describe('error-handler', () => { 'Accept': 'text/html' } }, (error, res, body) => { - expect(res.statusCode).to.equal(404); - expect(html.toString()).to.equal(body); + assert.equal(res.statusCode, 404); + assert.equal(html.toString(), body); done(); }); }); @@ -327,8 +303,8 @@ describe('error-handler', () => { 'Accept': 'text/html' } }, (error, res, body) => { - expect(res.statusCode).to.equal(500); - expect(html.toString()).to.equal(body); + assert.equal(res.statusCode, 500); + assert.equal(html.toString(), body); done(); }); }); @@ -342,8 +318,8 @@ describe('error-handler', () => { 'Content-Type': 'text/html' } }, (error, res, body) => { - expect(res.statusCode).to.equal(404); - expect(html.toString()).to.equal(body); + assert.equal(res.statusCode, 404); + assert.equal(html.toString(), body); done(); }); }); @@ -357,8 +333,8 @@ describe('error-handler', () => { 'Accept': 'text/html' } }, (error, res, body) => { - expect(res.statusCode).to.equal(404); - expect(html.toString()).to.equal(body); + assert.equal(res.statusCode, 404); + assert.equal(html.toString(), body); done(); }); }); @@ -375,8 +351,8 @@ describe('error-handler', () => { }, json: true }, (error, res, body) => { - expect(res.statusCode).to.equal(500); - expect(body).to.deep.equal({ + assert.equal(res.statusCode, 500); + assert.deepEqual(body, { name: 'GeneralError', message: 'Something went wrong', code: 500, @@ -397,8 +373,8 @@ describe('error-handler', () => { }, json: true }, (error, res, body) => { - expect(res.statusCode).to.equal(404); - expect(body).to.deep.equal({ name: 'NotFound', + assert.equal(res.statusCode, 404); + assert.deepEqual(body, { name: 'NotFound', message: 'File not found', code: 404, className: 'not-found', @@ -417,8 +393,8 @@ describe('error-handler', () => { }, json: true }, (error, res, body) => { - expect(res.statusCode).to.equal(400); - expect(body).to.deep.equal({ name: 'BadRequest', + assert.equal(res.statusCode, 400); + assert.deepEqual(body, { name: 'BadRequest', message: 'Invalid Password', code: 400, className: 'bad-request', @@ -443,8 +419,8 @@ describe('error-handler', () => { }, json: true }, (error, res, body) => { - expect(res.statusCode).to.equal(400); - expect(body).to.deep.equal({ name: 'BadRequest', + assert.equal(res.statusCode, 400); + assert.deepEqual(body, { name: 'BadRequest', message: 'Invalid Password', code: 400, className: 'bad-request', @@ -469,8 +445,8 @@ describe('error-handler', () => { }, json: true }, (error, res, body) => { - expect(res.statusCode).to.equal(400); - expect(body).to.deep.equal({ name: 'BadRequest', + assert.equal(res.statusCode, 400); + assert.deepEqual(body, { name: 'BadRequest', message: 'Invalid Password', code: 400, className: 'bad-request', @@ -505,8 +481,8 @@ describe('error-handler', () => { }] }); - expect(res.statusCode).to.equal(400); - expect(body).to.deep.equal(expected); + assert.equal(res.statusCode, 400); + assert.deepEqual(body, expected); done(); }); }); diff --git a/packages/express/test/index.test.js b/packages/express/test/index.test.js index f0f1cb244e..9a32d617ed 100644 --- a/packages/express/test/index.test.js +++ b/packages/express/test/index.test.js @@ -29,6 +29,13 @@ describe('@feathersjs/express', () => { assert.strictEqual(typeof app, 'function'); }); + it('allows to use an existing Express instance', () => { + const expressApp = express(); + const app = expressify(feathers(), expressApp); + + assert.strictEqual(app, expressApp); + }); + it('exports `express.rest`', () => { assert.ok(typeof expressify.rest === 'function'); }); diff --git a/packages/express/test/not-found-handler.test.js b/packages/express/test/not-found-handler.test.js index fbfb805327..0e2524e2d3 100644 --- a/packages/express/test/not-found-handler.test.js +++ b/packages/express/test/not-found-handler.test.js @@ -1,20 +1,15 @@ -const chai = require('chai'); -const sinonChai = require('sinon-chai'); +const { strict: assert } = require('assert'); const errors = require('@feathersjs/errors'); const handler = require('../lib/not-found-handler'); -const { expect } = chai; - -chai.use(sinonChai); - describe('not-found-handler', () => { it('is CommonJS compatible', () => { - expect(typeof require('../lib/not-found-handler')).to.equal('function'); + assert.equal(typeof require('../lib/not-found-handler'), 'function'); }); it('is import compatible', () => { - expect(typeof handler).to.equal('function'); + assert.equal(typeof handler, 'function'); }); it('returns NotFound error', done => { @@ -22,9 +17,9 @@ describe('not-found-handler', () => { url: 'some/where', headers: {} }, {}, function (error) { - expect(error instanceof errors.NotFound).to.equal(true); - expect(error.message).to.equal('Page not found'); - expect(error.data).to.deep.equal({ + assert.ok(error instanceof errors.NotFound); + assert.equal(error.message, 'Page not found'); + assert.deepEqual(error.data, { url: 'some/where' }); done(); @@ -36,9 +31,9 @@ describe('not-found-handler', () => { url: 'some/where', headers: {} }, {}, function (error) { - expect(error instanceof errors.NotFound).to.equal(true); - expect(error.message).to.equal('Page not found: some/where'); - expect(error.data).to.deep.equal({ + assert.ok(error instanceof errors.NotFound); + assert.equal(error.message, 'Page not found: some/where'); + assert.deepEqual(error.data, { url: 'some/where' }); done(); diff --git a/packages/express/test/rest.test.js b/packages/express/test/rest.test.js index 702b5f37d3..5e1cd9fcb6 100644 --- a/packages/express/test/rest.test.js +++ b/packages/express/test/rest.test.js @@ -249,7 +249,8 @@ describe('@feathersjs/express/rest provider', () => { arguments: ['dishes', paramsWithHeaders ], type: 'error', method: 'get', - path: 'hook-error' + path: 'hook-error', + original: data.hook.original }, error: { message: 'I blew up' } }); @@ -367,6 +368,42 @@ describe('@feathersjs/express/rest provider', () => { .then(() => server.close()); }); + it('allows middleware arrays before and after a service', () => { + const app = expressify(feathers()); + + app.configure(rest()) + .use(expressify.json()) + .use('/todo', [function (req, res, next) { + req.body.before = ['before first']; + next(); + }, function (req, res, next) { + req.body.before.push('before second'); + next(); + }], { + create (data) { + return Promise.resolve(data); + } + }, [function (req, res, next) { + res.data.after = ['after first']; + next(); + }], function (req, res, next) { + res.data.after.push('after second'); + next(); + }); + + const server = app.listen(4776); + + return axios.post('http://localhost:4776/todo', { text: 'Do dishes' }) + .then(res => { + assert.deepStrictEqual(res.data, { + text: 'Do dishes', + before: ['before first', 'before second'], + after: ['after first', 'after second'] + }); + }) + .then(() => server.close()); + }); + it('allows an array of middleware without a service', () => { const app = expressify(feathers()); const middlewareArray = [ diff --git a/packages/feathers/.npmignore b/packages/feathers/.npmignore index b59f7e3a95..3a777790fc 100644 --- a/packages/feathers/.npmignore +++ b/packages/feathers/.npmignore @@ -1 +1 @@ -test/ \ No newline at end of file +test/coverage/ diff --git a/packages/feathers/CHANGELOG.md b/packages/feathers/CHANGELOG.md index df210b94e4..0a3c5dccf9 100644 --- a/packages/feathers/CHANGELOG.md +++ b/packages/feathers/CHANGELOG.md @@ -3,6 +3,215 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + + +### Bug Fixes + +* **typescript:** Use stricter type for HookContext 'method' prop ([#1896](https://github.com/feathersjs/feathers/issues/1896)) ([24a41b7](https://github.com/feathersjs/feathers/commit/24a41b74486ddadccad18f3ae63afdac5bd373c7)) + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + + +### Bug Fixes + +* **typescript:** Make HookMap and HookObject generics. ([#1815](https://github.com/feathersjs/feathers/issues/1815)) ([d10145d](https://github.com/feathersjs/feathers/commit/d10145d91a09aef7bce5af80805a3c0fa9d94f26)) + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + + +### Bug Fixes + +* Add `params.authentication` type, remove `hook.connection` type ([#1732](https://github.com/feathersjs/feathers/issues/1732)) ([d46b7b2](https://github.com/feathersjs/feathers/commit/d46b7b2abac8862c0e4dbfce20d71b8b8a96692f)) + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + + +### Bug Fixes + +* **core:** Improve hook missing parameter message by adding the service name ([#1703](https://github.com/feathersjs/feathers/issues/1703)) ([2331c2a](https://github.com/feathersjs/feathers/commit/2331c2a3dd70d432db7d62a76ed805d359cbbba5)) +* **typescript:** Allow specific service typings for `Hook` and `HookContext` ([#1688](https://github.com/feathersjs/feathers/issues/1688)) ([f5d0ddd](https://github.com/feathersjs/feathers/commit/f5d0ddd9724bf5778355535d2103d59daaad6294)) + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + + +### Bug Fixes + +* Small type improvements ([#1624](https://github.com/feathersjs/feathers/issues/1624)) ([50162c6](https://github.com/feathersjs/feathers/commit/50162c6e562f0a47c6a280c4f01fff7c3afee293)) + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + + +### Bug Fixes + +* improve Service and AdapterService types ([#1567](https://github.com/feathersjs/feathers/issues/1567)) ([baad6a2](https://github.com/feathersjs/feathers/commit/baad6a26f0f543b712ccb40359b3933ad3a21392)) + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + + +### Bug Fixes + +* Reset version number after every publish ([#1596](https://github.com/feathersjs/feathers/issues/1596)) ([f24f82f](https://github.com/feathersjs/feathers/commit/f24f82f)) + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + + +### Bug Fixes + +* Small improvements in dependencies and code sturcture ([#1562](https://github.com/feathersjs/feathers/issues/1562)) ([42c13e2](https://github.com/feathersjs/feathers/commit/42c13e2)) + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + + +### Bug Fixes + +* Improve Params typing ([#1474](https://github.com/feathersjs/feathers/issues/1474)) ([54a3aa7](https://github.com/feathersjs/feathers/commit/54a3aa7)) + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/feathers + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + + +### Bug Fixes + +* Clean up hooks code ([#1407](https://github.com/feathersjs/feathers/issues/1407)) ([f25c88b](https://github.com/feathersjs/feathers/commit/f25c88b)) +* Fix @feathersjs/feathers typings http import ([abbc07b](https://github.com/feathersjs/feathers/commit/abbc07b)) +* Updated typings for ServiceMethods ([#1409](https://github.com/feathersjs/feathers/issues/1409)) ([b5ee7e2](https://github.com/feathersjs/feathers/commit/b5ee7e2)) + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/feathers/LICENSE b/packages/feathers/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/feathers/LICENSE +++ b/packages/feathers/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/feathers/index.d.ts b/packages/feathers/index.d.ts index 676b94521d..4676a291a8 100644 --- a/packages/feathers/index.d.ts +++ b/packages/feathers/index.d.ts @@ -1,7 +1,7 @@ /// import { EventEmitter } from 'events'; -import http from 'http'; +import * as http from 'http'; declare const createApplication: Feathers; export = createApplication; @@ -31,9 +31,17 @@ declare namespace createApplication { type ClientSideParams = Pick; type ServerSideParams = Params; + /** + * Service call parameters + * + * @see {@link https://docs.feathersjs.com/api/services.html#params} + */ interface Params { query?: Query; paginate?: false | Pick; + provider?: string; + route?: {[key: string]: string}; + headers?: {[key: string]: any}; [key: string]: any; // (JL) not sure if we want this } @@ -46,9 +54,9 @@ declare namespace createApplication { } // tslint:disable-next-line void-return - type Hook = (hook: HookContext) => (Promise | HookContext | void); + type Hook> = (hook: HookContext) => (Promise | void> | HookContext | void); - interface HookContext { + interface HookContext> { /** * A read only property that contains the Feathers application object. This can be used to * retrieve other services (via context.app.service('name')) or configuration values. @@ -74,7 +82,7 @@ declare namespace createApplication { * A read only property with the name of the service method (one of find, get, * create, update, patch, remove). */ - readonly method: string; + readonly method: 'find' | 'get' | 'create' | 'update' | 'patch' | 'remove'; /** * A writeable property that contains the service method parameters (including * params.query). @@ -98,7 +106,7 @@ declare namespace createApplication { /** * A read only property and contains the service this hook currently runs on. */ - readonly service: Service; + readonly service: S; /** * A writeable, optional property and contains a 'safe' version of the data that * should be sent to any client. If context.dispatch has not been set context.result @@ -115,62 +123,190 @@ declare namespace createApplication { */ readonly type: 'before' | 'after' | 'error'; /** - * The real-time connection object + * A writeable, optional property that allows service events to be skipped by + * setting it to `null` */ - connection?: any; + event?: null; } - interface HookMap { - all: Hook | Hook[]; - find: Hook | Hook[]; - get: Hook | Hook[]; - create: Hook | Hook[]; - update: Hook | Hook[]; - patch: Hook | Hook[]; - remove: Hook | Hook[]; + interface HookMap { + all: Hook | Hook[]; + find: Hook | Hook[]; + get: Hook | Hook[]; + create: Hook | Hook[]; + update: Hook | Hook[]; + patch: Hook | Hook[]; + remove: Hook | Hook[]; } - interface HooksObject { - before: Partial | Hook | Hook[]; - after: Partial | Hook | Hook[]; - error: Partial | Hook | Hook[]; - finally?: Partial | Hook | Hook[]; + interface HooksObject { + before: Partial> | Hook | Hook[]; + after: Partial> | Hook | Hook[]; + error: Partial> | Hook | Hook[]; + finally?: Partial> | Hook | Hook[]; + } + + interface SetupMethod { + setup (app: Application, path: string): void; } - // todo: figure out what to do: These methods don't actually need to be - // implemented, so they can be undefined at runtime. Yet making them - // optional gets cumbersome in strict mode. interface ServiceMethods { [key: string]: any; - find? (params?: Params): Promise>; - - get? (id: Id, params?: Params): Promise; + /** + * Retrieve all resources from this service. + * + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#find-params|Feathers API Documentation: .find(params)} + */ + find (params?: Params): Promise>; - create? (data: Partial | Array>, params?: Params): Promise; + /** + * Retrieve a single resource matching the given ID. + * + * @param id - ID of the resource to locate + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#get-id-params|Feathers API Documentation: .get(id, params)} + */ + get (id: Id, params?: Params): Promise; - update? (id: NullableId, data: T, params?: Params): Promise; + /** + * Create a new resource for this service. + * + * @param data - Data to insert into this service. + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} + */ + create (data: Partial | Partial[], params?: Params): Promise; - patch? (id: NullableId, data: Partial, params?: Params): Promise; + /** + * Replace any resources matching the given ID with the given data. + * + * @param id - ID of the resource to be updated + * @param data - Data to be put in place of the current resource. + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} + */ + update (id: NullableId, data: T, params?: Params): Promise; - remove? (id: NullableId, params?: Params): Promise; - } + /** + * Merge any resources matching the given ID with the given data. + * + * @param id - ID of the resource to be patched + * @param data - Data to merge with the current resource. + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} + */ + patch (id: NullableId, data: Partial, params?: Params): Promise; - interface SetupMethod { - setup (app: Application, path: string): void; + /** + * Remove resources matching the given ID from the this service. + * + * @param id - ID of the resource to be removed + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} + */ + remove (id: NullableId, params?: Params): Promise; } interface ServiceOverloads { - create? (data: Array>, params?: Params): Promise; + /** + * Retrieve all resources from this service. + * + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#find-params|Feathers API Documentation: .find(params)} + */ + find? (params: Params & { paginate: false}): Promise + /** + * Retrieve all resources from this service. + * + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#find-params|Feathers API Documentation: .find(params)} + */ + find? (params?: Params): Promise> + + /** + * Create a new resource for this service. + * + * @param data - Data to insert into this service. + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} + */ create? (data: Partial, params?: Params): Promise; - patch? (id: NullableId, data: Pick, params?: Params): Promise; + /** + * Create a new resource for this service. + * + * @param data - Data to insert into this service. + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#create-data-params|Feathers API Documentation: .create(data, params)} + */ + create? (data: Partial[], params?: Params): Promise; + + /** + * Replace any resources matching the given ID with the given data. + * + * @param id - ID of the resource to be updated + * @param data - Data to be put in place of the current resource. + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} + */ + update? (id: Id, data: T, params?: Params): Promise; + + /** + * Replace any resources matching the given ID with the given data. + * + * @param id - ID of the resource to be updated + * @param data - Data to be put in place of the current resource. + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#update-id-data-params|Feathers API Documentation: .update(id, data, params)} + */ + update? (id: null, data: T, params?: Params): Promise; + + /** + * Merge any resources matching the given ID with the given data. + * + * @param id - ID of the resource to be patched + * @param data - Data to merge with the current resource. + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} + */ + patch? (id: Id, data: Partial, params?: Params): Promise; + + /** + * Merge any resources matching the given ID with the given data. + * + * @param id - ID of the resource to be patched + * @param data - Data to merge with the current resource. + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#patch-id-data-params|Feathers API Documentation: .patch(id, data, params)} + */ + patch? (id: null, data: Partial, params?: Params): Promise; + + /** + * Remove resources matching the given ID from the this service. + * + * @param id - ID of the resource to be removed + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} + */ + remove? (id: Id, params?: Params): Promise; + + /** + * Remove resources matching the given ID from the this service. + * + * @param id - ID of the resource to be removed + * @param params - Service call parameters {@link Params} + * @see {@link https://docs.feathersjs.com/api/services.html#remove-id-params|Feathers API Documentation: .remove(id, params)} + */ + remove? (id: null, params?: Params): Promise; } interface ServiceAddons extends EventEmitter { id?: any; _serviceEvents: string[]; + methods: {[method: string]: string[]}; hooks (hooks: Partial): this; } diff --git a/packages/feathers/lib/application.js b/packages/feathers/lib/application.js index ec81c78ca6..92e89cf166 100644 --- a/packages/feathers/lib/application.js +++ b/packages/feathers/lib/application.js @@ -70,7 +70,7 @@ const application = { const current = this.services[location]; if (typeof current === 'undefined' && typeof this.defaultService === 'function') { - return this.use(`/${location}`, this.defaultService(location)) + return this.use(location, this.defaultService(location)) .service(location); } @@ -84,9 +84,7 @@ const application = { const location = stripSlashes(path) || '/'; const isSubApp = typeof service.service === 'function' && service.services; - const isService = this.methods.concat('setup').some(name => - (service && typeof service[name] === 'function') - ); + const isService = this.methods.concat('setup').some(name => typeof service[name] === 'function'); if (isSubApp) { const subApp = service; diff --git a/packages/feathers/lib/hooks/base.js b/packages/feathers/lib/hooks/base.js index f8f07c044d..bde4fea210 100644 --- a/packages/feathers/lib/hooks/base.js +++ b/packages/feathers/lib/hooks/base.js @@ -3,30 +3,28 @@ const { _ } = require('@feathersjs/commons'); const assignArguments = context => { const { service, method } = context; const parameters = service.methods[method]; - const argsObject = context.arguments.reduce((result, value, index) => { - result[parameters[index]] = value; - return result; - }, {}); - if (!argsObject.params) { - argsObject.params = {}; - } + context.arguments.forEach((value, index) => { + context[parameters[index]] = value; + }); - Object.assign(context, argsObject); + if (!context.params) { + context.params = {}; + } return context; }; const validate = context => { - const { service, method } = context; + const { service, method, path } = context; const parameters = service.methods[method]; if (parameters.includes('id') && context.id === undefined) { - throw new Error(`An id must be provided to the '${method}' method`); + throw new Error(`An id must be provided to the '${path}.${method}' method`); } if (parameters.includes('data') && !_.isObjectOrArray(context.data)) { - throw new Error(`A data object must be provided to the '${method}' method`); + throw new Error(`A data object must be provided to the '${path}.${method}' method`); } return context; diff --git a/packages/feathers/lib/hooks/index.js b/packages/feathers/lib/hooks/index.js index 0817ada438..e1db2eb6f6 100644 --- a/packages/feathers/lib/hooks/index.js +++ b/packages/feathers/lib/hooks/index.js @@ -1,4 +1,4 @@ -const { hooks, isPromise, _ } = require('@feathersjs/commons'); +const { hooks, isPromise } = require('@feathersjs/commons'); const baseHooks = require('./base'); const { @@ -9,11 +9,6 @@ const { ACTIVATE_HOOKS } = hooks; -const makeArguments = (service, method, hookObject) => service.methods[ method ].reduce((result, value) => ([ - ...result, - hookObject[ value ] -]), []); - const withHooks = function withHooks ({ app, service, @@ -33,8 +28,6 @@ const withHooks = function withHooks ({ const returnHook = args[args.length - 1] === true ? args.pop() : false; - // A reference to the original method - const _super = original || service[method].bind(service); // Create the hook object that gets passed through const hookObject = createHookObject(method, { type: 'before', // initial hook object type @@ -43,9 +36,14 @@ const withHooks = function withHooks ({ app }); - // Process all before hooks - return processHooks.call(service, baseHooks.concat(hooks.before), hookObject) - // Use the hook object to call the original method + return Promise.resolve(hookObject) + + // Run `before` hooks + .then(hookObject => { + return processHooks.call(service, baseHooks.concat(hooks.before), hookObject); + }) + + // Run the original method .then(hookObject => { // If `hookObject.result` is set, skip the original method if (typeof hookObject.result !== 'undefined') { @@ -53,60 +51,78 @@ const withHooks = function withHooks ({ } // Otherwise, call it with arguments created from the hook object - const promise = _super(...makeArguments(service, method, hookObject)); - - if (!isPromise(promise)) { - throw new Error(`Service method '${hookObject.method}' for '${hookObject.path}' service must return a promise`); - } + const promise = new Promise(resolve => { + const func = original || service[method]; + const args = service.methods[method].map((value) => hookObject[value]); + const result = func.apply(service, args); - return promise.then(result => { - hookObject.result = result; + if (!isPromise(result)) { + throw new Error(`Service method '${hookObject.method}' for '${hookObject.path}' service must return a promise`); + } - return hookObject; + resolve(result); }); + + return promise + .then(result => { + hookObject.result = result; + return hookObject; + }) + .catch(error => { + error.hook = hookObject; + throw error; + }); }) - // Make a (shallow) copy of hookObject from `before` hooks and update type - .then(hookObject => Object.assign({}, hookObject, { type: 'after' })) - // Run through all `after` hooks + + // Run `after` hooks .then(hookObject => { - // Combine all app and service `after` and `finally` hooks and process - const hookChain = hooks.after.concat(hooks.finally); + const afterHookObject = Object.assign({}, hookObject, { + type: 'after' + }); - return processHooks.call(service, hookChain, hookObject); + return processHooks.call(service, hooks.after, afterHookObject); }) - .then(hookObject => - // Finally, return the result - // Or the hook object if the `returnHook` flag is set - returnHook ? hookObject : hookObject.result - ) - // Handle errors - .catch(error => { - // Combine all app and service `error` and `finally` hooks and process - const hookChain = hooks.error.concat(hooks.finally); - // A shallow copy of the hook object - const errorHookObject = _.omit(Object.assign({}, error.hook, hookObject, { + // Run `errors` hooks + .catch(error => { + const errorHookObject = Object.assign({}, error.hook, { type: 'error', original: error.hook, - error - }), 'result'); + error, + result: undefined + }); - return processHooks.call(service, hookChain, errorHookObject) + return processHooks.call(service, hooks.error, errorHookObject) .catch(error => { - errorHookObject.error = error; + const errorHookObject = Object.assign({}, error.hook, { + error, + result: undefined + }); + + return errorHookObject; + }); + }) + + // Run `finally` hooks + .then(hookObject => { + return processHooks.call(service, hooks.finally, hookObject) + .catch(error => { + const errorHookObject = Object.assign({}, error.hook, { + error, + result: undefined + }); return errorHookObject; - }) - .then(hook => { - if (returnHook) { - // Either resolve or reject with the hook object - return typeof hook.result !== 'undefined' ? hook : Promise.reject(hook); - } - - // Otherwise return either the result if set (to swallow errors) - // Or reject with the hook error - return typeof hook.result !== 'undefined' ? hook.result : Promise.reject(hook.error); }); + }) + + // Resolve with a result or reject with an error + .then(hookObject => { + if (typeof hookObject.error !== 'undefined' && typeof hookObject.result === 'undefined') { + return Promise.reject(returnHook ? hookObject : hookObject.error); + } else { + return returnHook ? hookObject : hookObject.result; + } }); }; }; diff --git a/packages/feathers/lib/version.js b/packages/feathers/lib/version.js index cb936e4c2a..41bd0ae026 100644 --- a/packages/feathers/lib/version.js +++ b/packages/feathers/lib/version.js @@ -1 +1 @@ -module.exports = '4.0.0-pre.3'; +module.exports = 'development'; diff --git a/packages/feathers/package.json b/packages/feathers/package.json index 542faec932..e2f808d3bd 100644 --- a/packages/feathers/package.json +++ b/packages/feathers/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/feathers", - "description": "A REST and realtime API layer for modern applications.", - "version": "4.0.0-pre.3", + "description": "A framework for real-time applications and REST API with JavaScript and TypeScript", + "version": "4.5.3", "homepage": "http://feathersjs.com", "repository": { "type": "git", @@ -21,6 +21,10 @@ "url": "https://feathersjs.com" }, "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "bugs": { "url": "https://github.com/feathersjs/feathers/issues" }, @@ -28,24 +32,26 @@ "lib": "lib" }, "scripts": { - "test": "mocha --opts ../../mocha.opts", - "update-version": "node -e \"console.log('module.exports = \\'' + require('./package.json').version + '\\';')\" > lib/version.js", - "version": "npm run update-version" + "test": "mocha --config ../../.mocharc.json", + "write-version": "node -e \"console.log('module.exports = \\'' + require('./package.json').version + '\\';')\" > lib/version.js", + "reset-version": "node -e \"console.log('module.exports = \\'development\\';')\" > lib/version.js", + "version": "npm run write-version", + "publish": "npm run reset-version" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "publishConfig": { "access": "public" }, "dependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", + "@feathersjs/commons": "^4.5.3", "debug": "^4.1.1", - "events": "^3.0.0", - "uberproto": "^2.0.4" + "events": "^3.1.0", + "uberproto": "^2.0.6" }, "devDependencies": { - "mocha": "^6.1.4" + "mocha": "^8.0.1" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/feathers/readme.md b/packages/feathers/readme.md index bad89d7c0e..a56fd5e6cc 100644 --- a/packages/feathers/readme.md +++ b/packages/feathers/readme.md @@ -1,11 +1,9 @@ Feathers logo -## A REST and realtime API layer for modern applications. +## A framework for real-time applications and REST APIs with JavaScript and TypeScript [![Greenkeeper badge](https://badges.greenkeeper.io/feathersjs/feathers.svg)](https://greenkeeper.io/) - -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) -[![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/feathers)](https://david-dm.org/feathersjs/feathers?path=packages/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Maintainability](https://api.codeclimate.com/v1/badges/cb5ec42a2d0cc1a47a02/maintainability)](https://codeclimate.com/github/feathersjs/feathers/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/cb5ec42a2d0cc1a47a02/test_coverage)](https://codeclimate.com/github/feathersjs/feathers/test_coverage) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/feathers.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/feathers) @@ -13,7 +11,23 @@ [![Slack Status](http://slack.feathersjs.com/badge.svg)](http://slack.feathersjs.com) [![Telegram Status](https://img.shields.io/badge/Telegram_RU_chat:-Feathers-216bc1.svg?style=flat)](https://t.me/featherjs) -Feathers is a real-time, micro-service web framework for NodeJS that gives you control over your data via RESTful resources, sockets and flexible plug-ins. +Feathers is a lightweight web-framework for creating real-time applications and REST APIs using JavaScript or TypeScript. + +Feathers can interact with any backend technology, supports over a dozen databases and works with any frontend technology like React, VueJS, Angular, React Native, Android or iOS. + +## Getting started + +You can build your first real-time and REST API in just 4 commands: + +```bash +$ npm install -g @feathersjs/cli +$ mkdir my-new-app +$ cd my-new-app/ +$ feathers generate app +$ npm start +``` + +To learn more about Feathers visit the website at [feathersjs.com](http://feathersjs.com) or jump right into [the Feathers guides](http://docs.feathersjs.com/guides). ## Support @@ -87,80 +101,10 @@ Support us with a monthly donation and help us continue our activities. [[Become -## Getting started - -You can build your first real-time and REST API in just 4 commands: - -```bash -$ npm install -g @feathersjs/cli -$ mkdir my-new-app -$ cd my-new-app/ -$ feathers generate app -$ npm start -``` - -To learn more about Feathers visit the website at [feathersjs.com](http://feathersjs.com) or jump right into [the Feathers docs](http://docs.feathersjs.com). - -## See it in action - -Here is all the code you need to create a RESTful, real-time message API that uses an in-memory data store: - -```js -const feathers = require('@feathersjs/feathers'); -const express = require('@feathersjs/express'); -const socketio = require('@feathersjs/socketio'); - -const memory = require('feathers-memory'); - -// Creates an Express compatible Feathers application -const app = express(feathers()); - -// Parse HTTP JSON bodies -app.use(express.json()); -// Parse URL-encoded params -app.use(express.urlencoded({ extended: true })); -// Add REST API support -app.configure(express.rest()); -// Configure Socket.io real-time APIs -app.configure(socketio()); -// Register a messages service with pagination -app.use('/messages', memory({ - paginate: { - default: 10, - max: 25 - } -})); -// Register a nicer error handler than the default Express one -app.use(express.errorHandler()); - -// Add any new real-time connection to the `everybody` channel -app.on('connection', connection => app.channel('everybody').join(connection)); -// Publish all events to the `everybody` channel -app.publish(data => app.channel('everybody')); - -// Start the server -app.listen(3030).on('listening', () => - console.log('Feathers server listening on localhost:3030') -); -``` - -Then run - -``` -npm install @feathersjs/feathers @feathersjs/socketio @feathersjs/express feathers-memory -node app -``` - -and go to [http://localhost:3030/messages](http://localhost:3030/messages). That's it! There's a lot more you can do with Feathers including; using a real database, authentication, authorization, clustering and more! Head on over to [the Feathers docs](http://docs.feathersjs.com) to see just how easy it is to build scalable real-time apps. - ## Documentation The [Feathers docs](http://docs.feathersjs.com) are loaded with awesome stuff and tell you every thing you need to know about using and configuring Feathers. -## Security - -We :heart: the community and take security very seriously. No one wants their app hacked. If you have come across a security concern please [report it responsibly](https://docs.feathersjs.com/security#where-should-i-report-security-issues). Visit the [Security section](https://docs.feathersjs.com/SECURITY.html) of the docs to learn more about how you can make sure your app is secure. - ## License Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) diff --git a/packages/feathers/test/hooks/error.test.js b/packages/feathers/test/hooks/error.test.js index a4e71a2644..a9539fcf8b 100644 --- a/packages/feathers/test/hooks/error.test.js +++ b/packages/feathers/test/hooks/error.test.js @@ -11,7 +11,7 @@ describe('`error` hooks', () => { }); const service = app.service('dummy'); - afterEach(() => service.__hooks.error.get.pop()); + afterEach(() => service.__hooks.error.get = []); it('basic error hook', () => { service.hooks({ @@ -154,6 +154,30 @@ describe('`error` hooks', () => { return app.service('dummy').get(1) .then(result => assert.strictEqual(result, null)); }); + + it('uses the current hook object if thrown in a service method', () => { + const app = feathers().use('/dummy', { + get () { + return Promise.reject(new Error('Something went wrong')); + } + }); + + const service = app.service('dummy'); + + service.hooks({ + before (hook) { + return { ...hook, id: 42 }; + }, + error (hook) { + assert.strictEqual(hook.id, 42); + } + }); + + return service.get(1).then( + () => assert.fail('Should never get here'), + error => assert.strictEqual(error.message, 'Something went wrong') + ); + }); }); describe('error in hooks', () => { diff --git a/packages/feathers/test/hooks/finally.test.js b/packages/feathers/test/hooks/finally.test.js index 72290de223..50dbd54180 100644 --- a/packages/feathers/test/hooks/finally.test.js +++ b/packages/feathers/test/hooks/finally.test.js @@ -73,4 +73,36 @@ describe('`finally` hooks', () => { } ); }); + + it('runs once, sets error if throws', () => { + const app = feathers().use('/dummy', { + get (id) { + return Promise.resolve({ id }); + } + }); + + const service = app.service('dummy'); + + let count = 0; + + service.hooks({ + error (hook) { + assert.fail('Should never get here (error hook)'); + }, + finally: [ + function (hook) { + assert.strictEqual(++count, 1, 'This should be called only once'); + throw new Error('This did not work'); + }, + function (hook) { + assert.fail('Should never get here (second finally hook)'); + } + ] + }); + + return service.get(42).then( + () => assert.fail('Should never get here (result resolve)'), + error => assert.strictEqual(error.message, 'This did not work') + ); + }); }); diff --git a/packages/feathers/test/hooks/hooks.test.js b/packages/feathers/test/hooks/hooks.test.js index 020fbf25b4..efe184c633 100644 --- a/packages/feathers/test/hooks/hooks.test.js +++ b/packages/feathers/test/hooks/hooks.test.js @@ -18,11 +18,11 @@ describe('hooks basics', () => { return app.service('dummy').get(); }).catch(e => { - assert.strictEqual(e.message, `An id must be provided to the 'get' method`); + assert.strictEqual(e.message, `An id must be provided to the 'dummy.get' method`); }).then(() => app.service('dummy').create() ).catch(e => { - assert.strictEqual(e.message, `A data object must be provided to the 'create' method`); + assert.strictEqual(e.message, `A data object must be provided to the 'dummy.create' method`); }); }); @@ -201,7 +201,7 @@ describe('hooks basics', () => { assert.strictEqual(context.service, app.service('dummy')); assert.strictEqual(context.type, 'error'); assert.strictEqual(context.path, 'dummy'); - assert.strictEqual(context.error.message, 'An id must be provided to the \'get\' method'); + assert.strictEqual(context.error.message, 'An id must be provided to the \'dummy.get\' method'); }); }); diff --git a/packages/primus-client/.npmignore b/packages/primus-client/.npmignore index 65e3ba2eda..33b30624f5 100644 --- a/packages/primus-client/.npmignore +++ b/packages/primus-client/.npmignore @@ -1 +1,2 @@ test/ +coverage/ diff --git a/packages/primus-client/CHANGELOG.md b/packages/primus-client/CHANGELOG.md index fb05766ea0..646ddfe3ff 100644 --- a/packages/primus-client/CHANGELOG.md +++ b/packages/primus-client/CHANGELOG.md @@ -3,6 +3,201 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + + +### Bug Fixes + +* Change this reference in client libraries to explicitly passed app ([#1597](https://github.com/feathersjs/feathers/issues/1597)) ([4e4d10a](https://github.com/feathersjs/feathers/commit/4e4d10a)) + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/primus-client + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/primus-client/LICENSE b/packages/primus-client/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/primus-client/LICENSE +++ b/packages/primus-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/primus-client/README.md b/packages/primus-client/README.md index c2f40a2b29..9c8ad9129e 100644 --- a/packages/primus-client/README.md +++ b/packages/primus-client/README.md @@ -1,6 +1,6 @@ # @feathersjs/primus-client -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/primus-client)](https://david-dm.org/feathersjs/feathers?path=packages/primus-client) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/primus-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/primus-client) @@ -12,33 +12,12 @@ npm install @feathersjs/primus-client --save ``` -Quick usage: - -```js -const feathers = require('@feathersjs/feathers'); -const primus = require('@feathersjs/primus-client'); -const socket = new Primus('http://api.my-feathers-server.com'); - -const app = feathers(); - -app.configure(primus(socket)); - -// Receive real-time events through Primus -app.service('messages') - .on('created', message => console.log('New message created', message)); - -// Call the `messages` service -app.service('messages').create({ - text: 'A message from a REST client' -}); -``` - ## Documentation -Please refer to the [@feathersjs/primus-client documentation](https://docs.feathersjs.com/api/client/primus.html) for more details. +Refer to the [Feathers Primus client API documentation](https://docs.feathersjs.com/api/client/primus.html) for more details. ## License -Copyright (c) 2018 +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/primus-client/lib/index.js b/packages/primus-client/lib/index.js index 9e0c1d9f6d..afd97f05b7 100644 --- a/packages/primus-client/lib/index.js +++ b/packages/primus-client/lib/index.js @@ -13,13 +13,13 @@ function primusClient (connection, options) { })); }; - const initialize = function () { - if (typeof this.defaultService === 'function') { + const initialize = function (app) { + if (typeof app.defaultService === 'function') { throw new Error('Only one default client provider can be configured'); } - this.primus = connection; - this.defaultService = defaultService; + app.primus = connection; + app.defaultService = defaultService; }; initialize.Service = Service; diff --git a/packages/primus-client/package.json b/packages/primus-client/package.json index 4658b62152..376510e5f1 100644 --- a/packages/primus-client/package.json +++ b/packages/primus-client/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/primus-client", "description": "Client services for Primus and feathers-primus", - "version": "4.0.0-pre.3", + "version": "4.5.4", "homepage": "https://feathersjs.com", "main": "lib/index.js", "types": "index.d.ts", @@ -10,6 +10,10 @@ "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -24,10 +28,10 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 12" }, "scripts": { - "test": "mocha --opts ../../mocha.opts" + "test": "mocha --config ../../.mocharc.json" }, "directories": { "lib": "lib" @@ -36,17 +40,16 @@ "access": "public" }, "dependencies": { - "@feathersjs/transport-commons": "^4.2.1" + "@feathersjs/transport-commons": "^4.5.3" }, "devDependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", - "@feathersjs/primus": "^4.0.0-pre.3", - "@feathersjs/tests": "^4.0.0-pre.3", - "chai": "^4.2.0", - "feathers-memory": "^3.0.2", - "mocha": "^6.1.4", - "ws": "^7.0.0" - }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "@feathersjs/commons": "^4.5.3", + "@feathersjs/feathers": "^4.5.3", + "@feathersjs/primus": "^4.5.4", + "@feathersjs/tests": "^4.5.3", + "feathers-memory": "^4.1.0", + "mocha": "^8.0.1", + "ws": "^7.3.1" + }, + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/primus-client/test/index.test.js b/packages/primus-client/test/index.test.js index 45353536c2..25e480ddf4 100644 --- a/packages/primus-client/test/index.test.js +++ b/packages/primus-client/test/index.test.js @@ -1,6 +1,6 @@ const assert = require('assert'); const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const server = require('./server'); const primus = require('../lib'); diff --git a/packages/primus/.npmignore b/packages/primus/.npmignore index 65e3ba2eda..33b30624f5 100644 --- a/packages/primus/.npmignore +++ b/packages/primus/.npmignore @@ -1 +1,2 @@ test/ +coverage/ diff --git a/packages/primus/CHANGELOG.md b/packages/primus/CHANGELOG.md index 3dce91c165..c2f1613483 100644 --- a/packages/primus/CHANGELOG.md +++ b/packages/primus/CHANGELOG.md @@ -3,6 +3,204 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + + +### Bug Fixes + +* Typing improvements ([#1580](https://github.com/feathersjs/feathers/issues/1580)) ([7818aec](https://github.com/feathersjs/feathers/commit/7818aec)) + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/primus + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/primus + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/primus/LICENSE b/packages/primus/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/primus/LICENSE +++ b/packages/primus/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/primus/README.md b/packages/primus/README.md index 8c09925800..a0a189f74e 100644 --- a/packages/primus/README.md +++ b/packages/primus/README.md @@ -1,6 +1,6 @@ # @feathersjs/primus -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/primus)](https://david-dm.org/feathersjs/feathers?path=packages/primus) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/primus.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/primus) @@ -12,26 +12,12 @@ npm install @feathersjs/primus --save ``` -## Quick example - -```js -const feathers = require('@feathersjs/feathers'); -const primus = require('@feathersjs/primus'); - -const app = feathers(); - -// Set up Primus with SockJS -app.configure(primus({ transformer: 'ws' })); - -app.listen(3030); -``` - ## Documentation -Please refer to the [@feathersjs/primus documentation](https://docs.feathersjs.com/api/primus.html) for more details. +Refer to the [Feathers Primus API documentation](https://docs.feathersjs.com/api/primus.html) for more details. ## License -Copyright (c) 2018 +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/primus/index.d.ts b/packages/primus/index.d.ts index b6a0f92e54..7226d5c3ea 100644 --- a/packages/primus/index.d.ts +++ b/packages/primus/index.d.ts @@ -6,7 +6,6 @@ declare const configurePrimus: FeathersPrimus; export = configurePrimus; interface FeathersPrimus { - (options: any, callback?: (primus: any) => void): () => void; - readonly SOCKET_KEY: unique symbol; + (options?: any, callback?: (primus: any) => void): (app: any) => void; default: FeathersPrimus; } diff --git a/packages/primus/lib/index.js b/packages/primus/lib/index.js index f503ccc2e4..3ebc343185 100644 --- a/packages/primus/lib/index.js +++ b/packages/primus/lib/index.js @@ -6,12 +6,13 @@ const http = require('http'); const Emitter = require('primus-emitter'); const debug = makeDebug('@feathersjs/primus'); -const socketKey = Symbol('@feathersjs/primus/socket'); function configurePrimus (config, configurer) { - return function () { - const app = this; + return function (app) { + // Returns the connection object const getParams = spark => spark.request.feathers; + // Mapping from connection back to its socket + const socketMap = new WeakMap(); if (!app.version || app.version < '3.0.0') { throw new Error('@feathersjs/primus is not compatible with this version of Feathers. Use the latest at @feathersjs/feathers.'); @@ -58,12 +59,7 @@ function configurePrimus (config, configurer) { next(); }, 0); - primus.on('connection', spark => - Object.defineProperty(getParams(spark), socketKey, { - value: spark - }) - ); - + primus.on('connection', spark => socketMap.set(getParams(spark), spark)); primus.on('disconnection', spark => app.emit('disconnect', getParams(spark))); } @@ -81,7 +77,7 @@ function configurePrimus (config, configurer) { app.configure(commons({ done, - socketKey, + socketMap, getParams, emit: 'send' })); @@ -89,5 +85,4 @@ function configurePrimus (config, configurer) { } module.exports = configurePrimus; -module.exports.SOCKET_KEY = socketKey; module.exports.default = configurePrimus; diff --git a/packages/primus/package.json b/packages/primus/package.json index 9f48838bd6..5f3e01064e 100644 --- a/packages/primus/package.json +++ b/packages/primus/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/primus", "description": "The Feathers Primus real-time API provider", - "version": "4.0.0-pre.3", + "version": "4.5.4", "homepage": "https://feathersjs.com", "main": "lib/", "types": "index.d.ts", @@ -10,6 +10,10 @@ "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -24,10 +28,10 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { - "test": "mocha --opts ../../mocha.opts" + "test": "mocha --config ../../.mocharc.json" }, "directories": { "lib": "lib" @@ -36,22 +40,21 @@ "access": "public" }, "dependencies": { - "@feathersjs/transport-commons": "^4.2.1", + "@feathersjs/transport-commons": "^4.5.3", "debug": "^4.1.1", - "primus": "^7.3.3", + "primus": "^7.3.5", "primus-emitter": "^3.1.1", - "uberproto": "^2.0.4" + "uberproto": "^2.0.6" }, "devDependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", - "@feathersjs/express": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", - "@feathersjs/tests": "^4.0.0-pre.3", - "feathers": "^2.2.4", - "feathers-memory": "^3.0.2", - "lodash": "^4.17.11", - "mocha": "^6.1.4", - "ws": "^7.0.0" - }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "@feathersjs/commons": "^4.5.3", + "@feathersjs/express": "^4.5.4", + "@feathersjs/feathers": "^4.5.3", + "@feathersjs/tests": "^4.5.3", + "feathers-memory": "^4.1.0", + "lodash": "^4.17.19", + "mocha": "^8.0.1", + "ws": "^7.3.1" + }, + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/primus/test/index.test.js b/packages/primus/test/index.test.js index cca043becc..e1b0b3b233 100644 --- a/packages/primus/test/index.test.js +++ b/packages/primus/test/index.test.js @@ -2,7 +2,8 @@ const feathers = require('@feathersjs/feathers'); const express = require('@feathersjs/express'); const assert = require('assert'); const request = require('request'); -const _ = require('lodash'); +const omit = require('lodash/omit'); +const extend = require('lodash/extend'); const { Service } = require('@feathersjs/tests/lib/fixture'); const primus = require('../lib'); @@ -63,8 +64,7 @@ describe('@feathersjs/primus', () => { options.server.close(done); }); - it('exports default and SOCKET_KEY', () => { - assert.ok(primus.SOCKET_KEY); + it('exports default', () => { assert.strictEqual(primus, primus.default); }); @@ -72,17 +72,6 @@ describe('@feathersjs/primus', () => { assert.strictEqual(typeof require('../lib'), 'function'); }); - it('throws an error when using an incompatible version of Feathers', () => { - const oldFeathers = require('feathers'); - - try { - oldFeathers().configure(primus()); - assert.ok(false, 'Should never get here'); - } catch (e) { - assert.strictEqual(e.message, '@feathersjs/primus is not compatible with this version of Feathers. Use the latest at @feathersjs/feathers.'); - } - }); - it('runs primus before setup (#131)', done => { let counter = 0; const app = feathers() @@ -135,21 +124,21 @@ describe('@feathersjs/primus', () => { }; service.find = function (params) { - assert.deepStrictEqual(_.omit(params, 'query', 'route', 'connection'), options.socketParams, + assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), options.socketParams, 'Handshake parameters passed on proper position'); return old.find.apply(this, arguments); }; service.create = function (data, params) { - assert.deepStrictEqual(_.omit(params, 'query', 'route', 'connection'), options.socketParams, + assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), options.socketParams, 'Passed handshake parameters'); return old.create.apply(this, arguments); }; service.update = function (id, data, params) { - assert.deepStrictEqual(params, _.extend({ + assert.deepStrictEqual(params, extend({ connection: options.socketParams, route: {}, query: { @@ -165,7 +154,7 @@ describe('@feathersjs/primus', () => { options.socket.send('update', 'todo', 1, {}, { test: 'param' }, () => { assert.ok(!error); - _.extend(service, old); + extend(service, old); done(); }); }); @@ -178,14 +167,14 @@ describe('@feathersjs/primus', () => { }; service.find = function (params) { - assert.deepStrictEqual(_.omit(params, 'query', 'route', 'connection'), options.socketParams, + assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), options.socketParams, 'Handshake parameters passed on proper position'); return old.find.apply(this, arguments); }; options.socket.send('find', 'todo', function () { - _.extend(service, old); + extend(service, old); done(); }); }); diff --git a/packages/rest-client/.npmignore b/packages/rest-client/.npmignore index 65e3ba2eda..33b30624f5 100644 --- a/packages/rest-client/.npmignore +++ b/packages/rest-client/.npmignore @@ -1 +1,2 @@ test/ +coverage/ diff --git a/packages/rest-client/CHANGELOG.md b/packages/rest-client/CHANGELOG.md index 7eec6617b3..444f2626a3 100644 --- a/packages/rest-client/CHANGELOG.md +++ b/packages/rest-client/CHANGELOG.md @@ -3,6 +3,211 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + + +### Features + +* **rest-client:** Allow for customising rest clients ([#1780](https://github.com/feathersjs/feathers/issues/1780)) ([c5cfec7](https://github.com/feathersjs/feathers/commit/c5cfec7a4aafcaffaab0cdacb9b5d297ff20320f)) + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + + +### Bug Fixes + +* **core:** Improve hook missing parameter message by adding the service name ([#1703](https://github.com/feathersjs/feathers/issues/1703)) ([2331c2a](https://github.com/feathersjs/feathers/commit/2331c2a3dd70d432db7d62a76ed805d359cbbba5)) +* **rest-client:** Allow to customize getting the query ([#1594](https://github.com/feathersjs/feathers/issues/1594)) ([5f21272](https://github.com/feathersjs/feathers/commit/5f212729849414c4da6f0d51edd1986feca992ee)) + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + + +### Bug Fixes + +* Change this reference in client libraries to explicitly passed app ([#1597](https://github.com/feathersjs/feathers/issues/1597)) ([4e4d10a](https://github.com/feathersjs/feathers/commit/4e4d10a)) + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/rest-client + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/rest-client/LICENSE b/packages/rest-client/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/rest-client/LICENSE +++ b/packages/rest-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/rest-client/README.md b/packages/rest-client/README.md index 1fd30c34c6..85f2621cf7 100644 --- a/packages/rest-client/README.md +++ b/packages/rest-client/README.md @@ -1,46 +1,23 @@ # @feathersjs/rest-client -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/rest-client)](https://david-dm.org/feathersjs/feathers?path=packages/rest-client) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/rest-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/rest-client) > REST client services for different Ajax libraries -`@feathersjs/rest-client` supports [REST server](https://docs.feathersjs.com/api/rest.html#server) connectivity using [jQuery](https://jquery.com/), [request](https://github.com/request/request), [Superagent](http://visionmedia.github.io/superagent/), [Axios](https://github.com/mzabriskie/axios), [Fetch](https://facebook.github.io/react-native/docs/network.html) or [Angular HTTP](https://angularjs.org/) as the AJAX library. - ## Installation ``` npm install @feathersjs/rest-client --save ``` -## Quick example - -```js -const feathers = require('@feathersjs/feathers'); -const rest = require('@feathersjs/rest-client'); - -const app = feathers(); - -// Connect to the same as the browser URL (only in the browser) -const restClient = rest(); - -// Connect to a different URL -const restClient = rest('http://feathers-api.com') - -// Configure an AJAX library (see below) with that client -app.configure(restClient.fetch(window.fetch)); - -// Connect to the `http://feathers-api.com/messages` service -const messages = app.service('messages'); -``` - ## Documentation -Please refer to the [@feathersjs/rest-client documentation](https://docs.feathersjs.com/api/client/rest.html) for more details. +Refer to the [Feathers REST client API documentation](https://docs.feathersjs.com/api/client/rest.html) for more details. ## License -Copyright (c) 2018 +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/rest-client/lib/base.js b/packages/rest-client/lib/base.js index 8e95f12e44..635b50bcd7 100644 --- a/packages/rest-client/lib/base.js +++ b/packages/rest-client/lib/base.js @@ -1,4 +1,4 @@ -const query = require('qs'); +const qs = require('qs'); const { Unavailable } = require('@feathersjs/errors'); const { _ } = require('@feathersjs/commons'); const { stripSlashes } = require('@feathersjs/commons'); @@ -20,21 +20,25 @@ class Base { this.base = `${settings.base}/${this.name}`; } - makeUrl (params, id) { - params = params || {}; + makeUrl (query, id) { + query = query || {}; let url = this.base; if (typeof id !== 'undefined' && id !== null) { url += `/${encodeURIComponent(id)}`; } - if (Object.keys(params).length !== 0) { - const queryString = query.stringify(params); + return url + this.getQuery(query); + } + + getQuery (query) { + if (Object.keys(query).length !== 0) { + const queryString = qs.stringify(query); - url += `?${queryString}`; + return `?${queryString}`; } - return url; + return ''; } find (params = {}) { diff --git a/packages/rest-client/lib/index.js b/packages/rest-client/lib/index.js index dfa31bce8f..bbc1a75458 100644 --- a/packages/rest-client/lib/index.js +++ b/packages/rest-client/lib/index.js @@ -1,19 +1,19 @@ -const jQuery = require('./jquery'); -const Superagent = require('./superagent'); -const Request = require('./request'); -const Fetch = require('./fetch'); -const Axios = require('./axios'); -const Angular = require('./angular'); +const jQueryClient = require('./jquery'); +const SuperagentClient = require('./superagent'); +const RequestClient = require('./request'); +const FetchClient = require('./fetch'); +const AxiosClient = require('./axios'); +const AngularClient = require('./angular'); const Base = require('./base'); const AngularHttpClient = require('./angular-http-client'); const transports = { - jquery: jQuery, - superagent: Superagent, - request: Request, - fetch: Fetch, - axios: Axios, - angular: Angular, + jquery: jQueryClient, + superagent: SuperagentClient, + request: RequestClient, + fetch: FetchClient, + axios: AxiosClient, + angular: AngularClient, angularHttpClient: AngularHttpClient }; @@ -21,24 +21,27 @@ function restClient (base = '') { const result = { Base }; Object.keys(transports).forEach(key => { - const Service = transports[key]; - - result[key] = function (connection, options = {}) { + result[key] = function (connection, options = {}, Service = transports[key]) { if (!connection) { throw new Error(`${key} has to be provided to feathers-rest`); } + if (typeof options === 'function') { + Service = options; + options = {}; + } + const defaultService = function (name) { return new Service({ base, name, connection, options }); }; - const initialize = function () { - if (typeof this.defaultService === 'function') { + const initialize = function (app) { + if (typeof app.defaultService === 'function') { throw new Error('Only one default client provider can be configured'); } - this.rest = connection; - this.defaultService = defaultService; + app.rest = connection; + app.defaultService = defaultService; }; initialize.Service = Service; @@ -51,5 +54,5 @@ function restClient (base = '') { return result; } -module.exports = restClient; +module.exports = Object.assign(restClient, { SuperagentClient, FetchClient, jQueryClient, RequestClient, AxiosClient, AngularClient, AngularHttpClient }); module.exports.default = restClient; diff --git a/packages/rest-client/package.json b/packages/rest-client/package.json index 5cd660025e..d16a1a4a4b 100644 --- a/packages/rest-client/package.json +++ b/packages/rest-client/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/rest-client", "description": "REST client services for different Ajax libraries", - "version": "4.0.0-pre.3", + "version": "4.5.4", "homepage": "https://feathersjs.com", "main": "lib/index.js", "types": "index.d.ts", @@ -10,6 +10,10 @@ "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -24,10 +28,10 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10" }, "scripts": { - "test": "mocha --opts ../../mocha.opts" + "test": "mocha --config ../../.mocharc.json" }, "directories": { "lib": "lib" @@ -36,27 +40,27 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", - "@feathersjs/errors": "^4.0.0-pre.3", - "qs": "^6.7.0" + "@feathersjs/commons": "^4.5.3", + "@feathersjs/errors": "^4.5.3", + "qs": "^6.9.4" }, "devDependencies": { - "@angular/common": "^7.2.15", - "@angular/core": "^7.2.15", - "@angular/http": "^7.2.15", - "@angular/platform-browser": "^7.2.15", - "@feathersjs/express": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", - "@feathersjs/tests": "^4.0.0-pre.3", - "axios": "^0.19.0", + "@angular/common": "^10.0.3", + "@angular/core": "^10.0.3", + "@angular/http": "^7.2.16", + "@angular/platform-browser": "^10.0.3", + "@feathersjs/express": "^4.5.4", + "@feathersjs/feathers": "^4.5.3", + "@feathersjs/tests": "^4.5.3", + "axios": "^0.19.2", "body-parser": "^1.19.0", - "feathers-memory": "^3.0.2", - "mocha": "^6.1.4", + "feathers-memory": "^4.1.0", + "mocha": "^8.0.1", "node-fetch": "^2.6.0", - "request": "^2.88.0", - "rxjs": "^6.5.2", + "request": "^2.88.2", + "rxjs": "^6.6.0", "shx": "^0.3.2", - "superagent": "^5.0.5" + "superagent": "^5.3.1" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/rest-client/test/angular-http-client.test.js b/packages/rest-client/test/angular-http-client.test.js index b7792a20fc..0f81f06f77 100644 --- a/packages/rest-client/test/angular-http-client.test.js +++ b/packages/rest-client/test/angular-http-client.test.js @@ -1,6 +1,6 @@ const assert = require('assert'); const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const errors = require('@feathersjs/errors'); const server = require('./server'); diff --git a/packages/rest-client/test/angular.test.js b/packages/rest-client/test/angular.test.js index a49d512630..776c4f14a4 100644 --- a/packages/rest-client/test/angular.test.js +++ b/packages/rest-client/test/angular.test.js @@ -1,6 +1,6 @@ const assert = require('assert'); const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const errors = require('@feathersjs/errors'); const server = require('./server'); const rest = require('../lib/index'); diff --git a/packages/rest-client/test/axios.test.js b/packages/rest-client/test/axios.test.js index accb3a3ba0..04effc48a9 100644 --- a/packages/rest-client/test/axios.test.js +++ b/packages/rest-client/test/axios.test.js @@ -1,7 +1,7 @@ const assert = require('assert'); const axios = require('axios'); const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const errors = require('@feathersjs/errors'); const server = require('./server'); const rest = require('../lib/index'); diff --git a/packages/rest-client/test/fetch.test.js b/packages/rest-client/test/fetch.test.js index bc6016f01e..9c19041a87 100644 --- a/packages/rest-client/test/fetch.test.js +++ b/packages/rest-client/test/fetch.test.js @@ -2,7 +2,7 @@ const fetch = require('node-fetch'); const assert = require('assert'); const feathers = require('@feathersjs/feathers'); const errors = require('@feathersjs/errors'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const server = require('./server'); const rest = require('../lib/index'); diff --git a/packages/rest-client/test/index.test.js b/packages/rest-client/test/index.test.js index 41c287f7c7..e1f6f00e1c 100644 --- a/packages/rest-client/test/index.test.js +++ b/packages/rest-client/test/index.test.js @@ -1,6 +1,7 @@ const fetch = require('node-fetch'); const feathers = require('@feathersjs/feathers'); const rest = require('../lib/index'); +const { FetchClient } = require('../lib/index'); const assert = require('assert'); const init = require('../lib'); @@ -79,19 +80,65 @@ describe('REST client tests', function () { const service = app.service('todos'); return service.get().catch(error => { - assert.strictEqual(error.message, `An id must be provided to the 'get' method`); + assert.strictEqual(error.message, `An id must be provided to the 'todos.get' method`); return service.remove(); }).catch(error => { - assert.strictEqual(error.message, `An id must be provided to the 'remove' method`); + assert.strictEqual(error.message, `An id must be provided to the 'todos.remove' method`); return service.update(); }).catch(error => { - assert.strictEqual(error.message, `An id must be provided to the 'update' method`); + assert.strictEqual(error.message, `An id must be provided to the 'todos.update' method`); return service.patch(); }).catch(error => { - assert.strictEqual(error.message, `An id must be provided to the 'patch' method`); + assert.strictEqual(error.message, `An id must be provided to the 'todos.patch' method`); + }); + }); + + it('uses a custom client', () => { + const app = feathers(); + class MyFetchClient extends FetchClient { + find () { + return Promise.resolve({ + connection: this.connection, + base: this.base, + message: 'Custom fetch client' + }); + } + } + + app.configure(rest('http://localhost:8889').fetch(fetch, {}, MyFetchClient)); + + return app.service('messages').find().then(data => { + assert.deepStrictEqual(data, { + connection: fetch, + base: 'http://localhost:8889/messages', + message: 'Custom fetch client' + }); + }); + }); + + it('uses a custom client as second arg', () => { + const app = feathers(); + class MyFetchClient extends FetchClient { + find () { + return Promise.resolve({ + connection: this.connection, + base: this.base, + message: 'Custom fetch client' + }); + } + } + + app.configure(rest('http://localhost:8889').fetch(fetch, MyFetchClient)); + + return app.service('messages').find().then(data => { + assert.deepStrictEqual(data, { + connection: fetch, + base: 'http://localhost:8889/messages', + message: 'Custom fetch client' + }); }); }); }); diff --git a/packages/rest-client/test/jquery.test.js b/packages/rest-client/test/jquery.test.js index 1f89a11fa5..79e57a6a6a 100644 --- a/packages/rest-client/test/jquery.test.js +++ b/packages/rest-client/test/jquery.test.js @@ -2,7 +2,7 @@ const assert = require('assert'); const feathers = require('@feathersjs/feathers'); const { JSDOM } = require('jsdom'); const jquery = require('jquery'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const errors = require('@feathersjs/errors'); const server = require('./server'); const rest = require('../lib/index'); diff --git a/packages/rest-client/test/request.test.js b/packages/rest-client/test/request.test.js index 73347cec25..3c93c4c072 100644 --- a/packages/rest-client/test/request.test.js +++ b/packages/rest-client/test/request.test.js @@ -1,7 +1,7 @@ const assert = require('assert'); const request = require('request'); const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const errors = require('@feathersjs/errors'); const server = require('./server'); const rest = require('../lib/index'); diff --git a/packages/rest-client/test/superagent.test.js b/packages/rest-client/test/superagent.test.js index 8765927838..dae27fe82d 100644 --- a/packages/rest-client/test/superagent.test.js +++ b/packages/rest-client/test/superagent.test.js @@ -1,7 +1,7 @@ const assert = require('assert'); const superagent = require('superagent'); const feathers = require('@feathersjs/feathers'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const errors = require('@feathersjs/errors'); const server = require('./server'); const rest = require('../lib/index'); diff --git a/packages/socketio-client/.npmignore b/packages/socketio-client/.npmignore index 65e3ba2eda..33b30624f5 100644 --- a/packages/socketio-client/.npmignore +++ b/packages/socketio-client/.npmignore @@ -1 +1,2 @@ test/ +coverage/ diff --git a/packages/socketio-client/CHANGELOG.md b/packages/socketio-client/CHANGELOG.md index dce3d2ce87..fff3e4c020 100644 --- a/packages/socketio-client/CHANGELOG.md +++ b/packages/socketio-client/CHANGELOG.md @@ -3,6 +3,201 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + + +### Bug Fixes + +* Change this reference in client libraries to explicitly passed app ([#1597](https://github.com/feathersjs/feathers/issues/1597)) ([4e4d10a](https://github.com/feathersjs/feathers/commit/4e4d10a)) + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/socketio-client + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/socketio-client/LICENSE b/packages/socketio-client/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/socketio-client/LICENSE +++ b/packages/socketio-client/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/socketio-client/README.md b/packages/socketio-client/README.md index cd94b5eadb..38bbbc4129 100644 --- a/packages/socketio-client/README.md +++ b/packages/socketio-client/README.md @@ -1,6 +1,6 @@ # @feathersjs/socketio-client -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/socketio-client)](https://david-dm.org/feathersjs/feathers?path=packages/socketio-client) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/socketio-client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/socketio-client) @@ -12,35 +12,12 @@ npm install @feathersjs/socketio-client --save ``` -## Quick example - -```js -const feathers = require('@feathersjs/feathers'); -const socketio = require('@feathersjs/socketio-client'); -const io = require('socket.io-client'); - -const socket = io('http://api.feathersjs.com'); -const app = feathers(); - -// Set up Socket.io client with the socket -app.configure(socketio(socket)); - -// Receive real-time events through Socket.io -app.service('messages') - .on('created', message => console.log('New message created', message)); - -// Call the `messages` service -app.service('messages').create({ - text: 'A message from a REST client' -}); -``` - ## Documentation -Please refer to the [@feathersjs/socketio-client documentation](https://docs.feathersjs.com/api/client/socketio.html) for more details. +Refer to the [Feathers SocketIO API documentation](https://docs.feathersjs.com/api/client/socketio.html) for more details. ## License -Copyright (c) 2018 +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/socketio-client/lib/index.js b/packages/socketio-client/lib/index.js index e244945327..e31ec04f8f 100644 --- a/packages/socketio-client/lib/index.js +++ b/packages/socketio-client/lib/index.js @@ -19,13 +19,13 @@ function socketioClient (connection, options) { return new Service(settings); }; - const initialize = function () { - if (typeof this.defaultService === 'function') { + const initialize = function (app) { + if (typeof app.defaultService === 'function') { throw new Error('Only one default client provider can be configured'); } - this.io = connection; - this.defaultService = defaultService; + app.io = connection; + app.defaultService = defaultService; }; initialize.Service = Service; diff --git a/packages/socketio-client/package.json b/packages/socketio-client/package.json index 980c48706d..b04b6f13c7 100644 --- a/packages/socketio-client/package.json +++ b/packages/socketio-client/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/socketio-client", "description": "The client for Socket.io through feathers-socketio", - "version": "4.0.0-pre.3", + "version": "4.5.4", "homepage": "https://feathersjs.com", "main": "lib/index.js", "types": "index.d.ts", @@ -10,6 +10,10 @@ "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -24,10 +28,10 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10" }, "scripts": { - "test": "mocha --opts ../../mocha.opts" + "test": "mocha --config ../../.mocharc.json" }, "directories": { "lib": "lib" @@ -36,18 +40,17 @@ "access": "public" }, "dependencies": { - "@feathersjs/transport-commons": "^4.2.1", - "@types/socket.io-client": "^1.4.32" + "@feathersjs/transport-commons": "^4.5.3", + "@types/socket.io-client": "^1.4.33" }, "devDependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", - "@feathersjs/socketio": "^4.0.0-pre.3", - "@feathersjs/tests": "^4.0.0-pre.3", - "chai": "^4.2.0", - "feathers-memory": "^3.0.2", - "mocha": "^6.1.4", - "socket.io-client": "^2.2.0" - }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "@feathersjs/commons": "^4.5.3", + "@feathersjs/feathers": "^4.5.3", + "@feathersjs/socketio": "^4.5.4", + "@feathersjs/tests": "^4.5.3", + "feathers-memory": "^4.1.0", + "mocha": "^8.0.1", + "socket.io-client": "^2.3.0" + }, + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/socketio-client/test/index.test.js b/packages/socketio-client/test/index.test.js index 1326b60e0d..c027441b8a 100644 --- a/packages/socketio-client/test/index.test.js +++ b/packages/socketio-client/test/index.test.js @@ -1,7 +1,7 @@ const assert = require('assert'); const feathers = require('@feathersjs/feathers'); const io = require('socket.io-client'); -const baseTests = require('@feathersjs/tests/lib//client'); +const baseTests = require('@feathersjs/tests/lib/client'); const server = require('./server'); const socketio = require('../lib'); diff --git a/packages/socketio/.npmignore b/packages/socketio/.npmignore index 65e3ba2eda..33b30624f5 100644 --- a/packages/socketio/.npmignore +++ b/packages/socketio/.npmignore @@ -1 +1,2 @@ test/ +coverage/ diff --git a/packages/socketio/CHANGELOG.md b/packages/socketio/CHANGELOG.md index 0393504ac7..b455c69663 100644 --- a/packages/socketio/CHANGELOG.md +++ b/packages/socketio/CHANGELOG.md @@ -3,6 +3,208 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.4](https://github.com/feathersjs/feathers/compare/v4.5.3...v4.5.4) (2020-04-29) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + + +### Features + +* **authentication:** Add parseStrategies to allow separate strategies for creating JWTs and parsing headers ([#1708](https://github.com/feathersjs/feathers/issues/1708)) ([5e65629](https://github.com/feathersjs/feathers/commit/5e65629b924724c3e81d7c81df047e123d1c8bd7)) + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.3.5](https://github.com/feathersjs/feathers/compare/v4.3.4...v4.3.5) (2019-10-07) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + + +### Bug Fixes + +* Typing improvements ([#1580](https://github.com/feathersjs/feathers/issues/1580)) ([7818aec](https://github.com/feathersjs/feathers/commit/7818aec)) + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Expire and remove authenticated real-time connections ([#1512](https://github.com/feathersjs/feathers/issues/1512)) ([2707c33](https://github.com/feathersjs/feathers/commit/2707c33)) +* Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/socketio + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/socketio/LICENSE b/packages/socketio/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/socketio/LICENSE +++ b/packages/socketio/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/socketio/README.md b/packages/socketio/README.md index f386381905..8b4aba5f6d 100644 --- a/packages/socketio/README.md +++ b/packages/socketio/README.md @@ -1,6 +1,6 @@ # @feathersjs/socketio -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/socketio)](https://david-dm.org/feathersjs/feathers?path=packages/socketio) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/socketio.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/socketio) @@ -12,25 +12,12 @@ npm install @feathersjs/socketio --save ``` -## Quick example - -```js -const feathers = require('@feathersjs/feathers'); -const socketio = require('@feathersjs/socketio'); - -const app = feathers(); - -app.configure(socketio()); - -app.listen(3030); -``` - ## Documentation -Please refer to the [@feathersjs/socketio documentation](https://docs.feathersjs.com/api/socketio.html) for more details. +Refer to the [Feathers SocketIO API documentation](https://docs.feathersjs.com/api/socketio.html) for more details. ## License -Copyright (c) 2018 +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/socketio/index.d.ts b/packages/socketio/index.d.ts index 4c5b438ba4..3bd63b2d5c 100644 --- a/packages/socketio/index.d.ts +++ b/packages/socketio/index.d.ts @@ -5,9 +5,8 @@ declare const socketio: FeathersSocketIO; export = socketio; interface FeathersSocketIO { - (callback?: (io: io.Server) => void): () => void; - (options: number | io.ServerOptions, callback?: (io: io.Server) => void): () => void; - (port: number, options?: io.ServerOptions, callback?: (io: io.Server) => void): () => void; - readonly SOCKET_KEY: unique symbol; + (callback?: (io: io.Server) => void): (app: any) => void; + (options: number | io.ServerOptions, callback?: (io: io.Server) => void): (app: any) => void; + (port: number, options?: io.ServerOptions, callback?: (io: io.Server) => void): (app: any) => void; default: FeathersSocketIO; } diff --git a/packages/socketio/lib/index.js b/packages/socketio/lib/index.js index a8467849a9..36734660dd 100644 --- a/packages/socketio/lib/index.js +++ b/packages/socketio/lib/index.js @@ -4,7 +4,7 @@ const http = require('http'); const { socket: commons } = require('@feathersjs/transport-commons'); const debug = require('debug')('@feathersjs/socketio'); -const socketKey = Symbol('@feathersjs/socketio/socket'); +const middleware = require('./middleware'); function configureSocketio (port, options, config) { if (typeof port !== 'number') { @@ -18,9 +18,11 @@ function configureSocketio (port, options, config) { options = {}; } - return function () { - const app = this; + return function (app) { + // Function that gets the connection const getParams = socket => socket.feathers; + // A mapping from connection to socket instance + const socketMap = new WeakMap(); if (!app.version || app.version < '3.0.0') { throw new Error('@feathersjs/socketio is not compatible with this version of Feathers. Use the latest at @feathersjs/feathers.'); @@ -46,28 +48,11 @@ function configureSocketio (port, options, config) { setup (server) { if (!this.io) { - const io = this.io = socketio - .listen(port || server, options); + const io = this.io = socketio.listen(port || server, options); - io.use((socket, next) => { - const connection = { - provider: 'socketio', - headers: socket.handshake.headers - }; - - Object.defineProperty(connection, socketKey, { - value: socket - }); - - socket.feathers = connection; - - next(); - }); - - io.use((socket, next) => { - socket.once('disconnect', () => app.emit('disconnect', getParams(socket))); - next(); - }); + io.use(middleware.disconnect(app, getParams)); + io.use(middleware.params(app, socketMap)); + io.use(middleware.authentication(app, getParams)); // In Feathers it is easy to hit the standard Node warning limit // of event listeners (e.g. by registering 10 services). @@ -89,7 +74,7 @@ function configureSocketio (port, options, config) { app.configure(commons({ done, - socketKey, + socketMap, getParams, emit: 'emit' })); @@ -98,4 +83,3 @@ function configureSocketio (port, options, config) { module.exports = configureSocketio; module.exports.default = configureSocketio; -module.exports.SOCKET_KEY = socketKey; diff --git a/packages/socketio/lib/middleware.js b/packages/socketio/lib/middleware.js new file mode 100644 index 0000000000..10f626621f --- /dev/null +++ b/packages/socketio/lib/middleware.js @@ -0,0 +1,46 @@ +const debug = require('debug')('@feathersjs/socketio/middleware'); + +exports.disconnect = (app, getParams) => (socket, next) => { + socket.once('disconnect', () => app.emit('disconnect', getParams(socket))); + next(); +}; + +exports.params = (app, socketMap) => (socket, next) => { + socket.feathers = { + provider: 'socketio', + headers: socket.handshake.headers + }; + + socketMap.set(socket.feathers, socket); + + next(); +}; + +exports.authentication = (app, getParams, settings = {}) => (socket, next) => { + const service = app.defaultAuthentication ? app.defaultAuthentication(settings.service) : null; + + if (service === null) { + return next(); + } + + const config = service.configuration; + const authStrategies = config.parseStrategies || config.authStrategies || []; + + if (authStrategies.length === 0) { + return next(); + } + + service.parse(socket.handshake, null, ...authStrategies) + .then(async authentication => { + if (authentication) { + debug('Parsed authentication from HTTP header', authentication); + socket.feathers.authentication = authentication; + await service.create(authentication, { + provider: 'socketio', + connection: getParams(socket) + }); + } + + next(); + }).catch(next); +}; diff --git a/packages/socketio/package.json b/packages/socketio/package.json index d26f87a50d..47c9f503f0 100644 --- a/packages/socketio/package.json +++ b/packages/socketio/package.json @@ -1,7 +1,7 @@ { "name": "@feathersjs/socketio", "description": "The Feathers Socket.io real-time API provider", - "version": "4.0.0-pre.3", + "version": "4.5.4", "homepage": "https://feathersjs.com", "main": "lib/", "types": "index.d.ts", @@ -10,6 +10,10 @@ "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -24,10 +28,10 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { - "test": "mocha --opts ../../mocha.opts" + "test": "mocha --config ../../.mocharc.json" }, "directories": { "lib": "lib" @@ -36,22 +40,24 @@ "access": "public" }, "dependencies": { - "@feathersjs/transport-commons": "^4.2.1", - "@types/socket.io": "^2.1.2", + "@feathersjs/transport-commons": "^4.5.3", + "@types/socket.io": "^2.1.8", "debug": "^4.1.1", - "socket.io": "^2.2.0", - "uberproto": "^2.0.4" + "socket.io": "^2.3.0", + "uberproto": "^2.0.6" }, "devDependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", - "@feathersjs/express": "^4.0.0-pre.3", - "@feathersjs/feathers": "^4.0.0-pre.3", - "@feathersjs/tests": "^4.0.0-pre.3", - "feathers": "^2.2.4", - "feathers-memory": "^3.0.2", - "lodash": "^4.17.11", - "mocha": "^6.1.4", - "socket.io-client": "^2.2.0" - }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "@feathersjs/commons": "^4.5.3", + "@feathersjs/express": "^4.5.4", + "@feathersjs/feathers": "^4.5.3", + "@feathersjs/tests": "^4.5.3", + "@types/mocha": "^7.0.2", + "@types/mongodb": "^3.5.25", + "@types/node": "^14.0.22", + "feathers-memory": "^4.1.0", + "lodash": "^4.17.19", + "mocha": "^8.0.1", + "socket.io-client": "^2.3.0" + }, + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/socketio/test/index.test.js b/packages/socketio/test/index.test.js index fcef55088f..98a4983735 100644 --- a/packages/socketio/test/index.test.js +++ b/packages/socketio/test/index.test.js @@ -1,7 +1,8 @@ const feathers = require('@feathersjs/feathers'); const express = require('@feathersjs/express'); const assert = require('assert'); -const _ = require('lodash'); +const omit = require('lodash/omit'); +const extend = require('lodash/extend'); const io = require('socket.io-client'); const request = require('request'); const { Service } = require('@feathersjs/tests/lib/fixture'); @@ -10,7 +11,7 @@ const methodTests = require('./methods.js'); const eventTests = require('./events'); const socketio = require('../lib'); -describe.only('@feathersjs/socketio', () => { +describe('@feathersjs/socketio', () => { let app; let server; let socket; @@ -77,22 +78,10 @@ describe.only('@feathersjs/socketio', () => { server.close(done); }); - it('exports default and SOCKET_KEY', () => { - assert.ok(socketio.SOCKET_KEY); + it('exports default', () => { assert.strictEqual(socketio, socketio.default); }); - it('throws an error when using an incompatible version of Feathers', () => { - const oldFeathers = require('feathers'); - - try { - oldFeathers().configure(socketio()); - assert.ok(false, 'Should never get here'); - } catch (e) { - assert.strictEqual(e.message, '@feathersjs/socketio is not compatible with this version of Feathers. Use the latest at @feathersjs/feathers.'); - } - }); - it('runs io before setup (#131)', done => { let counter = 0; let app = feathers().configure(socketio(() => { @@ -161,12 +150,12 @@ describe.only('@feathersjs/socketio', () => { }; service.create = function (data, params) { - assert.deepStrictEqual(_.omit(params, 'query', 'route', 'connection'), socketParams, 'Passed handshake parameters'); + assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), socketParams, 'Passed handshake parameters'); return old.create.apply(this, arguments); }; service.update = function (id, data, params) { - assert.deepStrictEqual(params, _.extend({ + assert.deepStrictEqual(params, extend({ route: {}, connection: socketParams, query: { @@ -183,7 +172,7 @@ describe.only('@feathersjs/socketio', () => { test: 'param' }, error => { assert.ok(!error); - _.extend(service, old); + extend(service, old); done(); }); }); @@ -209,13 +198,13 @@ describe.only('@feathersjs/socketio', () => { let old = { find: service.find }; service.find = function (params) { - assert.deepStrictEqual(_.omit(params, 'query', 'route', 'connection'), socketParams, 'Handshake parameters passed on proper position'); + assert.deepStrictEqual(omit(params, 'query', 'route', 'connection'), socketParams, 'Handshake parameters passed on proper position'); return old.find.apply(this, arguments); }; socket.emit('find', 'todo', error => { assert.ok(!error); - _.extend(service, old); + extend(service, old); done(); }); }); diff --git a/packages/tests/.npmignore b/packages/tests/.npmignore index d7819044b6..ef86d5f1e7 100644 --- a/packages/tests/.npmignore +++ b/packages/tests/.npmignore @@ -1,3 +1,3 @@ test/ -src/ tsconfig.json +coverage/ diff --git a/packages/tests/CHANGELOG.md b/packages/tests/CHANGELOG.md index 687a9356f8..8cfdbafdb2 100644 --- a/packages/tests/CHANGELOG.md +++ b/packages/tests/CHANGELOG.md @@ -3,6 +3,185 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/tests + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + +**Note:** Version bump only for package @feathersjs/tests + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/tests/LICENSE b/packages/tests/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/tests/LICENSE +++ b/packages/tests/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/tests/README.md b/packages/tests/README.md index e5a80e8b8d..05d9b3e1f8 100644 --- a/packages/tests/README.md +++ b/packages/tests/README.md @@ -1,6 +1,6 @@ # @feathersjs/tests -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/express)](https://david-dm.org/feathersjs/feathers?path=packages/koa) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/tests.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/tests) diff --git a/packages/tests/package.json b/packages/tests/package.json index e19c72bb8c..4b4a4d6032 100644 --- a/packages/tests/package.json +++ b/packages/tests/package.json @@ -2,13 +2,17 @@ "name": "@feathersjs/tests", "private": true, "description": "Feathers core module common tests", - "version": "4.0.0-pre.3", + "version": "4.5.3", "homepage": "https://feathersjs.com", "main": "lib/", "keywords": [ "feathers" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -23,13 +27,13 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --opts ../../mocha.ts.opts --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -38,19 +42,19 @@ "access": "public" }, "dependencies": { - "axios": "^0.18.0", - "lodash": "^4.17.11" + "axios": "^0.19.2", + "lodash": "^4.17.19" }, "devDependencies": { - "@feathersjs/feathers": "^4.0.0-pre.3", + "@feathersjs/feathers": "^4.5.3", "@types/axios": "^0.14.0", - "@types/debug": "^4.1.4", - "@types/lodash": "^4.14.132", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.2", - "mocha": "^6.1.4", + "@types/debug": "^4.1.5", + "@types/lodash": "^4.14.157", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.22", + "mocha": "^8.0.1", "shx": "^0.3.2", - "ts-node": "^8.2.0", - "typescript": "^3.4.5" + "ts-node": "^8.10.2", + "typescript": "^3.9.6" } } diff --git a/packages/transport-commons/.npmignore b/packages/transport-commons/.npmignore index d7819044b6..ef86d5f1e7 100644 --- a/packages/transport-commons/.npmignore +++ b/packages/transport-commons/.npmignore @@ -1,3 +1,3 @@ test/ -src/ tsconfig.json +coverage/ diff --git a/packages/transport-commons/CHANGELOG.md b/packages/transport-commons/CHANGELOG.md index aff2110805..6663eff2eb 100644 --- a/packages/transport-commons/CHANGELOG.md +++ b/packages/transport-commons/CHANGELOG.md @@ -3,6 +3,204 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## [4.5.3](https://github.com/feathersjs/feathers/compare/v4.5.2...v4.5.3) (2020-04-17) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.5.2](https://github.com/feathersjs/feathers/compare/v4.5.1...v4.5.2) (2020-03-04) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.5.1](https://github.com/feathersjs/feathers/compare/v4.5.0...v4.5.1) (2020-01-24) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +# [4.5.0](https://github.com/feathersjs/feathers/compare/v4.4.3...v4.5.0) (2020-01-18) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.4.3](https://github.com/feathersjs/feathers/compare/v4.4.1...v4.4.3) (2019-12-06) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.4.1](https://github.com/feathersjs/feathers/compare/v4.4.0...v4.4.1) (2019-11-27) + + +### Bug Fixes + +* Gracefully handle errors in publishers ([#1710](https://github.com/feathersjs/feathers/issues/1710)) ([0616306](https://github.com/feathersjs/feathers/commit/061630696762e9dbf1dc4e738094992ba16989fc)) + + + + + +# [4.4.0](https://github.com/feathersjs/feathers/compare/v4.3.11...v4.4.0) (2019-11-27) + + +### Bug Fixes + +* **transport-commons:** Allow to properly chain SocketIo client.off ([#1706](https://github.com/feathersjs/feathers/issues/1706)) ([a4aecbc](https://github.com/feathersjs/feathers/commit/a4aecbcd3578c1cf4ecffb3a58fb6d26e15ee513)) + + + + + +## [4.3.11](https://github.com/feathersjs/feathers/compare/v4.3.10...v4.3.11) (2019-11-11) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.3.10](https://github.com/feathersjs/feathers/compare/v4.3.9...v4.3.10) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.3.9](https://github.com/feathersjs/feathers/compare/v4.3.8...v4.3.9) (2019-10-26) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.3.7](https://github.com/feathersjs/feathers/compare/v4.3.6...v4.3.7) (2019-10-14) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.3.4](https://github.com/feathersjs/feathers/compare/v4.3.3...v4.3.4) (2019-10-03) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.3.3](https://github.com/feathersjs/feathers/compare/v4.3.2...v4.3.3) (2019-09-21) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.3.2](https://github.com/feathersjs/feathers/compare/v4.3.1...v4.3.2) (2019-09-16) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +## [4.3.1](https://github.com/feathersjs/feathers/compare/v4.3.0...v4.3.1) (2019-09-09) + + +### Bug Fixes + +* Fix regression in transport commons ([#1551](https://github.com/feathersjs/feathers/issues/1551)) ([ed9e934](https://github.com/feathersjs/feathers/commit/ed9e934)) + + + + + +# [4.3.0](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.4...v4.3.0) (2019-08-27) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +# [4.3.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.3...v4.3.0-pre.4) (2019-08-22) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +# [4.3.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.2...v4.3.0-pre.3) (2019-08-19) + + +### Bug Fixes + +* Expire and remove authenticated real-time connections ([#1512](https://github.com/feathersjs/feathers/issues/1512)) ([2707c33](https://github.com/feathersjs/feathers/commit/2707c33)) +* Update all dependencies ([7d53a00](https://github.com/feathersjs/feathers/commit/7d53a00)) +* Use WeakMap to connect socket to connection ([#1509](https://github.com/feathersjs/feathers/issues/1509)) ([64807e3](https://github.com/feathersjs/feathers/commit/64807e3)) + + + + + +# [4.3.0-pre.2](https://github.com/feathersjs/feathers/compare/v4.3.0-pre.1...v4.3.0-pre.2) (2019-08-02) + + +### Bug Fixes + +* Add getEntityId to JWT strategy and fix legacy Socket authentication ([#1488](https://github.com/feathersjs/feathers/issues/1488)) ([9a3b324](https://github.com/feathersjs/feathers/commit/9a3b324)) +* Improve Params typing ([#1474](https://github.com/feathersjs/feathers/issues/1474)) ([54a3aa7](https://github.com/feathersjs/feathers/commit/54a3aa7)) + + + + + +# [4.3.0-pre.1](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.5...v4.3.0-pre.1) (2019-07-11) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +# [4.0.0-pre.5](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.4...v4.0.0-pre.5) (2019-07-10) + +**Note:** Version bump only for package @feathersjs/transport-commons + + + + + +# [4.0.0-pre.4](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.3...v4.0.0-pre.4) (2019-07-05) + + +### Bug Fixes + +* Clean up hooks code ([#1407](https://github.com/feathersjs/feathers/issues/1407)) ([f25c88b](https://github.com/feathersjs/feathers/commit/f25c88b)) +* Improve transport-commons types ([#1396](https://github.com/feathersjs/feathers/issues/1396)) ([f9d8536](https://github.com/feathersjs/feathers/commit/f9d8536)) + + + + + # [4.0.0-pre.3](https://github.com/feathersjs/feathers/compare/v4.0.0-pre.2...v4.0.0-pre.3) (2019-06-01) diff --git a/packages/transport-commons/LICENSE b/packages/transport-commons/LICENSE index 6bfc0adefc..7139cac0dd 100644 --- a/packages/transport-commons/LICENSE +++ b/packages/transport-commons/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2018 Feathers +Copyright (c) 2020 Feathers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/transport-commons/README.md b/packages/transport-commons/README.md index 734f3bdb98..1140df064f 100644 --- a/packages/transport-commons/README.md +++ b/packages/transport-commons/README.md @@ -1,17 +1,13 @@ # @feathersjs/transport-commons -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Dependency Status](https://img.shields.io/david/feathersjs/feathers.svg?style=flat-square&path=packages/transport-commons)](https://david-dm.org/feathersjs/feathers?path=packages/transport-commons) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/transport-commons.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/transport-commons) > Shared functionality for Feathers API transports like `@feathers/socketio` and `@feathersjs/primus`. Only intended to be used internally. -## About - -`@feathersjs/transport-commons` contains internal shared functionality for Feathers real-time providers (currently Socket.io and Primus). - ## License -Copyright (c) 2018 +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors) Licensed under the [MIT license](LICENSE). diff --git a/packages/transport-commons/package.json b/packages/transport-commons/package.json index d56892a9bd..2178852bd3 100644 --- a/packages/transport-commons/package.json +++ b/packages/transport-commons/package.json @@ -1,14 +1,19 @@ { "name": "@feathersjs/transport-commons", "description": "Shared functionality for websocket providers", - "version": "4.0.0-pre.3", + "version": "4.5.3", "homepage": "https://feathersjs.com", "main": "lib/", + "types": "lib/", "keywords": [ "feathers", "feathers-plugin" ], "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/feathers" + }, "repository": { "type": "git", "url": "git://github.com/feathersjs/feathers.git" @@ -23,13 +28,13 @@ "url": "https://github.com/feathersjs/feathers/issues" }, "engines": { - "node": ">= 6" + "node": ">= 10" }, "scripts": { "prepublish": "npm run compile", "compile": "shx rm -rf lib/ && tsc", "test": "npm run compile && npm run mocha", - "mocha": "mocha --opts ../../mocha.ts.opts --recursive test/**.test.ts test/**/*.test.ts" + "mocha": "mocha --config ../../.mocharc.ts.json --recursive test/**.test.ts test/**/*.test.ts" }, "directories": { "lib": "lib" @@ -38,21 +43,21 @@ "access": "public" }, "dependencies": { - "@feathersjs/commons": "^4.0.0-pre.3", - "@feathersjs/errors": "^4.0.0-pre.3", + "@feathersjs/commons": "^4.5.3", + "@feathersjs/errors": "^4.5.3", "debug": "^4.1.1", - "lodash": "^4.17.11", + "lodash": "^4.17.19", "radix-router": "^3.0.1" }, "devDependencies": { - "@feathersjs/feathers": "^4.0.0-pre.3", - "@types/debug": "^4.1.4", - "@types/mocha": "^5.2.6", - "@types/node": "^12.0.2", - "mocha": "^6.1.4", + "@feathersjs/feathers": "^4.5.3", + "@types/debug": "^4.1.5", + "@types/mocha": "^7.0.2", + "@types/node": "^14.0.22", + "mocha": "^8.0.1", "shx": "^0.3.2", - "ts-node": "^8.2.0", - "typescript": "^3.4.5" + "ts-node": "^8.10.2", + "typescript": "^3.9.6" }, - "gitHead": "19eb75737659e3e4b57765c1653d23c86fd2e1c3" + "gitHead": "9b9f0f13387341bdd320f1e66feda828fca2c9f2" } diff --git a/packages/transport-commons/src/channels/channel/base.ts b/packages/transport-commons/src/channels/channel/base.ts index 8b01a5bc48..7693d3c775 100644 --- a/packages/transport-commons/src/channels/channel/base.ts +++ b/packages/transport-commons/src/channels/channel/base.ts @@ -1,4 +1,4 @@ -import EventEmitter from 'events'; +import { EventEmitter } from 'events'; export interface RealTimeConnection { [key: string]: any; diff --git a/packages/transport-commons/src/channels/index.ts b/packages/transport-commons/src/channels/index.ts index c2cf57a4bd..2ef89d880c 100644 --- a/packages/transport-commons/src/channels/index.ts +++ b/packages/transport-commons/src/channels/index.ts @@ -1,6 +1,8 @@ import Debug from 'debug'; -import { compact, flattenDeep, noop } from 'lodash'; -import { Channel } from './channel/base'; +import compact from 'lodash/compact'; +import flattenDeep from 'lodash/flattenDeep'; +import noop from 'lodash/noop'; +import { Channel, RealTimeConnection } from './channel/base'; import { CombinedChannel } from './channel/combined'; import { channelMixin, publishMixin, keys, PublishMixin, Event, Publisher } from './mixins'; import { Application, Service } from '@feathersjs/feathers'; @@ -29,6 +31,10 @@ declare module '@feathersjs/feathers' { registerPublisher (publisher: Publisher): this; registerPublisher (event: Event, publisher: Publisher): this; } + + interface Params { + connection?: RealTimeConnection; + } } export { keys }; @@ -63,6 +69,7 @@ export function channels () { debug('Publishing event', event, hook.path); + const logError = (error: any) => debug(`Error in '${hook.path} ${event}' publisher`, error); const servicePublishers = (service as unknown as PublishMixin)[keys.PUBLISHERS]; const appPublishers = (app as unknown as PublishMixin)[keys.PUBLISHERS]; // This will return the first publisher list that is not empty @@ -80,20 +87,24 @@ export function channels () { noop ); - Promise.resolve(publisher(data, hook)).then(result => { - if (!result) { - return; - } - - const results = Array.isArray(result) ? compact(flattenDeep(result)) : [result]; - const channel = new CombinedChannel(results); - - if (channel && channel.length > 0) { - app.emit('publish', event, channel, hook, data); - } else { - debug('No connections to publish to'); - } - }); + try { + Promise.resolve(publisher(data, hook)).then((result: any) => { + if (!result) { + return; + } + + const results = Array.isArray(result) ? compact(flattenDeep(result)) : [result]; + const channel = new CombinedChannel(results); + + if (channel && channel.length > 0) { + app.emit('publish', event, channel, hook, data); + } else { + debug('No connections to publish to'); + } + }).catch(logError); + } catch (error) { + logError(error); + } }); }); }); diff --git a/packages/transport-commons/src/channels/mixins.ts b/packages/transport-commons/src/channels/mixins.ts index b4101cf38a..a69b115c33 100644 --- a/packages/transport-commons/src/channels/mixins.ts +++ b/packages/transport-commons/src/channels/mixins.ts @@ -11,7 +11,7 @@ const ALL_EVENTS = Symbol('@feathersjs/transport-commons/all-events'); export const keys = { PUBLISHERS: PUBLISHERS as typeof PUBLISHERS, CHANNELS: CHANNELS as typeof CHANNELS, - ALL_EVENTS: ALL_EVENTS as typeof ALL_EVENTS, + ALL_EVENTS: ALL_EVENTS as typeof ALL_EVENTS }; export interface ChannelMixin { diff --git a/packages/transport-commons/src/client.ts b/packages/transport-commons/src/client.ts index adcdb8cdfa..872aa060ab 100644 --- a/packages/transport-commons/src/client.ts +++ b/packages/transport-commons/src/client.ts @@ -130,7 +130,9 @@ export class Service { // of the emitter-component Socket.io is using off (name: string, ...args: any[]) { if (typeof this.connection.off === 'function') { - return this.connection.off(`${this.path} ${name}`, ...args); + const result = this.connection.off(`${this.path} ${name}`, ...args); + + return result === this.connection ? this : result; } else if (args.length === 0) { // @ts-ignore return this.removeAllListeners(name); diff --git a/packages/transport-commons/src/socket/index.ts b/packages/transport-commons/src/socket/index.ts index 09e625ee79..89c1f57105 100644 --- a/packages/transport-commons/src/socket/index.ts +++ b/packages/transport-commons/src/socket/index.ts @@ -1,8 +1,8 @@ +import { Application, Params } from '@feathersjs/feathers'; import Debug from 'debug'; import { channels } from '../channels'; import { routing } from '../routing'; import { getDispatcher, runMethod } from './utils'; -import { Application } from '@feathersjs/feathers'; import { RealTimeConnection } from '../channels/channel/base'; const debug = Debug('@feathersjs/transport-commons'); @@ -10,22 +10,32 @@ const debug = Debug('@feathersjs/transport-commons'); export interface SocketOptions { done: Promise; emit: string; - socketKey: any; + socketMap: WeakMap; + socketKey?: any; getParams: (socket: any) => RealTimeConnection; } -export function socket ({ done, emit, socketKey, getParams }: SocketOptions) { +export function socket ({ done, emit, socketMap, socketKey, getParams }: SocketOptions) { return (app: Application) => { - app.configure(channels()); - app.configure(routing()); - - app.on('publish', getDispatcher(emit, socketKey)); - app.on('disconnect', connection => { + const leaveChannels = (connection: RealTimeConnection) => { const { channels } = app; if (channels.length) { app.channel(app.channels).leave(connection); } + }; + + app.configure(channels()); + app.configure(routing()); + + app.on('publish', getDispatcher(emit, socketMap, socketKey)); + app.on('disconnect', leaveChannels); + app.on('logout', (_authResult: any, params: Params) => { + const { connection } = params; + + if (connection) { + leaveChannels(connection); + } }); // `connection` event @@ -50,6 +60,13 @@ export function socket ({ done, emit, socketKey, getParams }: SocketOptions) { runMethod(app, getParams(connection), app.get('defaultAuthentication'), 'create', args); } }); + + connection.on('logout', (callback: any) => { + if (app.get('defaultAuthentication')) { + debug('Got legacy authenticate event'); + runMethod(app, getParams(connection), app.get('defaultAuthentication'), 'remove', [ null, {}, callback ]); + } + }); })); // Legacy `socket.emit('serviceName::methodName', ...args)` handlers diff --git a/packages/transport-commons/src/socket/utils.ts b/packages/transport-commons/src/socket/utils.ts index a3fd9ca104..fbf9a5c0d8 100644 --- a/packages/transport-commons/src/socket/utils.ts +++ b/packages/transport-commons/src/socket/utils.ts @@ -1,5 +1,5 @@ import Debug from 'debug'; -import { isEqual } from 'lodash'; +import isEqual from 'lodash/isEqual'; import errors from '@feathersjs/errors'; import { HookContext, Application } from '@feathersjs/feathers'; import { CombinedChannel } from '../channels/channel/combined'; @@ -35,14 +35,13 @@ export function normalizeError (e: any) { return result; } -export function getDispatcher (emit: string, socketKey: any) { - return function (event: string, channel: CombinedChannel, context: HookContext, data: any) { +export function getDispatcher (emit: string, socketMap: WeakMap, socketKey?: any) { + return function (event: string, channel: CombinedChannel, context: HookContext, data?: any) { debug(`Dispatching '${event}' to ${channel.length} connections`); channel.connections.forEach(connection => { - // The reference between connection and socket - // is set in `app.setup` - const socket = connection[socketKey]; + // The reference between connection and socket is set in `app.setup` + const socket = socketKey ? connection[socketKey] : socketMap.get(connection); if (socket) { const eventName = `${context.path || ''} ${event}`.trim(); diff --git a/packages/transport-commons/test/channels/dispatch.test.ts b/packages/transport-commons/test/channels/dispatch.test.ts index 15c328bf74..543fab9c58 100644 --- a/packages/transport-commons/test/channels/dispatch.test.ts +++ b/packages/transport-commons/test/channels/dispatch.test.ts @@ -42,6 +42,18 @@ describe('app.publish', () => { }); }); + it('error in publisher is handled gracefully (#1707)', async () => { + app.service('test').publish('created', () => { + throw new Error('Something went wrong'); + }); + + try { + await app.service('test').create({ message: 'something' }); + } catch (error) { + assert.fail('Should never get here'); + } + }); + it('simple event registration and dispatching', done => { app.channel('testing').join(c1); diff --git a/packages/transport-commons/test/client.test.ts b/packages/transport-commons/test/client.test.ts index 7a9e21f05f..a5d11af48f 100644 --- a/packages/transport-commons/test/client.test.ts +++ b/packages/transport-commons/test/client.test.ts @@ -204,14 +204,15 @@ describe('client', () => { connection.emit('todos test', testing); }); - it('forwards namespaced call to .off', done => { + it('forwards namespaced call to .off, returns service instance', () => { // Use it's own connection and service so off method gets detected const conn = new EventEmitter(); // @ts-ignore - conn.off = name => { + conn.off = function (name) { assert.strictEqual(name, 'todos test'); - done(); + + return this; }; const client = new Service({ @@ -221,6 +222,6 @@ describe('client', () => { connection: conn }); - client.off('test'); + assert.strictEqual(client.off('test'), client); }); }); diff --git a/packages/transport-commons/test/socket/index.test.ts b/packages/transport-commons/test/socket/index.test.ts index cf2e264b07..f8842be78e 100644 --- a/packages/transport-commons/test/socket/index.test.ts +++ b/packages/transport-commons/test/socket/index.test.ts @@ -17,7 +17,7 @@ describe('@feathersjs/transport-commons', () => { options = { emit: 'emit', done: Promise.resolve(provider), - socketKey: 'test', + socketMap: new WeakMap(), getParams () { return connection; } diff --git a/packages/transport-commons/test/socket/utils.test.ts b/packages/transport-commons/test/socket/utils.test.ts index c690d56daa..b2bc57d3aa 100644 --- a/packages/transport-commons/test/socket/utils.test.ts +++ b/packages/transport-commons/test/socket/utils.test.ts @@ -9,6 +9,7 @@ import { getDispatcher, runMethod } from '../../src/socket/utils'; +import { RealTimeConnection } from '../../src/channels/channel/base'; describe('socket commons utils', () => { describe('.normalizeError', () => { @@ -59,27 +60,52 @@ describe('socket commons utils', () => { describe('.getDispatcher', () => { it('returns a dispatcher function', () => - assert.strictEqual(typeof getDispatcher('test', 'here'), 'function') + assert.strictEqual(typeof getDispatcher('test', new WeakMap()), 'function') ); + it('works with backwards compatible socketKey', done => { + const socketKey = Symbol('@feathersjs/test'); + const dispatcher = getDispatcher('emit', undefined, socketKey); + const socket = new EventEmitter(); + const connection = { + [socketKey]: socket + }; + const channel: any = { + connections: [ connection ], + dataFor (): null { + return null; + } + }; + + socket.once('testing', data => { + assert.strictEqual(data, 'hi'); + done(); + }); + + dispatcher('testing', channel, { result: 'hi' } as any); + }); + describe('dispatcher logic', () => { let dispatcher: any; let dummySocket: EventEmitter; let dummyHook: any; let dummyChannel: any; + let dummyConnection: RealTimeConnection; + let dummyMap: WeakMap; beforeEach(() => { - dispatcher = getDispatcher('emit', 'test'); + dummyConnection = {}; + dummyMap = new WeakMap(); + dispatcher = getDispatcher('emit', dummyMap); dummySocket = new EventEmitter(); dummyHook = { result: 'hi' }; dummyChannel = { - connections: [{ - test: dummySocket - }], + connections: [ dummyConnection ], dataFor (): null { return null; } }; + dummyMap.set(dummyConnection, dummySocket); }); it('dispatches a basic event', done => { diff --git a/readme.md b/readme.md index e48b03cecb..9ef43bdd51 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,8 @@ Feathers logo -## A REST and realtime API layer for modern applications. +## A framework for real-time applications and REST APIs with JavaScript and TypeScript -[![Greenkeeper badge](https://badges.greenkeeper.io/feathersjs/feathers.svg)](https://greenkeeper.io/) -[![Build Status](https://travis-ci.org/feathersjs/feathers.png?branch=master)](https://travis-ci.org/feathersjs/feathers) +[![CI](https://github.com/feathersjs/feathers/workflows/Node.js%20CI/badge.svg)](https://github.com/feathersjs/feathers/actions?query=workflow%3A%22Node.js+CI%22) [![Maintainability](https://api.codeclimate.com/v1/badges/cb5ec42a2d0cc1a47a02/maintainability)](https://codeclimate.com/github/feathersjs/feathers/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/cb5ec42a2d0cc1a47a02/test_coverage)](https://codeclimate.com/github/feathersjs/feathers/test_coverage) [![Download Status](https://img.shields.io/npm/dm/@feathersjs/feathers.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/feathers) @@ -11,9 +10,23 @@ [![Slack Status](http://slack.feathersjs.com/badge.svg)](http://slack.feathersjs.com) [![Telegram Status](https://img.shields.io/badge/Telegram_RU_chat:-Feathers-216bc1.svg?style=flat)](https://t.me/featherjs) -[![Sauce Test Status](https://saucelabs.com/browser-matrix/feathersjs.svg)](https://saucelabs.com/u/feathersjs) +Feathers is a lightweight web-framework for creating real-time applications and REST APIs using JavaScript or TypeScript. -Feathers is a real-time, micro-service web framework for NodeJS that gives you control over your data via RESTful resources, sockets and flexible plug-ins. +Feathers can interact with any backend technology, supports over a dozen databases and works with any frontend technology like React, VueJS, Angular, React Native, Android or iOS. + +## Getting started + +You can build your first real-time and REST API in just 4 commands: + +```bash +$ npm install -g @feathersjs/cli +$ mkdir my-new-app +$ cd my-new-app/ +$ feathers generate app +$ npm start +``` + +To learn more about Feathers visit the website at [feathersjs.com](http://feathersjs.com) or jump right into [the Feathers guides](http://docs.feathersjs.com/guides). ## Support @@ -87,82 +100,12 @@ Support us with a monthly donation and help us continue our activities. [[Become -## Getting started - -You can build your first real-time and REST API in just 4 commands: - -```bash -$ npm install -g @feathersjs/cli -$ mkdir my-new-app -$ cd my-new-app/ -$ feathers generate app -$ npm start -``` - -To learn more about Feathers visit the website at [feathersjs.com](http://feathersjs.com) or jump right into [the Feathers docs](http://docs.feathersjs.com). - -## See it in action - -Here is all the code you need to create a RESTful, real-time message API that uses an in-memory data store: - -```js -const feathers = require('@feathersjs/feathers'); -const express = require('@feathersjs/express'); -const socketio = require('@feathersjs/socketio'); - -const memory = require('feathers-memory'); - -// Creates an Express compatible Feathers application -const app = express(feathers()); - -// Parse HTTP JSON bodies -app.use(express.json()); -// Parse URL-encoded params -app.use(express.urlencoded({ extended: true })); -// Add REST API support -app.configure(express.rest()); -// Configure Socket.io real-time APIs -app.configure(socketio()); -// Register a messages service with pagination -app.use('/messages', memory({ - paginate: { - default: 10, - max: 25 - } -})); -// Register a nicer error handler than the default Express one -app.use(express.errorHandler()); - -// Add any new real-time connection to the `everybody` channel -app.on('connection', connection => app.channel('everybody').join(connection)); -// Publish all events to the `everybody` channel -app.registerPublisher(data => app.channel('everybody')); - -// Start the server -app.listen(3030).on('listening', () => - console.log('Feathers server listening on localhost:3030') -); -``` - -Then run - -``` -npm install @feathersjs/feathers @feathersjs/socketio @feathersjs/express feathers-memory -node app -``` - -and go to [http://localhost:3030/messages](http://localhost:3030/messages). That's it! There's a lot more you can do with Feathers including; using a real database, authentication, authorization, clustering and more! Head on over to [the Feathers docs](http://docs.feathersjs.com) to see just how easy it is to build scalable real-time apps. - ## Documentation The [Feathers docs](http://docs.feathersjs.com) are loaded with awesome stuff and tell you every thing you need to know about using and configuring Feathers. -## Security - -We :heart: the community and take security very seriously. No one wants their app hacked. If you have come across a security concern please [report it responsibly](https://docs.feathersjs.com/security#where-should-i-report-security-issues). Visit the [Security section](https://docs.feathersjs.com/SECURITY.html) of the docs to learn more about how you can make sure your app is secure. - ## License -Copyright (c) 2018 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) +Copyright (c) 2019 [Feathers contributors](https://github.com/feathersjs/feathers/graphs/contributors) Licensed under the [MIT license](LICENSE).