diff --git a/.circleci/config.yml b/.circleci/config.yml index 1a8de4602..d5d4ae737 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -59,7 +59,19 @@ jobs: - ./e2e/angular9/node_modules - run: name: Spreading Build - command: npm run build && npm run s:a + command: npm run build && npm run s:a && npm run s:test + - run: + name: Angular 6 UT + command: npm run test:a6 + - run: + name: Angular 7 UT + command: npm run test:a7 + - run: + name: Angular 8 UT + command: npm run test:a8 + - run: + name: Angular 9 UT + command: npm run test:a9 - run: name: Angular 6 E2E command: npm run e2e:a6 diff --git a/README.md b/README.md index e986f0223..79f157445 100644 --- a/README.md +++ b/README.md @@ -486,6 +486,136 @@ In case of relationship functions there are two more keys * `keyId` - a name of the keyId field. * `keyValue` - a name of the keyValue field. +## NGRX Store integration + +All selectors can be used to update the store with response data. + +For that `ngrxEntityRelationshipReducer` should be added as a meta reducer to the root import: +```typescript +StoreModule.forRoot({/* ... */}, { + metaReducers: [ + // ... + ngrxEntityRelationshipReducer, // <- add this + ], +}) +``` + +After that `reduceFlat` and `reduceGraph` can be used. + +### ReduceFlat / reduceFlat action + +This action helps to add to store data from a flat response. + +Imagine a backend returns the next flat shape: +```json +{ + "users": [ + { + "id": "1", + "firstName": "John", + "lastName": "Smith", + "companyId": "1" + } + ], + "companies": [ + { + "id": "1", + "name": "Magic", + "adminId": "2", + "addressId": "1" + } + ], + "addresses": [ + { + "id": "1", + "street": "Main st.", + "city": "Town", + "country": "Land" + } + ] +} +``` + +There's a selector that fetches this data from the store: +```typescript +export const selectUser = rootEntity( + selectUserState, + relatedEntity( + selectCompanyState, + 'companyId', + 'company', + relatedEntity( + selectAddressState, + 'addressId', + 'address', + ), + ), +); +``` + +Then the store can be updated by dispatching the `reduceFlat` action: +```typescript +this.store.dispatch(reduceFlat({ + data: response, + selector: selectUser, +})); +// or +this.store.dispatch(new ReduceFlat(response, selectUser)); +``` + +### ReduceGraph / reduceGraph action + +This action helps to add to store data from a graph response. + +Imagine a backend returns the next flat shape of a user: +```json +{ + "id": "1", + "firstName": "John", + "lastName": "Smith", + "companyId": "1", + "company": { + "id": "1", + "name": "Magic", + "adminId": "2", + "addressId": "1", + "address": { + "id": "1", + "street": "Main st.", + "city": "Town", + "country": "Land" + } + } +} +``` + +There's a selector that fetches this data from the store: +```typescript +export const selectUser = rootEntity( + selectUserState, + relatedEntity( + selectCompanyState, + 'companyId', + 'company', + relatedEntity( + selectAddressState, + 'addressId', + 'address', + ), + ), +); +``` + +Then the store can be updated by dispatching the `reduceGraph` action: +```typescript +this.store.dispatch(reduceGraph({ + data: response, + selector: selectUser, +})); +// or +this.store.dispatch(new ReduceGraph(response, selectUser)); +``` + ## Additional examples Of course, we can select as many relationships as we want until we have a field with a related id. diff --git a/e2e/angular6/.gitignore b/e2e/angular6/.gitignore index ee5c9d833..9c10cbd07 100644 --- a/e2e/angular6/.gitignore +++ b/e2e/angular6/.gitignore @@ -1,39 +1,2 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp -/out-tsc - -# dependencies /node_modules - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json - -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log -npm-debug.log -yarn-error.log -testem.log -/typings - -# System Files -.DS_Store -Thumbs.db +/src/test diff --git a/e2e/angular6/package-lock.json b/e2e/angular6/package-lock.json index 23eecf5c0..8f83e8881 100644 --- a/e2e/angular6/package-lock.json +++ b/e2e/angular6/package-lock.json @@ -605,12 +605,6 @@ "@types/jasmine": "*" } }, - "@types/mime-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", - "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", - "dev": true - }, "@types/node": { "version": "8.9.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", @@ -629,6 +623,16 @@ "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", "dev": true }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.5.13", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", @@ -1560,6 +1564,40 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "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": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -3619,15 +3657,51 @@ } }, "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz", + "integrity": "sha512-i42GQ498yibjdvIhivUsRslx608whtGoFIhF26Z7O4MYncBxp8CwalOs1lnHy21A9sIohWO2+uiE4SRtC9JXDg==", "dev": true, "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", "yauzl": "^2.10.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" + } + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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" + } + } } }, "extsprintf": { @@ -3883,6 +3957,12 @@ "null-check": "^1.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-minipass": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", @@ -6835,6 +6915,12 @@ "through2": "^2.0.0" } }, + "mitt": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.0.1.tgz", + "integrity": "sha512-FhuJY+tYHLnPcBHQhbUFzscD5512HumCPE4URXZUgPi3IvOJi4Xva5IIgy3xX56GqCmw++MAm5UURG6kDBYTdg==", + "dev": true + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -6883,6 +6969,12 @@ "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8558,21 +8650,22 @@ "dev": true }, "puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.2.0.tgz", + "integrity": "sha512-wkVid0V1p3Gw0u8Jyq0JxBaenx6H+/lmQIYDfHZS20IrhAobP70LSrWI6bF75olAKlrdR50w7IZxjaB09M6tDQ==", "dev": true, "requires": { - "@types/mime-types": "^2.1.0", "debug": "^4.1.0", - "extract-zip": "^1.6.6", + "extract-zip": "^2.0.0", "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", - "mime-types": "^2.1.25", + "mitt": "^2.0.1", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" }, "dependencies": { "agent-base": { @@ -8601,9 +8694,9 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, "ms": { @@ -8612,14 +8705,20 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "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": { - "async-limiter": "~1.0.0" + "glob": "^7.1.3" } + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "dev": true } } }, @@ -10288,6 +10387,56 @@ "inherits": "2" } }, + "tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "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": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -10643,6 +10792,28 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", diff --git a/e2e/angular6/package.json b/e2e/angular6/package.json index 965baea1e..854dc4db7 100644 --- a/e2e/angular6/package.json +++ b/e2e/angular6/package.json @@ -8,7 +8,7 @@ "test": "ng test", "lint": "ng lint", "e2e": "ng e2e --webdriver-update=false", - "postinstall": "node_modules/protractor/bin/webdriver-manager update --versions.chrome 80.0.3987.106" + "postinstall": "node_modules/protractor/bin/webdriver-manager update --versions.chrome 83.0.4103.39" }, "private": true, "peerDependencies": { @@ -49,7 +49,7 @@ "karma-jasmine": "~1.1.2", "karma-jasmine-html-reporter": "^0.2.2", "protractor": "^5.4.4", - "puppeteer": "^2.1.1", + "puppeteer": "~3.2.0", "ts-node": "~7.0.0", "tslint": "~5.11.0", "typescript": "~2.9.2" diff --git a/e2e/angular6/src/karma.conf.js b/e2e/angular6/src/karma.conf.js index b48e0b48a..558846654 100644 --- a/e2e/angular6/src/karma.conf.js +++ b/e2e/angular6/src/karma.conf.js @@ -22,12 +22,18 @@ module.exports = function (config) { reports: ['html', 'lcovonly'], fixWebpackSourcePaths: true, }, + customLaunchers: { + ChromeCi: { + base: 'ChromeHeadless', + flags: ['--headless', '--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage'], + }, + }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, + autoWatch: false, + browsers: ['ChromeCi'], + singleRun: true, }); }; diff --git a/e2e/angular7/.gitignore b/e2e/angular7/.gitignore index f4f46a5fe..9c10cbd07 100644 --- a/e2e/angular7/.gitignore +++ b/e2e/angular7/.gitignore @@ -1,46 +1,2 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp -/out-tsc -# Only exists if Bazel was run -/bazel-out - -# dependencies /node_modules - -# profiling files -chrome-profiler-events.json -speed-measure-plugin.json - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log -npm-debug.log -yarn-error.log -testem.log -/typings - -# System Files -.DS_Store -Thumbs.db +/src/test diff --git a/e2e/angular7/package-lock.json b/e2e/angular7/package-lock.json index 064e92354..1d531fcea 100644 --- a/e2e/angular7/package-lock.json +++ b/e2e/angular7/package-lock.json @@ -698,12 +698,6 @@ "@types/jasmine": "*" } }, - "@types/mime-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", - "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", - "dev": true - }, "@types/node": { "version": "8.9.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz", @@ -747,6 +741,16 @@ } } }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.7.11", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", @@ -1576,6 +1580,40 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "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": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -3484,15 +3522,41 @@ } }, "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz", + "integrity": "sha512-i42GQ498yibjdvIhivUsRslx608whtGoFIhF26Z7O4MYncBxp8CwalOs1lnHy21A9sIohWO2+uiE4SRtC9JXDg==", "dev": true, "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", "yauzl": "^2.10.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" + } + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } } }, "extsprintf": { @@ -3751,6 +3815,12 @@ "null-check": "^1.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -6429,6 +6499,12 @@ "through2": "^2.0.0" } }, + "mitt": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.0.1.tgz", + "integrity": "sha512-FhuJY+tYHLnPcBHQhbUFzscD5512HumCPE4URXZUgPi3IvOJi4Xva5IIgy3xX56GqCmw++MAm5UURG6kDBYTdg==", + "dev": true + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -6477,6 +6553,12 @@ "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8025,21 +8107,22 @@ "dev": true }, "puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.2.0.tgz", + "integrity": "sha512-wkVid0V1p3Gw0u8Jyq0JxBaenx6H+/lmQIYDfHZS20IrhAobP70LSrWI6bF75olAKlrdR50w7IZxjaB09M6tDQ==", "dev": true, "requires": { - "@types/mime-types": "^2.1.0", "debug": "^4.1.0", - "extract-zip": "^1.6.6", + "extract-zip": "^2.0.0", "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", - "mime-types": "^2.1.25", + "mitt": "^2.0.1", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" }, "dependencies": { "agent-base": { @@ -8068,9 +8151,9 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, "ms": { @@ -8079,14 +8162,20 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "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": { - "async-limiter": "~1.0.0" + "glob": "^7.1.3" } + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "dev": true } } }, @@ -9768,6 +9857,44 @@ "inherits": "2" } }, + "tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "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": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "terser": { "version": "4.6.11", "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.11.tgz", @@ -10076,6 +10203,28 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", diff --git a/e2e/angular7/package.json b/e2e/angular7/package.json index 57dc0c717..e8f79b406 100644 --- a/e2e/angular7/package.json +++ b/e2e/angular7/package.json @@ -8,7 +8,7 @@ "test": "ng test", "lint": "ng lint", "e2e": "ng e2e --webdriver-update=false", - "postinstall": "webdriver-manager update --versions.chrome 80.0.3987.106" + "postinstall": "webdriver-manager update --versions.chrome 83.0.4103.39" }, "private": true, "peerDependencies": { @@ -49,7 +49,7 @@ "karma-jasmine": "~1.1.2", "karma-jasmine-html-reporter": "^0.2.2", "protractor": "^5.4.4", - "puppeteer": "^2.1.1", + "puppeteer": "~3.2.0", "ts-node": "~7.0.0", "tslint": "~5.11.0", "typescript": "~3.2.2" diff --git a/e2e/angular7/src/karma.conf.js b/e2e/angular7/src/karma.conf.js index 01ad4b45c..a5e188872 100644 --- a/e2e/angular7/src/karma.conf.js +++ b/e2e/angular7/src/karma.conf.js @@ -22,13 +22,18 @@ module.exports = function (config) { reports: ['html', 'lcovonly', 'text-summary'], fixWebpackSourcePaths: true, }, + customLaunchers: { + ChromeCi: { + base: 'ChromeHeadless', + flags: ['--headless', '--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage'], + }, + }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true, + autoWatch: false, + browsers: ['ChromeCi'], + singleRun: true, }); }; diff --git a/e2e/angular8/.gitignore b/e2e/angular8/.gitignore index 86d943a9b..9c10cbd07 100644 --- a/e2e/angular8/.gitignore +++ b/e2e/angular8/.gitignore @@ -1,46 +1,2 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp -/out-tsc -# Only exists if Bazel was run -/bazel-out - -# dependencies /node_modules - -# profiling files -chrome-profiler-events*.json -speed-measure-plugin*.json - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log -npm-debug.log -yarn-error.log -testem.log -/typings - -# System Files -.DS_Store -Thumbs.db +/src/test diff --git a/e2e/angular8/karma.conf.js b/e2e/angular8/karma.conf.js index 39cd01f4f..609fdf111 100644 --- a/e2e/angular8/karma.conf.js +++ b/e2e/angular8/karma.conf.js @@ -22,13 +22,18 @@ module.exports = function (config) { reports: ['html', 'lcovonly', 'text-summary'], fixWebpackSourcePaths: true, }, + customLaunchers: { + ChromeCi: { + base: 'ChromeHeadless', + flags: ['--headless', '--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage'], + }, + }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true, + autoWatch: false, + browsers: ['ChromeCi'], + singleRun: true, }); }; diff --git a/e2e/angular8/package-lock.json b/e2e/angular8/package-lock.json index 2ccf08cef..682ebe156 100644 --- a/e2e/angular8/package-lock.json +++ b/e2e/angular8/package-lock.json @@ -2059,12 +2059,6 @@ "@types/jasmine": "*" } }, - "@types/mime-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", - "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", - "dev": true - }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -2114,6 +2108,16 @@ } } }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -2861,6 +2865,40 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "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": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -4865,31 +4903,25 @@ } }, "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz", + "integrity": "sha512-i42GQ498yibjdvIhivUsRslx608whtGoFIhF26Z7O4MYncBxp8CwalOs1lnHy21A9sIohWO2+uiE4SRtC9JXDg==", "dev": true, "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", "yauzl": "^2.10.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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": { - "ms": "2.0.0" + "pump": "^3.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -5221,6 +5253,12 @@ "null-check": "^1.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -7844,6 +7882,12 @@ "through2": "^2.0.0" } }, + "mitt": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.0.1.tgz", + "integrity": "sha512-FhuJY+tYHLnPcBHQhbUFzscD5512HumCPE4URXZUgPi3IvOJi4Xva5IIgy3xX56GqCmw++MAm5UURG6kDBYTdg==", + "dev": true + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -7874,6 +7918,12 @@ "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -9149,21 +9199,22 @@ "dev": true }, "puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.2.0.tgz", + "integrity": "sha512-wkVid0V1p3Gw0u8Jyq0JxBaenx6H+/lmQIYDfHZS20IrhAobP70LSrWI6bF75olAKlrdR50w7IZxjaB09M6tDQ==", "dev": true, "requires": { - "@types/mime-types": "^2.1.0", "debug": "^4.1.0", - "extract-zip": "^1.6.6", + "extract-zip": "^2.0.0", "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", - "mime-types": "^2.1.25", + "mitt": "^2.0.1", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" }, "dependencies": { "agent-base": { @@ -9183,9 +9234,24 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "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" + } + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", "dev": true } } @@ -10875,6 +10941,44 @@ "yallist": "^3.0.3" } }, + "tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "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": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "terser": { "version": "4.6.3", "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", @@ -11165,6 +11269,28 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", diff --git a/e2e/angular8/package.json b/e2e/angular8/package.json index b2a86dbf6..c47a4fb69 100644 --- a/e2e/angular8/package.json +++ b/e2e/angular8/package.json @@ -8,7 +8,7 @@ "test": "ng test", "lint": "ng lint", "e2e": "ng e2e --webdriver-update=false", - "postinstall": "webdriver-manager update --versions.chrome 80.0.3987.106" + "postinstall": "webdriver-manager update --versions.chrome 83.0.4103.39" }, "private": true, "peerDependencies": { @@ -49,7 +49,7 @@ "karma-jasmine": "~2.0.1", "karma-jasmine-html-reporter": "^1.4.0", "protractor": "^5.4.4", - "puppeteer": "^2.1.1", + "puppeteer": "~3.2.0", "ts-node": "~7.0.0", "tslint": "~5.15.0", "typescript": "~3.5.3" diff --git a/e2e/angular9/.gitignore b/e2e/angular9/.gitignore index 3c3629e64..9c10cbd07 100644 --- a/e2e/angular9/.gitignore +++ b/e2e/angular9/.gitignore @@ -1 +1,2 @@ -node_modules +/node_modules +/src/test diff --git a/e2e/angular9/karma.conf.js b/e2e/angular9/karma.conf.js index 4e911b82d..2e18deee6 100644 --- a/e2e/angular9/karma.conf.js +++ b/e2e/angular9/karma.conf.js @@ -22,13 +22,18 @@ module.exports = function (config) { reports: ['html', 'lcovonly', 'text-summary'], fixWebpackSourcePaths: true, }, + customLaunchers: { + ChromeCi: { + base: 'ChromeHeadless', + flags: ['--headless', '--disable-gpu', '--no-sandbox', '--disable-dev-shm-usage'], + }, + }, reporters: ['progress', 'kjhtml'], port: 9876, colors: true, logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true, + autoWatch: false, + browsers: ['ChromeCi'], + singleRun: true, }); }; diff --git a/e2e/angular9/package-lock.json b/e2e/angular9/package-lock.json index 493f74765..8a4620962 100644 --- a/e2e/angular9/package-lock.json +++ b/e2e/angular9/package-lock.json @@ -1405,12 +1405,6 @@ "@types/jasmine": "*" } }, - "@types/mime-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", - "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", - "dev": true - }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -1460,6 +1454,16 @@ } } }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@webassemblyjs/ast": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", @@ -2204,6 +2208,40 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "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": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -4537,40 +4575,25 @@ } }, "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz", + "integrity": "sha512-i42GQ498yibjdvIhivUsRslx608whtGoFIhF26Z7O4MYncBxp8CwalOs1lnHy21A9sIohWO2+uiE4SRtC9JXDg==", "dev": true, "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", "yauzl": "^2.10.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" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "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": { - "minimist": "^1.2.5" + "pump": "^3.0.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, @@ -4893,6 +4916,12 @@ "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, "fs-extra": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", @@ -7043,6 +7072,12 @@ "through2": "^2.0.0" } }, + "mitt": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.0.1.tgz", + "integrity": "sha512-FhuJY+tYHLnPcBHQhbUFzscD5512HumCPE4URXZUgPi3IvOJi4Xva5IIgy3xX56GqCmw++MAm5UURG6kDBYTdg==", + "dev": true + }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -7073,6 +7108,12 @@ "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -8996,21 +9037,22 @@ "dev": true }, "puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.2.0.tgz", + "integrity": "sha512-wkVid0V1p3Gw0u8Jyq0JxBaenx6H+/lmQIYDfHZS20IrhAobP70LSrWI6bF75olAKlrdR50w7IZxjaB09M6tDQ==", "dev": true, "requires": { - "@types/mime-types": "^2.1.0", "debug": "^4.1.0", - "extract-zip": "^1.6.6", + "extract-zip": "^2.0.0", "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", - "mime-types": "^2.1.25", + "mitt": "^2.0.1", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" }, "dependencies": { "agent-base": { @@ -9030,19 +9072,25 @@ } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "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" } + }, + "ws": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "dev": true } } }, @@ -10864,6 +10912,44 @@ } } }, + "tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "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": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "terser": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/terser/-/terser-4.5.1.tgz", @@ -11268,6 +11354,28 @@ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + }, + "dependencies": { + "buffer": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + } + } + }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", diff --git a/e2e/angular9/package.json b/e2e/angular9/package.json index be682b022..790013767 100644 --- a/e2e/angular9/package.json +++ b/e2e/angular9/package.json @@ -8,7 +8,7 @@ "test": "ng test", "lint": "ng lint", "e2e": "ng e2e --webdriver-update=false", - "postinstall": "webdriver-manager update --versions.chrome 80.0.3987.106" + "postinstall": "webdriver-manager update --versions.chrome 83.0.4103.39" }, "private": true, "peerDependencies": { @@ -49,7 +49,7 @@ "karma-jasmine": "~2.0.1", "karma-jasmine-html-reporter": "^1.5.3", "protractor": "^5.4.4", - "puppeteer": "^2.1.1", + "puppeteer": "~3.2.0", "ts-node": "~8.3.0", "tslint": "~5.18.0", "typescript": "~3.7.5" diff --git a/package-lock.json b/package-lock.json index 39f3d60ce..e62b1c96a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -563,68 +563,57 @@ } }, "@octokit/auth-token": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.0.tgz", - "integrity": "sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.1.tgz", + "integrity": "sha512-NB81O5h39KfHYGtgfWr2booRxp2bWOJoqbWwbyUg2hw6h35ArWYlAST5B3XwAkbdcx13yt84hFXyFP5X0QToWA==", "dev": true, "requires": { - "@octokit/types": "^2.0.0" + "@octokit/types": "^4.0.1" } }, "@octokit/core": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.0.tgz", - "integrity": "sha512-uvzmkemQrBgD8xuGbjhxzJN1darJk9L2cS+M99cHrDG2jlSVpxNJVhoV86cXdYBqdHCc9Z995uLCczaaHIYA6Q==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.3.tgz", + "integrity": "sha512-23AHK9xBW0v79Ck8h5U+5iA4MW7aosqv+Yr6uZXolVGNzzHwryNH5wM386/6+etiKUTwLFZTqyMU9oQpIBZcFA==", "dev": true, "requires": { "@octokit/auth-token": "^2.4.0", "@octokit/graphql": "^4.3.1", "@octokit/request": "^5.4.0", - "@octokit/types": "^2.0.0", + "@octokit/types": "^4.0.1", "before-after-hook": "^2.1.0", "universal-user-agent": "^5.0.0" } }, "@octokit/endpoint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.0.tgz", - "integrity": "sha512-3nx+MEYoZeD0uJ+7F/gvELLvQJzLXhep2Az0bBSXagbApDvDW0LWwpnAIY/hb0Jwe17A0fJdz0O12dPh05cj7A==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.2.tgz", + "integrity": "sha512-xs1mmCEZ2y4shXCpFjNq3UbmNR+bLzxtZim2L0zfEtj9R6O6kc4qLDvYw66hvO6lUsYzPTM5hMkltbuNAbRAcQ==", "dev": true, "requires": { - "@octokit/types": "^2.0.0", + "@octokit/types": "^4.0.1", "is-plain-object": "^3.0.0", "universal-user-agent": "^5.0.0" } }, "@octokit/graphql": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.3.1.tgz", - "integrity": "sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.0.tgz", + "integrity": "sha512-StJWfn0M1QfhL3NKBz31e1TdDNZrHLLS57J2hin92SIfzlOVBuUaRkp31AGkGOAFOAVtyEX6ZiZcsjcJDjeb5g==", "dev": true, "requires": { "@octokit/request": "^5.3.0", - "@octokit/types": "^2.0.0", - "universal-user-agent": "^4.0.0" - }, - "dependencies": { - "universal-user-agent": { - "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.1.0" - } - } + "@octokit/types": "^4.0.1", + "universal-user-agent": "^5.0.0" } }, "@octokit/plugin-paginate-rest": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.0.2.tgz", - "integrity": "sha512-HzODcSUt9mjErly26TlTOGZrhf9bmF/FEDQ2zln1izhgmIV6ulsjsHmgmR4VZ0wzVr/m52Eb6U2XuyS8fkcR1A==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.2.1.tgz", + "integrity": "sha512-/tHpIF2XpN40AyhIq295YRjb4g7Q5eKob0qM3thYJ0Z+CgmNsWKM/fWse/SUR8+LdprP1O4ZzSKQE+71TCwK+w==", "dev": true, "requires": { - "@octokit/types": "^2.0.1" + "@octokit/types": "^4.0.1" } }, "@octokit/plugin-request-log": { @@ -634,24 +623,24 @@ "dev": true }, "@octokit/plugin-rest-endpoint-methods": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.5.2.tgz", - "integrity": "sha512-i5GlEWm7k/SzBr7QrIOuas/1nNgr4JcmgM14TAKULVkv4L5mOY+pcVIUMU3qdYhFyblBFhigujav5seMnkqBnQ==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.13.0.tgz", + "integrity": "sha512-ArFHeq3L0Qo+zadptmslTJ2ug7bTinDUdx7Iul2vgwONvvgVEq4KSJWZ5Ab8AXEyO19x7yUjMVXZl1UgyGgeKw==", "dev": true, "requires": { - "@octokit/types": "^2.0.1", + "@octokit/types": "^4.1.1", "deprecation": "^2.3.1" } }, "@octokit/request": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.0.tgz", - "integrity": "sha512-uAJO6GI8z8VHBqtY7VTL9iFy1Y+UTp5ShpI97tY5z0qBfYKE9rZCRsCm23VmF00x+IoNJ7a0nuVITs/+wS9/mg==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.4.tgz", + "integrity": "sha512-vqv1lz41c6VTxUvF9nM+a6U+vvP3vGk7drDpr0DVQg4zyqlOiKVrY17DLD6de5okj+YLHKcoqaUZTBtlNZ1BtQ==", "dev": true, "requires": { - "@octokit/endpoint": "^6.0.0", + "@octokit/endpoint": "^6.0.1", "@octokit/request-error": "^2.0.0", - "@octokit/types": "^2.8.2", + "@octokit/types": "^4.0.1", "deprecation": "^2.0.0", "is-plain-object": "^3.0.0", "node-fetch": "^2.3.0", @@ -660,32 +649,32 @@ } }, "@octokit/request-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.0.tgz", - "integrity": "sha512-rtYicB4Absc60rUv74Rjpzek84UbVHGHJRu4fNVlZ1mCcyUPPuzFfG9Rn6sjHrd95DEsmjSt1Axlc699ZlbDkw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.1.tgz", + "integrity": "sha512-5lqBDJ9/TOehK82VvomQ6zFiZjPeSom8fLkFVLuYL3sKiIb5RB8iN/lenLkY7oBmyQcGP7FBMGiIZTO8jufaRQ==", "dev": true, "requires": { - "@octokit/types": "^2.0.0", + "@octokit/types": "^4.0.1", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "@octokit/rest": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.2.1.tgz", - "integrity": "sha512-5TLsk0BYnfUhOlA2mGMdVmnm8UPqfDq5q3T58pq/vudfkOmN3cFK5wI+sR7SvN+3m4dynU2733yzSXKAoIvpKg==", + "version": "17.9.2", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.9.2.tgz", + "integrity": "sha512-UXxiE0HhGQAPB3WDHTEu7lYMHH2uRcs/9f26XyHpGGiiXht8hgHWEk6fA7WglwwEvnj8V7mkJOgIntnij132UA==", "dev": true, "requires": { "@octokit/core": "^2.4.3", - "@octokit/plugin-paginate-rest": "^2.0.0", + "@octokit/plugin-paginate-rest": "^2.2.0", "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "3.5.2" + "@octokit/plugin-rest-endpoint-methods": "^3.12.2" } }, "@octokit/types": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.8.2.tgz", - "integrity": "sha512-8cs4DjRAzFoGo1ieUhDyrTdPK016V3JD/H00nbnojSCUYfOXnnJ1owUaAT/3OebTzp/tgdTG6M+8PdCTJzI+/w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.1.tgz", + "integrity": "sha512-gOuIVmMCfHzSv3QBwLZjGDEDtYC73A5+tYcccEoq+Jd/h9rG/Mfc+h0+GEU+mpGhx86n7eBw6J/0BZ0zAmLkKg==", "dev": true, "requires": { "@types/node": ">= 8" @@ -755,23 +744,6 @@ "import-from": "^3.0.0", "lodash": "^4.17.4", "micromatch": "^4.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" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "@semantic-release/error": { @@ -879,9 +851,9 @@ } }, "@semantic-release/github": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.5.tgz", - "integrity": "sha512-1nJCMeomspRIXKiFO3VXtkUMbIBEreYLFNBdWoLjvlUNcEK0/pEbupEZJA3XHfJuSzv43u3OLpPhF/JBrMuv+A==", + "version": "7.0.7", + "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.7.tgz", + "integrity": "sha512-Sai2UucYQ+5rJzKVEVJ4eiZNDdoo0/CzfpValBdeU5h97uJE7t4CoBTmUWkiXlPOx46CSw1+JhI+PHC1PUxVZw==", "dev": true, "requires": { "@octokit/rest": "^17.0.0", @@ -900,70 +872,6 @@ "p-filter": "^2.0.0", "p-retry": "^4.0.0", "url-join": "^4.0.0" - }, - "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "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-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "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" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true - } } }, "@semantic-release/npm": { @@ -987,26 +895,21 @@ "tempy": "^0.5.0" }, "dependencies": { - "fs-extra": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", - "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^1.0.0" - } - }, - "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "execa": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", "dev": true, "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, "read-pkg": { @@ -1032,12 +935,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true - }, - "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", - "dev": true } } }, @@ -1059,21 +956,6 @@ "read-pkg-up": "^7.0.0" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -1114,9 +996,9 @@ } }, "@tootallnate/once": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz", - "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==", + "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": { @@ -1131,16 +1013,16 @@ "integrity": "sha512-3F8qpwBAiVc5+HPJeXJpbrl+XjawGmciN5LgiO7Gv1pl1RHtjoMNqZpqEksaPJW05ViKe8snYInRs6xB25Xdew==", "dev": true }, - "@types/mime-types": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", - "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", + "@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": "12.12.37", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.37.tgz", - "integrity": "sha512-4mXKoDptrXAwZErQHrLzpe0FN/0Wmf5JRniSVIdwUrtDf9wnmEV1teCNLBo/TwuXhkK/bVegoEn/wmb+x0AuPg==", + "version": "12.12.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.42.tgz", + "integrity": "sha512-R/9QdYFLL9dE9l5cWWzWIZByVGFd7lk7JVOJ7KD+E1SJ4gni7XJRLz9QTjyYQiHIqEAgku9VgxdLjMlhhUaAFg==", "dev": true }, "@types/normalize-package-data": { @@ -1161,6 +1043,16 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "@types/yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "JSONStream": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", @@ -1182,9 +1074,9 @@ } }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", + "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", "dev": true }, "acorn-walk": { @@ -1200,10 +1092,13 @@ "dev": true }, "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", + "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", + "dev": true, + "requires": { + "debug": "4" + } }, "aggregate-error": { "version": "3.0.1", @@ -1302,6 +1197,12 @@ "integrity": "sha1-oMoMvCmltz6Dbuvhy/bF4OTrgvk=", "dev": true }, + "array-filter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-1.0.0.tgz", + "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", + "dev": true + }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -1350,6 +1251,14 @@ "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "assert": { @@ -1377,13 +1286,10 @@ "dev": true }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true }, "async-limiter": { "version": "1.0.1", @@ -1403,6 +1309,15 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true }, + "available-typed-arrays": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz", + "integrity": "sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ==", + "dev": true, + "requires": { + "array-filter": "^1.0.0" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -1477,9 +1392,9 @@ "dev": true }, "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "dev": true }, "bcrypt-pbkdf": { @@ -1512,6 +1427,25 @@ "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", "dev": true }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } + } + }, "blob": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", @@ -1519,9 +1453,9 @@ "dev": true }, "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", "dev": true }, "body-parser": { @@ -1542,6 +1476,21 @@ "type-is": "~1.6.17" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -1643,21 +1592,39 @@ "requires": { "bn.js": "^4.1.0", "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", + "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", "dev": true, "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.2", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } } }, "browserify-zlib": { @@ -1670,9 +1637,9 @@ } }, "buffer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", - "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", + "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", "dev": true, "requires": { "base64-js": "^1.0.2", @@ -1685,12 +1652,6 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "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 - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -1813,6 +1774,12 @@ "readdirp": "~3.4.0" } }, + "chownr": { + "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": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -2000,6 +1967,23 @@ "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.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" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "console-browserify": { @@ -2021,9 +2005,9 @@ "dev": true }, "conventional-changelog-angular": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz", - "integrity": "sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA==", + "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", @@ -2042,54 +2026,410 @@ } }, "conventional-changelog-writer": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz", - "integrity": "sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw==", + "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.4.0", + "handlebars": "^4.7.6", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.15", - "meow": "^5.0.0", + "meow": "^7.0.0", "semver": "^6.0.0", "split": "^1.0.0", "through2": "^3.0.0" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true - } - } - }, - "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==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz", - "integrity": "sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ==", + }, + "camelcase": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz", + "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==", + "dev": true + }, + "camelcase-keys": { + "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": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "indent-string": { + "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 + }, + "map-obj": { + "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 + }, + "meow": { + "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" + } + }, + "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" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "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 + } + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "strip-indent": { + "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": { + "min-indent": "^1.0.0" + } + }, + "trim-newlines": { + "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 + }, + "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 + } + } + } + } + }, + "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": "^5.0.0", + "meow": "^7.0.0", "split2": "^2.0.0", "through2": "^3.0.0", "trim-off-newlines": "^1.0.0" + }, + "dependencies": { + "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 + }, + "camelcase-keys": { + "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": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "indent-string": { + "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 + }, + "map-obj": { + "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 + }, + "meow": { + "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" + } + }, + "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" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "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 + } + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "strip-indent": { + "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": { + "min-indent": "^1.0.0" + } + }, + "trim-newlines": { + "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 + }, + "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 + } + } + } } }, "convert-source-map": { @@ -2161,6 +2501,14 @@ "requires": { "bn.js": "^4.1.0", "elliptic": "^6.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "create-hash": { @@ -2253,13 +2601,10 @@ "dev": true }, "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true }, "dashdash": { "version": "1.14.1", @@ -2271,9 +2616,9 @@ } }, "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", "dev": true }, "dateformat": { @@ -2283,12 +2628,12 @@ "dev": true }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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.0.0" + "ms": "^2.1.1" } }, "decamelize": { @@ -2394,6 +2739,14 @@ "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "dir-glob": { @@ -2418,9 +2771,9 @@ } }, "domain-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.0.0.tgz", - "integrity": "sha512-q9seD1JK98fzT69I0sAzp0cxb6gUS1grmCaq6cLxTbm9msb9eqYFXGJU94VOIOi2nKmYmKdUFkTnGvIViuX9qA==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.4.0.tgz", + "integrity": "sha512-GpKOVUarVuWSPQaCiAD+bMa9yDDKXv2YvvBUqkoNvPckaDCp/Bcks/rwjlLbbE+27esQIogAtXtipLd90SEFFw==", "dev": true }, "dot-prop": { @@ -2514,6 +2867,14 @@ "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "emoji-regex": { @@ -2538,64 +2899,59 @@ } }, "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.4.1.tgz", + "integrity": "sha512-8MfIfF1/IIfxuc2gv5K+XlFZczw/BpTvqBdl0E2fBLkYQp4miv4LuDTVtYt4yMyaIFLEr4vtaSgV4mjvll8Crw==", "dev": true, "requires": { "accepts": "~1.3.4", - "base64id": "1.0.0", + "base64id": "2.0.0", "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" - }, - "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" - } - } + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "^7.1.2" } }, "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.4.2.tgz", + "integrity": "sha512-AWjc1Xg06a6UPFOBAzJf48W1UR/qKYmv/ubgSCumo9GXgvL/xGIvo05dXoBL+2NTLMipDI7in8xK61C17L25xg==", "dev": true, "requires": { - "component-emitter": "1.2.1", + "component-emitter": "~1.3.0", "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", "has-cors": "1.1.0", "indexof": "0.0.1", "parseqs": "0.0.5", "parseuri": "0.0.5", - "ws": "~3.3.1", + "ws": "~6.1.0", "xmlhttprequest-ssl": "~1.5.4", "yeast": "0.1.2" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", "dev": true, "requires": { - "ms": "2.0.0" + "async-limiter": "~1.0.0" } } } }, "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.0.tgz", + "integrity": "sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==", "dev": true, "requires": { "after": "0.8.2", @@ -2628,6 +2984,25 @@ "requires": { "execa": "^4.0.0", "java-properties": "^1.0.0" + }, + "dependencies": { + "execa": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + } } }, "error-ex": { @@ -2639,6 +3014,36 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es6-object-assign": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", @@ -2670,9 +3075,9 @@ "dev": true }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", "dev": true }, "events": { @@ -2692,90 +3097,98 @@ } }, "execa": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.0.tgz", - "integrity": "sha512-JbDUxwV3BoT5ZVXQrSVbAiaXhXUkIwvbhPIwZ0N13kX+5yCzOhUNdocxB/UQRuYOHRYYwAxKYwJYc0T4D12pDA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", - "yauzl": "^2.10.0" + "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" }, "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "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": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "pump": "^3.0.0" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" } }, - "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==", + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "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": { - "safe-buffer": "~5.1.0" + "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 } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz", + "integrity": "sha512-i42GQ498yibjdvIhivUsRslx608whtGoFIhF26Z7O4MYncBxp8CwalOs1lnHy21A9sIohWO2+uiE4SRtC9JXDg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -2809,9 +3222,9 @@ "dev": true }, "fastq": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz", - "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz", + "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==", "dev": true, "requires": { "reusify": "^1.0.4" @@ -2857,6 +3270,23 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "find-up": { @@ -2879,9 +3309,9 @@ } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, "follow-redirects": { @@ -2901,15 +3331,15 @@ "requires": { "ms": "^2.1.1" } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true } } }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -2975,15 +3405,22 @@ } } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "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": "9.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.0.tgz", + "integrity": "sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^1.0.0" } }, "fs.realpath": { @@ -2999,6 +3436,12 @@ "dev": true, "optional": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -3107,16 +3550,195 @@ } }, "git-raw-commits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.3.tgz", - "integrity": "sha512-SoSsFL5lnixVzctGEi2uykjA7B5I0AhO9x6kdzvGRHbxsa6JSEgrgy1esRKsfOKE1cgyOJ/KDR2Trxu157sb8w==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.7.tgz", + "integrity": "sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g==", "dev": true, "requires": { - "dargs": "^4.0.1", + "dargs": "^7.0.0", "lodash.template": "^4.0.2", - "meow": "^5.0.0", + "meow": "^7.0.0", "split2": "^2.0.0", "through2": "^3.0.0" + }, + "dependencies": { + "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 + }, + "camelcase-keys": { + "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": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "indent-string": { + "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 + }, + "map-obj": { + "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 + }, + "meow": { + "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" + } + }, + "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" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } + }, + "quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "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 + } + } + }, + "redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "requires": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + } + }, + "strip-indent": { + "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": { + "min-indent": "^1.0.0" + } + }, + "trim-newlines": { + "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 + }, + "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 + } + } + } } }, "glob": { @@ -3206,6 +3828,21 @@ "har-schema": "^2.0.0" } }, + "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": { + "function-bind": "^1.1.1" + } + }, "has-binary2": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", @@ -3227,14 +3864,29 @@ "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 + }, "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } } }, "hash.js": { @@ -3290,9 +3942,9 @@ } }, "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { "eventemitter3": "^4.0.0", @@ -3309,32 +3961,6 @@ "@tootallnate/once": "1", "agent-base": "6", "debug": "4" - }, - "dependencies": { - "agent-base": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", - "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } } }, "http-signature": { @@ -3355,30 +3981,13 @@ "dev": true }, "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", - "dev": true, - "requires": { - "agent-base": "5", - "debug": "4" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "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" } }, "human-signals": { @@ -3473,9 +4082,9 @@ "dev": true }, "ignore": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", - "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true }, "import-fresh": { @@ -3587,6 +4196,18 @@ "binary-extensions": "^2.0.0" } }, + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", @@ -3656,6 +4277,15 @@ "isobject": "^4.0.0" } }, + "is-regex": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -3668,6 +4298,15 @@ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "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": "1.0.1", "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", @@ -3677,6 +4316,18 @@ "text-extensions": "^1.0.0" } }, + "is-typed-array": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.3.tgz", + "integrity": "sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.0", + "es-abstract": "^1.17.4", + "foreach": "^2.0.5", + "has-symbols": "^1.0.1" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -3913,12 +4564,13 @@ } }, "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", + "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "graceful-fs": "^4.1.6", + "universalify": "^1.0.0" } }, "jsonparse": { @@ -3940,35 +4592,52 @@ } }, "karma": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.4.tgz", - "integrity": "sha512-UGqTe2LBiGQBXRN+Fygeiq63tbfOX45639SKSbPkLpARwnxROWJZg+froGkpHxr84FXCe8UGCf+1PITM6frT5w==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.0.9.tgz", + "integrity": "sha512-dUA5z7Lo7G4FRSe1ZAXqOINEEWxmCjDBbfRBmU/wYlSMwxUQJP/tEEP90yJt3Uqo03s9rCgVnxtlfq+uDhxSPg==", "dev": true, "requires": { - "body-parser": "^1.16.1", + "body-parser": "^1.19.0", "braces": "^3.0.2", "chokidar": "^3.0.0", - "colors": "^1.1.0", - "connect": "^3.6.0", + "colors": "^1.4.0", + "connect": "^3.7.0", "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "flatted": "^2.0.0", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^4.0.2", - "lodash": "^4.17.14", - "log4js": "^4.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "socket.io": "2.1.1", + "dom-serialize": "^2.2.1", + "flatted": "^2.0.2", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.15", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", "source-map": "^0.6.1", - "tmp": "0.0.33", + "tmp": "0.2.1", "ua-parser-js": "0.7.21", "yargs": "^15.3.1" + }, + "dependencies": { + "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 + }, + "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" + } + } } }, "karma-chrome-launcher": { @@ -3995,9 +4664,9 @@ } }, "karma-jasmine": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.1.1.tgz", - "integrity": "sha512-pxBmv5K7IkBRLsFSTOpgiK/HzicQT3mfFF+oHAC7nxMfYKhaYFgxOa5qjnHW4sL5rUnmdkSajoudOnnOdPyW4Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-3.3.1.tgz", + "integrity": "sha512-Nxh7eX9mOQMyK0VSsMxdod+bcqrR/ikrmEiWj5M6fwuQ7oI+YEF1FckaDsWfs6TIpULm9f0fTKMjF7XcrvWyqQ==", "dev": true, "requires": { "jasmine-core": "^3.5.0" @@ -4014,9 +4683,9 @@ } }, "karma-typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.0.2.tgz", - "integrity": "sha512-cq3ETrnYMynLvUt29bqZhKMCHHDcqx0v0SfcsFqQsn/WWbMqXHNZq9dOLVXt6t3PiqfL0SLGq317LSNVmgLtqw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/karma-typescript/-/karma-typescript-5.0.3.tgz", + "integrity": "sha512-Irs767Oc5BCMPLbZ+VdJmIxLL+1fB3L9dye8oQHDfHXFuYBx+uir5FDLzNNXFgDRUMYxEFT1T1eucAcb56v+0A==", "dev": true, "requires": { "acorn": "^7.1.0", @@ -4064,82 +4733,12 @@ "vm-browserify": "^1.1.2" }, "dependencies": { - "async": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", - "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", - "dev": true - }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "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-extra": { - "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.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "log4js": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.1.2.tgz", - "integrity": "sha512-knS4Y30pC1e0n7rfx3VxcLOdBCsEo0o6/C7PVTGxdVK+5b1TYOSGQPn9FDcrhkoQBV29qwmA2mtkznPAQKnxQg==", - "dev": true, - "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.3" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "source-map": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, - "streamroller": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.3.tgz", - "integrity": "sha512-AegmvQsscTRhHVO46PhCDerjIpxi7E+d2GxgUDu+nzw/HuLnUdxHWr6WQ+mVn/4iJgMKKFFdiUwFcFRDvcjCtw==", - "dev": true, - "requires": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - } - } - }, "tmp": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.1.0.tgz", @@ -4151,6 +4750,12 @@ } } }, + "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 + }, "lcov-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", @@ -4164,19 +4769,20 @@ "dev": true }, "lint-staged": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.2.tgz", - "integrity": "sha512-78kNqNdDeKrnqWsexAmkOU3Z5wi+1CsQmUmfCuYgMTE8E4rAIX8RHW7xgxwAZ+LAayb7Cca4uYX4P3LlevzjVg==", + "version": "10.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.2.7.tgz", + "integrity": "sha512-srod2bTpF8riaLz+Bgr6v0mI/nSntE8M9jbh4WwAhoosx0G7RKEUIG7mI5Nu5SMbTF9o8GROPgK0Lhf5cDnUUw==", "dev": true, "requires": { "chalk": "^4.0.0", - "commander": "^5.0.0", + "cli-truncate": "2.1.0", + "commander": "^5.1.0", "cosmiconfig": "^6.0.0", "debug": "^4.1.1", "dedent": "^0.7.0", - "execa": "^4.0.0", - "listr2": "1.3.8", - "log-symbols": "^3.0.0", + "execa": "^4.0.1", + "listr2": "^2.0.2", + "log-symbols": "^4.0.0", "micromatch": "^4.0.2", "normalize-path": "^3.0.0", "please-upgrade-node": "^3.2.0", @@ -4219,13 +4825,21 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "execa": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", "dev": true, "requires": { - "ms": "^2.1.1" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, "has-flag": { @@ -4234,12 +4848,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "supports-color": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", @@ -4252,23 +4860,23 @@ } }, "listr2": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-1.3.8.tgz", - "integrity": "sha512-iRDRVTgSDz44tBeBBg/35TQz4W+EZBWsDUq7hPpqeUHm7yLPNll0rkwW3lIX9cPAK7l+x95mGWLpxjqxftNfZA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.0.4.tgz", + "integrity": "sha512-oJaAcplPsa72rKW0eg4P4LbEJjhH+UO2I8uqR/I2wzHrVg16ohSfUy0SlcHS21zfYXxtsUpL8YXGHjyfWMR0cg==", "dev": true, "requires": { "@samverschueren/stream-to-observable": "^0.3.0", - "chalk": "^3.0.0", + "chalk": "^4.0.0", "cli-cursor": "^3.1.0", "cli-truncate": "^2.1.0", "elegant-spinner": "^2.0.0", - "enquirer": "^2.3.4", + "enquirer": "^2.3.5", "figures": "^3.2.0", "indent-string": "^4.0.0", "log-update": "^4.0.0", "p-map": "^4.0.0", "pad": "^3.2.0", - "rxjs": "^6.3.3", + "rxjs": "^6.5.5", "through": "^2.3.8", "uuid": "^7.0.2" }, @@ -4284,9 +4892,9 @@ } }, "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", "dev": true, "requires": { "ansi-styles": "^4.1.0", @@ -4465,12 +5073,64 @@ "dev": true }, "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", "dev": true, "requires": { - "chalk": "^2.4.2" + "chalk": "^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": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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" + } + } } }, "log-update": { @@ -4524,33 +5184,16 @@ } }, "log4js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-4.5.1.tgz", - "integrity": "sha512-EEEgFcE9bLgaYUKuozyFfytQM2wDHtXn4tAN41pkaxpNjAykv11GVdeI4tHtmPWW4Xrgh9R/2d7XYghDVjbKKw==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", "dev": true, "requires": { - "date-format": "^2.0.0", + "date-format": "^3.0.0", "debug": "^4.1.1", - "flatted": "^2.0.0", + "flatted": "^2.0.1", "rfdc": "^1.1.4", - "streamroller": "^1.0.6" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "streamroller": "^2.2.4" } }, "loud-rejection": { @@ -4602,9 +5245,9 @@ "dev": true }, "marked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-1.0.0.tgz", - "integrity": "sha512-Wo+L1pWTVibfrSr+TTtMuiMfNzmZWiOPeO7rZsQUY5bgsxpHesBEcIWJloWVTFnrMXnf/TL30eTFSGJddmQAng==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-1.1.0.tgz", + "integrity": "sha512-EkE7RW6KcXfMHy2PA7Jg0YJE1l8UPEZE8k45tylzmZM30/r1M1MUXWQfJlrSbsTeh7m/XTwHbWUENvAJZpp1YA==", "dev": true }, "marked-terminal": { @@ -4737,12 +5380,20 @@ "requires": { "bn.js": "^4.0.0", "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", "dev": true }, "mime-db": { @@ -4766,6 +5417,12 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "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 + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -4803,6 +5460,12 @@ "is-plain-obj": "^1.1.0" } }, + "mitt": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.0.1.tgz", + "integrity": "sha512-FhuJY+tYHLnPcBHQhbUFzscD5512HumCPE4URXZUgPi3IvOJi4Xva5IIgy3xX56GqCmw++MAm5UURG6kDBYTdg==", + "dev": true + }, "mkdirp": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", @@ -4820,6 +5483,12 @@ } } }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "modify-values": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", @@ -4827,9 +5496,9 @@ "dev": true }, "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 }, "negotiator": { @@ -4896,9 +5565,9 @@ "dev": true }, "npm": { - "version": "6.14.4", - "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.4.tgz", - "integrity": "sha512-B8UDDbWvdkW6RgXFn8/h2cHJP/u/FPa4HWeGzW23aNEBARN3QPrRaHqPIZW2NSN3fW649gtgUDNZpaRs0zTMPw==", + "version": "6.14.5", + "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.5.tgz", + "integrity": "sha512-CDwa3FJd0XJpKDbWCST484H+mCNjF26dPrU+xnREW+upR0UODjMEfXPl3bxWuAwZIX6c2ASg1plLO7jP8ehWeA==", "dev": true, "requires": { "JSONStream": "^1.3.5", @@ -4930,7 +5599,7 @@ "fs-write-stream-atomic": "~1.0.10", "gentle-fs": "^2.3.0", "glob": "^7.1.6", - "graceful-fs": "^4.2.3", + "graceful-fs": "^4.2.4", "has-unicode": "~2.0.1", "hosted-git-info": "^2.8.8", "iferr": "^1.0.2", @@ -4967,10 +5636,10 @@ "lru-cache": "^5.1.1", "meant": "~1.0.1", "mississippi": "^3.0.0", - "mkdirp": "^0.5.4", + "mkdirp": "^0.5.5", "move-concurrently": "^1.0.1", "node-gyp": "^5.1.0", - "nopt": "~4.0.1", + "nopt": "^4.0.3", "normalize-package-data": "^2.5.0", "npm-audit-report": "^1.3.2", "npm-cache-filename": "~1.0.2", @@ -4980,7 +5649,7 @@ "npm-packlist": "^1.4.8", "npm-pick-manifest": "^3.0.2", "npm-profile": "^4.0.4", - "npm-registry-fetch": "^4.0.3", + "npm-registry-fetch": "^4.0.4", "npm-user-validate": "~1.0.0", "npmlog": "~4.1.2", "once": "~1.4.0", @@ -6153,7 +6822,7 @@ } }, "graceful-fs": { - "version": "4.2.3", + "version": "4.2.4", "bundled": true, "dev": true }, @@ -6916,7 +7585,7 @@ } }, "mkdirp": { - "version": "0.5.4", + "version": "0.5.5", "bundled": true, "dev": true, "requires": { @@ -6994,7 +7663,7 @@ } }, "nopt": { - "version": "4.0.1", + "version": "4.0.3", "bundled": true, "dev": true, "requires": { @@ -7120,7 +7789,7 @@ } }, "npm-registry-fetch": { - "version": "4.0.3", + "version": "4.0.4", "bundled": true, "dev": true, "requires": { @@ -8445,12 +9114,6 @@ "path-key": "^3.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.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -8463,18 +9126,40 @@ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", "dev": true }, - "object-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz", - "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==", + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", "dev": true }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "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" + } + }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -8524,12 +9209,6 @@ "windows-release": "^3.1.0" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "p-each-series": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz", @@ -8545,6 +9224,12 @@ "p-map": "^2.0.0" } }, + "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": "3.0.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-3.0.0.tgz", @@ -8871,6 +9556,14 @@ "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, "pump": { @@ -8890,45 +9583,47 @@ "dev": true }, "puppeteer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", - "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-3.2.0.tgz", + "integrity": "sha512-wkVid0V1p3Gw0u8Jyq0JxBaenx6H+/lmQIYDfHZS20IrhAobP70LSrWI6bF75olAKlrdR50w7IZxjaB09M6tDQ==", "dev": true, "requires": { - "@types/mime-types": "^2.1.0", "debug": "^4.1.0", - "extract-zip": "^1.6.6", + "extract-zip": "^2.0.0", "https-proxy-agent": "^4.0.0", "mime": "^2.0.3", - "mime-types": "^2.1.25", + "mitt": "^2.0.1", "progress": "^2.0.1", "proxy-from-env": "^1.0.0", - "rimraf": "^2.6.1", - "ws": "^6.1.0" + "rimraf": "^3.0.2", + "tar-fs": "^2.0.0", + "unbzip2-stream": "^1.3.3", + "ws": "^7.2.3" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", "dev": true }, - "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", "dev": true, "requires": { - "async-limiter": "~1.0.0" + "agent-base": "5", + "debug": "4" + } + }, + "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" } } } @@ -9300,9 +9995,9 @@ "dev": true }, "semantic-release": { - "version": "17.0.7", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.0.7.tgz", - "integrity": "sha512-F6FzJI1yiGavzCTXir4yPthK/iozZPJ4myUYndiHhSHbmOcCSJ2m7V+P6sFwVpDpQKQp1Q31M68sTJ/Q/27Bow==", + "version": "17.0.8", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.0.8.tgz", + "integrity": "sha512-9KcdidiJ4xchrJXxPdaDQVlybgX0xTeKyVjRySYk5u9GpjibXD7E5F8cB0BvFLMDmMyrkCwcem0kFiaLD2VNPg==", "dev": true, "requires": { "@semantic-release/commit-analyzer": "^8.0.0", @@ -9335,13 +10030,21 @@ "yargs": "^15.0.1" }, "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "execa": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.2.tgz", + "integrity": "sha512-QI2zLa6CjGWdiQsmSkZoGtDx2N+cQIGb3yNolGTdjSQzydzLgYYf8LRuagp7S7fPimjcrzUDSUFd/MgzELMi4Q==", "dev": true, "requires": { - "ms": "^2.1.1" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, "hosted-git-info": { @@ -9353,12 +10056,6 @@ "lru-cache": "^5.1.1" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, "read-pkg": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", @@ -9561,28 +10258,17 @@ } }, "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.3.0.tgz", + "integrity": "sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==", "dev": true, "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", + "debug": "~4.1.0", + "engine.io": "~3.4.0", "has-binary2": "~1.0.2", "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.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" - } - } + "socket.io-client": "2.3.0", + "socket.io-parser": "~3.4.0" } }, "socket.io-adapter": { @@ -9592,58 +10278,66 @@ "dev": true }, "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.3.0.tgz", + "integrity": "sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==", "dev": true, "requires": { "backo2": "1.0.2", "base64-arraybuffer": "0.1.5", "component-bind": "1.0.0", "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", + "debug": "~4.1.0", + "engine.io-client": "~3.4.0", "has-binary2": "~1.0.2", "has-cors": "1.1.0", "indexof": "0.0.1", "object-component": "0.0.3", "parseqs": "0.0.5", "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", + "socket.io-parser": "~3.3.0", "to-array": "0.1.4" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz", + "integrity": "sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==", "dev": true, "requires": { - "ms": "2.0.0" + "component-emitter": "1.2.1", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "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" + } + } } } } }, "socket.io-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", "dev": true, "requires": { "component-emitter": "1.2.1", - "debug": "~3.1.0", + "debug": "~4.1.0", "isarray": "2.0.1" - }, - "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" - } - } } }, "source-map": { @@ -9882,43 +10576,66 @@ } }, "stream-http": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.0.tgz", - "integrity": "sha512-cuB6RgO7BqC4FBYzmnvhob5Do3wIdIsXAgGycHJnW+981gHqoYcYz9lqjJrk8WXRddbwPuqPYRl+bag6mYv4lw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", + "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^3.0.6", - "xtend": "^4.0.0" + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + } } }, "streamroller": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", - "integrity": "sha512-3QC47Mhv3/aZNFpDDVO44qQb9gwB9QggMEE0sQmkTAwBVYdBRWISdsywlkfm5II1Q5y/pmrHflti/IgmIzdDBg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", "dev": true, "requires": { - "async": "^2.6.2", - "date-format": "^2.0.0", - "debug": "^3.2.6", - "fs-extra": "^7.0.1", - "lodash": "^4.17.14" + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "fs-extra": { + "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": { - "ms": "^2.1.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true } } @@ -9940,6 +10657,48 @@ "strip-ansi": "^6.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.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -10035,6 +10794,31 @@ } } }, + "tar-fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", + "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "dev": true, + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -10092,12 +10876,23 @@ } }, "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" + "rimraf": "^3.0.0" + }, + "dependencies": { + "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" + } + } } }, "to-array": { @@ -10271,12 +11066,6 @@ "mime-types": "~2.1.24" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "typescript": { "version": "3.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", @@ -10290,9 +11079,9 @@ "dev": true }, "uglify-js": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.1.tgz", - "integrity": "sha512-JUPoL1jHsc9fOjVFHdQIhqEEJsQvfKDjlubcCilu8U26uZ73qOg8VsN8O1jbuei44ZPlwL7kmbAdM4tzaUvqnA==", + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", + "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", "dev": true, "optional": true, "requires": { @@ -10308,11 +11097,15 @@ } } }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } }, "unique-string": { "version": "2.0.0", @@ -10333,9 +11126,9 @@ } }, "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", + "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, "unpipe": { @@ -10378,15 +11171,17 @@ "dev": true }, "util": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.2.tgz", - "integrity": "sha512-XE+MkWQvglYa+IOfBt5UFG93EmncEMP23UqpgDvVZVFBPxwmkK10QRp6pgU4xICPnWRf/t0zPv4noYSUq9gqUQ==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.3.tgz", + "integrity": "sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog==", "dev": true, "requires": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", - "safe-buffer": "^5.1.2" + "is-typed-array": "^1.1.3", + "safe-buffer": "^5.1.2", + "which-typed-array": "^1.1.2" } }, "util-deprecate": { @@ -10470,6 +11265,20 @@ "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", "dev": true }, + "which-typed-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.2.tgz", + "integrity": "sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.2", + "es-abstract": "^1.17.5", + "foreach": "^2.0.5", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.1", + "is-typed-array": "^1.1.3" + } + }, "windows-release": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.0.tgz", @@ -10477,87 +11286,6 @@ "dev": true, "requires": { "execa": "^1.0.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "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 - }, - "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 - } } }, "wordwrap": { @@ -10611,23 +11339,10 @@ "dev": true }, "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.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 - } - } + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", + "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==", + "dev": true }, "xmlbuilder": { "version": "12.0.0", diff --git a/package.json b/package.json index ec408296f..8a0538c9f 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,11 @@ "s:a7": "P=e2e/angular7/node_modules/ngrx-entity-relationship && rm -Rf $P && mkdir -p $P && cp -R dist $P && cp package.json $P", "s:a8": "P=e2e/angular8/node_modules/ngrx-entity-relationship && rm -Rf $P && mkdir -p $P && cp -R dist $P && cp package.json $P", "s:a9": "P=e2e/angular9/node_modules/ngrx-entity-relationship && rm -Rf $P && mkdir -p $P && cp -R dist $P && cp package.json $P", + "s:test": "npm run s:test:a6 && npm run s:test:a7 && npm run s:test:a8 && npm run s:test:a9", + "s:test:a6": "P=e2e/angular6/src/test && rm -Rf $P && mkdir -p $P && cp -R test $P", + "s:test:a7": "P=e2e/angular7/src/test && rm -Rf $P && mkdir -p $P && cp -R test $P", + "s:test:a8": "P=e2e/angular8/src/test && rm -Rf $P && mkdir -p $P && cp -R test $P", + "s:test:a9": "P=e2e/angular9/src/test && rm -Rf $P && mkdir -p $P && cp -R test $P", "i:a6": "cd e2e/angular6 && npm install && npm run postinstall", "i:a7": "cd e2e/angular7 && npm install && npm run postinstall", "i:a8": "cd e2e/angular8 && npm install && npm run postinstall", @@ -29,11 +34,16 @@ "e2e:a8": "cd e2e/angular8 && npm run e2e", "e2e:a9": "cd e2e/angular9 && npm run e2e", "e2e:a": "npm run e2e:a6 && npm run e2e:a7 && npm run e2e:a8 && npm run e2e:a9", - "e2e": "npm run i:a && npm run s:a && npm run e2e:a", + "e2e": "npm run build && npm run i:a && npm run s:a && npm run s:test && npm run test:a && npm run e2e:a", "lint": "tsc -p ./tsconfig.json --noEmit && tsc -p ./tsconfig.spec.json --noEmit && tslint --config ./tslint.yaml -p ./tsconfig.json", - "release": "semantic-release", + "release": "export $(cat .env) && semantic-release", "test": "karma start", - "test:debug": "npm test -- --no-single-run --auto-watch --browsers=Chrome" + "test:debug": "npm test -- --no-single-run --auto-watch --browsers=Chrome", + "test:a": "npm run test:a6 && npm run test:a7 &&npm run test:a8 && npm run test:a9", + "test:a6": "cd e2e/angular6 && npm run test", + "test:a7": "cd e2e/angular7 && npm run test", + "test:a8": "cd e2e/angular8 && npm run test", + "test:a9": "cd e2e/angular9 && npm run test" }, "repository": { "type": "git", @@ -66,29 +76,29 @@ "@semantic-release/changelog": "^5.0.1", "@semantic-release/exec": "^5.0.0", "@semantic-release/git": "^9.0.0", - "@semantic-release/github": "^7.0.5", + "@semantic-release/github": "^7.0.7", "@types/jasmine": "^3.5.10", - "@types/node": "^12.12.37", + "@types/node": "^12.12.42", "coveralls": "^3.1.0", "husky": "^4.2.5", "jasmine": "^3.5.0", - "jasmine-core": "^3.1.0", - "karma": "^5.0.4", + "jasmine-core": "^3.5.0", + "karma": "^5.0.9", "karma-chrome-launcher": "^3.1.0", "karma-coverage": "^2.0.2", - "karma-jasmine": "^3.1.1", + "karma-jasmine": "^3.3.1", "karma-junit-reporter": "^2.0.1", - "karma-typescript": "^5.0.2", - "lint-staged": "^10.2.2", + "karma-typescript": "^5.0.3", + "lint-staged": "^10.2.7", "prettier": "^2.0.5", - "puppeteer": "^2.1.1", + "puppeteer": "^3.2.0", "rxjs": "^6.5.5", - "semantic-release": "^17.0.7", + "semantic-release": "^17.0.8", "tslint": "^6.1.2", "tslint-defocus": "^2.0.6", "tslint-lines-between-class-members": "^1.3.6", "tslint-microsoft-contrib": "^6.2.0", - "typescript": "^3.8.3" + "typescript": "~3.8.3" }, "husky": { "hooks": { diff --git a/src/childEntity.ts b/src/childEntity.ts index 40fb8ec81..accc7b037 100644 --- a/src/childEntity.ts +++ b/src/childEntity.ts @@ -6,6 +6,8 @@ import { ID_FILTER_PROPS, ID_SELECTOR, ID_TYPES, + isSelectorMeta, + SELECTOR_META, UNKNOWN, VALUES_FILTER_PROPS, } from './types'; @@ -15,12 +17,16 @@ export function childEntity< STORE, PARENT_ENTITY, RELATED_ENTITY, - RELATED_KEY_IDS extends ID_FILTER_PROPS, - RELATED_KEY_VALUES extends VALUES_FILTER_PROPS + RELATED_KEY_IDS extends ID_FILTER_PROPS = ID_FILTER_PROPS, + RELATED_KEY_VALUES extends VALUES_FILTER_PROPS = VALUES_FILTER_PROPS< + PARENT_ENTITY, + RELATED_ENTITY + > >( featureSelector: FEATURE_SELECTOR, keyId: RELATED_KEY_IDS, keyValue: RELATED_KEY_VALUES, + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, ...relationships: Array> ): HANDLER_RELATED_ENTITY; @@ -38,6 +44,12 @@ export function childEntity< let relationships: Array> = [...arguments]; relationships = relationships.slice(3); + let meta: SELECTOR_META = {}; + if (isSelectorMeta(relationships[0])) { + meta = relationships[0]; + relationships = relationships.slice(1); + } + const {collection: collectionSelector, id: idSelector} = normalizeSelector(featureSelector); const callback = ( @@ -101,7 +113,7 @@ export function childEntity< checksEntities.set(null, featureState.entities); checksEntities.set(id, featureState.entities[id]); - // we have to clone it because we are going to update it with relations. + // we have to clone it because we are going to update it with relationships. value = {...featureState.entities[id]} as RELATED_ENTITY; let cacheRelLevelIndex = 0; @@ -119,6 +131,7 @@ export function childEntity< }; callback.ngrxEntityRelationship = 'childEntity'; callback.collectionSelector = collectionSelector; + callback.meta = meta; callback.idSelector = idSelector; callback.relationships = relationships; callback.keyId = keyId; diff --git a/src/childEntitySelector.ts b/src/childEntitySelector.ts index 693533fab..03f3437dc 100644 --- a/src/childEntitySelector.ts +++ b/src/childEntitySelector.ts @@ -1,5 +1,30 @@ import {childEntity} from './childEntity'; -import {FEATURE_SELECTOR, HANDLER_RELATED_ENTITY, ID_FILTER_PROPS, ID_TYPES} from './types'; +import { + FEATURE_SELECTOR, + HANDLER_RELATED_ENTITY, + ID_FILTER_PROPS, + ID_TYPES, + isSelectorMeta, + SELECTOR_META, +} from './types'; + +export function childEntitySelector< + STORE, + PARENT_ENTITY extends { + [KEY in RELATED_KEY_VALUES]?: RELATED_ENTITY; + }, + RELATED_ENTITY, + RELATED_KEY_IDS extends ID_FILTER_PROPS = ID_FILTER_PROPS, + RELATED_KEY_VALUES extends keyof any = keyof any +>( + featureSelector: FEATURE_SELECTOR, + keyId: RELATED_KEY_IDS, + keyValue: RELATED_KEY_VALUES, + meta?: SELECTOR_META, +): ( + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> +) => HANDLER_RELATED_ENTITY; export function childEntitySelector< STORE, @@ -13,17 +38,32 @@ export function childEntitySelector< featureSelector: FEATURE_SELECTOR, keyId: RELATED_KEY_IDS, keyValue: RELATED_KEY_VALUES, + meta?: SELECTOR_META, ): ( - ...relations: Array> + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> ) => HANDLER_RELATED_ENTITY { function callback(): HANDLER_RELATED_ENTITY { - const relations: Array> = [...arguments]; - return childEntity( - featureSelector, - keyId, - keyValue, - ...relations, - ); + let relationships: Array> = [...arguments]; + let currentMeta = isSelectorMeta(meta) ? meta : undefined; + if (isSelectorMeta(relationships[0])) { + currentMeta = relationships[0]; + relationships = relationships.slice(1); + } + return currentMeta + ? childEntity( + featureSelector, + keyId, + keyValue, + currentMeta, + ...relationships, + ) + : childEntity( + featureSelector, + keyId, + keyValue, + ...relationships, + ); } callback.ngrxEntityRelationship = 'childEntitySelector'; diff --git a/src/childrenEntities.ts b/src/childrenEntities.ts index f48bfc385..8550762bc 100644 --- a/src/childrenEntities.ts +++ b/src/childrenEntities.ts @@ -6,6 +6,8 @@ import { ID_FILTER_PROPS, ID_SELECTOR, ID_TYPES, + isSelectorMeta, + SELECTOR_META, UNKNOWN, VALUES_FILTER_PROPS, } from './types'; @@ -15,12 +17,16 @@ export function childrenEntities< STORE, PARENT_ENTITY, RELATED_ENTITY, - RELATED_KEY_IDS extends ID_FILTER_PROPS, - RELATED_KEY_VALUES_ARRAYS extends VALUES_FILTER_PROPS> + RELATED_KEY_IDS extends ID_FILTER_PROPS = ID_FILTER_PROPS, + RELATED_KEY_VALUES_ARRAYS extends VALUES_FILTER_PROPS> = VALUES_FILTER_PROPS< + PARENT_ENTITY, + Array + > >( featureSelector: FEATURE_SELECTOR, keyId: RELATED_KEY_IDS, keyValue: RELATED_KEY_VALUES_ARRAYS, + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, ...relationships: Array> ): HANDLER_RELATED_ENTITY; @@ -38,6 +44,12 @@ export function childrenEntities< let relationships: Array> = [...arguments]; relationships = relationships.slice(3); + let meta: SELECTOR_META = {}; + if (isSelectorMeta(relationships[0])) { + meta = relationships[0]; + relationships = relationships.slice(1); + } + const {collection: collectionSelector, id: idSelector} = normalizeSelector(featureSelector); const emptyResult: Map = new Map(); @@ -121,7 +133,7 @@ export function childrenEntities< } continue; } - // we have to clone it because we are going to update it with relations. + // we have to clone it because we are going to update it with relationships. entityValue = {...featureState.entities[id]} as RELATED_ENTITY; entityChecks = new Map(); const entityChecksEntities = new Map(); @@ -148,6 +160,7 @@ export function childrenEntities< }; callback.ngrxEntityRelationship = 'childrenEntities'; callback.collectionSelector = collectionSelector; + callback.meta = meta; callback.idSelector = idSelector; callback.relationships = relationships; callback.keyId = keyId; diff --git a/src/childrenEntitiesSelector.ts b/src/childrenEntitiesSelector.ts index 8f78309d3..f55458417 100644 --- a/src/childrenEntitiesSelector.ts +++ b/src/childrenEntitiesSelector.ts @@ -1,5 +1,30 @@ import {childrenEntities} from './childrenEntities'; -import {FEATURE_SELECTOR, HANDLER_RELATED_ENTITY, ID_FILTER_PROPS, ID_TYPES} from './types'; +import { + FEATURE_SELECTOR, + HANDLER_RELATED_ENTITY, + ID_FILTER_PROPS, + ID_TYPES, + isSelectorMeta, + SELECTOR_META, +} from './types'; + +export function childrenEntitiesSelector< + STORE, + PARENT_ENTITY extends { + [KEY in RELATED_KEY_VALUES_ARRAYS]?: Array; + }, + RELATED_ENTITY, + RELATED_KEY_IDS extends ID_FILTER_PROPS = ID_FILTER_PROPS, + RELATED_KEY_VALUES_ARRAYS extends keyof any = keyof any +>( + featureSelector: FEATURE_SELECTOR, + keyId: RELATED_KEY_IDS, + keyValue: RELATED_KEY_VALUES_ARRAYS, + meta?: SELECTOR_META, +): ( + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> +) => HANDLER_RELATED_ENTITY; export function childrenEntitiesSelector< STORE, @@ -13,17 +38,32 @@ export function childrenEntitiesSelector< featureSelector: FEATURE_SELECTOR, keyId: RELATED_KEY_IDS, keyValue: RELATED_KEY_VALUES_ARRAYS, + meta?: SELECTOR_META, ): ( - ...relations: Array> + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> ) => HANDLER_RELATED_ENTITY { function callback(): HANDLER_RELATED_ENTITY { - const relations: Array> = [...arguments]; - return childrenEntities( - featureSelector, - keyId, - keyValue, - ...relations, - ); + let relationships: Array> = [...arguments]; + let currentMeta = isSelectorMeta(meta) ? meta : undefined; + if (isSelectorMeta(relationships[0])) { + currentMeta = relationships[0]; + relationships = relationships.slice(1); + } + return currentMeta + ? childrenEntities( + featureSelector, + keyId, + keyValue, + currentMeta, + ...relationships, + ) + : childrenEntities( + featureSelector, + keyId, + keyValue, + ...relationships, + ); } callback.ngrxEntityRelationship = 'childrenEntitiesSelector'; diff --git a/src/index.ts b/src/index.ts index aa92f4847..7f112df51 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,3 +12,22 @@ export * from './relatedEntitySelector'; export * from './rootEntitySelector'; export * from './operators/relationships'; + +export * from './store'; + +export { + ENTITY_SELECTOR, + ENTITY_STATE, + FEATURE_SELECTOR, + HANDLER_RELATED_ENTITY, + HANDLER_ROOT_ENTITIES, + HANDLER_ROOT_ENTITY, + ID_SELECTOR, + ID_TYPES, + SELECTOR_META, + STORE_INSTANCE, + STORE_SELECTOR, + TRANSFORMER, + isBuiltInSelector, + isSelectorMeta, +} from './types'; diff --git a/src/relatedEntity.ts b/src/relatedEntity.ts index 9272623dd..028fb6c14 100644 --- a/src/relatedEntity.ts +++ b/src/relatedEntity.ts @@ -5,6 +5,8 @@ import { HANDLER_RELATED_ENTITY, ID_FILTER_PROPS, ID_TYPES, + isSelectorMeta, + SELECTOR_META, UNKNOWN, VALUES_FILTER_PROPS, } from './types'; @@ -14,14 +16,24 @@ export function relatedEntity< STORE, PARENT_ENTITY, RELATED_ENTITY, - RELATED_KEY_IDS extends ID_FILTER_PROPS, - RELATED_KEY_IDS_ARRAYS extends ID_FILTER_PROPS>, - RELATED_KEY_VALUES extends VALUES_FILTER_PROPS, - RELATED_KEY_VALUES_ARRAYS extends VALUES_FILTER_PROPS> + RELATED_KEY_IDS extends ID_FILTER_PROPS = ID_FILTER_PROPS, + RELATED_KEY_IDS_ARRAYS extends ID_FILTER_PROPS> = ID_FILTER_PROPS< + PARENT_ENTITY, + Array + >, + RELATED_KEY_VALUES extends VALUES_FILTER_PROPS = VALUES_FILTER_PROPS< + PARENT_ENTITY, + RELATED_ENTITY + >, + RELATED_KEY_VALUES_ARRAYS extends VALUES_FILTER_PROPS> = VALUES_FILTER_PROPS< + PARENT_ENTITY, + Array + > >( featureSelector: FEATURE_SELECTOR, keyId: RELATED_KEY_IDS | RELATED_KEY_IDS_ARRAYS, keyValue: RELATED_KEY_VALUES | RELATED_KEY_VALUES_ARRAYS, + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, ...relationships: Array> ): HANDLER_RELATED_ENTITY; @@ -41,6 +53,12 @@ export function relatedEntity< let relationships: Array> = [...arguments]; relationships = relationships.slice(3); + let meta: SELECTOR_META = {}; + if (isSelectorMeta(relationships[0])) { + meta = relationships[0]; + relationships = relationships.slice(1); + } + const {collection: collectionSelector, id: idSelector} = normalizeSelector(featureSelector); const emptyResult: Map = new Map(); @@ -115,7 +133,7 @@ export function relatedEntity< } continue; } - // we have to clone it because we are going to update it with relations. + // we have to clone it because we are going to update it with relationships. entityValue = {...featureState.entities[id]} as RELATED_ENTITY; entityChecks = new Map(); const entityCheckIds = new Map(); @@ -143,6 +161,7 @@ export function relatedEntity< }; callback.ngrxEntityRelationship = 'relatedEntity'; callback.collectionSelector = collectionSelector; + callback.meta = meta; callback.idSelector = idSelector; callback.relationships = relationships; callback.keyId = keyId; diff --git a/src/relatedEntitySelector.ts b/src/relatedEntitySelector.ts index 2642adc21..5e46c5bd5 100644 --- a/src/relatedEntitySelector.ts +++ b/src/relatedEntitySelector.ts @@ -1,5 +1,35 @@ import {relatedEntity} from './relatedEntity'; -import {FEATURE_SELECTOR, HANDLER_RELATED_ENTITY, ID_TYPES} from './types'; +import {FEATURE_SELECTOR, HANDLER_RELATED_ENTITY, ID_TYPES, isSelectorMeta, SELECTOR_META} from './types'; + +export function relatedEntitySelector< + STORE, + PARENT_ENTITY extends + | { + [KEY in RELATED_KEY_IDS | RELATED_KEY_VALUES]?: KEY extends RELATED_KEY_IDS + ? ID_TYPES + : KEY extends RELATED_KEY_VALUES + ? RELATED_ENTITY | null + : never; + } + | { + [KEY in RELATED_KEY_IDS | RELATED_KEY_VALUES]?: KEY extends RELATED_KEY_IDS + ? Array + : KEY extends RELATED_KEY_VALUES + ? Array | null + : never; + }, + RELATED_ENTITY, + RELATED_KEY_IDS extends keyof any = keyof any, + RELATED_KEY_VALUES extends keyof any = keyof any +>( + featureSelector: FEATURE_SELECTOR, + keyId: RELATED_KEY_IDS, + keyValue: RELATED_KEY_VALUES, + meta?: SELECTOR_META, +): ( + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> +) => HANDLER_RELATED_ENTITY; export function relatedEntitySelector< STORE, @@ -25,17 +55,32 @@ export function relatedEntitySelector< featureSelector: FEATURE_SELECTOR, keyId: RELATED_KEY_IDS, keyValue: RELATED_KEY_VALUES, + meta?: SELECTOR_META, ): ( - ...relations: Array> + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> ) => HANDLER_RELATED_ENTITY { function callback(): HANDLER_RELATED_ENTITY { - const relations: Array> = [...arguments]; - return relatedEntity( - featureSelector, - keyId, - keyValue, - ...relations, - ); + let relationships: Array> = [...arguments]; + let currentMeta = meta; + if (isSelectorMeta(relationships[0])) { + currentMeta = relationships[0]; + relationships = relationships.slice(1); + } + return currentMeta + ? relatedEntity( + featureSelector, + keyId, + keyValue, + currentMeta, + ...relationships, + ) + : relatedEntity( + featureSelector, + keyId, + keyValue, + ...relationships, + ); } callback.ngrxEntityRelationship = 'relatedEntitySelector'; diff --git a/src/rootEntities.ts b/src/rootEntities.ts index f2746cd3e..4057d5ae9 100644 --- a/src/rootEntities.ts +++ b/src/rootEntities.ts @@ -53,6 +53,7 @@ export function rootEntities( return value; }; callback.ngrxEntityRelationship = 'rootEntities'; + callback.meta = rootSelector.meta; callback.collectionSelector = rootSelector.collectionSelector; callback.idSelector = rootSelector.idSelector; callback.relationships = rootSelector.relationships; diff --git a/src/rootEntity.ts b/src/rootEntity.ts index 31b6000ea..ceeb37ebe 100644 --- a/src/rootEntity.ts +++ b/src/rootEntity.ts @@ -7,6 +7,8 @@ import { HANDLER_ROOT_ENTITY, ID_TYPES, isBuiltInSelector, + isSelectorMeta, + SELECTOR_META, TRANSFORMER, UNKNOWN, } from './types'; @@ -14,25 +16,51 @@ import {mergeCache, normalizeSelector, verifyCache} from './utils'; export function rootEntity( featureSelector: FEATURE_SELECTOR, - ...relations: Array> + ...relationships: Array> ): HANDLER_ROOT_ENTITY; + +export function rootEntity( + featureSelector: FEATURE_SELECTOR, + meta: SELECTOR_META, + ...relationships: Array> +): HANDLER_ROOT_ENTITY; + +export function rootEntity( + featureSelector: FEATURE_SELECTOR, + transformer: TRANSFORMER, + ...relationships: Array> +): HANDLER_ROOT_ENTITY; + export function rootEntity( featureSelector: FEATURE_SELECTOR, transformer: TRANSFORMER, - ...relations: Array> + meta: SELECTOR_META, + ...relationships: Array> ): HANDLER_ROOT_ENTITY; + export function rootEntity( featureSelector: FEATURE_SELECTOR, - deside?: TRANSFORMER | HANDLER_RELATED_ENTITY, + guess1?: TRANSFORMER | SELECTOR_META | HANDLER_RELATED_ENTITY, + guess2?: SELECTOR_META | HANDLER_RELATED_ENTITY, ): HANDLER_ROOT_ENTITY { let relationships: Array> = [...arguments]; relationships = relationships.slice(1); let transformer: undefined | TRANSFORMER; - if (!isBuiltInSelector(deside)) { - transformer = deside; + let meta: SELECTOR_META = {}; + if (!isBuiltInSelector(guess1) && !isSelectorMeta(guess1)) { + transformer = guess1; + relationships = relationships.slice(1); + } + if (!isBuiltInSelector(guess1) && isSelectorMeta(guess1)) { + meta = guess1; + relationships = relationships.slice(1); + } + if (!isBuiltInSelector(guess2) && isSelectorMeta(guess2)) { + meta = guess2; relationships = relationships.slice(1); } + const {collection: collectionSelector, id: idSelector} = normalizeSelector(featureSelector); const cacheLevel = '0'; @@ -76,7 +104,7 @@ export function rootEntity( return value; } - // we have to clone it because we are going to update it with relations. + // we have to clone it because we are going to update it with relationships. value = {...featureState.entities[id]} as ENTITY; let cacheRelLevelIndex = 0; @@ -95,6 +123,7 @@ export function rootEntity( }; callback.ngrxEntityRelationship = 'rootEntity'; callback.collectionSelector = collectionSelector; + callback.meta = meta; callback.idSelector = idSelector; callback.relationships = relationships; callback.release = () => { diff --git a/src/rootEntitySelector.ts b/src/rootEntitySelector.ts index a65520dbd..a0945d122 100644 --- a/src/rootEntitySelector.ts +++ b/src/rootEntitySelector.ts @@ -1,28 +1,71 @@ import {rootEntity} from './rootEntity'; -import {FEATURE_SELECTOR, HANDLER_RELATED_ENTITY, HANDLER_ROOT_ENTITY, ID_TYPES, TRANSFORMER} from './types'; +import { + FEATURE_SELECTOR, + HANDLER_RELATED_ENTITY, + HANDLER_ROOT_ENTITY, + ID_TYPES, + isSelectorMeta, + SELECTOR_META, + TRANSFORMER, +} from './types'; export function rootEntitySelector( featureSelector: FEATURE_SELECTOR, transformer: TRANSFORMER, + meta: SELECTOR_META, ): ( - ...relations: Array> + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> +) => HANDLER_ROOT_ENTITY; + +export function rootEntitySelector( + featureSelector: FEATURE_SELECTOR, + transformer: TRANSFORMER, +): ( + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> ) => HANDLER_ROOT_ENTITY; export function rootEntitySelector( featureSelector: FEATURE_SELECTOR, -): (...relations: Array>) => HANDLER_ROOT_ENTITY; + meta: SELECTOR_META, +): ( + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> +) => HANDLER_ROOT_ENTITY; + +export function rootEntitySelector( + featureSelector: FEATURE_SELECTOR, +): ( + metaOrRelationship?: SELECTOR_META | HANDLER_RELATED_ENTITY, + ...relationships: Array> +) => HANDLER_ROOT_ENTITY; export function rootEntitySelector( featureSelector: FEATURE_SELECTOR, - transformer?: TRANSFORMER, + guess1?: SELECTOR_META | TRANSFORMER, + guess2?: SELECTOR_META, ): ( - ...relations: Array> + meta?: SELECTOR_META, + ...relationships: Array> ) => HANDLER_ROOT_ENTITY { - function callback(): HANDLER_ROOT_ENTITY { - const relations: Array> = [...arguments]; - return transformer - ? rootEntity(featureSelector, transformer, ...relations) - : rootEntity(featureSelector, ...relations); + function callback( + metaOverride?: SELECTOR_META, + ): HANDLER_ROOT_ENTITY { + let relationships: Array> = [...arguments]; + const transformer = isSelectorMeta(guess1) ? undefined : guess1; + let currentMeta = isSelectorMeta(guess1) ? guess1 : guess2; + if (isSelectorMeta(metaOverride)) { + currentMeta = metaOverride; + relationships = relationships.slice(1); + } + return transformer && currentMeta + ? rootEntity(featureSelector, transformer, currentMeta, ...relationships) + : transformer + ? rootEntity(featureSelector, transformer, ...relationships) + : currentMeta + ? rootEntity(featureSelector, currentMeta, ...relationships) + : rootEntity(featureSelector, ...relationships); } callback.ngrxEntityRelationship = 'rootEntitySelector'; diff --git a/src/store/actions.ts b/src/store/actions.ts new file mode 100644 index 000000000..bec3e9e9a --- /dev/null +++ b/src/store/actions.ts @@ -0,0 +1,27 @@ +import {ENTITY_SELECTOR} from '../types'; + +export enum ngrxEntityRelationshipActions { + reduceFlat = '[NGRX-Entity-Relationship] Flat', + reduceGraph = '[NGRX-Entity-Relationship] Graph', +} + +class ReduceFlat { + public readonly type: ngrxEntityRelationshipActions.reduceFlat = ngrxEntityRelationshipActions.reduceFlat; + + constructor(public readonly data: any, public readonly selector: ENTITY_SELECTOR) {} +} + +const reduceFlat = (payload: {data: any; selector: ENTITY_SELECTOR}) => new ReduceFlat(payload.data, payload.selector); +reduceFlat.type = ngrxEntityRelationshipActions.reduceFlat; + +class ReduceGraph { + public readonly type: ngrxEntityRelationshipActions.reduceGraph = ngrxEntityRelationshipActions.reduceGraph; + + constructor(public readonly data: any, public readonly selector: ENTITY_SELECTOR) {} +} + +const reduceGraph = (payload: {data: any; selector: ENTITY_SELECTOR}) => + new ReduceGraph(payload.data, payload.selector); +reduceGraph.type = ngrxEntityRelationshipActions.reduceGraph; + +export {ReduceFlat, reduceFlat, ReduceGraph, reduceGraph}; diff --git a/src/store/fromFlat.ts b/src/store/fromFlat.ts new file mode 100644 index 000000000..f6f040d41 --- /dev/null +++ b/src/store/fromFlat.ts @@ -0,0 +1,50 @@ +import {ENTITY_SELECTOR} from '../types'; + +import {injectEntity} from './injectEntity'; + +const extractMap = ( + selector: ENTITY_SELECTOR, + map: Map; skipFields: Set}>, +) => { + if (!selector.meta || !selector.meta.flatKey) { + throw new Error('Flat key is not provided in meta'); + } + const {selectors = new Set(), skipFields = new Set()} = + map.get(selector.meta.flatKey) || {}; + if (!map.has(selector.meta.flatKey)) { + map.set(selector.meta.flatKey, { + selectors, + skipFields, + }); + } + selectors.add(selector); + for (const relationship of selector.relationships) { + skipFields.add(relationship.keyValue); + extractMap(relationship, map); + } + return map; +}; + +const func = (state: any, selector: ENTITY_SELECTOR, data: any) => { + const map = extractMap(selector, new Map()); + for (const [key, {selectors, skipFields}] of map) { + const isSet = Array.isArray(data[key]); + const entities = isSet ? data[key] : [data[key]]; + + for (const entity of entities) { + if (!entity) { + continue; + } + + for (const entitySelector of selectors) { + state = injectEntity.func(state, entitySelector, entity, {skipFields: [...skipFields]}); + } + } + } + + return state; +}; + +export const fromFlat = { + func, +}; diff --git a/src/store/fromGraph.ts b/src/store/fromGraph.ts new file mode 100644 index 000000000..4d73873d9 --- /dev/null +++ b/src/store/fromGraph.ts @@ -0,0 +1,31 @@ +import {ENTITY_SELECTOR} from '../types'; + +import {injectEntity} from './injectEntity'; + +export const func = (state: any, selector: ENTITY_SELECTOR, data: any) => { + const isSet = Array.isArray(data); + const entities = isSet ? data : [data]; + + // detecting keys we should skip + const skipFields: Array = []; + for (const relationship of selector.relationships) { + skipFields.push(relationship.keyValue); + } + + for (const entity of entities) { + if (!entity) { + continue; + } + + state = injectEntity.func(state, selector, entity, {skipFields}); + for (const relationship of selector.relationships) { + state = func(state, relationship, entity[relationship.keyValue]); + } + } + + return state; +}; + +export const fromGraph = { + func, +}; diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 000000000..f1f1e125b --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,2 @@ +export * from './actions'; +export * from './ngrxEntityRelationshipReducer'; diff --git a/src/store/injectEntity.ts b/src/store/injectEntity.ts new file mode 100644 index 000000000..6e312d4d8 --- /dev/null +++ b/src/store/injectEntity.ts @@ -0,0 +1,65 @@ +import {ENTITY_SELECTOR} from '../types'; + +import {patchState} from './patchState'; + +export const func = (state: any, selector: ENTITY_SELECTOR, entity: any, meta?: {skipFields?: Array}) => { + if (typeof entity !== 'object') { + throw new Error('Entity is not an object'); + } + const id = selector.idSelector(entity); + if (!id) { + throw new Error('Cannot detect id of an entity'); + } + + const originalState = selector.collectionSelector(state); + const originalEntity = originalState.entities[id]; + let featureState = originalState; + + // creating a clone + const clone: any = {}; + for (const key of Object.keys(entity)) { + if (meta && meta.skipFields && meta.skipFields.indexOf(key) !== -1) { + continue; + } + clone[key] = entity[key]; + } + Object.setPrototypeOf(clone, Object.getPrototypeOf(entity)); + + const existingKeys = Object.keys(clone); + for (const key of originalEntity ? Object.keys(originalEntity) : []) { + if (existingKeys.indexOf(key) !== -1) { + continue; + } + clone[key] = originalEntity[key]; + } + + if (featureState.ids.indexOf(id) === -1) { + featureState = { + ...featureState, + ids: [...featureState.ids, id], + }; + } + + let isEntityChanged = !originalEntity; + for (const key of Object.keys(clone)) { + if (isEntityChanged || !originalEntity || clone[key] !== originalEntity[key]) { + isEntityChanged = true; + break; + } + } + if (isEntityChanged) { + featureState = { + ...featureState, + entities: { + ...featureState.entities, + [id]: clone, + }, + }; + } + + return patchState.func(state, originalState, featureState); +}; + +export const injectEntity = { + func, +}; diff --git a/src/store/ngrxEntityRelationshipReducer.ts b/src/store/ngrxEntityRelationshipReducer.ts new file mode 100644 index 000000000..fad4ac766 --- /dev/null +++ b/src/store/ngrxEntityRelationshipReducer.ts @@ -0,0 +1,18 @@ +import {ACTION} from '../types'; + +import {ngrxEntityRelationshipActions} from './actions'; +import {fromFlat} from './fromFlat'; +import {fromGraph} from './fromGraph'; + +export const ngrxEntityRelationshipReducer = (reducer: (state: T | undefined, action: ACTION) => T) => ( + state: T, + action: any, +) => { + if (action.type === ngrxEntityRelationshipActions.reduceGraph) { + return reducer(fromGraph.func(state, action.selector, action.data), action); + } + if (action.type === ngrxEntityRelationshipActions.reduceFlat) { + return reducer(fromFlat.func(state, action.selector, action.data), action); + } + return reducer(state, action); +}; diff --git a/src/store/patchState.ts b/src/store/patchState.ts new file mode 100644 index 000000000..9d1936376 --- /dev/null +++ b/src/store/patchState.ts @@ -0,0 +1,40 @@ +import {UNKNOWN} from '../types'; + +const func = (state: T, source: UNKNOWN, destination: UNKNOWN): T => { + if (source === destination) { + return state; + } + if (state === null) { + return state; + } + if (typeof state !== 'object') { + return state; + } + + for (const key of Object.keys(state)) { + if (typeof state[key] !== 'object' || state[key] === null) { + continue; + } + + if (state[key] === source) { + return { + ...state, + [key]: destination, + }; + } + + const patchedState = func(state[key], source, destination); + if (patchedState !== state[key]) { + return { + ...state, + [key]: patchedState, + }; + } + } + + return state; +}; + +export const patchState = { + func, +}; diff --git a/src/types.ts b/src/types.ts index 0a3953537..f98f4d77c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -10,11 +10,21 @@ export type STORE_INSTANCE = { select(mapFn: (state: T, props: Props) => K, props: Props): Observable; }; +export type ACTION = { + type: string; +}; + +// tslint:disable-next-line:class-name +export interface SELECTOR_META { + flatKey?: string; +} + export type FILTER_PROPS = { [Key in keyof Base]: Base[Key] extends Condition ? Key : never; }[keyof Base]; export type ENTITY_STATE = { + ids: Array; entities: { [id in ID_TYPES]: E | undefined; }; @@ -41,25 +51,25 @@ export type CACHE_CHECKS = Map; export type CACHE_CHECKS_SET = Map>, CACHE_CHECKS>; export type CACHE = Map, UNKNOWN]>>; -export type HANDLER_ROOT_ENTITY = { - (state: S, id: I): undefined | T; +export type ENTITY_SELECTOR = { ngrxEntityRelationship: string; + meta: SELECTOR_META; collectionSelector: STORE_SELECTOR>; idSelector: ID_SELECTOR; relationships: Array>; +}; + +export type HANDLER_ROOT_ENTITY = ENTITY_SELECTOR & { + (state: S, id: I): undefined | T; release(): void; }; -export type HANDLER_ROOT_ENTITIES = { +export type HANDLER_ROOT_ENTITIES = ENTITY_SELECTOR & { (state: S, id: Array): Array; - ngrxEntityRelationship: string; - collectionSelector: STORE_SELECTOR>; - idSelector: ID_SELECTOR; - relationships: Array>; release(): void; }; -export type HANDLER_RELATED_ENTITY = { +export type HANDLER_RELATED_ENTITY = ENTITY_SELECTOR & { ( cachePrefix: string, state: S, @@ -67,10 +77,6 @@ export type HANDLER_RELATED_ENTITY = { source: E, sourceIdSelector: ID_SELECTOR, ): string | undefined; - ngrxEntityRelationship: string; - collectionSelector: STORE_SELECTOR>; - idSelector: ID_SELECTOR; - relationships: Array>; keyId: keyof any; keyValue: keyof any; release(): void; @@ -91,3 +97,7 @@ export type TRANSFORMER = (entity: F) => T; export const isBuiltInSelector = (value: UNKNOWN): value is HANDLER_RELATED_ENTITY => { return value && value.ngrxEntityRelationship; }; + +export const isSelectorMeta = (value: UNKNOWN): value is SELECTOR_META => { + return typeof value === 'object' && value !== null; +}; diff --git a/test/childEntity.spec.ts b/test/childEntity.spec.ts index a1723b956..d6b199142 100644 --- a/test/childEntity.spec.ts +++ b/test/childEntity.spec.ts @@ -1,5 +1,5 @@ -import {childEntity} from '../src'; -import {ENTITY_STATE, FEATURE_SELECTOR, HANDLER_RELATED_ENTITY, UNKNOWN} from '../src/types'; +import {childEntity, ENTITY_STATE, FEATURE_SELECTOR, HANDLER_RELATED_ENTITY} from 'ngrx-entity-relationship'; +import {UNKNOWN} from 'ngrx-entity-relationship/dist/types'; describe('childEntity', () => { type Entity = { @@ -25,6 +25,7 @@ describe('childEntity', () => { it('does not set anything if there is no child entity', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -46,6 +47,7 @@ describe('childEntity', () => { it('sets the child entity if it exists', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -86,6 +88,7 @@ describe('childEntity', () => { it('clones the child entity', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -116,6 +119,7 @@ describe('childEntity', () => { it('sets the cache when the related entity does not exist', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -143,6 +147,7 @@ describe('childEntity', () => { it('sets the cache when the related entity exists', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -187,6 +192,7 @@ describe('childEntity', () => { it('calls relationships with an incrementing prefix and arguments', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -227,6 +233,7 @@ describe('childEntity', () => { it('respects cache of relationships', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -287,6 +294,7 @@ describe('childEntity', () => { it('calls relationships.release on own release call', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -315,6 +323,7 @@ describe('childEntity', () => { it('supports EntityCollectionService as a selector', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -356,6 +365,7 @@ describe('childEntity', () => { it('supports a default selector and returns id field', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -392,6 +402,7 @@ describe('childEntity', () => { it('supports custom feature selector and id field of string', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -431,6 +442,7 @@ describe('childEntity', () => { it('supports custom feature selector and id field of number', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -470,6 +482,7 @@ describe('childEntity', () => { it('supports custom feature selector and id selector', () => { const state = { feature: { + ids: [], entities: {}, }, }; diff --git a/test/childEntitySelector.spec.ts b/test/childEntitySelector.spec.ts index 7593408ea..6e0c55201 100644 --- a/test/childEntitySelector.spec.ts +++ b/test/childEntitySelector.spec.ts @@ -1,5 +1,4 @@ -import {childEntitySelector} from '../src'; -import {HANDLER_RELATED_ENTITY} from '../src/types'; +import {childEntitySelector, HANDLER_RELATED_ENTITY} from 'ngrx-entity-relationship'; describe('childEntitySelector', () => { type Entity = { @@ -22,6 +21,7 @@ describe('childEntitySelector', () => { it('calls childEntity with relations', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -61,7 +61,7 @@ describe('childEntitySelector', () => { jasmine.objectContaining({ rel1: true, rel2: true, - }), + } as any), ); }); }); diff --git a/test/childrenEntities.spec.ts b/test/childrenEntities.spec.ts index 6c901c12a..a5b3af046 100644 --- a/test/childrenEntities.spec.ts +++ b/test/childrenEntities.spec.ts @@ -1,5 +1,5 @@ -import {childrenEntities} from '../src'; -import {ENTITY_STATE, FEATURE_SELECTOR, HANDLER_RELATED_ENTITY, UNKNOWN} from '../src/types'; +import {childrenEntities, ENTITY_STATE, FEATURE_SELECTOR, HANDLER_RELATED_ENTITY} from 'ngrx-entity-relationship'; +import {UNKNOWN} from 'ngrx-entity-relationship/dist/types'; describe('childrenEntities', () => { type Entity = { @@ -25,6 +25,7 @@ describe('childrenEntities', () => { it('set an empty array if there are no child entities', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -46,6 +47,7 @@ describe('childrenEntities', () => { it('set the children entities if they exist', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -98,6 +100,7 @@ describe('childrenEntities', () => { it('clones the children entities', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -128,6 +131,7 @@ describe('childrenEntities', () => { it('sets the cache when the children entities do not exist', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -158,6 +162,7 @@ describe('childrenEntities', () => { it('sets the cache when the children entities exist', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -221,6 +226,7 @@ describe('childrenEntities', () => { it('calls relationships with an incrementing prefix and arguments', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -261,6 +267,7 @@ describe('childrenEntities', () => { it('respects cache of relationships', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -321,6 +328,7 @@ describe('childrenEntities', () => { it('calls relationships.release on own release call', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -349,6 +357,7 @@ describe('childrenEntities', () => { it('supports EntityCollectionService as a selector', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -398,6 +407,7 @@ describe('childrenEntities', () => { it('supports a default selector and returns id field', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -442,6 +452,7 @@ describe('childrenEntities', () => { it('supports custom feature selector and id field of string', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -489,6 +500,7 @@ describe('childrenEntities', () => { it('supports custom feature selector and id field of number', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -536,6 +548,7 @@ describe('childrenEntities', () => { it('supports custom feature selector and id selector', () => { const state = { feature: { + ids: [], entities: {}, }, }; diff --git a/test/childrenEntitiesSelector.spec.ts b/test/childrenEntitiesSelector.spec.ts index f7992d012..ee70877d4 100644 --- a/test/childrenEntitiesSelector.spec.ts +++ b/test/childrenEntitiesSelector.spec.ts @@ -1,5 +1,4 @@ -import {childrenEntitiesSelector} from '../src'; -import {HANDLER_RELATED_ENTITY} from '../src/types'; +import {childrenEntitiesSelector, HANDLER_RELATED_ENTITY} from 'ngrx-entity-relationship'; describe('childrenEntitiesSelector', () => { type Entity = { @@ -22,6 +21,7 @@ describe('childrenEntitiesSelector', () => { it('calls childrenEntities with relations', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -62,6 +62,6 @@ describe('childrenEntitiesSelector', () => { rel1: true, rel2: true, }), - ]); + ] as any); }); }); diff --git a/test/e2e/all-arguments-options-selectors.spec.ts b/test/e2e/all-arguments-options-selectors.spec.ts new file mode 100644 index 000000000..903c3372b --- /dev/null +++ b/test/e2e/all-arguments-options-selectors.spec.ts @@ -0,0 +1,340 @@ +import { + childEntitySelector, + childrenEntitiesSelector, + ENTITY_STATE, + relatedEntitySelector, + rootEntities, + rootEntitySelector, +} from 'ngrx-entity-relationship'; + +describe('all-arguments-options-selectors', () => { + interface User { + id: string; + user: string; + companyId?: string; + company?: Company; + managerId?: string; + manager: User; + employees?: Array; + } + interface Company { + id: string; + company: string; + staff?: Array; + adminId?: string; + admin?: User; + addressId?: string; + address?: Address; + } + interface Address { + id: string; + address: string; + company?: Company; + } + + const state: { + users: ENTITY_STATE; + companies: ENTITY_STATE; + addresses: ENTITY_STATE
; + } = { + users: { + ids: [], + entities: {}, + }, + companies: { + ids: [], + entities: {}, + }, + addresses: { + ids: [], + entities: {}, + }, + }; + + const selectUsersState = (s: typeof state) => s.users; + const selectCompaniesState = (s: typeof state) => s.companies; + const selectAddressesState = (s: typeof state) => s.addresses; + + // selectors + const sUser = rootEntitySelector(selectUsersState); + const sUserCompany = relatedEntitySelector(selectCompaniesState, 'companyId', 'company'); + const sUserManager = relatedEntitySelector(selectUsersState, 'managerId', 'manager'); + const sUserEmployees = childrenEntitiesSelector(selectUsersState, 'managerId', 'employees'); + const sCompany = rootEntitySelector(selectCompaniesState); + const sCompanyStaff = childrenEntitiesSelector(selectUsersState, 'companyId', 'staff'); + const sCompanyAdmin = relatedEntitySelector(selectUsersState, 'adminId', 'admin'); + const sCompanyAddress = relatedEntitySelector(selectAddressesState, 'addressId', 'address'); + const sAddress = rootEntitySelector(selectAddressesState); + const sAddressCompany = childEntitySelector(selectCompaniesState, 'addressId', 'company'); + + // selectors with transformers + const sUserTr = rootEntitySelector(selectUsersState, e => ({...e, tr: true})); + const sCompanyTr = rootEntitySelector(selectCompaniesState, e => ({...e, tr: true})); + const sAddressTr = rootEntitySelector(selectAddressesState, e => ({...e, tr: true})); + + // selectors with meta + const sUserMt = rootEntitySelector(selectUsersState, {flatKey: 'users'}); + const sUserCompanyMt = relatedEntitySelector(selectCompaniesState, 'companyId', 'company', {flatKey: 'companies'}); + const sUserManagerMt = relatedEntitySelector(selectUsersState, 'managerId', 'manager', {flatKey: 'users'}); + const sUserEmployeesMt = childrenEntitiesSelector(selectUsersState, 'managerId', 'employees', {flatKey: 'users'}); + const sCompanyMt = rootEntitySelector(selectCompaniesState, {flatKey: 'companies'}); + const sCompanyStaffMt = childrenEntitiesSelector(selectUsersState, 'companyId', 'staff', {flatKey: 'users'}); + const sCompanyAdminMt = relatedEntitySelector(selectUsersState, 'adminId', 'admin', {flatKey: 'users'}); + const sCompanyAddressMt = relatedEntitySelector(selectAddressesState, 'addressId', 'address', { + flatKey: 'addresses', + }); + const sAddressMt = rootEntitySelector(selectAddressesState, {flatKey: 'addresses'}); + const sAddressCompanyMt = childEntitySelector(selectCompaniesState, 'addressId', 'company', {flatKey: 'companies'}); + + // selectors with transformers and meta + const sUserTrMt = rootEntitySelector(selectUsersState, e => ({...e, tr: true}), {flatKey: 'users'}); + const sCompanyTrMt = rootEntitySelector(selectCompaniesState, e => ({...e, tr: true}), {flatKey: 'companies'}); + const sAddressTrMt = rootEntitySelector(selectAddressesState, e => ({...e, tr: true}), {flatKey: 'addresses'}); + + // creating selector + const sUserSelector = sUser( + sUserCompany(sCompanyStaff(), sCompanyAdmin(), sCompanyAddress()), + sUserManager(sUserCompany(), sUserManager(), sUserEmployees()), + sUserEmployees(sUserCompany(), sUserManager(), sUserEmployees()), + ); + const sUserSelectors = rootEntities(sUserSelector); + const sCompanySelector = sCompany( + sCompanyStaff( + { + flatKey: 'users', + }, + sUserCompany(), + sUserManager(), + sUserEmployees(), + ), + sCompanyAdmin( + sUserCompany({ + flatKey: 'companies', + }), + sUserManager({ + flatKey: 'users', + }), + sUserEmployees({ + flatKey: 'users', + }), + ), + sCompanyAddress( + { + flatKey: 'addresses', + }, + sAddressCompany({ + flatKey: 'companies', + }), + ), + ); + const sCompanySelectors = rootEntities(sCompanySelector); + const sAddressSelector = sAddress( + { + flatKey: 'addresses', + }, + sAddressCompany( + { + flatKey: 'companies', + }, + sCompanyStaff({ + flatKey: 'users', + }), + sCompanyAdmin({ + flatKey: 'users', + }), + sCompanyAddress({ + flatKey: 'addresses', + }), + ), + ); + const sAddressSelectors = rootEntities(sAddressSelector); + + // creating selector with transformers + const sUserSelectorTr = sUserTr( + sUserCompany(sCompanyStaff(), sCompanyAdmin(), sCompanyAddress()), + sUserManager(sUserCompany(), sUserManager(), sUserEmployees()), + sUserEmployees(sUserCompany(), sUserManager(), sUserEmployees()), + ); + const sUserSelectorsTr = rootEntities(sUserSelectorTr); + const sCompanySelectorTr = sCompanyTr( + sCompanyStaff( + { + flatKey: 'users', + }, + sUserCompany(), + sUserManager(), + sUserEmployees(), + ), + sCompanyAdmin( + sUserCompany({ + flatKey: 'companies', + }), + sUserManager({ + flatKey: 'users', + }), + sUserEmployees({ + flatKey: 'users', + }), + ), + sCompanyAddress( + { + flatKey: 'addresses', + }, + sAddressCompany({ + flatKey: 'companies', + }), + ), + ); + const sCompanySelectorsTr = rootEntities(sCompanySelectorTr); + const sAddressSelectorTr = sAddressTr( + { + flatKey: 'addresses', + }, + sAddressCompany( + { + flatKey: 'companies', + }, + sCompanyStaff({ + flatKey: 'users', + }), + sCompanyAdmin({ + flatKey: 'users', + }), + sCompanyAddress({ + flatKey: 'addresses', + }), + ), + ); + const sAddressSelectorsTr = rootEntities(sAddressSelectorTr); + + // creating selector with meta + const sUserSelectorMt = sUserMt( + sUserCompanyMt(sCompanyStaffMt(), sCompanyAdminMt(), sCompanyAddressMt()), + sUserManagerMt(sUserCompanyMt(), sUserManagerMt(), sUserEmployeesMt()), + sUserEmployeesMt(sUserCompanyMt(), sUserManagerMt(), sUserEmployeesMt()), + ); + const sUserSelectorsMt = rootEntities(sUserSelectorMt); + const sCompanySelectorMt = sCompanyMt( + sCompanyStaffMt( + { + flatKey: 'users', + }, + sUserCompanyMt(), + sUserManagerMt(), + sUserEmployeesMt(), + ), + sCompanyAdminMt( + sUserCompanyMt({ + flatKey: 'companies', + }), + sUserManagerMt({ + flatKey: 'users', + }), + sUserEmployeesMt({ + flatKey: 'users', + }), + ), + sCompanyAddressMt( + { + flatKey: 'addresses', + }, + sAddressCompanyMt({ + flatKey: 'companies', + }), + ), + ); + const sCompanySelectorsMt = rootEntities(sCompanySelectorMt); + const sAddressSelectorMt = sAddressMt( + { + flatKey: 'addresses', + }, + sAddressCompanyMt( + { + flatKey: 'companies', + }, + sCompanyStaffMt({ + flatKey: 'users', + }), + sCompanyAdminMt({ + flatKey: 'users', + }), + sCompanyAddressMt({ + flatKey: 'addresses', + }), + ), + ); + const sAddressSelectorsMt = rootEntities(sAddressSelectorMt); + + // creating selector with transformers and meta + const sUserSelectorTrMt = sUserTrMt( + sUserCompanyMt(sCompanyStaffMt(), sCompanyAdminMt(), sCompanyAddressMt()), + sUserManagerMt(sUserCompanyMt(), sUserManagerMt(), sUserEmployeesMt()), + sUserEmployeesMt(sUserCompanyMt(), sUserManagerMt(), sUserEmployeesMt()), + ); + const sUserSelectorsTrMt = rootEntities(sUserSelectorTrMt); + const sCompanySelectorTrMt = sCompanyTrMt( + sCompanyStaffMt( + { + flatKey: 'users', + }, + sUserCompanyMt(), + sUserManagerMt(), + sUserEmployeesMt(), + ), + sCompanyAdminMt( + sUserCompanyMt({ + flatKey: 'companies', + }), + sUserManagerMt({ + flatKey: 'users', + }), + sUserEmployeesMt({ + flatKey: 'users', + }), + ), + sCompanyAddressMt( + { + flatKey: 'addresses', + }, + sAddressCompanyMt({ + flatKey: 'companies', + }), + ), + ); + const sCompanySelectorsTrMt = rootEntities(sCompanySelectorTrMt); + const sAddressSelectorTrMt = sAddressTrMt( + { + flatKey: 'addresses', + }, + sAddressCompanyMt( + { + flatKey: 'companies', + }, + sCompanyStaffMt({ + flatKey: 'users', + }), + sCompanyAdminMt({ + flatKey: 'users', + }), + sCompanyAddressMt({ + flatKey: 'addresses', + }), + ), + ); + const sAddressSelectorsTrMt = rootEntities(sAddressSelectorTrMt); + + it('compiles selectors without an issue', () => { + expect(sUserSelectors(state, [])).toEqual([]); + expect(sCompanySelectors(state, [])).toEqual([]); + expect(sAddressSelectors(state, [])).toEqual([]); + expect(sUserSelectorsTr(state, [])).toEqual([]); + expect(sCompanySelectorsTr(state, [])).toEqual([]); + expect(sAddressSelectorsTr(state, [])).toEqual([]); + expect(sUserSelectorsMt(state, [])).toEqual([]); + expect(sCompanySelectorsMt(state, [])).toEqual([]); + expect(sAddressSelectorsMt(state, [])).toEqual([]); + expect(sUserSelectorsTrMt(state, [])).toEqual([]); + expect(sCompanySelectorsTrMt(state, [])).toEqual([]); + expect(sAddressSelectorsTrMt(state, [])).toEqual([]); + }); +}); diff --git a/test/e2e/all-arguments-options-standard.spec.ts b/test/e2e/all-arguments-options-standard.spec.ts new file mode 100644 index 000000000..dccc54455 --- /dev/null +++ b/test/e2e/all-arguments-options-standard.spec.ts @@ -0,0 +1,429 @@ +import { + childEntity, + childrenEntities, + ENTITY_STATE, + relatedEntity, + rootEntities, + rootEntity, +} from 'ngrx-entity-relationship'; + +describe('all-arguments-options-standard', () => { + interface User { + id: string; + user: string; + companyId?: string; + company?: Company; + managerId?: string; + manager: User; + employees?: Array; + } + + interface Company { + id: string; + company: string; + staff?: Array; + adminId?: string; + admin?: User; + addressId?: string; + address?: Address; + } + + interface Address { + id: string; + address: string; + company?: Company; + } + + const state: { + users: ENTITY_STATE; + companies: ENTITY_STATE; + addresses: ENTITY_STATE
; + } = { + users: { + ids: [], + entities: {}, + }, + companies: { + ids: [], + entities: {}, + }, + addresses: { + ids: [], + entities: {}, + }, + }; + + const selectUsersState = (s: typeof state) => s.users; + const selectCompaniesState = (s: typeof state) => s.companies; + const selectAddressesState = (s: typeof state) => s.addresses; + + // creating selector + const sUserSelector = rootEntity( + selectUsersState, + relatedEntity( + selectCompaniesState, + 'companyId', + 'company', + childrenEntities(selectUsersState, 'companyId', 'staff'), + relatedEntity(selectUsersState, 'adminId', 'admin'), + relatedEntity( + selectAddressesState, + 'addressId', + 'address', + childEntity(selectCompaniesState, 'addressId', 'company'), + ), + ), + relatedEntity( + selectUsersState, + 'managerId', + 'manager', + relatedEntity(selectCompaniesState, 'companyId', 'company'), + relatedEntity(selectUsersState, 'managerId', 'manager'), + childrenEntities(selectUsersState, 'managerId', 'employees'), + ), + childrenEntities( + selectUsersState, + 'managerId', + 'employees', + relatedEntity(selectCompaniesState, 'companyId', 'company'), + relatedEntity(selectUsersState, 'managerId', 'manager'), + childrenEntities(selectUsersState, 'managerId', 'employees'), + ), + ); + const sUserSelectors = rootEntities(sUserSelector); + const sCompanySelector = rootEntity( + selectCompaniesState, + childrenEntities( + selectUsersState, + 'companyId', + 'staff', + { + flatKey: 'users', + }, + relatedEntity(selectCompaniesState, 'companyId', 'company'), + relatedEntity(selectUsersState, 'managerId', 'manager'), + childrenEntities(selectUsersState, 'managerId', 'employees'), + ), + relatedEntity( + selectUsersState, + 'adminId', + 'admin', + relatedEntity(selectCompaniesState, 'companyId', 'company', { + flatKey: 'companies', + }), + relatedEntity(selectUsersState, 'managerId', 'manager', { + flatKey: 'users', + }), + childrenEntities(selectUsersState, 'managerId', 'employees', { + flatKey: 'users', + }), + ), + relatedEntity( + selectAddressesState, + 'addressId', + 'address', + { + flatKey: 'addresses', + }, + childEntity(selectCompaniesState, 'addressId', 'company', { + flatKey: 'companies', + }), + ), + ); + const sCompanySelectors = rootEntities(sCompanySelector); + const sAddressSelector = rootEntity( + selectAddressesState, + { + flatKey: 'addresses', + }, + childEntity( + selectCompaniesState, + 'addressId', + 'company', + { + flatKey: 'companies', + }, + childrenEntities(selectUsersState, 'companyId', 'staff', { + flatKey: 'users', + }), + relatedEntity(selectUsersState, 'adminId', 'admin', { + flatKey: 'users', + }), + relatedEntity(selectAddressesState, 'addressId', 'address', { + flatKey: 'addresses', + }), + ), + ); + const sAddressSelectors = rootEntities(sAddressSelector); + + // creating selector with transformers + const sUserSelectorTr = rootEntity( + selectUsersState, + e => ({...e, tr: true}), + relatedEntity( + selectCompaniesState, + 'companyId', + 'company', + childrenEntities(selectUsersState, 'companyId', 'staff'), + relatedEntity(selectUsersState, 'adminId', 'admin'), + relatedEntity(selectAddressesState, 'addressId', 'address'), + ), + relatedEntity( + selectUsersState, + 'managerId', + 'manager', + relatedEntity(selectCompaniesState, 'companyId', 'company'), + relatedEntity(selectUsersState, 'managerId', 'manager'), + childrenEntities(selectUsersState, 'managerId', 'employees'), + ), + childrenEntities( + selectUsersState, + 'managerId', + 'employees', + relatedEntity(selectCompaniesState, 'companyId', 'company'), + relatedEntity(selectUsersState, 'managerId', 'manager'), + childrenEntities(selectUsersState, 'managerId', 'employees'), + ), + ); + const sUserSelectorsTr = rootEntities(sUserSelectorTr); + const sCompanySelectorTr = rootEntity( + selectCompaniesState, + e => ({...e, tr: true}), + childrenEntities( + selectUsersState, + 'companyId', + 'staff', + { + flatKey: 'users', + }, + relatedEntity(selectCompaniesState, 'companyId', 'company'), + relatedEntity(selectUsersState, 'managerId', 'manager'), + childrenEntities(selectUsersState, 'managerId', 'employees'), + ), + relatedEntity( + selectUsersState, + 'adminId', + 'admin', + relatedEntity(selectCompaniesState, 'companyId', 'company', { + flatKey: 'companies', + }), + relatedEntity(selectUsersState, 'managerId', 'manager', { + flatKey: 'users', + }), + childrenEntities(selectUsersState, 'managerId', 'employees', { + flatKey: 'users', + }), + ), + relatedEntity( + selectAddressesState, + 'addressId', + 'address', + { + flatKey: 'addresses', + }, + childEntity(selectCompaniesState, 'addressId', 'company', { + flatKey: 'companies', + }), + ), + ); + const sCompanySelectorsTr = rootEntities(sCompanySelectorTr); + const sAddressSelectorTr = rootEntity( + selectAddressesState, + e => ({...e, tr: true}), + { + flatKey: 'addresses', + }, + childEntity( + selectCompaniesState, + 'addressId', + 'company', + { + flatKey: 'companies', + }, + childrenEntities(selectUsersState, 'companyId', 'staff', { + flatKey: 'users', + }), + relatedEntity(selectUsersState, 'adminId', 'admin', { + flatKey: 'users', + }), + relatedEntity(selectAddressesState, 'addressId', 'address', { + flatKey: 'addresses', + }), + ), + ); + const sAddressSelectorsTr = rootEntities(sAddressSelectorTr); + + // creating selector with meta + const sUserSelectorMt = rootEntity( + selectUsersState, + {flatKey: 'users'}, + relatedEntity( + selectCompaniesState, + 'companyId', + 'company', + {flatKey: 'companies'}, + childrenEntities(selectUsersState, 'companyId', 'staff', {flatKey: 'users'}), + relatedEntity(selectUsersState, 'adminId', 'admin', {flatKey: 'users'}), + relatedEntity(selectAddressesState, 'addressId', 'address', {flatKey: 'addresses'}), + ), + relatedEntity( + selectUsersState, + 'managerId', + 'manager', + {flatKey: 'users'}, + relatedEntity(selectCompaniesState, 'companyId', 'company', {flatKey: 'companies'}), + relatedEntity(selectUsersState, 'managerId', 'manager', {flatKey: 'users'}), + childrenEntities(selectUsersState, 'managerId', 'employees', {flatKey: 'users'}), + ), + childrenEntities( + selectUsersState, + 'managerId', + 'employees', + {flatKey: 'users'}, + relatedEntity(selectCompaniesState, 'companyId', 'company', {flatKey: 'companies'}), + relatedEntity(selectUsersState, 'managerId', 'manager', {flatKey: 'users'}), + childrenEntities(selectUsersState, 'managerId', 'employees', {flatKey: 'users'}), + ), + ); + const sUserSelectorsMt = rootEntities(sUserSelectorMt); + const sCompanySelectorMt = rootEntity( + selectCompaniesState, + {flatKey: 'companies'}, + childrenEntities( + selectUsersState, + 'companyId', + 'staff', + {flatKey: 'users'}, + relatedEntity(selectCompaniesState, 'companyId', 'company', {flatKey: 'companies'}), + relatedEntity(selectUsersState, 'managerId', 'manager', {flatKey: 'users'}), + childrenEntities(selectUsersState, 'managerId', 'employees', {flatKey: 'users'}), + ), + relatedEntity( + selectUsersState, + 'adminId', + 'admin', + {flatKey: 'users'}, + relatedEntity(selectCompaniesState, 'companyId', 'company', {flatKey: 'companies'}), + relatedEntity(selectUsersState, 'managerId', 'manager', {flatKey: 'users'}), + childrenEntities(selectUsersState, 'managerId', 'employees', {flatKey: 'users'}), + ), + relatedEntity( + selectAddressesState, + 'addressId', + 'address', + {flatKey: 'addresses'}, + childEntity(selectCompaniesState, 'addressId', 'company', {flatKey: 'companies'}), + ), + ); + const sCompanySelectorsMt = rootEntities(sCompanySelectorMt); + const sAddressSelectorMt = rootEntity( + selectAddressesState, + {flatKey: 'addresses'}, + childEntity( + selectCompaniesState, + 'addressId', + 'company', + {flatKey: 'companies'}, + childrenEntities(selectUsersState, 'companyId', 'staff', {flatKey: 'users'}), + relatedEntity(selectUsersState, 'adminId', 'admin', {flatKey: 'users'}), + relatedEntity(selectAddressesState, 'addressId', 'address', {flatKey: 'addresses'}), + ), + ); + const sAddressSelectorsMt = rootEntities(sAddressSelectorMt); + + // creating selector with transformers and meta + const sUserSelectorTrMt = rootEntity( + selectUsersState, + e => ({...e, tr: true}), + {flatKey: 'users'}, + relatedEntity( + selectCompaniesState, + 'companyId', + 'company', + {flatKey: 'companies'}, + childrenEntities(selectUsersState, 'companyId', 'staff', {flatKey: 'users'}), + relatedEntity(selectUsersState, 'adminId', 'admin', {flatKey: 'users'}), + relatedEntity(selectAddressesState, 'addressId', 'address', {flatKey: 'addresses'}), + ), + relatedEntity( + selectUsersState, + 'managerId', + 'manager', + {flatKey: 'users'}, + relatedEntity(selectCompaniesState, 'companyId', 'company', {flatKey: 'companies'}), + relatedEntity(selectUsersState, 'managerId', 'manager', {flatKey: 'users'}), + childrenEntities(selectUsersState, 'managerId', 'employees', {flatKey: 'users'}), + ), + childrenEntities( + selectUsersState, + 'managerId', + 'employees', + {flatKey: 'users'}, + relatedEntity(selectCompaniesState, 'companyId', 'company', {flatKey: 'companies'}), + relatedEntity(selectUsersState, 'managerId', 'manager', {flatKey: 'users'}), + childrenEntities(selectUsersState, 'managerId', 'employees', {flatKey: 'users'}), + ), + ); + const sUserSelectorsTrMt = rootEntities(sUserSelectorTrMt); + const sCompanySelectorTrMt = rootEntity( + selectCompaniesState, + e => ({...e, tr: true}), + {flatKey: 'companies'}, + childrenEntities( + selectUsersState, + 'companyId', + 'staff', + {flatKey: 'users'}, + relatedEntity(selectCompaniesState, 'companyId', 'company', {flatKey: 'companies'}), + relatedEntity(selectUsersState, 'managerId', 'manager', {flatKey: 'users'}), + childrenEntities(selectUsersState, 'managerId', 'employees', {flatKey: 'users'}), + ), + relatedEntity( + selectUsersState, + 'adminId', + 'admin', + {flatKey: 'users'}, + relatedEntity(selectCompaniesState, 'companyId', 'company', {flatKey: 'companies'}), + relatedEntity(selectUsersState, 'managerId', 'manager', {flatKey: 'users'}), + childrenEntities(selectUsersState, 'managerId', 'employees', {flatKey: 'users'}), + ), + relatedEntity( + selectAddressesState, + 'addressId', + 'address', + {flatKey: 'addresses'}, + childEntity(selectCompaniesState, 'addressId', 'company', {flatKey: 'companies'}), + ), + ); + const sCompanySelectorsTrMt = rootEntities(sCompanySelectorTrMt); + const sAddressSelectorTrMt = rootEntity( + selectAddressesState, + e => ({...e, tr: true}), + {flatKey: 'addresses'}, + childEntity( + selectCompaniesState, + 'addressId', + 'company', + {flatKey: 'companies'}, + childrenEntities(selectUsersState, 'companyId', 'staff', {flatKey: 'users'}), + relatedEntity(selectUsersState, 'adminId', 'admin', {flatKey: 'users'}), + relatedEntity(selectAddressesState, 'addressId', 'address', {flatKey: 'addresses'}), + ), + ); + const sAddressSelectorsTrMt = rootEntities(sAddressSelectorTrMt); + + it('compiles selectors without an issue', () => { + expect(sUserSelectors(state, [])).toEqual([]); + expect(sCompanySelectors(state, [])).toEqual([]); + expect(sAddressSelectors(state, [])).toEqual([]); + expect(sUserSelectorsTr(state, [])).toEqual([]); + expect(sCompanySelectorsTr(state, [])).toEqual([]); + expect(sAddressSelectorsTr(state, [])).toEqual([]); + expect(sUserSelectorsMt(state, [])).toEqual([]); + expect(sCompanySelectorsMt(state, [])).toEqual([]); + expect(sAddressSelectorsMt(state, [])).toEqual([]); + expect(sUserSelectorsTrMt(state, [])).toEqual([]); + expect(sCompanySelectorsTrMt(state, [])).toEqual([]); + expect(sAddressSelectorsTrMt(state, [])).toEqual([]); + }); +}); diff --git a/test/e2e/reuse-of-nested-entities.spec.ts b/test/e2e/reuse-of-nested-entities.spec.ts index f2637e269..8835d11df 100644 --- a/test/e2e/reuse-of-nested-entities.spec.ts +++ b/test/e2e/reuse-of-nested-entities.spec.ts @@ -1,49 +1,50 @@ -import {childEntity, childrenEntities, relatedEntity, rootEntity} from '../../src'; -import {ENTITY_STATE, FEATURE_SELECTOR} from '../../src/types'; - -interface User { - id: string; - firstName: string; - lastName: string; - - company?: Company; - companyId?: string; - - employees?: Array; - employeesId?: Array; -} - -interface Company { - id: string; - name: string; - - staff?: Array; - - admin?: User; - adminId?: string; - - address?: Address; -} - -interface Address { - id: string; - street: string; - city: string; - country: string; - - companyId?: string; -} +import { + childEntity, + childrenEntities, + ENTITY_STATE, + FEATURE_SELECTOR, + relatedEntity, + rootEntity, +} from 'ngrx-entity-relationship'; describe('reuse-of-nested-entities', () => { + interface User { + id: string; + firstName: string; + lastName: string; + company?: Company; + companyId?: string; + employees?: Array; + employeesId?: Array; + } + interface Company { + id: string; + name: string; + staff?: Array; + admin?: User; + adminId?: string; + address?: Address; + } + interface Address { + id: string; + street: string; + city: string; + country: string; + companyId?: string; + } + it('keeps unchanged entities the same', () => { const state: {users: ENTITY_STATE; companies: ENTITY_STATE; addresses: ENTITY_STATE
} = { users: { + ids: [], entities: {}, }, companies: { + ids: [], entities: {}, }, addresses: { + ids: [], entities: {}, }, }; diff --git a/test/operators/relationships.spec.ts b/test/operators/relationships.spec.ts index 93e0685cd..c10b40265 100644 --- a/test/operators/relationships.spec.ts +++ b/test/operators/relationships.spec.ts @@ -1,8 +1,7 @@ +import {HANDLER_ROOT_ENTITIES, HANDLER_ROOT_ENTITY, relationships} from 'ngrx-entity-relationship'; +import {UNKNOWN} from 'ngrx-entity-relationship/dist/types'; import {of, Subject} from 'rxjs'; -import {relationships} from '../../src'; -import {HANDLER_ROOT_ENTITIES, HANDLER_ROOT_ENTITY, UNKNOWN} from '../../src/types'; - describe('operators/relationships', () => { type Entity = { id: string; diff --git a/test/relatedEntity.spec.ts b/test/relatedEntity.spec.ts index 36f2f710a..d1a036a75 100644 --- a/test/relatedEntity.spec.ts +++ b/test/relatedEntity.spec.ts @@ -1,5 +1,5 @@ -import {relatedEntity} from '../src'; -import {ENTITY_STATE, FEATURE_SELECTOR, HANDLER_RELATED_ENTITY, UNKNOWN} from '../src/types'; +import {ENTITY_STATE, FEATURE_SELECTOR, HANDLER_RELATED_ENTITY, relatedEntity} from 'ngrx-entity-relationship'; +import {UNKNOWN} from 'ngrx-entity-relationship/dist/types'; describe('relatedEntity', () => { type Entity = { @@ -33,6 +33,7 @@ describe('relatedEntity', () => { it('does not set anything if the related id is falsy', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -62,6 +63,7 @@ describe('relatedEntity', () => { it('sets the related entity if the related id field has primitive type', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -95,6 +97,7 @@ describe('relatedEntity', () => { it('sets an array of the related entities the related id field is an array', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -130,6 +133,7 @@ describe('relatedEntity', () => { it('sets undefined when the related entity does not exist', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -152,6 +156,7 @@ describe('relatedEntity', () => { it('sets an empty when the related entities do not exist', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -174,6 +179,7 @@ describe('relatedEntity', () => { it('ignores falsy ids', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -196,6 +202,7 @@ describe('relatedEntity', () => { it('caches an empty array', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -222,6 +229,7 @@ describe('relatedEntity', () => { it('clones the related entity', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -253,6 +261,7 @@ describe('relatedEntity', () => { it('clones the related entities for arrays', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -284,6 +293,7 @@ describe('relatedEntity', () => { it('sets the cache when the related entity exists', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -337,6 +347,7 @@ describe('relatedEntity', () => { it('sets the cache when the related entity does not exist', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -369,6 +380,7 @@ describe('relatedEntity', () => { it('calls relationships with an incrementing prefix and arguments', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -413,6 +425,7 @@ describe('relatedEntity', () => { it('calls relationships.release on own release call', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -441,6 +454,7 @@ describe('relatedEntity', () => { it('supports EntityCollectionService as a selector', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -481,6 +495,7 @@ describe('relatedEntity', () => { it('supports a default selector and returns id field', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -515,6 +530,7 @@ describe('relatedEntity', () => { it('supports custom feature selector and id field of string', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -553,6 +569,7 @@ describe('relatedEntity', () => { it('supports custom feature selector and id field of number', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -591,6 +608,7 @@ describe('relatedEntity', () => { it('supports custom feature selector and id selector', () => { const state = { feature: { + ids: [], entities: {}, }, }; diff --git a/test/relatedEntitySelector.spec.ts b/test/relatedEntitySelector.spec.ts index 901f44070..b0216f4bf 100644 --- a/test/relatedEntitySelector.spec.ts +++ b/test/relatedEntitySelector.spec.ts @@ -1,5 +1,4 @@ -import {relatedEntitySelector} from '../src'; -import {HANDLER_RELATED_ENTITY} from '../src/types'; +import {HANDLER_RELATED_ENTITY, relatedEntitySelector} from 'ngrx-entity-relationship'; describe('relatedEntitySelector', () => { type Entity = { @@ -23,6 +22,7 @@ describe('relatedEntitySelector', () => { it('calls relatedEntity with relations', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -60,7 +60,7 @@ describe('relatedEntitySelector', () => { jasmine.objectContaining({ rel1: true, rel2: true, - }), + } as any), ); }); }); diff --git a/test/rootEntities.spec.ts b/test/rootEntities.spec.ts index 8ba115d41..807b071fd 100644 --- a/test/rootEntities.spec.ts +++ b/test/rootEntities.spec.ts @@ -1,5 +1,11 @@ -import {rootEntities, rootEntity, rootEntityFlags} from '../src'; -import {FEATURE_SELECTOR, HANDLER_ROOT_ENTITY, ID_TYPES} from '../src/types'; +import { + FEATURE_SELECTOR, + HANDLER_ROOT_ENTITY, + ID_TYPES, + rootEntities, + rootEntity, + rootEntityFlags, +} from 'ngrx-entity-relationship'; describe('rootEntities', () => { type Entity = { diff --git a/test/rootEntity.spec.ts b/test/rootEntity.spec.ts index b5c2a0f3d..0c21b1f96 100644 --- a/test/rootEntity.spec.ts +++ b/test/rootEntity.spec.ts @@ -1,5 +1,5 @@ -import {rootEntity, rootEntityFlags} from '../src'; -import {ENTITY_STATE, HANDLER_RELATED_ENTITY, UNKNOWN} from '../src/types'; +import {ENTITY_STATE, HANDLER_RELATED_ENTITY, rootEntity, rootEntityFlags} from 'ngrx-entity-relationship'; +import {UNKNOWN} from 'ngrx-entity-relationship/dist/types'; describe('rootEntity', () => { type Entity = { @@ -29,6 +29,7 @@ describe('rootEntity', () => { it('returns undefined when the id is falsy', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -40,6 +41,7 @@ describe('rootEntity', () => { it('returns undefined when the entity does not exist', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -52,6 +54,7 @@ describe('rootEntity', () => { it('clones the original entity', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -73,6 +76,7 @@ describe('rootEntity', () => { it('returns cached value when rootEntityFlags.disabled is true', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -130,6 +134,7 @@ describe('rootEntity', () => { it('returns cached value when the original entity has not been changed unless the cache release', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -162,9 +167,11 @@ describe('rootEntity', () => { it('returns cached value when the related entity has not been changed unless the cache release', () => { const state: {feature1: ENTITY_STATE; feature2: ENTITY_STATE} = { feature1: { + ids: [], entities: {}, }, feature2: { + ids: [], entities: {}, }, }; @@ -231,9 +238,11 @@ describe('rootEntity', () => { it('returns cached value when the related entity set has not been changed unless the cache release', () => { const state: {feature1: ENTITY_STATE; feature2: ENTITY_STATE} = { feature1: { + ids: [], entities: {}, }, feature2: { + ids: [], entities: {}, }, }; @@ -296,6 +305,7 @@ describe('rootEntity', () => { it('calls relationships with an incrementing prefix and arguments', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -321,6 +331,7 @@ describe('rootEntity', () => { it('calls relationships.release on own release call', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -341,6 +352,7 @@ describe('rootEntity', () => { it('uses transformer', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -359,13 +371,14 @@ describe('rootEntity', () => { expect(selector(state, 'id')).toEqual( jasmine.objectContaining({ transformed: true, - }), + } as any), ); }); it('uses transformer after relationships', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -394,6 +407,7 @@ describe('rootEntity', () => { it('uses transformer to a different type', () => { const state = { feature: { + ids: [], entities: {}, }, }; @@ -418,6 +432,7 @@ describe('rootEntity', () => { it('supports EntityCollectionService as a selector', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -444,6 +459,7 @@ describe('rootEntity', () => { it('supports a default selector and returns id field', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -464,6 +480,7 @@ describe('rootEntity', () => { it('supports custom feature selector and id field of string', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -487,6 +504,7 @@ describe('rootEntity', () => { it('supports custom feature selector and id field of number', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -510,6 +528,7 @@ describe('rootEntity', () => { it('supports custom feature selector and id selector', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; diff --git a/test/rootEntitySelector.spec.ts b/test/rootEntitySelector.spec.ts index 6d588a175..0e2db4ef0 100644 --- a/test/rootEntitySelector.spec.ts +++ b/test/rootEntitySelector.spec.ts @@ -1,5 +1,4 @@ -import {rootEntitySelector} from '../src'; -import {ENTITY_STATE, HANDLER_RELATED_ENTITY} from '../src/types'; +import {ENTITY_STATE, HANDLER_RELATED_ENTITY, rootEntitySelector} from 'ngrx-entity-relationship'; describe('rootEntitySelector', () => { type Entity = { @@ -23,6 +22,7 @@ describe('rootEntitySelector', () => { it('calls rootEntity with transformer and relations', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -63,13 +63,14 @@ describe('rootEntitySelector', () => { rel1: true, rel2: true, transformed: true, - }), + } as any), ); }); it('calls rootEntity with transformer to a different type', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -94,6 +95,7 @@ describe('rootEntitySelector', () => { it('calls rootEntity with relations only', () => { const state: {feature: ENTITY_STATE} = { feature: { + ids: [], entities: {}, }, }; @@ -122,7 +124,7 @@ describe('rootEntitySelector', () => { jasmine.objectContaining({ rel1: true, rel2: true, - }), + } as any), ); }); }); diff --git a/test/store/actions.spec.ts b/test/store/actions.spec.ts new file mode 100644 index 000000000..d3fbc795d --- /dev/null +++ b/test/store/actions.spec.ts @@ -0,0 +1,66 @@ +import { + ngrxEntityRelationshipActions, + ReduceFlat, + reduceFlat, + ReduceGraph, + reduceGraph, + rootEntity, +} from 'ngrx-entity-relationship'; + +describe('store/actions', () => { + it('ReduceFlat', () => { + const data = Symbol(); + const selector = rootEntity(() => undefined); + const actual = new ReduceFlat(data, selector); + expect(actual).toEqual(jasmine.any(ReduceFlat)); + expect(actual).toEqual( + jasmine.objectContaining({ + type: ngrxEntityRelationshipActions.reduceFlat, + data, + selector, + }) as any, + ); + }); + + it('reduceFlat', () => { + const data = Symbol(); + const selector = rootEntity(() => undefined); + const actual = reduceFlat({data, selector}); + expect(actual).toEqual(jasmine.any(ReduceFlat)); + expect(actual).toEqual( + jasmine.objectContaining({ + type: ngrxEntityRelationshipActions.reduceFlat, + data, + selector, + }) as any, + ); + }); + + it('ReduceGraph', () => { + const data = Symbol(); + const selector = rootEntity(() => undefined); + const actual = new ReduceGraph(data, selector); + expect(actual).toEqual(jasmine.any(ReduceGraph)); + expect(actual).toEqual( + jasmine.objectContaining({ + type: ngrxEntityRelationshipActions.reduceGraph, + data, + selector, + }) as any, + ); + }); + + it('reduceGraph', () => { + const data = Symbol(); + const selector = rootEntity(() => undefined); + const actual = reduceGraph({data, selector}); + expect(actual).toEqual(jasmine.any(ReduceGraph)); + expect(actual).toEqual( + jasmine.objectContaining({ + type: ngrxEntityRelationshipActions.reduceGraph, + data, + selector, + }) as any, + ); + }); +}); diff --git a/test/store/fromFlat.spec.ts b/test/store/fromFlat.spec.ts new file mode 100644 index 000000000..3de20aaf2 --- /dev/null +++ b/test/store/fromFlat.spec.ts @@ -0,0 +1,119 @@ +import {relatedEntity, rootEntity} from 'ngrx-entity-relationship'; +import {fromFlat} from 'ngrx-entity-relationship/dist/store/fromFlat'; +import {injectEntity} from 'ngrx-entity-relationship/dist/store/injectEntity'; + +describe('store/fromFlat', () => { + let injectEntitySpy: jasmine.Spy; + let injectEntityOrig: typeof injectEntity.func; + + beforeEach(() => { + injectEntityOrig = injectEntity.func; + injectEntitySpy = spyOn(injectEntity, 'func'); + }); + + afterEach(() => { + injectEntity.func = injectEntityOrig; + }); + + it('requires meta', () => { + const state = Symbol(); + const data = undefined; + const selector = rootEntity(() => undefined); + selector.meta = undefined; + expect(() => fromFlat.func(state, selector, data)).toThrowError('Flat key is not provided in meta'); + }); + + it('requires meta.flatKey', () => { + const state = Symbol(); + const data = undefined; + const selector = rootEntity(() => undefined); + selector.meta = {}; + expect(() => fromFlat.func(state, selector, data)).toThrowError('Flat key is not provided in meta'); + }); + + it('makes graph data flat', () => { + const entity1 = Symbol(); + const entity2 = Symbol(); + const entity3 = Symbol(); + const entity4 = Symbol(); + const data = { + type1: [entity1, entity2], + type2: [entity3], + type3: entity4, + }; + + const state = Symbol(); + const state1 = Symbol(); + const state2 = Symbol(); + const state3 = Symbol(); + const state4 = Symbol(); + const state5 = Symbol(); + const state6 = Symbol(); + + const selector = rootEntity( + () => undefined, + { + flatKey: 'type1', + }, + relatedEntity( + () => undefined, + 'keyId', + 'keyValue', + { + flatKey: 'type2', + }, + relatedEntity( + () => undefined, + 'keyId', + 'keyValue', + { + flatKey: 'type3', + }, + relatedEntity(() => undefined, 'keyId', 'keyValue', { // should be ignored because it exists + flatKey: 'type1', + }), + ), + ), + ); + + injectEntitySpy.and.returnValues(state1, state2, state3, state4, state5, state6); + + const actual = fromFlat.func(state, selector, data); + expect(actual).toBe(state6); + expect(injectEntitySpy).toHaveBeenCalledTimes(6); + expect(injectEntitySpy).toHaveBeenCalledWith(state, selector, entity1, {skipFields: ['keyValue']}); + expect(injectEntitySpy).toHaveBeenCalledWith( + state1, + selector.relationships[0].relationships[0].relationships[0], + entity1, + {skipFields: ['keyValue']}, + ); + expect(injectEntitySpy).toHaveBeenCalledWith(state2, selector, entity2, {skipFields: ['keyValue']}); + expect(injectEntitySpy).toHaveBeenCalledWith( + state3, + selector.relationships[0].relationships[0].relationships[0], + entity2, + {skipFields: ['keyValue']}, + ); + expect(injectEntitySpy).toHaveBeenCalledWith(state4, selector.relationships[0], entity3, { + skipFields: ['keyValue'], + }); + expect(injectEntitySpy).toHaveBeenCalledWith(state5, selector.relationships[0].relationships[0], entity4, { + skipFields: ['keyValue'], + }); + }); + + it('ignores empty entities', () => { + const state = Symbol(); + const data = { + test: [undefined, false, null], + }; + const selector = rootEntity(() => undefined); + selector.meta = { + flatKey: 'test', + }; + const actual = fromFlat.func(state, selector, data); + expect(actual).toBe(state); + expect(injectEntitySpy).not.toHaveBeenCalled(); + }); +}); diff --git a/test/store/fromGraph.spec.ts b/test/store/fromGraph.spec.ts new file mode 100644 index 000000000..62e1c8b5e --- /dev/null +++ b/test/store/fromGraph.spec.ts @@ -0,0 +1,124 @@ +import {relatedEntity, rootEntity} from 'ngrx-entity-relationship'; +import {fromGraph} from 'ngrx-entity-relationship/dist/store/fromGraph'; +import {injectEntity} from 'ngrx-entity-relationship/dist/store/injectEntity'; + +describe('store/fromGraph', () => { + let injectEntitySpy: jasmine.Spy; + let injectEntityOrig: typeof injectEntity.func; + + beforeEach(() => { + injectEntityOrig = injectEntity.func; + injectEntitySpy = spyOn(injectEntity, 'func'); + }); + + afterEach(() => { + injectEntity.func = injectEntityOrig; + }); + + it('makes graph data flat', () => { + const entity1 = { + name: 'entity1', + }; + const entity2 = { + name: 'entity2', + }; + const entity3 = { + name: 'entity3', + }; + const entity4 = { + name: 'entity4', + }; + const data = [ + { + ...entity1, + keyValue1: [ + { + ...entity3, + keyValue2: entity4, + }, + ], + }, + entity2, + ]; + + const state = Symbol(); + const state1 = Symbol(); + const state2 = Symbol(); + const state3 = Symbol(); + const state4 = Symbol(); + + const selector = rootEntity( + () => undefined, + relatedEntity( + () => undefined, + 'keyId1', + 'keyValue1', + relatedEntity(() => undefined, 'keyId2', 'keyValue2'), + ), + ); + + injectEntitySpy.and.returnValues(state1, state2, state3, state4); + + const actual = fromGraph.func(state, selector, data); + expect(actual).toBe(state4); + expect(injectEntitySpy).toHaveBeenCalledTimes(4); + expect(injectEntitySpy).toHaveBeenCalledWith( + state, + selector, + jasmine.objectContaining({ + name: 'entity1', + keyValue1: jasmine.anything(), + }), + {skipFields: ['keyValue1']}, + ); + expect(injectEntitySpy).toHaveBeenCalledWith( + state1, + selector.relationships[0], + jasmine.objectContaining({ + name: 'entity3', + keyValue2: jasmine.anything(), + }), + {skipFields: ['keyValue2']}, + ); + expect(injectEntitySpy).toHaveBeenCalledWith( + state2, + selector.relationships[0].relationships[0], + jasmine.objectContaining({ + name: 'entity4', + }), + {skipFields: []}, + ); + expect(injectEntitySpy).toHaveBeenCalledWith( + state3, + selector, + jasmine.objectContaining({ + name: 'entity2', + }), + {skipFields: ['keyValue1']}, + ); + }); + + it('ignores empty entities', () => { + const state = Symbol(); + const state1 = Symbol(); + const data = [ + undefined, + false, + null, + { + keyValue: [undefined, false, null], + }, + ]; + const selector = rootEntity( + () => undefined, + relatedEntity(() => undefined, 'keyId', 'keyValue'), + ); + + injectEntitySpy.and.returnValues(state1); + + const actual = fromGraph.func(state, selector, data); + expect(actual).toBe(state1); + expect(injectEntitySpy).toHaveBeenCalledTimes(1); + expect(injectEntitySpy).toHaveBeenCalledWith(state, selector, jasmine.anything(), jasmine.anything()); + }); +}); diff --git a/test/store/injectEntity.spec.ts b/test/store/injectEntity.spec.ts new file mode 100644 index 000000000..e2d043107 --- /dev/null +++ b/test/store/injectEntity.spec.ts @@ -0,0 +1,200 @@ +import {relatedEntity, rootEntity} from 'ngrx-entity-relationship'; +import {injectEntity} from 'ngrx-entity-relationship/dist/store/injectEntity'; +import {patchState} from 'ngrx-entity-relationship/dist/store/patchState'; + +describe('store/patchState', () => { + let patchStateSpy: jasmine.Spy; + let patchStateOrig: typeof patchState.func; + + beforeEach(() => { + patchStateOrig = patchState.func; + patchStateSpy = spyOn(patchState, 'func'); + }); + + afterEach(() => { + patchState.func = patchStateOrig; + }); + + it('throws on primitives', () => { + const state = Symbol(); + const selector = rootEntity(() => undefined); + expect(() => injectEntity.func(state, selector, false)).toThrowError('Entity is not an object'); + expect(() => injectEntity.func(state, selector, 123)).toThrowError('Entity is not an object'); + expect(() => injectEntity.func(state, selector, 'str')).toThrowError('Entity is not an object'); + expect(() => injectEntity.func(state, selector, undefined)).toThrowError('Entity is not an object'); + }); + + it('throws on unknown id selectors', () => { + const state = Symbol(); + const entity = {}; + const selector = rootEntity(() => undefined); + expect(() => injectEntity.func(state, selector, entity)).toThrowError('Cannot detect id of an entity'); + }); + + it('avoids fields with relationships', () => { + const state = { + entity1: { + ids: [], + entities: {}, + }, + }; + const state1 = Symbol(); + const entity = { + id: '1', + rand: 'rand1', + keyId1: '2', + keyValue1: { + id: '2', + }, + keyId2: ['3'], + keyValue2: [ + { + id: '3', + }, + ], + }; + const selector = rootEntity(s => s.entity1); + patchStateSpy.and.returnValues(state1); + + const actual = injectEntity.func(state, selector, entity, { + skipFields: ['keyValue1', 'keyValue2'], + }); + expect(actual).toBe(state1); + expect(patchStateSpy).toHaveBeenCalledWith( + state, + state.entity1, + jasmine.objectContaining({ + entities: { + 1: { + id: '1', + rand: 'rand1', + keyId1: '2', + keyId2: ['3'], + }, + }, + }), + ); + }); + + it('adds missed fields from an existing entity', () => { + const state = { + entity1: { + ids: ['1'], + entities: { + 1: { + rand: 'rand0', + missed: true, + }, + }, + }, + }; + const state1 = Symbol(); + const entity = { + id: '1', + rand: 'rand1', + }; + const selector = rootEntity(s => s.entity1); + patchStateSpy.and.returnValues(state1); + + const actual = injectEntity.func(state, selector, entity); + expect(actual).toBe(state1); + expect(patchStateSpy).toHaveBeenCalledWith( + state, + state.entity1, + jasmine.objectContaining({ + entities: { + 1: { + id: '1', + rand: 'rand1', + missed: true, + }, + }, + }), + ); + }); + + it('adds id of a new entity to the store', () => { + const state = { + entity1: { + ids: ['2'], + entities: {}, + }, + }; + const state1 = Symbol(); + const entity = { + id: '1', + rand: 'rand1', + }; + const selector = rootEntity(s => s.entity1); + patchStateSpy.and.returnValues(state1); + + const actual = injectEntity.func(state, selector, entity); + expect(actual).toBe(state1); + expect(patchStateSpy).toHaveBeenCalledWith( + state, + state.entity1, + jasmine.objectContaining({ + ids: ['2', '1'], + }), + ); + }); + + it('adds a new entity to the store', () => { + const state = { + entity1: { + ids: ['2'], + entities: { + 2: { + id: '2', + rand: 'rand2', + }, + }, + }, + }; + const state1 = Symbol(); + const entity = { + id: '1', + rand: 'rand1', + }; + const selector = rootEntity(s => s.entity1); + patchStateSpy.and.returnValues(state1); + + const actual = injectEntity.func(state, selector, entity); + expect(actual).toBe(state1); + expect(patchStateSpy).toHaveBeenCalledWith( + state, + state.entity1, + jasmine.objectContaining({ + entities: { + 2: state.entity1.entities[2], + 1: entity, + }, + }), + ); + }); + + it('respects the same entity', () => { + const state = { + entity1: { + ids: ['1'], + entities: { + 1: { + id: '1', + rand: 'rand1', + }, + }, + }, + }; + const state1 = Symbol(); + const entity = { + id: '1', + rand: 'rand1', + }; + const selector = rootEntity(s => s.entity1); + patchStateSpy.and.returnValues(state1); + + const actual = injectEntity.func(state, selector, entity); + expect(actual).toBe(state1); + expect(patchStateSpy).toHaveBeenCalledWith(state, state.entity1, state.entity1); + }); +}); diff --git a/test/store/ngrxEntityRelationshipReducer.spec.ts b/test/store/ngrxEntityRelationshipReducer.spec.ts new file mode 100644 index 000000000..eaddfdd4b --- /dev/null +++ b/test/store/ngrxEntityRelationshipReducer.spec.ts @@ -0,0 +1,78 @@ +import {ngrxEntityRelationshipActions, ngrxEntityRelationshipReducer} from 'ngrx-entity-relationship'; +import {fromFlat} from 'ngrx-entity-relationship/dist/store/fromFlat'; +import {fromGraph} from 'ngrx-entity-relationship/dist/store/fromGraph'; + +describe('store/ngrxEntityRelationshipReducer', () => { + let fromGraphSpy: jasmine.Spy; + let fromFlatSpy: jasmine.Spy; + + let fromGraphOrig: typeof fromGraph.func; + let fromFlatOrig: typeof fromFlat.func; + + beforeEach(() => { + fromGraphOrig = fromGraph.func; + fromFlatOrig = fromFlat.func; + + fromGraphSpy = spyOn(fromGraph, 'func'); + fromFlatSpy = spyOn(fromFlat, 'func'); + }); + + afterEach(() => { + fromGraph.func = fromGraphOrig; + fromFlat.func = fromFlatOrig; + }); + + it('handles reduceGraph', () => { + const stateOriginal = Symbol(); + const stateFromGraph = Symbol(); + const stateReducer = Symbol(); + const reducer = jasmine.createSpy('reducer'); + const action = { + type: ngrxEntityRelationshipActions.reduceGraph, + selector: jasmine.createSpy('selector'), + data: Symbol(), + }; + fromGraphSpy.and.returnValue(stateFromGraph); + reducer.and.returnValue(stateReducer); + + const actual = ngrxEntityRelationshipReducer(reducer)(stateOriginal, action); + expect(actual).toBe(stateReducer); + expect(fromGraphSpy).toHaveBeenCalledWith(stateOriginal, action.selector, action.data); + expect(fromFlatSpy).not.toHaveBeenCalled(); + expect(reducer).toHaveBeenCalledWith(stateFromGraph, action); + }); + + it('handles reduceFlat', () => { + const stateOriginal = Symbol(); + const stateFromFlat = Symbol(); + const stateReducer = Symbol(); + const reducer = jasmine.createSpy('reducer'); + const action = { + type: ngrxEntityRelationshipActions.reduceFlat, + selector: jasmine.createSpy('selector'), + data: Symbol(), + }; + fromFlatSpy.and.returnValue(stateFromFlat); + reducer.and.returnValue(stateReducer); + + const actual = ngrxEntityRelationshipReducer(reducer)(stateOriginal, action); + expect(actual).toBe(stateReducer); + expect(fromGraphSpy).not.toHaveBeenCalled(); + expect(fromFlatSpy).toHaveBeenCalledWith(stateOriginal, action.selector, action.data); + expect(reducer).toHaveBeenCalledWith(stateFromFlat, action); + }); + + it('skips the rest', () => { + const stateOriginal = Symbol(); + const stateReducer = Symbol(); + const reducer = jasmine.createSpy('reducer'); + const action = {}; + reducer.and.returnValue(stateReducer); + + const actual = ngrxEntityRelationshipReducer(reducer)(stateOriginal, action); + expect(actual).toBe(stateReducer); + expect(fromFlatSpy).not.toHaveBeenCalled(); + expect(fromGraphSpy).not.toHaveBeenCalled(); + expect(reducer).toHaveBeenCalledWith(stateOriginal, action); + }); +}); diff --git a/test/store/patchState.spec.ts b/test/store/patchState.spec.ts new file mode 100644 index 000000000..ec2bb45b1 --- /dev/null +++ b/test/store/patchState.spec.ts @@ -0,0 +1,101 @@ +import {patchState} from 'ngrx-entity-relationship/dist/store/patchState'; + +describe('store/patchState', () => { + it('touches only objects', () => { + const state = { + key1: Symbol(), + key3: { + key4: Symbol(), + }, + }; + const destination = Symbol(); + + const actual = patchState.func(state, state.key1, destination); + expect(actual).toBe(state); + expect(actual.key1).not.toBe(destination); + }); + + it('handles duplicates', () => { + const state = { + key1: Symbol(), + key3: { + key4: Symbol(), + }, + }; + const destination = Symbol(); + + const actual = patchState.func(state, state.key3, state.key3); + expect(actual).toBe(state); + }); + + it('ignores nulls', () => { + const state = { + key1: Symbol(), + key3: { + key4: Symbol(), + }, + }; + const destination = Symbol(); + + const actual = patchState.func(null, state, destination); + expect(actual).toBe(null); + }); + + it('ignores primitives', () => { + const state = { + key1: Symbol(), + key3: { + key4: Symbol(), + }, + }; + const destination = Symbol(); + + const actual = patchState.func('hello', state, destination); + expect(actual).toBe('hello'); + }); + + it('find and replaces root', () => { + const state = { + key1: { + key2: Symbol(), + }, + key3: { + key4: Symbol(), + }, + }; + const destination = { + key5: Symbol(), + }; + + const actual = patchState.func(state, state.key1, destination); + expect(actual).not.toBe(state); + expect(actual.key3).toBe(state.key3); + expect(actual.key1).toBe(destination as any); + }); + + it('find and replaces child', () => { + const state = { + key1: { + key2: Symbol(), + }, + key3: { + key4: { + key5: Symbol(), + }, + key6: { + key7: Symbol(), + }, + }, + }; + const destination = { + key8: Symbol(), + }; + + const actual = patchState.func(state, state.key3.key4, destination); + expect(actual).not.toBe(state); + expect(actual.key1).toBe(state.key1); + expect(actual.key3).not.toBe(state.key3); + expect(actual.key3.key4).toBe(destination as any); + expect(actual.key3.key6).toBe(state.key3.key6); + }); +}); diff --git a/test/utils.spec.ts b/test/utils.spec.ts index ed013c4c4..a0b9531d2 100644 --- a/test/utils.spec.ts +++ b/test/utils.spec.ts @@ -1,10 +1,10 @@ -import {mergeCache, normalizeSelector, verifyCache} from '../src/utils'; +import {mergeCache, normalizeSelector, verifyCache} from 'ngrx-entity-relationship/dist/utils'; describe('utils', () => { describe('normalizeSelector', () => { it('throws an error in console about circular dependencies', () => { - expect(() => normalizeSelector(undefined)).toThrowMatching(error => - error.message.match('https://github.com/satanTime/ngrx-entity-relationship#circular-dependency'), + expect(() => normalizeSelector(undefined)).toThrowError( + new RegExp('https://github.com/satanTime/ngrx-entity-relationship#circular-dependency'), ); }); diff --git a/tsconfig.json b/tsconfig.json index 11ac697d9..a466af690 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,7 +23,11 @@ "strictBindCallApply": true, "strictFunctionTypes": true, "strictPropertyInitialization": true, - "strictNullChecks": true + "strictNullChecks": true, + "paths": { + "ngrx-entity-relationship": ["src/index"], + "ngrx-entity-relationship/dist/*": ["src/*"] + } }, "include": ["src/index.ts"] }