diff --git a/.gitignore b/.gitignore index a60b41b70d05fc80340cc59824669e40ab84e290..36681a2a1181af5fe6c64fd1a4c6a9d51e3ce76a 100644 --- a/.gitignore +++ b/.gitignore @@ -385,7 +385,16 @@ Network Trash Folder Temporary Items .apdisk -======= # Local .env dist + +# Migrations +.migrate +src/migrations/data/ + +# Tests +junit.xml + +# Documentation generated with compodoc +documentation diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 66e872cf6a13633c5ff316860ac745b2397c3e79..4ef6f7f43d6ef023e19dadd3355c43ab62b0daf1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,15 +1,11 @@ -image: docker:git - -services: - - docker:dind - stages: + - test - sonar-analysis - build - deploy build: - image: docker:18.09 + image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09 services: - docker:18.09-dind only: @@ -32,32 +28,59 @@ deploy_dev: - cd /home/mps/ram - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker-compose pull service-ram - - docker-compose up -d service-ram + - docker-compose up -d --force-recreate service-ram - docker system prune -a -f + environment: + name: dev + url: https://resin-dev.grandlyon.com -code_analysis: - image: skilldlabs/sonar-scanner:4.0.0 - services: - - docker:18.09-dind - stage: sonar-analysis - only: - - dev +test: + stage: test + image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/node:14.15.4 before_script: - - export NODE_PATH=$NODE_PATH:`npm root -g` - - npm install -g typescript + - export GHOST_HOST_AND_PORT=http://localhost:2368 + - export GHOST_ADMIN_API_KEY=60142bc9e33940000156bccc:6217742e2671e322612e89cac9bab61fcd01822709fe5d8f5e6a5b3e54d5e6bb + - export SALT=$TEST_SALT + - export ELASTICSEARCH_NODE=http://localhost:9200 script: - - > - sonar-scanner - -Dsonar.projectName=${SONAR_PROJECT_KEY} - -Dsonar.projectVersion=1.0 - -Dsonar.sourceEncoding=UTF-8 - -Dsonar.projectBaseDir=. - -Dsonar.host.url=${SONAR_URL} - -Dsonar.projectKey=${SONAR_PROJECT_KEY} - -Dsonar.login=${SONAR_TOKEN} + - npm i + - npm run test:cov + coverage: /All files[^|]*\|[^|]*\s+([\d\.]+)/ + artifacts: + when: always + reports: + junit: + - junit.xml + only: + - dev + - merge_requests + +# code_analysis: +# image: registry.forge.grandlyon.com/apoyen2/sonnar-scanner-gl:master +# services: +# - docker:18.09-dind +# stage: sonar-analysis +# only: +# - dev +# - merge_requests +# before_script: +# - export NODE_PATH=$NODE_PATH:`npm root -g` +# - npm install -g typescript +# script: +# - > +# sonar-scanner +# -Dsonar.projectName=${SONAR_PROJECT_KEY} +# -Dsonar.projectVersion=1.0 +# -Dsonar.sourceEncoding=UTF-8 +# -Dsonar.projectBaseDir=. +# -Dsonar.host.url=${SONAR_URL} +# -Dsonar.projectKey=${SONAR_PROJECT_KEY} +# -Dsonar.exclusions=scripts/**,**/*mock.*.ts,**/*spec.ts +# -Dsonar.login=${SONAR_TOKEN} +# -Dsonar.qualitygate.wait=true mr: - image: docker:18.09 + image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/docker:18.09 services: - docker:18.09-dind stage: build diff --git a/CHANGELOG.md b/CHANGELOG.md index 792590a4ed25e0085eae88490763d34c831a887e..f1ff84ac97d5cb04685d4412269930e0a3d75349 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,164 +2,280 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. -## [1.6.0](https://forge.grandlyon.com///compare/v1.5.0...v1.6.0) (2021-03-15) +## [1.10.0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/compare/v1.9.1...v1.10.0) (2021-12-22) ### Features -* add Ghost admin client ([60ed843](https://forge.grandlyon.com///commit/60ed843bedc98a8e52dbbca0c9b37a4810dc51ae)) -* add news tag handling ([588f9bd](https://forge.grandlyon.com///commit/588f9bdf614d9af60b8c2357b61f4d1fe5ae3d9b)) -* add site mail signature ([6e1ba0a](https://forge.grandlyon.com///commit/6e1ba0ab9c09e9fbd53fff91edeb1e3e0874bec0)) -* add tag and posts db init ([ed1fa26](https://forge.grandlyon.com///commit/ed1fa267871df403a8f0a89642df1844b14dcab6)) +* **admin:** return incomplete structure ([9bff0dd](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/9bff0dd893b311272f6e00b0991054a54ada4352)) +* make job fail in case of quality qate issue ([c09687f](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/c09687ffb4907a6e92c5107f13f78541bc7799fb)) +* **structure:** add service venteMaterielPrixSolidaire ([1d24d33](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/1d24d339160dd3132db0ff50ad67469628d4a471)) +* update init script for local install ([c7e7658](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/c7e76585d339747a173baa3f651e45ffe38ad2c2)) ### Bug Fixes -* bug on admin validation ([8fd705f](https://forge.grandlyon.com///commit/8fd705f5b4e769905c96496f064cf63b105aa8de)) -* dockerfile typo ([2d7f67b](https://forge.grandlyon.com///commit/2d7f67b52676554a20a15e613700b575d67f3b46)) -* update coord endpoint on photon-bal ([2d13c57](https://forge.grandlyon.com///commit/2d13c570cf2a1cb47470280a2a77e4e65711aa9f)) -* update dockerfile to add init scripts ([6925278](https://forge.grandlyon.com///commit/69252787747e87d6f1a78aaacfb22968951051b1)) -* update error handling on post controller + update ghost insert script ([ab97a2d](https://forge.grandlyon.com///commit/ab97a2dac4d82a6314e1f480498296eab644e731)) -* update script data + clean code ([c360668](https://forge.grandlyon.com///commit/c36066859b6f84880f0611c0aba4e8f721c2e23d)) -* **ghost:** ghost data ([00b6a18](https://forge.grandlyon.com///commit/00b6a18db4fe6d3f55bdf07775c2edf544292948)) +* add migration france-service ([d0bfb36](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/d0bfb361fa017b12a5f2b61c2f59f3a0a3e257d3)) +* change france-services migration ([99f5963](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/99f596392833824d0c4c26ca0185df076fc3d9a8)) +* **chore:** update packages ([79f55d0](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/79f55d014425b6f2c9865f25156be25496514ca0)) +* **cicd:** update gitlabci to use dependencies proxy ([ed2de02](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/ed2de02c40f0b084d37d2550022f72c8d1bf97c9)) +* db init script, bad collection name for structureType ([cca9031](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/cca9031a57b3f9055f560d6fc915041b4f28059b)) +* docker compose volumes persistence ([9ea0c4a](https://forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server/commit/9ea0c4ae419240e7d27e473143ef6f9c6eada8ed)) -## [1.5.0](https://forge.grandlyon.com///compare/v1.4.0...v1.5.0) (2021-02-25) +### [1.9.1](https://forge.grandlyon.com///compare/v1.9.0...v1.9.1) (2021-09-29) + +### Features + +- **migrations**: added label Conseiller numerique france service ([b310d9d](https://forge.grandlyon.com///commit/b310d9d2b84f54cdc72679e10ea7f85efe01f036)) + +### Bug Fixes + +- changed password regex to match frontend regex ([d7ca511](https://forge.grandlyon.com///commit/d7ca5116a72e06755e121d9310c8fa751b668c62)) +## [1.9.0](https://forge.grandlyon.com///compare/v1.8.0...v1.9.0) (2021-05-31) ### Features -* add ghost stack ([98e4254](https://forge.grandlyon.com///commit/98e4254ae9cc6c5f91bc7e7ab310b85b52111c33)) -* add name and surname in token ([4a125a1](https://forge.grandlyon.com///commit/4a125a1b4f776baaaa6a7142f4ccc4fe46014f93)) -* add post endpoint and update swagger declaration to allow auth ([d450d44](https://forge.grandlyon.com///commit/d450d44c79acda0262f74e3093a384822f6be733)) -* add startup script for test users ([8d06a19](https://forge.grandlyon.com///commit/8d06a19f4a9c28465a561d720ad5c53db2ee2479)) -* add temp-user handling for structure join ([9560829](https://forge.grandlyon.com///commit/95608291b11759847484efe9b94a1f81a02a3798)) -* add user structure delete ([e592a89](https://forge.grandlyon.com///commit/e592a8979c96a5c03f5280eee21522b52329142b)) -* move structureType to back ([22e0bd2](https://forge.grandlyon.com///commit/22e0bd2eaa6b336a77b4817ccee3d342d1f7d6fd)) -* update config service for template handling + add structure join ([679f239](https://forge.grandlyon.com///commit/679f239edae90f714b60fd7a89e4f881fcc6d5dc)) +- add remote accompaniment ([48b3f3c](https://forge.grandlyon.com///commit/48b3f3c7a5a6c82861298fce11c042175dd1bfed)) +- **doc:** add compodoc ([274e3f5](https://forge.grandlyon.com///commit/274e3f54a4aa84e6a0db2b6c38f5ea3a900784f3)) +- add endpoint for unclaimed structure ([8dd5f50](https://forge.grandlyon.com///commit/8dd5f5020cce91c1d8933b906aa4b13921240f8e)) +- add migration for pix label ([ab52515](https://forge.grandlyon.com///commit/ab52515ce0c86a14541486c8fbb1aa580828b9c0)) +- add structure description to ES fields ([a8d675e](https://forge.grandlyon.com///commit/a8d675e47f384beb98f893236fecaa67ba08ea10)) +- add women to public list ([3bb52d0](https://forge.grandlyon.com///commit/3bb52d0a2718c7a42d9084c225b4e82e0e27a9f4)) + +### Bug Fixes + +- **TU:** missing key in test ([8601c97](https://forge.grandlyon.com///commit/8601c978773b34e749a819c86642194b74e1dff9)) +- add claim structure email sending. It has been removed in a previous commit ([a282f91](https://forge.grandlyon.com///commit/a282f9171f2a3299d650ba01cf96c49e28b9d536)) +- compilation error, missing import ([d6a08cb](https://forge.grandlyon.com///commit/d6a08cb6cdce8a7cd33d997033a2eb7a5d8860d1)) +- minor fix and unused import ([2dff8b3](https://forge.grandlyon.com///commit/2dff8b3ae9c3fe28ff02762042d888a2f082c2ee)) +- opendata endpoint data and email format ([759fcb5](https://forge.grandlyon.com///commit/759fcb53a0f78c03c594c524572d55f547d6f7ec)) +- **TU:** increase TU coverage ([dd28504](https://forge.grandlyon.com///commit/dd2850437105827a5bb467d6ef53220858603b58)) +- add creation of ES document on apitc structure ([1732577](https://forge.grandlyon.com///commit/17325772183bab4376f7db9d40e0105305d0742f)) +- change naming for clarification ([4191eb3](https://forge.grandlyon.com///commit/4191eb3c28e9dd74c30e730dba590208d1850332)) +- new endpoint for admin pannel, sorting and better algo ([440ffef](https://forge.grandlyon.com///commit/440ffef5def19a1325cd97615f45e33fe2b38f81)) +- remove useless varuiable ([24aef88](https://forge.grandlyon.com///commit/24aef880741ea86fc7cdd8fa92052dc721d6a586)) +- update missing conf in docker-compose ([70b630d](https://forge.grandlyon.com///commit/70b630dde80595fd952e8bf1520dd941648a13c6)) +- update search of ES and max score to optimize ([115ab1d](https://forge.grandlyon.com///commit/115ab1d17cee59b44303ed725b1424292237c771)) +- use id instead of name on formated structure. ([2f71261](https://forge.grandlyon.com///commit/2f7126104acd54c296db1f7b1671e21953e700a3)) + +## [1.8.0](https://forge.grandlyon.com///compare/v1.7.0...v1.8.0) (2021-05-06) + +### Features +- add auto-migrate for production ([f0568dc](https://forge.grandlyon.com///commit/f0568dcb3959db84a96c78915a7cd135d163b1b4)) +- add migration for date format ([cae255e](https://forge.grandlyon.com///commit/cae255efe9c174457ae66c94a41e941bf7b2165c)) +- **structures:** add elastic search stack for better search handling ([bbf608b](https://forge.grandlyon.com///commit/bbf608b6e90afaea9ae84ee9121e11ade7dd32c0)) +- add enpoint for couting newsletter ([27cd278](https://forge.grandlyon.com///commit/27cd278781187a3734d06f16331fa9119da7adf4)) +- add new endpoint for structures, data is formated (jointure on modules) ([509f30f](https://forge.grandlyon.com///commit/509f30f9a2c36b18ed093d25fa37c3b9b3849165)) +- add notification mail to admin for structure ([d241ed8](https://forge.grandlyon.com///commit/d241ed8c4597a0151d5a916ae9c0f6aefe0e3092)) ### Bug Fixes -* add npm script for db init ([8c819fc](https://forge.grandlyon.com///commit/8c819fc5e250d54e26b9058457534f3f8ddbe1ef)) -* add structure remove from userModel ([fd21790](https://forge.grandlyon.com///commit/fd2179074baef4f435092330ee9169cdae85f803)) -* aptic structure accountVerified ([928bf58](https://forge.grandlyon.com///commit/928bf58b85e49d493e9f462d0fbe55cac21b7b81)) -* aptic structure init + admin structurename for claim validation ([cef5451](https://forge.grandlyon.com///commit/cef545168d9bdd6346767a55fe985459ff81b606)) -* delete structure ([451e004](https://forge.grandlyon.com///commit/451e0041f6c431c57938db34c507dbb48563e2bd)) -* mail config + new url ([874b062](https://forge.grandlyon.com///commit/874b06236254fd6dc28df8fe060f3c0597d01913)) -* MR conflicts ([ac18ce8](https://forge.grandlyon.com///commit/ac18ce82b3456198bb8f0f52638f386d303134ca)) -* MR return + issue on delete owner endpoint ([1fb8047](https://forge.grandlyon.com///commit/1fb80471382d883db23909b4ae58beab05d1cfca)) -* remove unused imports ([f2db14e](https://forge.grandlyon.com///commit/f2db14eb0bb98682dbb3c37610e88f800480f9d5)) -* remove useless swagger auth ([bf89fbd](https://forge.grandlyon.com///commit/bf89fbd62873517fdb990a7a2b9126e296b0ddcd)) -* user cration bug + structure find refacto ([25480d5](https://forge.grandlyon.com///commit/25480d585119ca6bef98dc4567cd63c8b273e980)) -* user model structureid from string to objectid ([35fa953](https://forge.grandlyon.com///commit/35fa953761b6800426155d27595efaa26df0f47f)) -* **form:** fix model ([f0d1df6](https://forge.grandlyon.com///commit/f0d1df6092c099a100256425c1ab4b640b48aaf6)) -* **form:** fix structure ([af1b4fa](https://forge.grandlyon.com///commit/af1b4fac5fa2c370e53917dfe3271c3c60a55266)) +- better naming ([2f837e7](https://forge.grandlyon.com///commit/2f837e78add9bacece2c8a03aa90c828ab7a832f)) +- change freeWorkshop back to notempty ([ad09120](https://forge.grandlyon.com///commit/ad0912014ce7e1da5c94565f4dd05ca14884adb6)) +- changes after review ([b627628](https://forge.grandlyon.com///commit/b62762851345e08d09cde924bc961ecca3123f16)) +- changes on email template (wording...) ([0d18670](https://forge.grandlyon.com///commit/0d18670ca6d889628150d3d04ef1257ef06c3a51)) +- docker-compose missing var + add admin verification on ES index reset ([0af581d](https://forge.grandlyon.com///commit/0af581d8a9d06d0de5b00a65915694cec6d270d2)) +- fix number of results for ES and filters count ([416654e](https://forge.grandlyon.com///commit/416654e6165072314f91d7db3924dd730dbe471b)) +- hide some fiel on endpoint and create migration for opening hours ([ec6d2ac](https://forge.grandlyon.com///commit/ec6d2acfd96a69ffd38e08310ec6f1863332a306)) +- remove mandatory field on structure + update local email sending conf ([7603e47](https://forge.grandlyon.com///commit/7603e47f335aee3ade21ec5d49e7927d7b6eaaa8)) +- remove useless import ([2253581](https://forge.grandlyon.com///commit/2253581b1ebc5a0dd2c0826ed97d9e549bba9402)) +- remove useless improt ([421806d](https://forge.grandlyon.com///commit/421806d13befac5092d87d4864358692938ccfd3)) +- **migration:** fix remove field bug in script ([d6a0f77](https://forge.grandlyon.com///commit/d6a0f775e2cbe6ca9e98d30dc6d136206b587667)) -## [1.4.0](https://forge.grandlyon.com///compare/v1.3.0...v1.4.0) (2021-02-01) +## [1.7.0](https://forge.grandlyon.com///compare/v1.6.1...v1.7.0) (2021-04-12) + +### Features + +- add aptic service offer query ([7602b41](https://forge.grandlyon.com///commit/7602b412f08047cd8dea2cb99af2e47b83d08c08)) +- add endpoint for sending error report for structure ([bc64158](https://forge.grandlyon.com///commit/bc64158c06f6c1ecad7753dbac62a19a81f84a42)) +- add newsletter data insert script ([a1a743d](https://forge.grandlyon.com///commit/a1a743d5c3391c2c54ec095a6cf12e4f2aeaae58)) +- add newsletter subscription ([c507f53](https://forge.grandlyon.com///commit/c507f53646c9f10d40ebe1d6ea518b7aeea27876)) +- edit request for structure service (not working) ([a156819](https://forge.grandlyon.com///commit/a1568197036f8a87d902b2563fc35430a79d13c3)) +- TU for admin mailer and posts ([1b1724e](https://forge.grandlyon.com///commit/1b1724efcca24c2e5706e122f13f6740bb9b4ee9)) +- zoom on town ([7eec8f1](https://forge.grandlyon.com///commit/7eec8f160286746c713b451d7d8576bc50314c9b)) + +### Bug Fixes + +- migration script path ([0b549b8](https://forge.grandlyon.com///commit/0b549b86d961d25f95d3977cab2c2f86f5b0e6b1)) +- typo in .gitignore ([ede567e](https://forge.grandlyon.com///commit/ede567e7fdd4542f5c5ccced51b3a627434bfd98)) +- **structures:** prevent access to deleted structures ([ea0bf7b](https://forge.grandlyon.com///commit/ea0bf7bf698486cda875113852d6cc5c957f1f55)) +- update search filter query ([44bb26e](https://forge.grandlyon.com///commit/44bb26ea836d95c3c5bc5437553eb633cf0092f1)) +- **mail:** add link to structure in admin new structure mail ([b067483](https://forge.grandlyon.com///commit/b067483a91fb97ec7506f17a4999cd4fd65614be)) +### [1.6.1](https://forge.grandlyon.com///compare/v1.6.0...v1.6.1) (2021-04-01) ### Features -* **structures:** add admin delete ([43eb15b](https://forge.grandlyon.com///commit/43eb15b70acfddfb251e02f98abd0840d7eb4567)) -* add address search for structure registration ([c4811fb](https://forge.grandlyon.com///commit/c4811fb22dfab9149d94e4b87dcb79570a895f26)) -* add APTIC api structure + cron job ([88bc8fd](https://forge.grandlyon.com///commit/88bc8fdc489059fe11fb1ee83b5b5716d9daf7e0)) -* add APTIC api structure + cron job ([6605486](https://forge.grandlyon.com///commit/66054863ffda381a5f15d9419e3577717b2c9798)) -* add email sending for outdated structures ([20fd741](https://forge.grandlyon.com///commit/20fd741e6c3c9a06ebce3f056f107d28e9cf50f8)) +- add jest auto testing in gitlab-ci ([e8b1b04](https://forge.grandlyon.com///commit/e8b1b04294c01a6d79c945e6d026906a249a18a9)) +- add route for deleting user as admin ([da6052e](https://forge.grandlyon.com///commit/da6052e43ddd7557b061df38d7e6629613fbe00c)) +- update gitlab-ci for test ([6b8f204](https://forge.grandlyon.com///commit/6b8f204754215ba88b167e79d87f1e59fa5f4f9c)) +- updating user servuce ([e176e69](https://forge.grandlyon.com///commit/e176e69e1da5331b97c20bd0c242121821eb912d)) + +### Bug Fixes + +- add admin mail sending fo new structures ([51cf3ab](https://forge.grandlyon.com///commit/51cf3ab12fc54c0b7de2555a294e2e495c3f7b87)) +- add https to regex replace ([21f5955](https://forge.grandlyon.com///commit/21f5955cb9d293f12d3436854e818636f65f5738)) +- add img regex for html news ([8e6ed52](https://forge.grandlyon.com///commit/8e6ed525b7986d2280233a5524f65402b9f0ca50)) +- gitlab-ci ([48eb446](https://forge.grandlyon.com///commit/48eb44603e280de3e5277f7468dfc16be99234da)) +- gitlab-ci ([c822468](https://forge.grandlyon.com///commit/c822468cb96df73e8d5dcdafb2d7d7c5ba6507df)) +- gitlab-ci ([ffd2edd](https://forge.grandlyon.com///commit/ffd2edd03b88a7e6b6bfa286c910abe5fea07834)) +- gitlab-ci ([b67369c](https://forge.grandlyon.com///commit/b67369c8b8932f3361eec6e37cd1ab393c243174)) +- host url for news image ([2698302](https://forge.grandlyon.com///commit/2698302c6b558f434039c0ace1806a70b98f9721)) +- images path in getById ([bc80a95](https://forge.grandlyon.com///commit/bc80a95ff772e4df638514544565061016ed5060)) +- sonar issues ([232dbd7](https://forge.grandlyon.com///commit/232dbd78d4bf6c8aa7dbdabdd37852f844b8df78)) +- syntax ([39b7cd2](https://forge.grandlyon.com///commit/39b7cd25593f48771afa8954f24eae48ef4a2be7)) +- typo in url ([be3c536](https://forge.grandlyon.com///commit/be3c5361e01208225ec2e5c0d8ba3937e6f65cb8)) +- unitary test + update test coverage config ([6b6d4bd](https://forge.grandlyon.com///commit/6b6d4bd12e21b6769474a0477e6675d55b8974a5)) +- update auth unitary test ([336849a](https://forge.grandlyon.com///commit/336849a37b40b76672993d2018e4072b6f59ed31)) +## [1.6.0](https://forge.grandlyon.com///compare/v1.5.0...v1.6.0) (2021-03-15) + +### Features + +- add Ghost admin client ([60ed843](https://forge.grandlyon.com///commit/60ed843bedc98a8e52dbbca0c9b37a4810dc51ae)) +- add news tag handling ([588f9bd](https://forge.grandlyon.com///commit/588f9bdf614d9af60b8c2357b61f4d1fe5ae3d9b)) +- add site mail signature ([6e1ba0a](https://forge.grandlyon.com///commit/6e1ba0ab9c09e9fbd53fff91edeb1e3e0874bec0)) +- add tag and posts db init ([ed1fa26](https://forge.grandlyon.com///commit/ed1fa267871df403a8f0a89642df1844b14dcab6)) ### Bug Fixes -* add trim for opendata request to solve 400 request issue ([2d3b357](https://forge.grandlyon.com///commit/2d3b357965e0a5fa18d0e9207174a9143b1cb9cc)) -* configuration logs and bug fix for user registration ([eb8b243](https://forge.grandlyon.com///commit/eb8b24330f0380eecb1cad762c18f1cd8f6ce1b6)) -* cron duration ([2f86c0b](https://forge.grandlyon.com///commit/2f86c0bcbf6b52f83ca9f7f5de8a740bda5d135f)) -* fix duplication bug from aptic structure ([4838342](https://forge.grandlyon.com///commit/48383420588f4b221dbf920f65e30e8da9def88f)) -* merge conflit ([6a4290d](https://forge.grandlyon.com///commit/6a4290df9a0c42134f10b61c7de31d542acfc3fe)) -* outdated structure range ([0d2666f](https://forge.grandlyon.com///commit/0d2666fd7ae0922cbf188ee3fd16a570e9192195)) -* update conf ([e7070d1](https://forge.grandlyon.com///commit/e7070d130edbf875b8851eec89a4cf75ca8b3689)) -* update mailing templates, user model wrong type and aptic structure handling when a structure is updated. ([f1b69ba](https://forge.grandlyon.com///commit/f1b69ba24d961c031b4f54eeaf1cc5b0cbd0a1d8)) -* **structure:** remove unecessary sort for search ([2982dfe](https://forge.grandlyon.com///commit/2982dfe3ffa3b15f41f2bea497f16c255063e2c7)) -* **structure:** structure id creation ([7b14c80](https://forge.grandlyon.com///commit/7b14c808b8e04a34552e58eb243906b6acd9bbfc)) -* unecessary id declaration in model structure ([e788e55](https://forge.grandlyon.com///commit/e788e55e0c63155c5994b39cbc2f37871f2b4398)) +- bug on admin validation ([8fd705f](https://forge.grandlyon.com///commit/8fd705f5b4e769905c96496f064cf63b105aa8de)) +- dockerfile typo ([2d7f67b](https://forge.grandlyon.com///commit/2d7f67b52676554a20a15e613700b575d67f3b46)) +- update coord endpoint on photon-bal ([2d13c57](https://forge.grandlyon.com///commit/2d13c570cf2a1cb47470280a2a77e4e65711aa9f)) +- update dockerfile to add init scripts ([6925278](https://forge.grandlyon.com///commit/69252787747e87d6f1a78aaacfb22968951051b1)) +- update error handling on post controller + update ghost insert script ([ab97a2d](https://forge.grandlyon.com///commit/ab97a2dac4d82a6314e1f480498296eab644e731)) +- update script data + clean code ([c360668](https://forge.grandlyon.com///commit/c36066859b6f84880f0611c0aba4e8f721c2e23d)) +- **ghost:** ghost data ([00b6a18](https://forge.grandlyon.com///commit/00b6a18db4fe6d3f55bdf07775c2edf544292948)) -## [1.3.0](https://forge.grandlyon.com///compare/v1.2.0...v1.3.0) (2021-01-15) +## [1.5.0](https://forge.grandlyon.com///compare/v1.4.0...v1.5.0) (2021-02-25) + +### Features + +- add ghost stack ([98e4254](https://forge.grandlyon.com///commit/98e4254ae9cc6c5f91bc7e7ab310b85b52111c33)) +- add name and surname in token ([4a125a1](https://forge.grandlyon.com///commit/4a125a1b4f776baaaa6a7142f4ccc4fe46014f93)) +- add post endpoint and update swagger declaration to allow auth ([d450d44](https://forge.grandlyon.com///commit/d450d44c79acda0262f74e3093a384822f6be733)) +- add startup script for test users ([8d06a19](https://forge.grandlyon.com///commit/8d06a19f4a9c28465a561d720ad5c53db2ee2479)) +- add temp-user handling for structure join ([9560829](https://forge.grandlyon.com///commit/95608291b11759847484efe9b94a1f81a02a3798)) +- add user structure delete ([e592a89](https://forge.grandlyon.com///commit/e592a8979c96a5c03f5280eee21522b52329142b)) +- move structureType to back ([22e0bd2](https://forge.grandlyon.com///commit/22e0bd2eaa6b336a77b4817ccee3d342d1f7d6fd)) +- update config service for template handling + add structure join ([679f239](https://forge.grandlyon.com///commit/679f239edae90f714b60fd7a89e4f881fcc6d5dc)) + +### Bug Fixes + +- add npm script for db init ([8c819fc](https://forge.grandlyon.com///commit/8c819fc5e250d54e26b9058457534f3f8ddbe1ef)) +- add structure remove from userModel ([fd21790](https://forge.grandlyon.com///commit/fd2179074baef4f435092330ee9169cdae85f803)) +- aptic structure accountVerified ([928bf58](https://forge.grandlyon.com///commit/928bf58b85e49d493e9f462d0fbe55cac21b7b81)) +- aptic structure init + admin structurename for claim validation ([cef5451](https://forge.grandlyon.com///commit/cef545168d9bdd6346767a55fe985459ff81b606)) +- delete structure ([451e004](https://forge.grandlyon.com///commit/451e0041f6c431c57938db34c507dbb48563e2bd)) +- mail config + new url ([874b062](https://forge.grandlyon.com///commit/874b06236254fd6dc28df8fe060f3c0597d01913)) +- MR conflicts ([ac18ce8](https://forge.grandlyon.com///commit/ac18ce82b3456198bb8f0f52638f386d303134ca)) +- MR return + issue on delete owner endpoint ([1fb8047](https://forge.grandlyon.com///commit/1fb80471382d883db23909b4ae58beab05d1cfca)) +- remove unused imports ([f2db14e](https://forge.grandlyon.com///commit/f2db14eb0bb98682dbb3c37610e88f800480f9d5)) +- remove useless swagger auth ([bf89fbd](https://forge.grandlyon.com///commit/bf89fbd62873517fdb990a7a2b9126e296b0ddcd)) +- user cration bug + structure find refacto ([25480d5](https://forge.grandlyon.com///commit/25480d585119ca6bef98dc4567cd63c8b273e980)) +- user model structureid from string to objectid ([35fa953](https://forge.grandlyon.com///commit/35fa953761b6800426155d27595efaa26df0f47f)) +- **form:** fix model ([f0d1df6](https://forge.grandlyon.com///commit/f0d1df6092c099a100256425c1ab4b640b48aaf6)) +- **form:** fix structure ([af1b4fa](https://forge.grandlyon.com///commit/af1b4fac5fa2c370e53917dfe3271c3c60a55266)) +## [1.4.0](https://forge.grandlyon.com///compare/v1.3.0...v1.4.0) (2021-02-01) ### Features -* add admin module + add validation for claiming structures ([95ed7ec](https://forge.grandlyon.com///commit/95ed7eca7c099e24aeeb6ffb535e5b59858162fb)) -* add new field in structure schema ([b09c65d](https://forge.grandlyon.com///commit/b09c65d4139976d22d20589d0b3f6e62ef996e2f)) -* add role guard ([acb79f2](https://forge.grandlyon.com///commit/acb79f25c7a4c7ee447e4409be25682152b3f739)) -* add role to jwt ([f446fd9](https://forge.grandlyon.com///commit/f446fd990de074512e1dc8dcfd7bba31e8b0c9e1)) -* add sending of email when structure is validate or not by an admin ([6d683b5](https://forge.grandlyon.com///commit/6d683b5f28489c955b9dc9cfb3cf6522b07ef979)) -* add structure name in claim validation mail ([3ad4b8c](https://forge.grandlyon.com///commit/3ad4b8cc7c6b111c45814b738184e56350053da1)) -* add tcl module ([b3807e2](https://forge.grandlyon.com///commit/b3807e264a53be1717d316cd512f09bb371e454d)) -* claim structure ([8f1bc01](https://forge.grandlyon.com///commit/8f1bc01010e3575a5fd53027be7bb9e680e8fc7c)) +- **structures:** add admin delete ([43eb15b](https://forge.grandlyon.com///commit/43eb15b70acfddfb251e02f98abd0840d7eb4567)) +- add address search for structure registration ([c4811fb](https://forge.grandlyon.com///commit/c4811fb22dfab9149d94e4b87dcb79570a895f26)) +- add APTIC api structure + cron job ([88bc8fd](https://forge.grandlyon.com///commit/88bc8fdc489059fe11fb1ee83b5b5716d9daf7e0)) +- add APTIC api structure + cron job ([6605486](https://forge.grandlyon.com///commit/66054863ffda381a5f15d9419e3577717b2c9798)) +- add email sending for outdated structures ([20fd741](https://forge.grandlyon.com///commit/20fd741e6c3c9a06ebce3f056f107d28e9cf50f8)) +### Bug Fixes + +- add trim for opendata request to solve 400 request issue ([2d3b357](https://forge.grandlyon.com///commit/2d3b357965e0a5fa18d0e9207174a9143b1cb9cc)) +- configuration logs and bug fix for user registration ([eb8b243](https://forge.grandlyon.com///commit/eb8b24330f0380eecb1cad762c18f1cd8f6ce1b6)) +- cron duration ([2f86c0b](https://forge.grandlyon.com///commit/2f86c0bcbf6b52f83ca9f7f5de8a740bda5d135f)) +- fix duplication bug from aptic structure ([4838342](https://forge.grandlyon.com///commit/48383420588f4b221dbf920f65e30e8da9def88f)) +- merge conflit ([6a4290d](https://forge.grandlyon.com///commit/6a4290df9a0c42134f10b61c7de31d542acfc3fe)) +- outdated structure range ([0d2666f](https://forge.grandlyon.com///commit/0d2666fd7ae0922cbf188ee3fd16a570e9192195)) +- update conf ([e7070d1](https://forge.grandlyon.com///commit/e7070d130edbf875b8851eec89a4cf75ca8b3689)) +- update mailing templates, user model wrong type and aptic structure handling when a structure is updated. ([f1b69ba](https://forge.grandlyon.com///commit/f1b69ba24d961c031b4f54eeaf1cc5b0cbd0a1d8)) +- **structure:** remove unecessary sort for search ([2982dfe](https://forge.grandlyon.com///commit/2982dfe3ffa3b15f41f2bea497f16c255063e2c7)) +- **structure:** structure id creation ([7b14c80](https://forge.grandlyon.com///commit/7b14c808b8e04a34552e58eb243906b6acd9bbfc)) +- unecessary id declaration in model structure ([e788e55](https://forge.grandlyon.com///commit/e788e55e0c63155c5994b39cbc2f37871f2b4398)) + +## [1.3.0](https://forge.grandlyon.com///compare/v1.2.0...v1.3.0) (2021-01-15) + +### Features + +- add admin module + add validation for claiming structures ([95ed7ec](https://forge.grandlyon.com///commit/95ed7eca7c099e24aeeb6ffb535e5b59858162fb)) +- add new field in structure schema ([b09c65d](https://forge.grandlyon.com///commit/b09c65d4139976d22d20589d0b3f6e62ef996e2f)) +- add role guard ([acb79f2](https://forge.grandlyon.com///commit/acb79f25c7a4c7ee447e4409be25682152b3f739)) +- add role to jwt ([f446fd9](https://forge.grandlyon.com///commit/f446fd990de074512e1dc8dcfd7bba31e8b0c9e1)) +- add sending of email when structure is validate or not by an admin ([6d683b5](https://forge.grandlyon.com///commit/6d683b5f28489c955b9dc9cfb3cf6522b07ef979)) +- add structure name in claim validation mail ([3ad4b8c](https://forge.grandlyon.com///commit/3ad4b8cc7c6b111c45814b738184e56350053da1)) +- add tcl module ([b3807e2](https://forge.grandlyon.com///commit/b3807e264a53be1717d316cd512f09bb371e454d)) +- claim structure ([8f1bc01](https://forge.grandlyon.com///commit/8f1bc01010e3575a5fd53027be7bb9e680e8fc7c)) ### Bug Fixes -* mail issue after sen change ([29cdc20](https://forge.grandlyon.com///commit/29cdc20d5e636548665a4f7868dcd2802fe0a4c4)) -* structure claim check with bdd ([e0ff4df](https://forge.grandlyon.com///commit/e0ff4df5be560a3e79a563a80b824be80ce62781)) +- mail issue after sen change ([29cdc20](https://forge.grandlyon.com///commit/29cdc20d5e636548665a4f7868dcd2802fe0a4c4)) +- structure claim check with bdd ([e0ff4df](https://forge.grandlyon.com///commit/e0ff4df5be560a3e79a563a80b824be80ce62781)) ## [1.2.0](https://forge.grandlyon.com///compare/v1.1.0...v1.2.0) (2020-12-18) - ### Features -* add comments and TU ([5c0dd46](https://forge.grandlyon.com///commit/5c0dd468d34f11c9e9fea2817a3600267f043043)) -* add password cahnge endpoint ([cead66e](https://forge.grandlyon.com///commit/cead66ea129de7d7b38e026e6ee89d6fa2892f5e)) -* add password reset ([ffea481](https://forge.grandlyon.com///commit/ffea481f8275c93748c114488c150d8b9ace3edd)) -* add tu for password change ([c3eb184](https://forge.grandlyon.com///commit/c3eb184b73169d0c7611298f7e3fb00bde72a21a)) -* structure edit + data refacto ([a2a65e8](https://forge.grandlyon.com///commit/a2a65e8a2ed3fb2bb8ea1066945d7b044eee7357)) -* update dto definition for swagger ([d7a30ed](https://forge.grandlyon.com///commit/d7a30ed7a0e7e0f74e85dace474152f9a184bfc5)) -* **auth:** add expiration date on token ([771bd91](https://forge.grandlyon.com///commit/771bd9165b700eb29cc473723d363997695d7f5f)) -* **auth:** add user verification endpoint ([7b1fe8a](https://forge.grandlyon.com///commit/7b1fe8a6db800f0182c372e09c720d17771382a1)) -* **auth:** send validation mail ([ccbfe8f](https://forge.grandlyon.com///commit/ccbfe8ffda6db3f55b1ff6263f189ef583df3a61)) -* **auth:** update password strength verification, increase security with salt in env variable ([8cf88c0](https://forge.grandlyon.com///commit/8cf88c0eb37975172de43a869e30ae125edcacf3)) -* **cicd:** add sonar conf + deploy ([1595281](https://forge.grandlyon.com///commit/1595281e0254bbbc06e89cc0058a0dc58a0e9a16)) -* **cicd:** init cicd with build ([7156660](https://forge.grandlyon.com///commit/71566600376fcc43a9aa4b0486853746a6cf31be)) -* **config:** update logging and add envconfiguration handling ([2ccc5e8](https://forge.grandlyon.com///commit/2ccc5e86bc34a5afaef901ca3ae1dca80c6294f4)) -* **mailer:** add ejs template handling ([2b68810](https://forge.grandlyon.com///commit/2b68810cd5a7915da4370e91ae866020e5482df6)) - +- add comments and TU ([5c0dd46](https://forge.grandlyon.com///commit/5c0dd468d34f11c9e9fea2817a3600267f043043)) +- add password cahnge endpoint ([cead66e](https://forge.grandlyon.com///commit/cead66ea129de7d7b38e026e6ee89d6fa2892f5e)) +- add password reset ([ffea481](https://forge.grandlyon.com///commit/ffea481f8275c93748c114488c150d8b9ace3edd)) +- add tu for password change ([c3eb184](https://forge.grandlyon.com///commit/c3eb184b73169d0c7611298f7e3fb00bde72a21a)) +- structure edit + data refacto ([a2a65e8](https://forge.grandlyon.com///commit/a2a65e8a2ed3fb2bb8ea1066945d7b044eee7357)) +- update dto definition for swagger ([d7a30ed](https://forge.grandlyon.com///commit/d7a30ed7a0e7e0f74e85dace474152f9a184bfc5)) +- **auth:** add expiration date on token ([771bd91](https://forge.grandlyon.com///commit/771bd9165b700eb29cc473723d363997695d7f5f)) +- **auth:** add user verification endpoint ([7b1fe8a](https://forge.grandlyon.com///commit/7b1fe8a6db800f0182c372e09c720d17771382a1)) +- **auth:** send validation mail ([ccbfe8f](https://forge.grandlyon.com///commit/ccbfe8ffda6db3f55b1ff6263f189ef583df3a61)) +- **auth:** update password strength verification, increase security with salt in env variable ([8cf88c0](https://forge.grandlyon.com///commit/8cf88c0eb37975172de43a869e30ae125edcacf3)) +- **cicd:** add sonar conf + deploy ([1595281](https://forge.grandlyon.com///commit/1595281e0254bbbc06e89cc0058a0dc58a0e9a16)) +- **cicd:** init cicd with build ([7156660](https://forge.grandlyon.com///commit/71566600376fcc43a9aa4b0486853746a6cf31be)) +- **config:** update logging and add envconfiguration handling ([2ccc5e8](https://forge.grandlyon.com///commit/2ccc5e86bc34a5afaef901ca3ae1dca80c6294f4)) +- **mailer:** add ejs template handling ([2b68810](https://forge.grandlyon.com///commit/2b68810cd5a7915da4370e91ae866020e5482df6)) ### Bug Fixes -* **mailer:** update mailer service with new sen api request form ([edd8d04](https://forge.grandlyon.com///commit/edd8d0415224a5f55ef594bf7bd993d0af414b75)) -* change token variables ([64d5fd4](https://forge.grandlyon.com///commit/64d5fd4830bfcb55f8226c4184f0851fa6ca7b5b)) -* import typo ([cead291](https://forge.grandlyon.com///commit/cead291d4845201d2ebf42ef39ebda9b8299066f)) -* route in reset-password mail template ([b9de8c9](https://forge.grandlyon.com///commit/b9de8c935cd2f7ae267292d7df3b560410012127)) -* update missing import ([e9c77cb](https://forge.grandlyon.com///commit/e9c77cb64213929ad9a7cf402f00ae59f4a42260)) -* **cicd:** add mr validation build + sonar ts ([da070d2](https://forge.grandlyon.com///commit/da070d2aa8a56f70279ff641090ad0df43314abc)) -* **cicd:** add mr validation build + sonar ts ([8025ab2](https://forge.grandlyon.com///commit/8025ab2f3abed73f2354bb5254982dc0fb08628e)) -* **cicd:** docker build issue ([7732250](https://forge.grandlyon.com///commit/7732250a37b8c1edc9af9509037aebf4f232f466)) -* **cicd:** docker-compose version ([0187808](https://forge.grandlyon.com///commit/018780838acc590f5d799828a9a57a689b06f723)) -* **cicd:** image build ([78c33c2](https://forge.grandlyon.com///commit/78c33c237b194c5c86e7bdd91f52be221fb63f76)) -* **cicd:** image build ([50c1fd1](https://forge.grandlyon.com///commit/50c1fd1108fe50b9e19ebe256753a2284f87a021)) -* **TU:** Add unitary testing for auth service ([af44ba0](https://forge.grandlyon.com///commit/af44ba026e4bba564f87ad268ea2bd8ef5a5c566)) -* **TU:** fix import issues on TU and add user.service TU ([a0f9456](https://forge.grandlyon.com///commit/a0f94564ef8b04fa10503ec789901e758975888c)) -* **TU:** wrong test description ([647da39](https://forge.grandlyon.com///commit/647da394bef7a16febf223220b581f78100b685a)) -* build issue because of typo in imports ([fca81cb](https://forge.grandlyon.com///commit/fca81cb4687e141bf311d15e42c6a67e2de5e407)) +- **mailer:** update mailer service with new sen api request form ([edd8d04](https://forge.grandlyon.com///commit/edd8d0415224a5f55ef594bf7bd993d0af414b75)) +- change token variables ([64d5fd4](https://forge.grandlyon.com///commit/64d5fd4830bfcb55f8226c4184f0851fa6ca7b5b)) +- import typo ([cead291](https://forge.grandlyon.com///commit/cead291d4845201d2ebf42ef39ebda9b8299066f)) +- route in reset-password mail template ([b9de8c9](https://forge.grandlyon.com///commit/b9de8c935cd2f7ae267292d7df3b560410012127)) +- update missing import ([e9c77cb](https://forge.grandlyon.com///commit/e9c77cb64213929ad9a7cf402f00ae59f4a42260)) +- **cicd:** add mr validation build + sonar ts ([da070d2](https://forge.grandlyon.com///commit/da070d2aa8a56f70279ff641090ad0df43314abc)) +- **cicd:** add mr validation build + sonar ts ([8025ab2](https://forge.grandlyon.com///commit/8025ab2f3abed73f2354bb5254982dc0fb08628e)) +- **cicd:** docker build issue ([7732250](https://forge.grandlyon.com///commit/7732250a37b8c1edc9af9509037aebf4f232f466)) +- **cicd:** docker-compose version ([0187808](https://forge.grandlyon.com///commit/018780838acc590f5d799828a9a57a689b06f723)) +- **cicd:** image build ([78c33c2](https://forge.grandlyon.com///commit/78c33c237b194c5c86e7bdd91f52be221fb63f76)) +- **cicd:** image build ([50c1fd1](https://forge.grandlyon.com///commit/50c1fd1108fe50b9e19ebe256753a2284f87a021)) +- **TU:** Add unitary testing for auth service ([af44ba0](https://forge.grandlyon.com///commit/af44ba026e4bba564f87ad268ea2bd8ef5a5c566)) +- **TU:** fix import issues on TU and add user.service TU ([a0f9456](https://forge.grandlyon.com///commit/a0f94564ef8b04fa10503ec789901e758975888c)) +- **TU:** wrong test description ([647da39](https://forge.grandlyon.com///commit/647da394bef7a16febf223220b581f78100b685a)) +- build issue because of typo in imports ([fca81cb](https://forge.grandlyon.com///commit/fca81cb4687e141bf311d15e42c6a67e2de5e407)) ## 1.1.0 (2020-12-01) - ### Features -* add categories endpoint ([b610803](https://forge.grandlyon.com///commit/b6108038843cdaf5099beb369bdd23e98d10f126)) -* add count handling ([d918fb7](https://forge.grandlyon.com///commit/d918fb7e8a15061f482359b6e9b4cf8b1e424cea)) -* add first working version for structure endpoint ([42b760b](https://forge.grandlyon.com///commit/42b760bc70029b3b19439b34aac38448ed7c65f5)) -* add full text search ([609b51b](https://forge.grandlyon.com///commit/609b51b8a40056be18cc2b7fe39674c1db463c48)) -* add health check ([0673e49](https://forge.grandlyon.com///commit/0673e49a7a9792e60910e1887ad4dcc56d453750)) -* add registration and auth ([99b3c50](https://forge.grandlyon.com///commit/99b3c509f27e7fa2d105431347658957a017dcf0)) -* first working version of auth ([8d8ff61](https://forge.grandlyon.com///commit/8d8ff617ea3065b54145502e7e8277c97304ac30)) -* parse boolean string to boolean for search filter + Refacto ([1184295](https://forge.grandlyon.com///commit/1184295c0cadf04771fc377b0b6fd09507ceecc4)) -* update readme + make coord and address call in backend instead of front ([87ca741](https://forge.grandlyon.com///commit/87ca7411ca6a61c5e23319fa472f8dff10627c8c)) -* **docker:** add docker handling for mongo database ([d66af3c](https://forge.grandlyon.com///commit/d66af3c04547e85b222ef73eeee090520edd6d22)) - +- add categories endpoint ([b610803](https://forge.grandlyon.com///commit/b6108038843cdaf5099beb369bdd23e98d10f126)) +- add count handling ([d918fb7](https://forge.grandlyon.com///commit/d918fb7e8a15061f482359b6e9b4cf8b1e424cea)) +- add first working version for structure endpoint ([42b760b](https://forge.grandlyon.com///commit/42b760bc70029b3b19439b34aac38448ed7c65f5)) +- add full text search ([609b51b](https://forge.grandlyon.com///commit/609b51b8a40056be18cc2b7fe39674c1db463c48)) +- add health check ([0673e49](https://forge.grandlyon.com///commit/0673e49a7a9792e60910e1887ad4dcc56d453750)) +- add registration and auth ([99b3c50](https://forge.grandlyon.com///commit/99b3c509f27e7fa2d105431347658957a017dcf0)) +- first working version of auth ([8d8ff61](https://forge.grandlyon.com///commit/8d8ff617ea3065b54145502e7e8277c97304ac30)) +- parse boolean string to boolean for search filter + Refacto ([1184295](https://forge.grandlyon.com///commit/1184295c0cadf04771fc377b0b6fd09507ceecc4)) +- update readme + make coord and address call in backend instead of front ([87ca741](https://forge.grandlyon.com///commit/87ca7411ca6a61c5e23319fa472f8dff10627c8c)) +- **docker:** add docker handling for mongo database ([d66af3c](https://forge.grandlyon.com///commit/d66af3c04547e85b222ef73eeee090520edd6d22)) ### Bug Fixes -* or instead of and for filter search query ([e135dfb](https://forge.grandlyon.com///commit/e135dfb02db44621f25e08d36bc8475393e62573)) -* search issue ([13e5b81](https://forge.grandlyon.com///commit/13e5b816236236ce2bf73a7179f0ea5b51ae6703)) -* typo in structure.controller ([d9000b4](https://forge.grandlyon.com///commit/d9000b4d9d98454b8f99148cd8a5e0ed1c32adee)) -* update docker-compose ([857a2d5](https://forge.grandlyon.com///commit/857a2d54ca8284778a7963828cfe6a55fcfce1ec)) +- or instead of and for filter search query ([e135dfb](https://forge.grandlyon.com///commit/e135dfb02db44621f25e08d36bc8475393e62573)) +- search issue ([13e5b81](https://forge.grandlyon.com///commit/13e5b816236236ce2bf73a7179f0ea5b51ae6703)) +- typo in structure.controller ([d9000b4](https://forge.grandlyon.com///commit/d9000b4d9d98454b8f99148cd8a5e0ed1c32adee)) +- update docker-compose ([857a2d5](https://forge.grandlyon.com///commit/857a2d54ca8284778a7963828cfe6a55fcfce1ec)) diff --git a/README.md b/README.md index 5edb496c7c0e2f7a54fe4cf00b8ad1b95cd46e84..b42a00f565b5af59c7a86633dae94af758db373c 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,13 @@ $ http://localhost:3000/api $ http://localhost:8081 ``` +## Documentation +A documentation is generated with compodoc in addition of the existing documentation on the wiki. +```sh +npm run doc:serve +``` +You can now visualize it at : `localhost:8080` + ## Test ```bash diff --git a/docker-compose.yml b/docker-compose.yml index e95e22ec421be34eadca84b2076cc2b029fd0cb0..e28e86d0f70ccc389b2cf30f2424f71a81ecfc20 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,17 +2,32 @@ version: '2' services: service-ram: - build: . - image: registry.forge.grandlyon.com/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server:${TAG} + image: registry.forge.grandlyon.com/web-et-numerique/pamn_plateforme-des-acteurs-de-la-mediation-numerique/pamn_server:master ports: - ${SERVICE_API_BIND_PORT}:3000 extra_hosts: - 'sen.grandlyon.com:10.128.16.229' + volumes: + - ./.migrate:/app/.migrate environment: MONGO_NON_ROOT_USERNAME: ${MONGO_NON_ROOT_USERNAME} MONGO_NON_ROOT_PASSWORD: ${MONGO_NON_ROOT_PASSWORD} MONGO_DB_HOST_AND_PORT: ${MONGO_DB_HOST_AND_PORT} + JWT_SECRET: ${JWT_SECRET} + SALT: ${SALT} + MAIL_URL: ${MAIL_URL} + MAIL_TOKEN: ${MAIL_TOKEN} + NODE_ENV: ${NODE_ENV} + APTIC_TOKEN: ${APTIC_TOKEN} + GHOST_HOST_AND_PORT: ${GHOST_HOST_AND_PORT} + GHOST_ADMIN_API_KEY: ${GHOST_ADMIN_API_KEY} + GHOST_CONTENT_API_KEY: ${GHOST_CONTENT_API_KEY} + ELASTICSEARCH_NODE: ${ELASTICSEARCH_NODE} + ELASTICSEARCH_USERNAME: ${ELASTICSEARCH_USERNAME} + ELASTICSEARCH_PASSWORD: ${ELASTICSEARCH_PASSWORD} restart: unless-stopped + networks: + - backend depends_on: - database-ram @@ -25,6 +40,8 @@ services: MONGODB_PASSWORD: ${MONGO_NON_ROOT_PASSWORD} MONGODB_DATABASE: ram restart: unless-stopped + networks: + - backend ports: - ${MONGO_PORT}:27017 volumes: @@ -35,6 +52,8 @@ services: restart: unless-stopped depends_on: - database-ram + networks: + - backend ports: - ${ME_PORT}:8081 environment: @@ -65,8 +84,50 @@ services: environment: MYSQL_ROOT_PASSWORD: ${GHOST_DB_PASSWORD} volumes: - - db-ghost + - db-ghost:/var/lib/mysql + + es01: + image: elasticsearch:7.6.1 + restart: unless-stopped + environment: + node.name: es01 + cluster.name: es-docker-cluster + discovery.type: single-node + xpack.security.enabled: ${ELASTIC_SECURITY} + ELASTIC_PASSWORD: ${ELASTICSEARCH_PASSWORD} + volumes: + - db-elastic:/usr/share/elasticsearch/data + networks: + - elastic + ports: + - ${ELASTICSEARCH_PORT}:9200 + + kib01: + image: docker.elastic.co/kibana/kibana:7.6.1 + restart: unless-stopped + container_name: kib01 + ports: + - ${KIBANA_PORT}:5601 + environment: + ELASTICSEARCH_URL: http://es01:9200 + ELASTICSEARCH_HOSTS: '["http://es01:9200"]' + ELASTICSEARCH_USERNAME: elastic + ELASTICSEARCH_PASSWORD: ${ELASTICSEARCH_PASSWORD} + depends_on: + - es01 + networks: + - elastic volumes: db-ram: + driver: local db-ghost: + driver: local + db-elastic: + driver: local + +networks: + backend: + driver: bridge + elastic: + driver: bridge diff --git a/package-lock.json b/package-lock.json index 79f04ea9cdf353befa5208e0589b66e944947e34..c32dba743fa033561364730f0db3a6b29cb20137 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9 +1,15 @@ { "name": "ram_server", - "version": "1.6.0", + "version": "1.10.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@aduh95/viz.js": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@aduh95/viz.js/-/viz.js-3.5.0.tgz", + "integrity": "sha512-ahLdpRAoGsdgEfy2SGV2wnnHrBSLDHuwA32v+BoNGnz1gqajr8VMzF8y6mIQt28hHi4LQ272wqSi78DK4YdT2g==", + "dev": true + }, "@angular-devkit/core": { "version": "10.0.7", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-10.0.7.tgz", @@ -237,6 +243,12 @@ "@babel/highlight": "^7.10.4" } }, + "@babel/compat-data": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", + "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "dev": true + }, "@babel/core": { "version": "7.12.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz", @@ -318,6 +330,508 @@ } } }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz", + "integrity": "sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz", + "integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.5", + "@babel/helper-split-export-declaration": "^7.16.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", + "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", + "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", + "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-function-name": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", @@ -338,6 +852,33 @@ "@babel/types": "^7.10.4" } }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-member-expression-to-functions": { "version": "7.12.1", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz", @@ -388,17 +929,46 @@ "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", "dev": true }, - "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "@babel/helper-remap-async-to-generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz", + "integrity": "sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" - } + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", + "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.1", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } }, "@babel/helper-simple-access": { "version": "7.12.1", @@ -409,6 +979,33 @@ "@babel/types": "^7.12.1" } }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, "@babel/helper-split-export-declaration": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", @@ -423,6 +1020,164 @@ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz", + "integrity": "sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "@babel/helpers": { "version": "7.12.5", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", @@ -450,192 +1205,3149 @@ "integrity": "sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ==", "dev": true }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", + "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", - "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.5.tgz", + "integrity": "sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "@babel/plugin-proposal-class-properties": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz", + "integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "@babel/plugin-proposal-class-static-block": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz", + "integrity": "sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz", + "integrity": "sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz", + "integrity": "sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "@babel/plugin-proposal-json-strings": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz", + "integrity": "sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz", + "integrity": "sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz", + "integrity": "sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz", + "integrity": "sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz", + "integrity": "sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz", + "integrity": "sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz", + "integrity": "sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz", + "integrity": "sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz", + "integrity": "sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-create-class-features-plugin": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz", + "integrity": "sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz", + "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz", + "integrity": "sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.5.tgz", + "integrity": "sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-remap-async-to-generator": "^7.16.5" + }, + "dependencies": { + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz", + "integrity": "sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz", + "integrity": "sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz", + "integrity": "sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5", + "@babel/helper-split-export-declaration": "^7.16.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz", + "integrity": "sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz", + "integrity": "sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz", + "integrity": "sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz", + "integrity": "sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz", + "integrity": "sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz", + "integrity": "sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz", + "integrity": "sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz", + "integrity": "sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz", + "integrity": "sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz", + "integrity": "sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz", + "integrity": "sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-simple-access": "^7.16.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz", + "integrity": "sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-validator-identifier": "^7.15.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz", + "integrity": "sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz", + "integrity": "sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz", + "integrity": "sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz", + "integrity": "sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-replace-supers": "^7.16.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz", + "integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-replace-supers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz", + "integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-member-expression-to-functions": "^7.16.5", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz", + "integrity": "sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz", + "integrity": "sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz", + "integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz", + "integrity": "sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz", + "integrity": "sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz", + "integrity": "sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz", + "integrity": "sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz", + "integrity": "sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz", + "integrity": "sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz", + "integrity": "sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz", + "integrity": "sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.16.5" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + } + } + }, + "@babel/preset-env": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.5.tgz", + "integrity": "sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.16.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.5", + "@babel/plugin-proposal-class-properties": "^7.16.5", + "@babel/plugin-proposal-class-static-block": "^7.16.5", + "@babel/plugin-proposal-dynamic-import": "^7.16.5", + "@babel/plugin-proposal-export-namespace-from": "^7.16.5", + "@babel/plugin-proposal-json-strings": "^7.16.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.5", + "@babel/plugin-proposal-numeric-separator": "^7.16.5", + "@babel/plugin-proposal-object-rest-spread": "^7.16.5", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.5", + "@babel/plugin-proposal-optional-chaining": "^7.16.5", + "@babel/plugin-proposal-private-methods": "^7.16.5", + "@babel/plugin-proposal-private-property-in-object": "^7.16.5", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.5", + "@babel/plugin-transform-async-to-generator": "^7.16.5", + "@babel/plugin-transform-block-scoped-functions": "^7.16.5", + "@babel/plugin-transform-block-scoping": "^7.16.5", + "@babel/plugin-transform-classes": "^7.16.5", + "@babel/plugin-transform-computed-properties": "^7.16.5", + "@babel/plugin-transform-destructuring": "^7.16.5", + "@babel/plugin-transform-dotall-regex": "^7.16.5", + "@babel/plugin-transform-duplicate-keys": "^7.16.5", + "@babel/plugin-transform-exponentiation-operator": "^7.16.5", + "@babel/plugin-transform-for-of": "^7.16.5", + "@babel/plugin-transform-function-name": "^7.16.5", + "@babel/plugin-transform-literals": "^7.16.5", + "@babel/plugin-transform-member-expression-literals": "^7.16.5", + "@babel/plugin-transform-modules-amd": "^7.16.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.5", + "@babel/plugin-transform-modules-systemjs": "^7.16.5", + "@babel/plugin-transform-modules-umd": "^7.16.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.5", + "@babel/plugin-transform-new-target": "^7.16.5", + "@babel/plugin-transform-object-super": "^7.16.5", + "@babel/plugin-transform-parameters": "^7.16.5", + "@babel/plugin-transform-property-literals": "^7.16.5", + "@babel/plugin-transform-regenerator": "^7.16.5", + "@babel/plugin-transform-reserved-words": "^7.16.5", + "@babel/plugin-transform-shorthand-properties": "^7.16.5", + "@babel/plugin-transform-spread": "^7.16.5", + "@babel/plugin-transform-sticky-regex": "^7.16.5", + "@babel/plugin-transform-template-literals": "^7.16.5", + "@babel/plugin-transform-typeof-symbol": "^7.16.5", + "@babel/plugin-transform-unicode-escapes": "^7.16.5", + "@babel/plugin-transform-unicode-regex": "^7.16.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", + "semver": "^6.3.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", + "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.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 + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.5.tgz", + "integrity": "sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", + "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.12.5", + "@babel/types": "^7.12.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "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 + } + } + }, + "@babel/types": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.5.tgz", + "integrity": "sha512-gyTcvz7JFa4V45C0Zklv//GmFOAal5fL23OWpBLqc4nZ4Yrz67s4kCNwSK1Gu0MXGTU8mRY3zJYtacLdKXlzig==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@compodoc/compodoc": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@compodoc/compodoc/-/compodoc-1.1.16.tgz", + "integrity": "sha512-4zfjOaumS9E6QwoI8s5LF9B71h7zcLMElFUrElpqT83HGpRKBhzNrkEfdODNlS/ySYYpqwX81yUgQXsOWTRTjg==", + "dev": true, + "requires": { + "@babel/core": "^7.16.0", + "@babel/preset-env": "^7.16.4", + "@compodoc/live-server": "^1.2.2", + "@compodoc/ngd-transformer": "^2.1.0", + "chalk": "^4.1.2", + "cheerio": "^1.0.0-rc.10", + "chokidar": "^3.5.2", + "colors": "^1.4.0", + "commander": "^8.3.0", + "cosmiconfig": "^7.0.1", + "decache": "^4.6.0", + "fancy-log": "^1.3.3", + "findit2": "^2.2.3", + "fs-extra": "^10.0.0", + "glob": "^7.2.0", + "handlebars": "^4.7.7", + "html-entities": "^2.3.2", + "i18next": "^21.5.2", + "inside": "^1.0.0", + "json5": "^2.2.0", + "lodash": "^4.17.21", + "loglevel": "^1.8.0", + "loglevel-plugin-prefix": "^0.8.4", + "lunr": "^2.3.9", + "marked": "^4.0.4", + "minimist": "^1.2.5", + "opencollective-postinstall": "^2.0.3", + "os-name": "4.0.1", + "pdfmake": "^0.2.4", + "semver": "^7.3.5", + "traverse": "^0.6.6", + "ts-morph": "^13.0.1", + "uuid": "^8.3.2" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/core": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz", + "integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-module-transforms": "^7.16.5", + "@babel/helpers": "^7.16.5", + "@babel/parser": "^7.16.5", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", + "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", + "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helpers": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz", + "integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.5", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.16.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", + "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "dev": true + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", + "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.5", + "@babel/helper-environment-visitor": "^7.16.5", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.5", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.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 + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "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" + } + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "macos-release": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.5.0.tgz", + "integrity": "sha512-EIgv+QZ9r+814gjJj0Bt5vSLJLzswGmSUbUpbi9AIr/fsN2IWFBl2NucV9PAiek+U1STK468tEkxmVYUtuAN3g==", + "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 + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "os-name": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-4.0.1.tgz", + "integrity": "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==", + "dev": true, + "requires": { + "macos-release": "^2.5.0", + "windows-release": "^4.0.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "windows-release": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-4.0.0.tgz", + "integrity": "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==", + "dev": true, + "requires": { + "execa": "^4.0.2" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@compodoc/live-server": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@compodoc/live-server/-/live-server-1.2.2.tgz", + "integrity": "sha512-TaLC0IfrXc74B/csSaEQhQ2aZrHOC5lSiGT30UqGJ+vBaS9M+JSji0eYCLXScgbp7fSohQA56p0quNmHnHlXUw==", + "dev": true, + "requires": { + "chokidar": "^3.5.2", + "colors": "^1.4.0", + "connect": "^3.7.0", + "cors": "^2.8.5", + "event-stream": "4.0.1", + "faye-websocket": "0.11.x", + "http-auth": "4.1.7", + "http-auth-connect": "^1.0.5", + "morgan": "^1.10.0", + "object-assign": "^4.1.1", + "open": "8.2.1", + "proxy-middleware": "^0.15.0", + "send": "^0.17.2", + "serve-index": "^1.9.1" + }, + "dependencies": { + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + } } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", - "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "@compodoc/ngd-core": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-core/-/ngd-core-2.1.0.tgz", + "integrity": "sha512-nyBH7J7SJJ2AV6OeZhJ02kRtVB7ALnZJKgShjoL9CNmOFEj8AkdhP9qTBIgjaDrbsW5pF4nx32KQL2fT7RFnqw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "ansi-colors": "^4.1.1", + "fancy-log": "^1.3.3", + "typescript": "^4.0.3" } }, - "@babel/template": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", - "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "@compodoc/ngd-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@compodoc/ngd-transformer/-/ngd-transformer-2.1.0.tgz", + "integrity": "sha512-Jo4VCMzIUtgIAdRmhHhOoRRE01gCjc5CyrUERRx0VgEzkkCm1Wmu/XHSsQP6tSpCYHBjERghqaDqH5DabkR2oQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.10.4", - "@babel/types": "^7.10.4" + "@aduh95/viz.js": "^3.1.0", + "@compodoc/ngd-core": "~2.1.0", + "dot": "^1.1.3", + "fs-extra": "^9.0.1" } }, - "@babel/traverse": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.5.tgz", - "integrity": "sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA==", - "dev": true, + "@elastic/elasticsearch": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-7.12.0.tgz", + "integrity": "sha512-GquUEytCijFRPEk3DKkkDdyhspB3qbucVQOwih9uNyz3iz804I+nGBUsFo2LwVvLQmQfEM0IY2+yoYfEz5wMug==", "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.5", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.5", - "@babel/types": "^7.12.5", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.19" + "debug": "^4.3.1", + "hpagent": "^0.1.1", + "ms": "^2.1.3", + "pump": "^3.0.0", + "secure-json-parse": "^2.3.1" }, "dependencies": { "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { "ms": "2.1.2" + }, + "dependencies": { + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "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 + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, - "@babel/types": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.5.tgz", - "integrity": "sha512-gyTcvz7JFa4V45C0Zklv//GmFOAal5fL23OWpBLqc4nZ4Yrz67s4kCNwSK1Gu0MXGTU8mRY3zJYtacLdKXlzig==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.10.4", - "lodash": "^4.17.19", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@cnakazawa/watch": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", - "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", - "dev": true, - "requires": { - "exec-sh": "^0.3.2", - "minimist": "^1.2.0" - } - }, "@eslint/eslintrc": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz", @@ -689,6 +4401,58 @@ } } }, + "@foliojs-fork/fontkit": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.1.tgz", + "integrity": "sha512-U589voc2/ROnvx1CyH9aNzOQWJp127JGU1QAylXGQ7LoEAF6hMmahZLQ4eqAcgHUw+uyW4PjtCItq9qudPkK3A==", + "dev": true, + "requires": { + "@foliojs-fork/restructure": "^2.0.2", + "brfs": "^2.0.0", + "brotli": "^1.2.0", + "browserify-optional": "^1.0.1", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^2.0.0" + } + }, + "@foliojs-fork/linebreak": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.1.tgz", + "integrity": "sha512-pgY/+53GqGQI+mvDiyprvPWgkTlVBS8cxqee03ejm6gKAQNsR1tCYCIvN9FHy7otZajzMqCgPOgC4cHdt4JPig==", + "dev": true, + "requires": { + "base64-js": "1.3.1", + "brfs": "^2.0.2", + "unicode-trie": "^2.0.0" + } + }, + "@foliojs-fork/pdfkit": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.13.0.tgz", + "integrity": "sha512-YXeG1fml9k97YNC9K8e292Pj2JzGt9uOIiBFuQFxHsdQ45BlxW+JU3RQK6JAvXU7kjhjP8rCcYvpk36JLD33sQ==", + "dev": true, + "requires": { + "@foliojs-fork/fontkit": "^1.9.1", + "@foliojs-fork/linebreak": "^1.1.1", + "crypto-js": "^4.0.0", + "png-js": "^1.0.0" + } + }, + "@foliojs-fork/restructure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", + "dev": true + }, + "@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==" + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1246,6 +5010,95 @@ } } }, + "@mapbox/node-pre-gyp": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", + "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", + "requires": { + "detect-libc": "^1.0.3", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.5", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.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==" + } + } + }, + "node-fetch": { + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz", + "integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==", + "requires": { + "whatwg-url": "^5.0.0" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "@nestjs/cli": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/@nestjs/cli/-/cli-7.5.1.tgz", @@ -1356,6 +5209,26 @@ } } }, + "@nestjs/config": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-0.6.3.tgz", + "integrity": "sha512-JxvvUpmH0/WOrTB+zh8dEkxSUQXhB7V3d/qeQXyCnMiEFjaq89+fNFztpWjz4DlOfdS4/eYTzIEy9PH2uGnfzA==", + "requires": { + "dotenv": "8.2.0", + "dotenv-expand": "5.1.0", + "lodash.get": "4.4.2", + "lodash.has": "4.5.2", + "lodash.set": "4.3.2", + "uuid": "8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, "@nestjs/core": { "version": "7.5.1", "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.5.1.tgz", @@ -1370,6 +5243,11 @@ "uuid": "8.3.1" } }, + "@nestjs/elasticsearch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/elasticsearch/-/elasticsearch-7.1.0.tgz", + "integrity": "sha512-3ixmu9MkTh0DS+LKAKcWHLyf/1DPQTXoy+aVClVI14DJQU208oHR3V0e9klApC+GXCYW+BDhNReh4HRyekjTrw==" + }, "@nestjs/jwt": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-7.2.0.tgz", @@ -1548,6 +5426,13 @@ "@nestjs/mapped-types": "0.1.1", "lodash": "4.17.20", "path-to-regexp": "3.2.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + } } }, "@nestjs/testing": { @@ -1639,23 +5524,74 @@ "defer-to-connect": "^1.0.1" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, "@tryghost/admin-api": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/@tryghost/admin-api/-/admin-api-1.3.8.tgz", - "integrity": "sha512-xRyyc3b29xcfyGhUx3nfvsJhXBz7+2NMWbAzSijKphQooCfG7L45XsfF9oRXwEToXUfHbnpBqvzKtsCIp6i8NA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/@tryghost/admin-api/-/admin-api-1.4.4.tgz", + "integrity": "sha512-Xv1POS1ey7GeYuicsIGevRTOmyT4F56MMQN8IFNl8yQbRl42sqRz6kWs4AiQAgjmXRG/JdL7zz0ZFdsh1VrHbg==", "requires": { - "axios": "0.21.1", + "axios": "^0.21.1", "form-data": "^3.0.0", "jsonwebtoken": "^8.4.0" + } + }, + "@ts-morph/common": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.12.2.tgz", + "integrity": "sha512-m5KjptpIf1K0t0QL38uE+ol1n+aNn9MgRq++G3Zym1FlqfN+rThsXlp3cAgib14pIeXF7jk3UtJQOviwawFyYg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "minimatch": "^3.0.4", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" }, "dependencies": { - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, "requires": { - "follow-redirects": "^1.10.0" + "braces": "^3.0.1", + "picomatch": "^2.2.3" } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true } } }, @@ -1838,9 +5774,9 @@ "dev": true }, "@types/minimist": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz", - "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==" }, "@types/mongodb": { "version": "3.5.34", @@ -2435,6 +6371,25 @@ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", @@ -2446,6 +6401,29 @@ "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=" }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "ajv": { "version": "6.12.3", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", @@ -2470,53 +6448,20 @@ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": true + }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "dev": true, "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-colors": { @@ -2534,10 +6479,19 @@ "type-fest": "^0.11.0" } }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -2547,6 +6501,12 @@ "color-convert": "^1.9.0" } }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, "anymatch": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", @@ -2557,6 +6517,21 @@ "picomatch": "^2.0.4" } }, + "apache-crypt": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/apache-crypt/-/apache-crypt-1.2.5.tgz", + "integrity": "sha512-ICnYQH+DFVmw+S4Q0QY2XRXD8Ne8ewh8HgbuFH4K7022zCxgHM0Hz1xkRnUlEfAXNbwp1Cnhbedu60USIfDxvg==", + "dev": true, + "requires": { + "unix-crypt-td-js": "^1.1.4" + } + }, + "apache-md5": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/apache-md5/-/apache-md5-1.1.7.tgz", + "integrity": "sha512-JtHjzZmJxtzfTSjsCyHgPR155HBe5WGyUyHTaEkfy46qhwCFKx1Epm6nAxgUG3WfUZP1dWhGqj9Z2NOBeZ+uBw==", + "dev": true + }, "append-field": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", @@ -2568,39 +6543,35 @@ "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "are-we-there-yet": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", - "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", "requires": { "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "readable-stream": "^3.6.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "~5.2.0" } } } @@ -2638,16 +6609,17 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, "array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", @@ -2670,15 +6642,6 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -2726,18 +6689,71 @@ } } }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "ast-transform": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ast-transform/-/ast-transform-0.0.0.tgz", + "integrity": "sha1-dJRAWIh9goPhidlUYAlHvJj+AGI=", + "dev": true, + "requires": { + "escodegen": "~1.2.0", + "esprima": "~1.0.4", + "through": "~2.3.4" + }, + "dependencies": { + "escodegen": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.2.0.tgz", + "integrity": "sha1-Cd55Z3kcyVi3+Jot220jRRrzJ+E=", + "dev": true, + "requires": { + "esprima": "~1.0.4", + "estraverse": "~1.5.0", + "esutils": "~1.0.0", + "source-map": "~0.1.30" + } + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "dev": true + }, + "estraverse": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.5.1.tgz", + "integrity": "sha1-hno+jlip+EYYr7bC3bzZFrfLr3E=", + "dev": true + }, + "esutils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.0.0.tgz", + "integrity": "sha1-gVHTWOIMisx/t0XnRywAJf5JZXA=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "ast-types": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.7.8.tgz", + "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk=", + "dev": true + }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -2773,18 +6789,6 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "axios": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", @@ -2860,6 +6864,15 @@ } } }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, "babel-plugin-istanbul": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz", @@ -2885,6 +6898,44 @@ "@types/babel__traverse": "^7.0.6" } }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.0", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0" + } + }, "babel-preset-current-node-syntax": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz", @@ -2981,24 +7032,36 @@ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, - "bcrypt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.0.tgz", - "integrity": "sha512-jB0yCBl4W/kVHM2whjfyqnxTmOHkCX4kHEa5nYKSoGeYe8YrjTYTc87/6bwt1g8cmV0QrbhKriETg9jWtcREhg==", + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, "requires": { - "node-addon-api": "^3.0.0", - "node-pre-gyp": "0.15.0" + "safe-buffer": "5.1.2" } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.0.1.tgz", + "integrity": "sha512-9BTgmrhZM2t1bNuDtrtIMVSmmxZBrJ71n8Wg+YgdjHuIWYF7SjjmCPZFB+/5i/o/PIeRpwVJR3P+NrpIItUjqw==", "requires": { - "tweetnacl": "^0.14.3" + "@mapbox/node-pre-gyp": "^1.0.0", + "node-addon-api": "^3.1.0" } }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=", + "dev": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -3088,6 +7151,12 @@ "type-is": "~1.6.17" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, "boxen": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", @@ -3179,18 +7248,56 @@ "fill-range": "^7.0.1" } }, + "brfs": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brfs/-/brfs-2.0.2.tgz", + "integrity": "sha512-IrFjVtwu4eTJZyu8w/V2gxU7iLTtcHih67sgEdzrhjLBMHp2uYefUBfdM4k2UvcuWMgV7PQDZHSLeNWnLFKWVQ==", + "dev": true, + "requires": { + "quote-stream": "^1.0.1", + "resolve": "^1.1.5", + "static-module": "^3.0.2", + "through2": "^2.0.0" + } + }, "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "brotli": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.2.tgz", + "integrity": "sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y=", + "dev": true, + "requires": { + "base64-js": "^1.1.2" + } + }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -3228,6 +7335,17 @@ "safe-buffer": "^5.1.2" } }, + "browserify-optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-optional/-/browserify-optional-1.0.1.tgz", + "integrity": "sha1-HhNyLP3g2F8SFnbCpyztUzoBiGk=", + "dev": true, + "requires": { + "ast-transform": "0.0.0", + "ast-types": "^0.7.0", + "browser-resolve": "^1.8.1" + } + }, "browserify-rsa": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", @@ -3306,6 +7424,19 @@ "pako": "~1.0.5" } }, + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, "bs-logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", @@ -3348,6 +7479,12 @@ } } }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=", + "dev": true + }, "buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -3467,6 +7604,22 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3488,6 +7641,12 @@ "quick-lru": "^4.0.1" } }, + "caniuse-lite": { + "version": "1.0.30001291", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001291.tgz", + "integrity": "sha512-roMV5V0HNGgJ88s42eE70sstqGW/gwFndosYrikHthw98N5tLnOTxFqMLQjZVRxTWFlJ4rn+MsgXrR7MDPY4jA==", + "dev": true + }, "capture-exit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", @@ -3497,12 +7656,6 @@ "rsvp": "^4.8.4" } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3525,6 +7678,48 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dev": true, + "requires": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } + }, + "cheerio-select": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", + "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "css-what": "^5.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0", + "domutils": "^2.7.0" + } + }, "chokidar": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", @@ -3544,7 +7739,8 @@ "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true }, "chrome-trace-event": { "version": "1.0.2", @@ -3699,6 +7895,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -3726,10 +7923,22 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", "dev": true }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + "code-block-writer": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.0.tgz", + "integrity": "sha512-GEqWvEWWsOvER+g9keO4ohFoD3ymwyCnqY3hoTr7GZipYFwEhMHJw+TtV0rfgRhNImM6QWZGO2XYjlJVyYT62w==", + "dev": true, + "requires": { + "tslib": "2.3.1" + }, + "dependencies": { + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } }, "collect-v8-coverage": { "version": "1.0.1", @@ -3760,12 +7969,16 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true + "dev": true }, "combined-stream": { "version": "1.0.8", @@ -3878,6 +8091,18 @@ } } }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, "consola": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.0.tgz", @@ -3914,27 +8139,27 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "conventional-changelog": { - "version": "3.1.23", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.23.tgz", - "integrity": "sha512-sScUu2NHusjRC1dPc5p8/b3kT78OYr95/Bx7Vl8CPB8tF2mG1xei5iylDTRjONV5hTlzt+Cn/tBWrKdd299b7A==", - "requires": { - "conventional-changelog-angular": "^5.0.11", - "conventional-changelog-atom": "^2.0.7", - "conventional-changelog-codemirror": "^2.0.7", - "conventional-changelog-conventionalcommits": "^4.4.0", - "conventional-changelog-core": "^4.2.0", - "conventional-changelog-ember": "^2.0.8", - "conventional-changelog-eslint": "^3.0.8", - "conventional-changelog-express": "^2.0.5", - "conventional-changelog-jquery": "^3.0.10", - "conventional-changelog-jshint": "^2.0.8", + "version": "3.1.24", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.24.tgz", + "integrity": "sha512-ed6k8PO00UVvhExYohroVPXcOJ/K1N0/drJHx/faTH37OIZthlecuLIRX/T6uOp682CAoVoFpu+sSEaeuH6Asg==", + "requires": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", "conventional-changelog-preset-loader": "^2.3.4" } }, "conventional-changelog-angular": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz", - "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==", + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "requires": { "compare-func": "^2.0.0", "q": "^1.5.1" @@ -3962,9 +8187,9 @@ "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==" }, "conventional-changelog-conventionalcommits": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz", - "integrity": "sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.1.tgz", + "integrity": "sha512-lzWJpPZhbM1R0PIzkwzGBCnAkH5RKJzJfFQZcl/D+2lsJxAwGnDKBqn/F4C1RD31GJNn8NuKWQzAZDAVXPp2Mw==", "requires": { "compare-func": "^2.0.0", "lodash": "^4.17.15", @@ -3972,16 +8197,16 @@ } }, "conventional-changelog-core": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.1.tgz", - "integrity": "sha512-8cH8/DEoD3e5Q6aeogdR5oaaKs0+mG6+f+Om0ZYt3PNv7Zo0sQhu4bMDRsqAF+UTekTAtP1W/C41jH/fkm8Jtw==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "requires": { "add-stream": "^1.0.0", - "conventional-changelog-writer": "^4.0.18", + "conventional-changelog-writer": "^5.0.0", "conventional-commits-parser": "^3.2.0", "dateformat": "^3.0.0", - "get-pkg-repo": "^1.0.0", - "git-raw-commits": "2.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", "git-remote-origin-url": "^2.0.0", "git-semver-tags": "^4.1.1", "lodash": "^4.17.15", @@ -3989,7 +8214,6 @@ "q": "^1.5.1", "read-pkg": "^3.0.0", "read-pkg-up": "^3.0.0", - "shelljs": "^0.8.3", "through2": "^4.0.0" }, "dependencies": { @@ -4002,22 +8226,19 @@ } }, "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", "requires": { "lru-cache": "^6.0.0" } }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "has": "^1.0.3" } }, "locate-path": { @@ -4038,13 +8259,13 @@ } }, "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, @@ -4069,15 +8290,6 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -4102,9 +8314,9 @@ }, "dependencies": { "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "normalize-package-data": { "version": "2.5.0", @@ -4148,6 +8360,14 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -4218,11 +8438,10 @@ "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==" }, "conventional-changelog-writer": { - "version": "4.0.18", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.18.tgz", - "integrity": "sha512-mAQDCKyB9HsE8Ko5cCM1Jn1AWxXPYV0v8dFPabZRkvsiWUul2YyAqbIaoMKF88Zf2ffnOPSvKhboLf3fnjo5/A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.0.tgz", + "integrity": "sha512-HnDh9QHLNWfL6E1uHz6krZEQOgm8hN7z/m7tT16xwd802fwgMN0Wqd7AQYVkhpsjDUx/99oo+nGgvKF657XP5g==", "requires": { - "compare-func": "^2.0.0", "conventional-commits-filter": "^2.0.7", "dateformat": "^3.0.0", "handlebars": "^4.7.6", @@ -4282,17 +8501,16 @@ } }, "conventional-commits-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.0.tgz", - "integrity": "sha512-XmJiXPxsF0JhAKyfA2Nn+rZwYKJ60nanlbSWwwkGwLQFbugsc0gv1rzc7VbbUWAzJfR1qR87/pNgv9NgmxtBMQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.3.tgz", + "integrity": "sha512-YyRDR7On9H07ICFpRm/igcdjIqebXbvf4Cff+Pf0BrBys1i1EOzx9iFXNlAbdrLAR8jf7bkUYkDAr8pEy0q4Pw==", "requires": { "JSONStream": "^1.0.4", "is-text-path": "^1.0.1", "lodash": "^4.17.15", "meow": "^8.0.0", - "split2": "^2.0.0", - "through2": "^4.0.0", - "trim-off-newlines": "^1.0.0" + "split2": "^3.0.0", + "through2": "^4.0.0" }, "dependencies": { "readable-stream": { @@ -4329,17 +8547,17 @@ } }, "conventional-recommended-bump": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.0.10.tgz", - "integrity": "sha512-2ibrqAFMN3ZA369JgVoSbajdD/BHN6zjY7DZFKTHzyzuQejDUCjQ85S5KHxCRxNwsbDJhTPD5hOKcis/jQhRgg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "requires": { "concat-stream": "^2.0.0", "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.6", - "conventional-commits-parser": "^3.1.0", - "git-raw-commits": "2.0.0", - "git-semver-tags": "^4.1.0", - "meow": "^7.0.0", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", "q": "^1.5.1" }, "dependencies": { @@ -4354,24 +8572,6 @@ "typedarray": "^0.0.6" } }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "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" - } - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -4394,11 +8594,6 @@ "requires": { "safe-buffer": "~5.2.0" } - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==" } } }, @@ -4458,6 +8653,24 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js-compat": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.0.tgz", + "integrity": "sha512-relrah5h+sslXssTTOkvqcC/6RURifB0W5yhYBdBkaPYa5/2KBMiog3XiD+s3TwEHWxInWVv4Jx2/Lw0vng+IQ==", + "dev": true, + "requires": { + "browserslist": "^4.19.1", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -4578,12 +8791,37 @@ "randomfill": "^1.0.3" } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "dev": true + }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, + "css-select": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.0.tgz", + "integrity": "sha512-6YVG6hsH9yIb/si3Th/is8Pex7qnVHO6t7q7U6TIUnkQASGbS8tnUDBftnPynLNnuUl/r2+PTd0ekiiq7R0zJw==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true + }, "cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -4607,37 +8845,33 @@ } } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } - }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, + "dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==" + }, + "dash-ast": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-2.0.1.tgz", + "integrity": "sha512-5TXltWJGc+RdnabUGzhRae1TRq6m4gr+3K2wQX0is5/F2yS6MJXJvLyI3ErAnsAXuJoGqvfVD5icRgim07DrxQ==", + "dev": true + }, "data-urls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", @@ -4662,6 +8896,15 @@ "ms": "2.0.0" } }, + "decache": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/decache/-/decache-4.6.1.tgz", + "integrity": "sha512-ohApBM8u9ygepJCjgBrEZSSxPjc0T/PJkD+uNyxXPkqudyUpdXpwJYp0VISm2WrPVzASU6DZyIi6BWdyw7uJ2Q==", + "dev": true, + "requires": { + "callsite": "^1.0.0" + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -4704,10 +8947,25 @@ "mimic-response": "^1.0.0" } }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true }, "deep-is": { "version": "0.1.3", @@ -4736,6 +8994,21 @@ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", "dev": true }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -4813,9 +9086,9 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-indent": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", - "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==" }, "detect-libc": { "version": "1.0.3", @@ -4827,6 +9100,12 @@ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" }, + "dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "dev": true + }, "dicer": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", @@ -4885,12 +9164,29 @@ "esutils": "^2.0.2" } }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -4908,6 +9204,32 @@ } } }, + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "dot": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.3.tgz", + "integrity": "sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==", + "dev": true + }, "dot-prop": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", @@ -4921,6 +9243,11 @@ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, "dotgitignore": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", @@ -4930,6 +9257,53 @@ "minimatch": "^3.0.4" } }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" + }, + "dependencies": { + "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==", + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -4980,16 +9354,6 @@ } } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ecdsa-sig-formatter": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", @@ -5011,25 +9375,37 @@ "jake": "^10.6.1" } }, + "electron-to-chromium": { + "version": "1.4.24", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.24.tgz", + "integrity": "sha512-erwx5r69B/WFfFuF2jcNN0817BfDBdC4765kQ6WltOMuwsimlQo3JTEq0Cle+wpHralwdeX3OfAtw/mHxPK0Wg==", + "dev": true + }, "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", + "bn.js": "^4.11.9", + "brorand": "^1.1.0", "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^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==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true } } @@ -5060,7 +9436,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -5085,6 +9460,12 @@ "ansi-colors": "^4.1.1" } }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -5102,6 +9483,82 @@ "is-arrayish": "^0.2.1" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "dev": true, + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "~0.3.5" + }, + "dependencies": { + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + } + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", @@ -5469,6 +9926,12 @@ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "estree-is-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-function/-/estree-is-function-1.0.0.tgz", + "integrity": "sha512-nSCWn1jkSq2QAtkaVLJZY2ezwcFO161HVc174zL1KPW3RJ+O6C3eJb8Nx7OXzvhoEv+nLgSR1g71oWUHUDTrJA==", + "dev": true + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -5480,6 +9943,31 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "event-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", + "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, "events": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", @@ -5642,12 +10130,23 @@ } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, + "ext": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", + "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", + "dev": true, + "requires": { + "type": "^2.5.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==", + "dev": true + } + } + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -5745,11 +10244,17 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } }, "fast-deep-equal": { "version": "3.1.3", @@ -5815,6 +10320,15 @@ "reusify": "^1.0.4" } }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, "fb-watchman": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", @@ -5904,6 +10418,12 @@ "locate-path": "^3.0.0" } }, + "findit2": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz", + "integrity": "sha1-WKRmaX34piBc39vzlVNri9d3pfY=", + "dev": true + }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", @@ -5985,12 +10505,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, "fork-ts-checker-webpack-plugin": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-5.1.0.tgz", @@ -6096,6 +10610,12 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -6159,11 +10679,11 @@ } }, "fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "requires": { - "minipass": "^2.6.0" + "minipass": "^3.0.0" } }, "fs-monkey": { @@ -6208,49 +10728,37 @@ "dev": true }, "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", "requires": { - "aproba": "^1.0.3", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" }, "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "^1.0.0" - } - }, "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.1" } } } @@ -6261,11 +10769,28 @@ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -6273,138 +10798,101 @@ "dev": true }, "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", "requires": { - "hosted-git-info": "^2.1.4", - "meow": "^3.3.0", - "normalize-package-data": "^2.3.0", - "parse-github-repo-url": "^1.3.0", - "through2": "^2.0.0" + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" }, "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" + "color-convert": "^2.0.1" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "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==", "requires": { - "repeating": "^2.0.0" + "color-name": "~1.1.4" } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } + "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==" }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "hosted-git-info": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", "requires": { - "pinkie-promise": "^2.0.0" + "lru-cache": "^6.0.0" } }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "yallist": "^4.0.0" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "requires": { - "get-stdin": "^4.0.1" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" } } }, @@ -6429,190 +10917,48 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "git-raw-commits": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", - "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz", + "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==", "requires": { - "dargs": "^4.0.1", - "lodash.template": "^4.0.2", - "meow": "^4.0.0", - "split2": "^2.0.0", - "through2": "^2.0.0" + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "requires": { - "camelcase": "^4.1.0", - "map-obj": "^2.0.0", - "quick-lru": "^1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "^2.0.0" - } - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" - }, - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "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==", "requires": { - "camelcase-keys": "^4.0.0", - "decamelize-keys": "^1.0.0", - "loud-rejection": "^1.0.0", - "minimist": "^1.1.3", - "minimist-options": "^3.0.1", - "normalize-package-data": "^2.3.4", - "read-pkg-up": "^3.0.0", - "redent": "^2.0.0", - "trim-newlines": "^2.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" - } + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "p-limit": { + "string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "safe-buffer": "~5.2.0" } }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "requires": { - "indent-string": "^3.0.0", - "strip-indent": "^2.0.0" + "readable-stream": "3" } - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" } } }, @@ -6670,9 +11016,9 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -6755,9 +11101,9 @@ "optional": true }, "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "requires": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -6768,25 +11114,9 @@ "dependencies": { "source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } } }, "hard-rejection": { @@ -6807,6 +11137,21 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -6937,9 +11282,14 @@ } }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "hpagent": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-0.1.1.tgz", + "integrity": "sha512-IxJWQiY0vmEjetHdoE9HZjD4Cx+mYTr25tR7JCxXaiI3QxW0YqYyM11KyZbHufoa/piWhMb2+D3FGpMgmA2cFQ==" }, "html-encoding-sniffer": { "version": "2.0.1", @@ -6950,12 +11300,56 @@ "whatwg-encoding": "^1.0.5" } }, + "html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-auth": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/http-auth/-/http-auth-4.1.7.tgz", + "integrity": "sha512-LdftJKxCOpEE56ESgg8uODQ+f+P+0ZHN+PZblIT3YX+c1hDINiI6eNDZ/jm+ji+oqeP+RAW7RuIvt76vqiOLnQ==", + "dev": true, + "requires": { + "apache-crypt": "^1.1.2", + "apache-md5": "^1.0.6", + "bcryptjs": "^2.4.3", + "uuid": "^3.4.0" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, + "http-auth-connect": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/http-auth-connect/-/http-auth-connect-1.0.5.tgz", + "integrity": "sha512-zykAOKpVAXyzhOLm6+xyB/RtRcfN3uDfH4Al73DIfeSb6B7nr0WToLI6UyyM6ohtcLmbBPksWXzVbEDStz8ObQ==", + "dev": true + }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -6974,15 +11368,38 @@ "toidentifier": "1.0.0" } }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "http-parser-js": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", + "dev": true + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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 + } } }, "https-browserify": { @@ -6991,12 +11408,45 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "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==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, + "i18next": { + "version": "21.6.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.3.tgz", + "integrity": "sha512-2uuRGslNQ8m7TRllsVs4cZuei5X9OgoPRB/Sj5oadUpxZaW+NYv3srn7zR+h8bCMhkux9z8HtnJdQM5Mz+Govw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.12.0" + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -7029,14 +11479,6 @@ "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", "dev": true }, - "ignore-walk": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", - "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", - "requires": { - "minimatch": "^3.0.4" - } - }, "import-fresh": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz", @@ -7222,15 +11664,16 @@ } } }, + "inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/inside/-/inside-1.0.0.tgz", + "integrity": "sha1-20Xpk1c82z23C5gy6ChbrUZCR3A=", + "dev": true + }, "interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true }, "ipaddr.js": { @@ -7258,6 +11701,16 @@ } } }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -7315,6 +11768,15 @@ } } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -7338,8 +11800,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz", "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==", - "dev": true, - "optional": true + "dev": true }, "is-extendable": { "version": "0.1.1", @@ -7353,11 +11814,6 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" - }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -7431,11 +11887,15 @@ "isobject": "^3.0.1" } }, - "is-potential-custom-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz", - "integrity": "sha1-DFLlS8yjkbssSUsh6GJtczbG45c=", - "dev": true + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } }, "is-stream": { "version": "1.1.0", @@ -7457,11 +11917,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -7497,12 +11952,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul-lib-coverage": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", @@ -8179,6 +12628,47 @@ } } }, + "jest-junit": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/jest-junit/-/jest-junit-12.0.0.tgz", + "integrity": "sha512-+8K35LlboWiPuCnXSyiid7rFdxNlpCWWM20WEYe6IZH6psfUWKZmSpSRQ5tk0C0cBeDsvsnIzcef5mYhyJsbug==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "strip-ansi": "^5.2.0", + "uuid": "^3.3.3", + "xml": "^1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, "jest-leak-detector": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz", @@ -8915,80 +13405,189 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.6.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", + "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dev": true, + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "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 + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" } } } }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, - "jsdom": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.4.0.tgz", - "integrity": "sha512-lYMm3wYdgPhrl7pDcRmvzPhhrGVBeVhPIqeHjzeiHN3DFmD1RBpbExbi8vU7BJdH8VAZYovR8DMt0PNNDM7k8w==", - "dev": true, - "requires": { - "abab": "^2.0.3", - "acorn": "^7.1.1", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.2.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.0", - "domexception": "^2.0.1", - "escodegen": "^1.14.1", - "html-encoding-sniffer": "^2.0.1", - "is-potential-custom-element-name": "^1.0.0", - "nwsapi": "^2.2.0", - "parse5": "5.1.1", - "request": "^2.88.2", - "request-promise-native": "^1.0.8", - "saxes": "^5.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^3.0.1", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0", - "ws": "^7.2.3", - "xml-name-validator": "^3.0.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - } - } - }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9011,12 +13610,6 @@ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -9095,18 +13688,6 @@ } } }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -9182,37 +13763,29 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, @@ -9243,14 +13816,25 @@ } }, "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" }, "lodash.includes": { "version": "4.3.0", @@ -9298,29 +13882,17 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", "dev": true }, - "lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "requires": { - "lodash._reinterpolate": "^3.0.0" - } - }, "lodash.toarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", @@ -9336,14 +13908,17 @@ "chalk": "^2.4.2" } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } + "loglevel": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.0.tgz", + "integrity": "sha512-G6A/nJLRgWOuuwdNuA6koovfEV1YpqqAG4pRUlFaz3jj2QNZ8M4vBqnVA+HBTmU/AMNUtlOsMmSpF6NyOjztbA==", + "dev": true + }, + "loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", + "dev": true }, "lowercase-keys": { "version": "1.0.1", @@ -9360,6 +13935,12 @@ "yallist": "^3.0.2" } }, + "lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "luxon": { "version": "1.25.0", "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.25.0.tgz", @@ -9420,9 +14001,15 @@ "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==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" + }, + "map-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "dev": true }, "map-visit": { "version": "1.0.0", @@ -9433,6 +14020,12 @@ "object-visit": "^1.0.0" } }, + "marked": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.8.tgz", + "integrity": "sha512-dkpJMIlJpc833hbjjg8jraw1t51e/eKDoG8TFOgc5O0Z77zaYKigYekTDop5AplRoKFGIaoazhYEhGkMtU3IeA==", + "dev": true + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -9507,9 +14100,9 @@ "optional": true }, "meow": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.0.0.tgz", - "integrity": "sha512-nbsTRz2fwniJBFgUkcdISq8y/q9n9VbiHYbfwklFh5V4V2uAcxtKQkDc0yCLPM/kP0d+inZBewn3zJqewHE7kg==", + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "requires": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -9525,13 +14118,21 @@ }, "dependencies": { "hosted-git-info": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.7.tgz", - "integrity": "sha512-fWqc0IcuXs+BmE9orLDyVykAG9GJtGLGuZAAqgcckPgv5xad4AcXGIv8galtQvlwutxSlaMcdw7BUtq2EIvqCQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", + "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==", "requires": { "lru-cache": "^6.0.0" } }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "requires": { + "has": "^1.0.3" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -9541,16 +14142,24 @@ } }, "normalize-package-data": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz", - "integrity": "sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "requires": { - "hosted-git-info": "^3.0.6", - "resolve": "^1.17.0", - "semver": "^7.3.2", + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", "validate-npm-package-license": "^3.0.1" } }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, "type-fest": { "version": "0.18.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", @@ -9562,9 +14171,9 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" } } }, @@ -9573,6 +14182,23 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", + "dev": true, + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -9695,6 +14321,33 @@ } } }, + "migrate": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/migrate/-/migrate-1.7.0.tgz", + "integrity": "sha512-I63YykITgWyI+ET4KO8xGePYkR9U7CtSe/RrR13vLbZSpUcAh4/ry2GswNv7Lywcsp3BaDHj7YdjC7ihVYCFmw==", + "requires": { + "chalk": "^2.4.1", + "commander": "^2.19.0", + "dateformat": "^3.0.3", + "dotenv": "^6.1.0", + "inherits": "^2.0.3", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "slug": "^0.9.2" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + } + } + }, "miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -9784,20 +14437,34 @@ } }, "minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "requires": { - "minipass": "^2.9.0" + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "mississippi": { @@ -9913,6 +14580,27 @@ "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + } + } + }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -10028,31 +14716,6 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "needle": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.5.2.tgz", - "integrity": "sha512-LbRIwS9BfkPvNwNHlsA41Q29kL2L/6VaOJ0qisM5lLWsTV3nP15abO5ITL6L81zqFhzjRKDAYjpcBcwM0AVvLQ==", - "requires": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "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==" - } - } - }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -10063,6 +14726,12 @@ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -10070,9 +14739,9 @@ "dev": true }, "node-addon-api": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.0.2.tgz", - "integrity": "sha512-+D4s2HCnxPd5PjjI0STKwncjXTUKKqm74MDMz9OPXavjsGmjkvwgLtA5yoxJUdmpj52+2u+RrXgPipahKczMKg==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" }, "node-emoji": { "version": "1.10.0", @@ -10189,9 +14858,9 @@ "dev": true }, "node-notifier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz", - "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", + "integrity": "sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==", "dev": true, "optional": true, "requires": { @@ -10225,46 +14894,11 @@ } } }, - "node-pre-gyp": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.15.0.tgz", - "integrity": "sha512-7QcZa8/fpaU/BKenjcaeFF9hLz2+7S9AqyXFhlH/rilsQ/hPZKK32RtR5EQHJElgu+q5RfbJ34KriI79UWaorA==", - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.3", - "needle": "^2.5.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4.4.2" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true }, "nodemon": { "version": "2.0.6", @@ -10341,34 +14975,11 @@ "dev": true }, "normalize-url": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", - "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, - "npm-bundled": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", - "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-packlist": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", - "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -10379,14 +14990,23 @@ } }, "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "boolbase": "^1.0.0" } }, "null-check": { @@ -10394,23 +15014,12 @@ "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=" }, - "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=" - }, "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", "dev": true }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -10452,6 +15061,28 @@ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz", "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==" }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -10461,6 +15092,18 @@ "isobject": "^3.0.0" } }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -10478,6 +15121,12 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -10495,6 +15144,34 @@ "mimic-fn": "^2.1.0" } }, + "open": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", + "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "dependencies": { + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + } + } + }, + "opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "dev": true + }, "optional": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", @@ -10597,11 +15274,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, "os-name": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", @@ -10615,16 +15287,8 @@ "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=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true }, "p-cancelable": { "version": "1.1.0", @@ -10756,11 +15420,6 @@ "safe-buffer": "^5.1.1" } }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=" - }, "parse-json": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz", @@ -10772,12 +15431,29 @@ "lines-and-columns": "^1.1.6" } }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "dev": true }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -10850,9 +15526,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "3.2.0", @@ -10870,6 +15546,15 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "~2.3" + } + }, "pbkdf2": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", @@ -10883,10 +15568,33 @@ "sha.js": "^2.4.8" } }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "pdfmake": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.4.tgz", + "integrity": "sha512-EM39waHUe/Dg1W9C3XqYbpx6tfhYyU14JHZlI1HaW0AUEY32GbkRBjDLGWo9f7z/k3ea6k1p9yyDrflnvtZS1A==", + "dev": true, + "requires": { + "@foliojs-fork/linebreak": "^1.1.1", + "@foliojs-fork/pdfkit": "^0.13.0", + "iconv-lite": "^0.6.3", + "xmldoc": "^1.1.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, "picomatch": { @@ -10901,19 +15609,6 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "requires": { - "pinkie": "^2.0.0" - } - }, "pirates": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", @@ -10938,6 +15633,12 @@ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", "dev": true }, + "png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==", + "dev": true + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -11051,6 +15752,12 @@ "ipaddr.js": "1.9.1" } }, + "proxy-middleware": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.15.0.tgz", + "integrity": "sha1-o/3xvvtzD5UZZYcqwvYHTGFHelY=", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -11095,7 +15802,6 @@ "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" @@ -11166,6 +15872,17 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" }, + "quote-stream": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz", + "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=", + "dev": true, + "requires": { + "buffer-equal": "0.0.1", + "minimist": "^1.1.3", + "through2": "^2.0.0" + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -11205,6 +15922,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, "requires": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -11215,7 +15933,8 @@ "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true } } }, @@ -11314,6 +16033,7 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, "requires": { "resolve": "^1.1.6" } @@ -11332,6 +16052,36 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -11347,12 +16097,36 @@ "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, "registry-auth-token": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", @@ -11371,6 +16145,29 @@ "rc": "^1.2.8" } }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -11389,109 +16186,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - } - } - }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -11500,7 +16194,8 @@ "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "require_optional": { "version": "1.0.1", @@ -11721,7 +16416,8 @@ "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true }, "saxes": { "version": "5.0.1", @@ -11743,6 +16439,26 @@ "ajv-keywords": "^3.4.1" } }, + "scope-analyzer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.2.tgz", + "integrity": "sha512-5cfCmsTYV/wPaRIItNxatw02ua/MThdIUNnUOCYp+3LSEJvnG804ANw2VLaavNILIfWXF1D1G2KNANkBBvInwQ==", + "dev": true, + "requires": { + "array-from": "^2.1.1", + "dash-ast": "^2.0.1", + "es6-map": "^0.1.5", + "es6-set": "^0.1.5", + "es6-symbol": "^3.1.1", + "estree-is-function": "^1.0.0", + "get-assigned-identifiers": "^1.1.0" + } + }, + "secure-json-parse": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.4.0.tgz", + "integrity": "sha512-Q5Z/97nbON5t/L/sH6mY2EacfjVGwrCcSi5D3btRO2GZ8pf1K1UN7Z9H5J57hjVU2Qzxr1xO+FmBhOvEkzCMmg==" + }, "semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", @@ -11801,6 +16517,41 @@ "randombytes": "^2.1.0" } }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, "serve-static": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", @@ -11861,6 +16612,12 @@ "safe-buffer": "^5.0.1" } }, + "shallow-copy": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", + "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=", + "dev": true + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -11880,6 +16637,7 @@ "version": "0.8.4", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dev": true, "requires": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -11939,6 +16697,14 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, + "slug": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/slug/-/slug-0.9.4.tgz", + "integrity": "sha512-3YHq0TeJ4+AIFbJm+4UWSQs5A1mmeWOTQqydW3OoPmQfNKxlO96NDRTIrp+TBkmvEsEFrd+Z/LXw8OD/6OlZ5g==", + "requires": { + "unicode": ">= 0.3.1" + } + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -12162,11 +16928,36 @@ } }, "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "requires": { - "through2": "^2.0.2" + "readable-stream": "^3.0.0" + }, + "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==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + } } }, "sprintf-js": { @@ -12175,27 +16966,10 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -12219,59 +16993,141 @@ } }, "standard-version": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.0.0.tgz", - "integrity": "sha512-eRR04IscMP3xW9MJTykwz13HFNYs8jS33AGuDiBKgfo5YrO0qX0Nxb4rjupVwT5HDYL/aR+MBEVLjlmVFmFEDQ==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.3.2.tgz", + "integrity": "sha512-u1rfKP4o4ew7Yjbfycv80aNMN2feTiqseAhUhrrx2XtdQGmu7gucpziXe68Z4YfHVqlxVEzo4aUA0Iu3VQOTgQ==", "requires": { "chalk": "^2.4.2", - "conventional-changelog": "3.1.23", + "conventional-changelog": "3.1.24", "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.4.0", - "conventional-recommended-bump": "6.0.10", + "conventional-changelog-conventionalcommits": "4.6.1", + "conventional-recommended-bump": "6.1.0", "detect-indent": "^6.0.0", "detect-newline": "^3.1.0", "dotgitignore": "^2.1.0", "figures": "^3.1.0", - "find-up": "^4.1.0", + "find-up": "^5.0.0", "fs-access": "^1.0.1", "git-semver-tags": "^4.0.0", "semver": "^7.1.1", "stringify-package": "^1.0.1", - "yargs": "^15.3.1" + "yargs": "^16.0.0" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.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==", + "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==" + }, "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { - "locate-path": "^5.0.0", + "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" } }, "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" } }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" } } }, + "static-eval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", + "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", + "dev": true, + "requires": { + "escodegen": "^1.11.1" + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -12293,17 +17149,74 @@ } } }, + "static-module": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz", + "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "concat-stream": "~1.6.0", + "convert-source-map": "^1.5.1", + "duplexer2": "~0.1.4", + "escodegen": "^1.11.1", + "has": "^1.0.1", + "magic-string": "0.25.1", + "merge-source-map": "1.0.4", + "object-inspect": "^1.6.0", + "readable-stream": "~2.3.3", + "scope-analyzer": "^2.0.1", + "shallow-copy": "~0.0.1", + "static-eval": "^2.0.5", + "through2": "~2.0.3" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "magic-string": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", + "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.1" + } + }, + "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==", + "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" + } + }, + "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==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -12346,6 +17259,16 @@ } } }, + "stream-combiner": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, + "requires": { + "duplexer": "~0.1.1", + "through": "~2.3.4" + } + }, "stream-each": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", @@ -12612,16 +17535,16 @@ } }, "swagger-ui-dist": { - "version": "3.37.0", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.37.0.tgz", - "integrity": "sha512-ySYfsGTSxuyIAAynncQew9WLRsKu6bI3/tWTqcuXYSqTLCjz3ROtUbNj2zRNs7i37V8CteKE9CUMkYnNklGi2g==" + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-4.1.3.tgz", + "integrity": "sha512-WvfPSfAAMlE/sKS6YkW47nX/hA7StmhYnAHc6wWCXNL0oclwLj6UXv0hQCkLnDgvebi0MEV40SJJpVjKUgH1IQ==" }, "swagger-ui-express": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.5.tgz", - "integrity": "sha512-hs9OqBu2jwmhYyFUhdTiwurvbZC+bq2XnWmmbYymVdwhgJCcGkLdnqymX24ZYUve2nkYSvKPEDCo20ZF+vyw9A==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.3.0.tgz", + "integrity": "sha512-jN46SEEe9EoXa3ZgZoKgnSF6z0w3tnM1yqhO4Y+Q4iZVc8JOQB960EZpIAz6rNROrDApVDwcMHR0mhlnc/5Omw==", "requires": { - "swagger-ui-dist": "^3.18.1" + "swagger-ui-dist": ">=4.1.3" } }, "symbol-observable": { @@ -12695,17 +17618,33 @@ "dev": true }, "tar": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", - "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.8.6", - "minizlib": "^1.2.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.3" + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "term-size": { @@ -12856,6 +17795,12 @@ } } }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, "timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -12865,6 +17810,12 @@ "setimmediate": "^1.0.4" } }, + "tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -12875,9 +17826,9 @@ } }, "tmpl": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", - "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-arraybuffer": { @@ -12953,17 +17904,6 @@ "nopt": "~1.0.10" } }, - "tough-cookie": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-3.0.1.tgz", - "integrity": "sha512-yQyJ0u4pZsv9D4clxO69OEjLWYw+jbgspjTue4lTQZLfV0c5l1VmK2y1JK8E9ahdpltPOaAThPcp5nKPUgSnsg==", - "dev": true, - "requires": { - "ip-regex": "^2.1.0", - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, "tr46": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz", @@ -12973,6 +17913,12 @@ "punycode": "^2.1.1" } }, + "traverse": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz", + "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=", + "dev": true + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -12980,14 +17926,9 @@ "dev": true }, "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==" - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" }, "ts-jest": { "version": "26.4.3", @@ -13063,6 +18004,16 @@ } } }, + "ts-morph": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-13.0.2.tgz", + "integrity": "sha512-SjeeHaRf/mFsNeR3KTJnx39JyEOzT4e+DX28gQx5zjzEOuFs2eGrqeN2PLKs/+AibSxPmzV7RD8nJVKmFJqtLA==", + "dev": true, + "requires": { + "@ts-morph/common": "~0.12.2", + "code-block-writer": "^11.0.0" + } + }, "ts-node": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.0.0.tgz", @@ -13144,19 +18095,10 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, "type-check": { @@ -13210,9 +18152,9 @@ "dev": true }, "uglify-js": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.1.tgz", - "integrity": "sha512-o8lHP20KjIiQe5b/67Rh68xEGRrc2SRsCuuoYclXXoC74AfSRGblU1HKzJWH3HxPZ+Ort85fWHpSX7KwBUC9CQ==", + "version": "3.14.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz", + "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", "optional": true }, "undefsafe": { @@ -13224,6 +18166,67 @@ "debug": "^2.2.0" } }, + "unicode": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/unicode/-/unicode-13.0.0.tgz", + "integrity": "sha512-osNPLT4Lqna/sV6DQikrB8m4WxR61/k0fnhfKnkPGcZImczW3IysRXvWxfdqGUjh0Ju2o/tGGgu46mlfc/cpZw==" + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-properties": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.3.1.tgz", + "integrity": "sha512-nIV3Tf3LcUEZttY/2g4ZJtGXhWwSkuLL+rCu0DIAMbjyVPj+8j5gNVz4T/sVbnQybIsd5SFGkPKg/756OY6jlA==", + "dev": true, + "requires": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "dev": true, + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -13269,6 +18272,12 @@ "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", "dev": true }, + "unix-crypt-td-js": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unix-crypt-td-js/-/unix-crypt-td-js-1.1.4.tgz", + "integrity": "sha512-8rMeVYWSIyccIJscb9NdCfZKSRBKYTeVnwmiRYT2ulE3qd1RaDQ0xQDP+rI3ccIWbhu/zuo5cgN8z73belNZgw==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -13507,17 +18516,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -13911,6 +18909,23 @@ } } }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -13949,43 +18964,15 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true }, "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "^3.0.0" - } - } + "string-width": "^1.0.2 || 2 || 3 || 4" } }, "widest-line": { @@ -14030,6 +19017,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -14040,6 +19028,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -14048,6 +19037,7 @@ "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" } @@ -14055,7 +19045,8 @@ "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==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true } } }, @@ -14086,9 +19077,9 @@ } }, "ws": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", - "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", + "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", "dev": true }, "xdg-basedir": { @@ -14097,6 +19088,12 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, + "xml": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", + "integrity": "sha1-eLpyAgApxbyHuKgaPPzXS0ovweU=", + "dev": true + }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -14109,20 +19106,31 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xmldoc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", + "dev": true, + "requires": { + "sax": "^1.2.1" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true }, "yaml": { "version": "1.10.0", @@ -14134,6 +19142,7 @@ "version": "15.4.1", "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, "requires": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -14152,6 +19161,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -14161,6 +19171,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -14169,6 +19180,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -14176,7 +19188,8 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true } } }, @@ -14184,6 +19197,7 @@ "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" @@ -14194,6 +19208,11 @@ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index e0d0bd9bbc93c31ec671aef764a570ded40d2e6b..7bcfb722c57763dc38d71e4e785d5e0630e1cbc5 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ram_server", "private": true, - "version": "1.6.0", + "version": "1.10.0", "description": "Nest TypeScript starter repository", "license": "MIT", "scripts": { @@ -11,34 +11,43 @@ "start": "ts-node -r tsconfig-paths/register src/main.ts", "start:dev": "nodemon", "start:debug": "nodemon --config nodemon-debug.json", - "start:prod": "node dist/main", + "start:prod": "npm run migrate:up && node dist/main", + "doc": "./node_modules/.bin/compodoc compodoc -p tsconfig.json -s -n 'Resin api documentation'", + "doc:serve": "./node_modules/.bin/compodoc compodoc -s", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "release": "standard-version", "init-db": "node ./scripts/init-db.js", "test": "jest", - "test:watch": "jest --watch", - "test:cov": "jest --coverage", + "test:watch": "jest --config ./test/jest.json --watch", + "test:cov": "jest --config ./test/jest.json --coverage --ci --reporters=default --reporters=jest-junit", "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", - "test:e2e": "jest --config ./test/jest-e2e.json" + "test:e2e": "jest --config ./test/jest-e2e.json", + "migrate:create": "migrate create --template-file ./src/migrations/migrations-utils/template.ts --migrations-dir=\"./src/migrations/scripts\" --compiler=\"ts:./src/migrations/migrations-utils/ts-compiler.js\"", + "migrate:up": "migrate --migrations-dir=\"./src/migrations/scripts\" --compiler=\"ts:./src/migrations/migrations-utils/ts-compiler.js\" up", + "migrate:down": "migrate --migrations-dir=\"./src/migrations/scripts\" --compiler=\"ts:./src/migrations/migrations-utils/ts-compiler.js\" down" }, "dependencies": { + "@elastic/elasticsearch": "^7.12.0", "@nestjs/common": "^7.6.13", + "@nestjs/config": "^0.6.3", "@nestjs/core": "^7.5.1", + "@nestjs/elasticsearch": "^7.1.0", "@nestjs/jwt": "^7.2.0", "@nestjs/mongoose": "^7.1.0", "@nestjs/passport": "^7.1.5", "@nestjs/platform-express": "^7.5.1", "@nestjs/schedule": "^0.4.1", "@nestjs/swagger": "^4.7.5", - "@tryghost/admin-api": "^1.3.8", + "@tryghost/admin-api": "^1.4.4", "@types/bcrypt": "^3.0.0", - "bcrypt": "^5.0.0", + "bcrypt": "^5.0.1", "class-transformer": "^0.3.1", "class-validator": "^0.12.2", "dotenv": "^8.2.0", "ejs": "^3.1.5", "form-data": "^3.0.0", "luxon": "^1.25.0", + "migrate": "^1.7.0", "mongoose": "^5.10.15", "passport": "^0.4.1", "passport-jwt": "^4.0.0", @@ -46,10 +55,11 @@ "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^6.6.3", - "standard-version": "^9.0.0", - "swagger-ui-express": "^4.1.5" + "standard-version": "^9.3.2", + "swagger-ui-express": "^4.3.0" }, "devDependencies": { + "@compodoc/compodoc": "^1.1.16", "@nestjs/cli": "^7.5.1", "@nestjs/schematics": "^7.1.3", "@nestjs/testing": "^7.5.1", @@ -65,6 +75,7 @@ "eslint-config-prettier": "^6.15.0", "eslint-plugin-prettier": "^3.1.4", "jest": "^26.6.3", + "jest-junit": "^12.0.0", "nodemon": "^2.0.6", "prettier": "^2.1.2", "supertest": "^6.0.0", diff --git a/scripts/data/categoriesAccompanements.js b/scripts/data/categoriesAccompanements.js new file mode 100644 index 0000000000000000000000000000000000000000..3831dabbe5a2529c619d1f41dfed2abf7680f2ef --- /dev/null +++ b/scripts/data/categoriesAccompanements.js @@ -0,0 +1,47 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const mongoose = require('mongoose'); + +module.exports = { + data: [ + { + _id: mongoose.Types.ObjectId('5fbb931c80a5c257dc0161f4'), + modules: [ + { + id: 'accompagnantCaf', + text: 'Accompagnant CAF', + }, + { + id: 'poleEmploi', + text: 'Pôle Emploi', + }, + { + id: 'cpam', + text: 'CPAM', + }, + { + id: 'impots', + text: 'Impôts', + }, + { + id: 'logement', + text: 'Logement', + }, + { + id: 'carsat', + text: 'CARSAT', + }, + { + id: 'demarcheMetropolitaine', + text: 'Démarches Métropolitaines', + }, + { + id: 'autres', + text: 'Autres', + }, + ], + name: 'Accompagnement des démarches', + id: 'proceduresAccompaniment', + __v: 0, + }, + ], +}; diff --git a/scripts/data/categoriesFormation.js b/scripts/data/categoriesFormation.js new file mode 100644 index 0000000000000000000000000000000000000000..08ad4c04be54ce65f76855ad121118333c36ac61 --- /dev/null +++ b/scripts/data/categoriesFormation.js @@ -0,0 +1,339 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const mongoose = require('mongoose'); + +module.exports = { + data: [ + { + _id: mongoose.Types.ObjectId('5fbb933b80a5c257dc0161f5'), + modules: [ + { + id: '84', + display_id: '84', + display_name: 'Modules APTIC - n°84', + digest: 'Pôle Emploi : faire ses déclarations en ligne', + text: 'Pôle Emploi : faire ses déclarations en ligne', + }, + { + id: '85', + display_id: '85', + display_name: 'Modules APTIC - n°85', + digest: 'Déclarer ses revenus en ligne et découvertes des services proposés', + text: 'Déclarer ses revenus en ligne et découvertes des services proposés', + }, + { + id: '86', + display_id: '86', + display_name: 'Modules APTIC - n°86', + digest: 'Accéder à ses droits sociaux et les gérer en ligne (RSA…)', + text: 'Accéder à ses droits sociaux et les gérer en ligne (RSA…)', + }, + { + id: '87', + display_id: '87', + display_name: 'Modules APTIC - n°87', + digest: 'Ouvrir et gérer son dossier de retraite (CNAF/CARSAT) en ligne', + text: 'Ouvrir et gérer son dossier de retraite (CNAF/CARSAT) en ligne', + }, + { + id: '88', + display_id: '88', + display_name: 'Modules APTIC - n°88', + digest: "Gérer son abonnement et ses factures d'électricité/gaz en ligne", + text: "Gérer son abonnement et ses factures d'électricité/gaz en ligne", + }, + { + id: '89', + display_id: '89', + display_name: 'Modules APTIC - n°89', + digest: "Gérer ses droits d'assuré social en ligne/sur internet", + text: "Gérer ses droits d'assuré social en ligne/sur internet", + }, + { + id: '93', + display_id: '93', + display_name: 'Modules APTIC - n°93', + digest: 'Plateforme Ameli.fr : la sécurité sociale en ligne', + text: 'Plateforme Ameli.fr : la sécurité sociale en ligne', + }, + { + id: '95', + display_id: '95', + display_name: 'Modules APTIC - n°95', + digest: 'Plateforme France Connect', + text: 'Plateforme France Connect', + }, + ], + name: 'Accès aux droits', + id: 'accessRight', + __v: 0, + }, + { + modules: [ + { + id: '260', + display_id: '260', + display_name: 'Modules APTIC - n°260', + digest: 'Maitrise de l’environnement d’un ordinateur (clavier, souris)', + text: 'Maitrise de l’environnement d’un ordinateur (clavier, souris)', + }, + { + id: '1', + display_id: '1', + display_name: 'Modules APTIC - n°1', + digest: 'Composantes et facettes de l’identité numérique', + text: 'Composantes et facettes de l’identité numérique', + }, + { + id: '11', + display_id: '11', + display_name: 'Modules APTIC - n°11', + digest: 'Internet : fonctionnement et outils de navigation web', + text: 'Internet : fonctionnement et outils de navigation web', + }, + { + id: '38', + display_id: '38', + display_name: 'Modules APTIC - n°38', + digest: 'Le smartphone : principes de fonctionnement', + text: 'Le smartphone : principes de fonctionnement', + }, + { + id: '48', + display_id: '48', + display_name: 'Modules APTIC - n°48', + digest: 'Internet : envoyer, recevoir, gérer ses emails', + text: 'Internet : envoyer, recevoir, gérer ses emails', + }, + { + id: '74', + display_id: '74', + display_name: 'Modules APTIC - n°74', + digest: 'Smartphones et Tablettes sous Androïd', + text: 'Smartphones et Tablettes sous Androïd', + }, + { + id: '77', + display_id: '77', + display_name: 'Modules APTIC - n°77', + digest: "Smartphone : Les principaux gestes pour l'écran tactile", + text: "Smartphone : Les principaux gestes pour l'écran tactile", + }, + ], + name: 'Les compétences de base', + id: 'baseSkills', + __v: 0, + }, + { + modules: [ + { + id: '6', + display_id: '6', + display_name: 'Modules APTIC - n°6', + digest: "Utiliser les réseaux sociaux pour sa recherche d'emploi", + text: "Utiliser les réseaux sociaux pour sa recherche d'emploi", + }, + { + id: '20', + display_id: '20', + display_name: 'Modules APTIC - n°20', + digest: 'Panorama des plateformes de recherche d’emploi', + text: 'Panorama des plateformes de recherche d’emploi', + }, + { + id: '66', + display_id: '66', + display_name: 'Modules APTIC - n°66', + digest: 'Traitement de texte : découverte', + text: 'Traitement de texte : découverte', + }, + { + id: '67', + display_id: '67', + display_name: 'Modules APTIC - n°67', + digest: 'Traitement de texte : utilisation de base', + text: 'Traitement de texte : utilisation de base', + }, + { + id: '68', + display_id: '68', + display_name: 'Modules APTIC - n°68', + digest: 'Traitement de texte : utilisation avancée', + text: 'Traitement de texte : utilisation avancée', + }, + { + id: '69', + display_id: '69', + display_name: 'Modules APTIC - n°69', + digest: 'Tableur : découverte', + text: 'Tableur : découverte', + }, + { + id: '124', + display_id: '124', + display_name: 'Modules APTIC - n°124', + digest: 'Réalisation CV', + text: 'Réalisation CV', + }, + { + id: '125', + display_id: '125', + display_name: 'Modules APTIC - n°125', + digest: 'Diffuser son CV en ligne', + text: 'Diffuser son CV en ligne', + }, + { + id: '127', + display_id: '127', + display_name: 'Modules APTIC - n°127', + digest: "Organiser sa recherche d'emploi", + text: "Organiser sa recherche d'emploi", + }, + ], + name: 'Insertion sociale et professionnelle', + id: 'socialAndProfessional', + __v: 0, + }, + { + _id: mongoose.Types.ObjectId('5fbb934c80a5c257dc0161f8'), + modules: [ + { + id: '3', + display_id: '3', + display_name: 'Modules APTIC - n°3', + digest: "Être parent à l'ère numérique: connaître les usages, jouer son rôle de parent", + text: "Être parent à l'ère numérique: connaître les usages, jouer son rôle de parent", + }, + { + id: '22', + display_id: '22', + display_name: 'Modules APTIC - n°22', + digest: 'Découvrir l’univers des jeux vidéo - 22', + text: 'Découvrir l’univers des jeux vidéo', + }, + { + id: '82', + display_id: '82', + display_name: 'Modules APTIC - n°82', + digest: 'Suivre la scolarité de son enfant - 82', + text: 'Suivre la scolarité de son enfant', + }, + { + id: '94', + display_id: '94', + display_name: 'Modules APTIC - n°94', + digest: "Découvrir les services en ligne de l'enfance de votre commune - 94", + text: "Découvrir les services en ligne de l'enfance de votre commune", + }, + ], + name: 'Aide à la parentalité', + id: 'parentingHelp', + __v: 0, + }, + { + _id: mongoose.Types.ObjectId('5fbb935080a5c257dc0161f9'), + modules: [ + { + id: '2', + display_id: '2', + display_name: 'Modules APTIC - n°2', + digest: 'Les conduites à risques et les bons usages du numérique - 02', + text: 'Les conduites à risques et les bons usages du numérique', + }, + { + id: '5', + display_id: '5', + display_name: 'Modules APTIC - n°5', + digest: 'Découvrir les réseaux sociaux : définition, fonctionnement - 05', + text: 'Découvrir les réseaux sociaux : définition, fonctionnement', + }, + { + id: '9', + display_id: '9', + display_name: 'Modules APTIC - n°9', + digest: 'Fablab : charte, valeurs et panorama des outils numériques - 09', + text: 'Fablab : charte, valeurs et panorama des outils numériques', + }, + { + id: '28', + display_id: '28', + display_name: 'Modules APTIC - n°28', + digest: 'Les paiements en ligne - 28', + text: 'Les paiements en ligne', + }, + { + id: '34', + display_id: '34', + display_name: 'Modules APTIC - n°34', + digest: 'Internet : comprendre les principes de fonctionnement - 35', + text: 'Internet : comprendre les principes de fonctionnement', + }, + { + id: '39', + display_id: '39', + display_name: 'Modules APTIC - n°39', + digest: 'Techniques de vérification de l’information - 39', + text: 'Techniques de vérification de l’information', + }, + { + id: '42', + display_id: '42', + display_name: 'Modules APTIC - n°42', + digest: 'Créer et paramétrer un compte Google - 42', + text: 'Créer et paramétrer un compte Google', + }, + { + id: '51', + display_id: '51', + display_name: 'Modules APTIC - n°51', + digest: 'Gérer ses données : sauvegarde en ligne (dans le cloud) - 51', + text: 'Gérer ses données : sauvegarde en ligne (dans le cloud)', + }, + { + id: '52', + display_id: '52', + display_name: 'Modules APTIC - n°52', + digest: 'Gérer ses données : sauvegardes locales (disques durs externes, clé USB) - 52', + text: 'Gérer ses données : sauvegardes locales (disques durs externes, clé USB)', + }, + { + id: '54', + display_id: '54', + display_name: 'Modules APTIC - n°54', + digest: 'Classer, gérer et partager ses photos - 54', + text: 'Classer, gérer et partager ses photos', + }, + { + id: '65', + display_id: '65', + display_name: 'Modules APTIC - n°65', + digest: 'Skype et autres outils de visioconférence - 65', + text: 'Skype et autres outils de visioconférence', + }, + { + id: '96', + display_id: '96', + display_name: 'Modules APTIC - n°96', + digest: 'Connaitre et gérer son identité numérique - 96', + text: 'Connaitre et gérer son identité numérique', + }, + { + id: '97', + display_id: '97', + display_name: 'Modules APTIC - n°97', + digest: 'Nettoyer son identité numérique - 97', + text: 'Nettoyer son identité numérique', + }, + { + id: '98', + display_id: '98', + display_name: 'Modules APTIC - n°98', + digest: 'Effacer ses traces sur le web, protéger ses données personnelles - 98', + text: 'Effacer ses traces sur le web, protéger ses données personnelles', + }, + ], + name: 'Culture et sécurité numérique', + id: 'digitalCultureSecurity', + __v: 0, + }, + ], +}; diff --git a/scripts/data/categoriesOthers.js b/scripts/data/categoriesOthers.js new file mode 100644 index 0000000000000000000000000000000000000000..3c283bcc85823e91d24a9136a9ce22f7042ca927 --- /dev/null +++ b/scripts/data/categoriesOthers.js @@ -0,0 +1,163 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const mongoose = require('mongoose'); + +module.exports = { + data: [ + { + _id: mongoose.Types.ObjectId('5fbb92dd80a5c257dc0161ef'), + modules: [ + { + id: 'toutPublic', + text: 'Tout public', + }, + { + id: 'moinsDe16Ans', + text: 'Moins de 16 ans', + }, + { + id: 'jeunes1625Ans', + text: 'Jeunes (16-25 ans)', + }, + { + id: 'adultes', + text: 'Adultes', + }, + { + id: 'seniorsPlusDe65Ans', + text: 'Séniors (+ de 65 ans)', + }, + ], + name: 'Publics acceptés', + id: 'publics', + __v: 0, + }, + { + _id: mongoose.Types.ObjectId('5fbb92e480a5c257dc0161f0'), + modules: [ + { + id: 'aidantsConnect', + text: 'Aidants Connect', + }, + { + id: 'espacePublicNumeriqueepn', + text: 'Espace public numérique', + }, + { + id: 'fabriqueDeTerritoire', + text: 'Fabrique de territoire', + }, + { + id: 'maisonFranceService', + text: 'Maison France Service', + }, + { + id: 'passNumerique', + text: 'Pass numérique', + }, + { + id: 'conseillerNumFranceServices', + text: 'Conseiller numérique France services', + }, + ], + name: 'Labels et qualifications', + id: 'labelsQualifications', + __v: 0, + }, + { + _id: mongoose.Types.ObjectId('5fbb92e980a5c257dc0161f1'), + modules: [ + { + id: 'accesLibre', + text: 'Accès libre', + }, + { + id: 'telephoneVisio', + text: 'Téléphone / Visio', + }, + { + id: 'surRdv', + text: 'Sur RDV', + }, + ], + name: "Modalités d'accès", + id: 'accessModality', + __v: 0, + }, + { + _id: mongoose.Types.ObjectId('5fbb92ef80a5c257dc0161f2'), + modules: [ + { + id: "Personnes en situation d'illetrisme", + text: "Personnes en situation d'illetrisme", + }, + { + id: 'Langue étrangère (anglais)', + text: 'Langue étrangère (anglais)', + }, + { + id: 'Langues étrangères (autres)', + text: 'Langues étrangères (autres)', + }, + { + id: 'Surdité', + text: 'Surdité', + }, + { + id: 'Déficience visuelle', + text: 'Déficience visuelle', + }, + { + id: 'Handicap moteur', + text: 'Handicap moteur', + }, + ], + name: 'Accompagnement des publics spécifiques', + id: 'publicsAccompaniment', + __v: 0, + }, + { + _id: mongoose.Types.ObjectId('5fbb92f380a5c257dc0161f3'), + modules: [ + { + id: 'wifiEnAccesLibre', + text: 'Wifi en accès libre', + }, + { + id: 'ordinateurs', + text: 'Ordinateurs', + }, + { + id: 'tablettes', + text: 'Tablettes', + }, + { + id: 'bornesNumeriques', + text: 'Bornes numériques', + }, + { + id: 'imprimantes', + text: 'Imprimantes', + }, + { + id: 'scanners', + text: 'Scanners', + }, + { + id: 'donDeMateriels', + text: 'Prêt / don de matériels', + }, + { + id: 'reconditionnementsDeMateriel', + text: 'Reconditionnements de matériel', + }, + { + id: 'accesLivresInformatiques', + text: 'Accès à des revues ou livres informatiques et numériques', + }, + ], + name: 'Équipements et services proposés', + id: 'equipmentsAndServices', + __v: 0, + }, + ], +}; diff --git a/scripts/data/structures.js b/scripts/data/structures.js new file mode 100644 index 0000000000000000000000000000000000000000..9af53b20216b4443551de9848cf9979ef9a75acb --- /dev/null +++ b/scripts/data/structures.js @@ -0,0 +1,763 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const mongoose = require('mongoose'); + +module.exports = { + data: [ + { + _id: mongoose.Types.ObjectId('6001a35f16b08100062e415f'), + freeWorkShop: false, + createdAt: '2020-11-16T15:37:00.000Z', + updatedAt: '2021-03-02T12:36:53.000Z', + structureName: "Maison de l'Emploi (Feyzin)", + description: + "- Permanence de médiation numérique (sur rdv) les lundis; mardi, mercredi apres midi 13h30 - 17h30 et les vendredi matins 9h-12h - mise à disposition d'ordinateurs aux horaires d'ouverture de la structure lundi, mercredi, jeudi 9h-12h; 13h30-17h30 ; mardi 10h-12h 13h30- 17h30 et vendredi matin 9h-12H. - mise à disposition (sur rdv)de matériels pour suivre des formations / informations collectives à distance et participer à un entretien en visio - cours de code et entrainement en ligne sur rdv", + lockdownActivity: + 'Toutes les activités sont maintenues durant le confinement. Toutes nécessitent cependant de prendre rdv préalablement', + contactPhone: '04 04 04 04 04', + contactMail: 'm.annequin@test.fr', + website: '', + facebook: null, + twitter: null, + instagram: null, + pmrAccess: true, + accessModality: ['accesLibre', 'surRdv'], + labelsQualifications: [], + publics: ['toutPublic'], + exceptionalClosures: 'Jours fériés', + jaccompagneLesUsagersDansLeursDemarchesEnLigne: true, + proceduresAccompaniment: ['poleEmploi', 'accompagnantCaf'], + publicsAccompaniment: [], + autresAccompagnements: '', + baseSkills: [], + accessRight: ['84'], + socialAndProfessional: [], + parentingHelp: [], + digitalCultureSecurity: [], + equipmentsAndServices: ['ordinateurs', 'imprimantes', 'wifiEnAccesLibre'], + nbComputers: 5, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + structureType: 'mairie', + hours: { + monday: { + open: true, + time: [ + { + closing: '12:00', + opening: '9:00', + }, + { + closing: '17:30', + opening: '13:30', + }, + ], + }, + tuesday: { + open: true, + time: [ + { + closing: '12:00', + opening: '10:00', + }, + { + closing: '17:30', + opening: '13:30', + }, + ], + }, + wednesday: { + open: true, + time: [ + { + closing: '12:00', + opening: '9:00', + }, + { + closing: '17:30', + opening: '13:30', + }, + ], + }, + thursday: { + open: true, + time: [ + { + closing: '12:00', + opening: '9:00', + }, + { + closing: '17:30', + opening: '13:30', + }, + ], + }, + friday: { + open: true, + time: [ + { + closing: '12:00', + opening: '9:00', + }, + ], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + address: { + numero: '18', + street: 'Rue de la Mairie', + commune: 'Feyzin', + }, + accountVerified: true, + coord: [4.8563106, 45.6693619], + linkedin: null, + nbScanners: 1, + otherDescription: null, + }, + { + _id: mongoose.Types.ObjectId('6001a37716b08100062e4160'), + structureType: null, + digitalCultureSecurity: [], + parentingHelp: [], + socialAndProfessional: ['124', '125', '127'], + accessRight: ['84'], + baseSkills: [], + proceduresAccompaniment: ['poleEmploi'], + publics: ['toutPublic'], + labelsQualifications: ['espacePublicNumeriqueepn'], + accessModality: ['accesLibre', 'surRdv'], + freeWorkShop: false, + createdAt: '2020-11-16T10:19:00.000Z', + updatedAt: 'Mon May 10 2021 08:45:50 GMT+0000 (Coordinated Universal Time)', + structureName: 'Pôle emploi (Vénissieux)', + description: "Espace informatique en libre service le matin Sur RDV l'après-midi, réservation d'un poste", + lockdownActivity: "Espace libre accès le matin RDV l'après-midi, résercation d'un poste", + contactPhone: '', + contactMail: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + pmrAccess: true, + exceptionalClosures: '', + jaccompagneLesUsagersDansLeursDemarchesEnLigne: true, + publicsAccompaniment: [], + autresAccompagnements: '', + equipmentsAndServices: ['ordinateurs', 'imprimantes'], + nbComputers: 10, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + hours: { + monday: { + open: true, + time: [ + { + closing: '12:30', + opening: '8:30', + }, + { + closing: '16:00', + opening: '13:30', + }, + ], + }, + tuesday: { + open: true, + time: [ + { + closing: '12:30', + opening: '8:30', + }, + { + closing: '16:00', + opening: '13:30', + }, + ], + }, + wednesday: { + open: true, + time: [ + { + closing: '12:30', + opening: '8:30', + }, + { + closing: '16:00', + opening: '13:30', + }, + ], + }, + thursday: { + open: true, + time: [ + { + closing: '12:30', + opening: '8:30', + }, + { + closing: '16:00', + opening: '13:30', + }, + ], + }, + friday: { + open: true, + time: [ + { + closing: '12:30', + opening: '8:30', + }, + ], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + __v: 0, + address: { + numero: '27', + street: 'Avenue de la République', + commune: 'Vénissieux', + }, + accountVerified: true, + coord: [4.8678548, 45.7075853], + linkedin: null, + nbScanners: 1, + otherDescription: null, + deletedAt: new Date('2021-05-10T08:45:50.076Z'), + }, + { + _id: mongoose.Types.ObjectId('6001a38516b08100062e4161'), + freeWorkShop: false, + createdAt: '2020-11-16T14:15:00.000Z', + updatedAt: '2021-04-27T14:19:17.000Z', + structureName: 'Centre social Quartier Vitalité', + description: + "Le centre social s'inscrit dans une démarche d'animation de la vie sociale locale afin de permettre aux habitants d'exprimer, de concevoir, de réaliser leurs projets. C'est un lieu de proximité à vocation familiale et intergénérationnelle qui propose des activités sociales, éducatives et culturelles pour répondre aux besoins de chacun.", + lockdownActivity: 'Aide aux démarches administratives et médiation numérique, sur rendez vous uniquement', + contactPhone: '04 05 05 05 05', + contactMail: 'test@gmail.com', + website: 'www.centresocialquartiervitalite.i-citoyen.com', + facebook: null, + twitter: null, + instagram: null, + pmrAccess: true, + accessModality: ['telephoneVisio', 'surRdv'], + labelsQualifications: [], + publics: ['jeunes1625Ans', 'adultes', 'seniorsPlusDe65Ans', 'toutPublic'], + exceptionalClosures: "vacances de Noel + tout le mois d'Aout", + jaccompagneLesUsagersDansLeursDemarchesEnLigne: true, + proceduresAccompaniment: ['poleEmploi', 'cpam', 'impots', 'logement', 'carsat', 'accompagnantCaf'], + publicsAccompaniment: [], + autresAccompagnements: '', + baseSkills: ['260', '1', '11', '38', '48', '74', '77'], + accessRight: ['84', '85', '86', '87', '88', '89', '93', '95'], + socialAndProfessional: ['66', '67', '68', '69', '124'], + parentingHelp: ['3', '22', '82', '94'], + digitalCultureSecurity: ['2', '28', '34', '39', '42', '52', '65'], + equipmentsAndServices: ['ordinateurs', 'imprimantes'], + nbComputers: 3, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + structureType: 'centreSocio', + address: { + numero: '7', + street: 'Rue Saint Polycarpe', + commune: 'Lyon 1er Arrondissement', + }, + hours: { + monday: { + open: false, + time: [], + }, + tuesday: { + open: true, + time: [ + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + wednesday: { + open: false, + time: [], + }, + thursday: { + open: true, + time: [ + { + closing: '12:00', + opening: '9:30', + }, + ], + }, + friday: { + open: false, + time: [], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + coord: [4.8343466, 45.7689958], + accountVerified: true, + linkedin: null, + nbScanners: 1, + otherDescription: null, + }, + { + _id: mongoose.Types.ObjectId('6001a39c16b08100062e4164'), + structureType: null, + digitalCultureSecurity: ['2', '5', '9', '28', '34', '39', '42', '51', '52', '54', '65', '96', '97', '98'], + parentingHelp: ['3', '22', '82', '94'], + socialAndProfessional: ['6', '20', '66', '67', '68', '69', '124', '125', '127'], + accessRight: ['84', '85', '86', '87', '88', '89', '93', '95'], + baseSkills: ['260', '1', '11', '38', '48', '74', '77'], + proceduresAccompaniment: ['cpam', 'impots', 'carsat', 'poleEmploi'], + publics: ['toutPublic'], + labelsQualifications: ['passNumerique', 'espacePublicNumeriqueepn'], + accessModality: ['accesLibre', 'telephoneVisio', 'surRdv'], + freeWorkShop: false, + createdAt: '2020-11-16T09:30:00.000Z', + updatedAt: '2021-04-12T08:48:00.000Z', + structureName: "L'Atelier Numérique", + description: + "L'Atelier Numérique est l'Espace Public Numérique des Centres Sociaux de Rillieux-la-Pape, ayant pour mission la médiation numérique pour toutes et tous.", + lockdownActivity: + 'accesLibres, permanences numériques téléphoniques, cours et ateliers à distance, formations professionnelles.', + contactPhone: '', + contactMail: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + pmrAccess: true, + exceptionalClosures: '', + jaccompagneLesUsagersDansLeursDemarchesEnLigne: true, + publicsAccompaniment: [], + autresAccompagnements: '', + equipmentsAndServices: ['ordinateurs', 'tablettes'], + nbComputers: 16, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + hours: { + monday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + tuesday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + wednesday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + thursday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + friday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + ], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + __v: 0, + address: { + numero: '30 bis', + street: 'Avenue Leclerc', + commune: 'Rillieux-la-Pape', + }, + coord: [4.9036773, 45.8142196], + accountVerified: true, + linkedin: null, + nbScanners: 1, + otherDescription: null, + deletedAt: new Date('2021-04-12T08:48:00.764Z'), + }, + { + _id: mongoose.Types.ObjectId('6001a3aa16b08100062e4166'), + structureType: 'mjc', + digitalCultureSecurity: ['2', '5', '9', '28', '34', '39', '42', '51', '52', '54', '65', '96', '97', '98'], + parentingHelp: ['3', '22', '82', '94'], + socialAndProfessional: ['66', '67', '68', '69'], + accessRight: [], + baseSkills: ['260', '1', '11', '38', '48', '74', '77'], + proceduresAccompaniment: [], + publics: ['toutPublic'], + labelsQualifications: ['passNumerique', 'espacePublicNumeriqueepn'], + accessModality: ['accesLibre', 'telephoneVisio', 'surRdv'], + freeWorkShop: false, + createdAt: '2020-11-16T08:53:00.000Z', + updatedAt: '2021-04-27T17:06:46.000Z', + structureName: 'Cyber-base / MJC Louis Aragon', + description: + 'Notre espace est un lieu de DÉCOUVERTE, d’APPRENTISSAGE et de SOUTIEN de votre pratique numérique. Ouvert à tous, c’est un aussi un lieu de vie, d’échanges et de partage de savoirs. La Cyber-base est un lieu ressource pour les acteurs sociaux, éducatifs et culturels . Elle a vocation à ACCOMPAGNER : • les projets des structures impliquant le numérique comme levier social d’inclusion des citoyens • l’éducation aux médias des jeunes générations • à la parentalité.', + lockdownActivity: + "OUVERT au public pour un libre accès INTERNET et impressions de documents.\nUne permanence téléphonique d'AIDE NUMERIQUE (logiciel VISIO, envoyer une pièce jointe, se connecter au WIFI, récupération mot de passe,...) est maintenue : mercredi / vendredi, 11h à 13h et 18h à 19h au 04 72 81 76 87. Les activités enfants / ados sont SUSPENDUES. \nDes soirées conviviales sont organisées A DISTANCE les vendredis soirs, de 18h30 à 19h30 -> https://cyberbase.mjcbron.fr/les-vendredis-conviviaux/", + contactPhone: '04 06 06 06 60', + contactMail: 'cyberbase@test.fr', + website: 'http://cyberbase.mjcbron.fr', + facebook: 'facebook.com/CyberBaseMJCBron', + twitter: 'twitter.com/cyberbasebron', + instagram: 'instagram.com/mjc_louis_aragon_bron/', + pmrAccess: true, + exceptionalClosures: '', + jaccompagneLesUsagersDansLeursDemarchesEnLigne: false, + publicsAccompaniment: [], + autresAccompagnements: '', + equipmentsAndServices: [ + 'wifiEnAccesLibre', + 'ordinateurs', + 'tablettes', + 'imprimantes', + 'scanners', + 'accesLivresInformatiques', + ], + nbComputers: 9, + nbPrinters: 1, + nbTablets: 6, + nbNumericTerminal: 1, + hours: { + monday: { + open: false, + time: [], + }, + tuesday: { + open: true, + time: [ + { + closing: '18:30', + opening: '16:00', + }, + ], + }, + wednesday: { + open: true, + time: [ + { + closing: '18:30', + opening: '16:00', + }, + ], + }, + thursday: { + open: true, + time: [ + { + closing: '18:30', + opening: '16:00', + }, + ], + }, + friday: { + open: true, + time: [ + { + closing: '18:30', + opening: '16:00', + }, + ], + }, + saturday: { + open: true, + time: [ + { + closing: '18:00', + opening: '14:00', + }, + ], + }, + sunday: { + open: false, + time: [], + }, + }, + __v: 1, + address: { + numero: '212', + street: 'Avenue Franklin Roosevelt', + commune: 'Bron', + }, + coord: [4.9149121, 45.7311648], + accountVerified: true, + linkedin: null, + nbScanners: 1, + otherDescription: null, + }, + { + _id: mongoose.Types.ObjectId('6001a3b116b08100062e4167'), + structureType: 'association', + digitalCultureSecurity: ['2', '5', '28', '34', '39', '42', '51', '52', '54', '65', '96', '97', '98'], + parentingHelp: ['3', '82', '94'], + socialAndProfessional: ['6', '20', '66', '67', '68', '69', '124', '125', '127'], + accessRight: ['84', '85', '86', '87', '88', '89', '93', '95'], + baseSkills: ['260', '1', '11', '38', '48', '74', '77'], + proceduresAccompaniment: ['cpam', 'impots', 'poleEmploi'], + publics: ['toutPublic'], + labelsQualifications: ['passNumerique'], + accessModality: ['accesLibre', 'surRdv'], + freeWorkShop: false, + createdAt: '2020-11-04T09:27:00.000Z', + updatedAt: '2021-03-02T10:07:48.000Z', + structureName: 'Oasis Informatique', + description: '', + lockdownActivity: '', + contactPhone: '06 06 06 60 60', + contactMail: 'iip.oasis@test.fr', + website: 'http://oasis-informatique.fr/', + facebook: null, + twitter: null, + instagram: null, + pmrAccess: true, + exceptionalClosures: '', + jaccompagneLesUsagersDansLeursDemarchesEnLigne: true, + publicsAccompaniment: [], + autresAccompagnements: '', + equipmentsAndServices: ['ordinateurs', 'imprimantes'], + nbComputers: 8, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + hours: { + monday: { + open: true, + time: [ + { + closing: '17:30', + opening: '14:30', + }, + ], + }, + tuesday: { + open: true, + time: [ + { + closing: '17:30', + opening: '14:30', + }, + ], + }, + wednesday: { + open: true, + time: [ + { + closing: '17:30', + opening: '14:30', + }, + ], + }, + thursday: { + open: true, + time: [ + { + closing: '17:30', + opening: '14:30', + }, + ], + }, + friday: { + open: true, + time: [ + { + closing: '17:30', + opening: '14:30', + }, + ], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + __v: 0, + address: { + numero: '3', + street: 'Rue Louis Normand', + commune: 'Oullins', + }, + coord: [4.8188378, 45.7157896], + accountVerified: true, + linkedin: null, + nbScanners: 1, + otherDescription: null, + }, + { + _id: mongoose.Types.ObjectId('6001a3b716b08100062e4168'), + structureType: 'coworking', + digitalCultureSecurity: ['2', '5', '28', '34', '39', '42', '51', '52', '54', '65', '96', '97', '98'], + parentingHelp: ['82', '94'], + socialAndProfessional: ['6', '20', '66', '67', '68', '69', '124', '125', '127'], + accessRight: ['84', '85', '87', '88', '89', '93', '95'], + baseSkills: ['260', '1', '11', '38', '48', '74', '77'], + proceduresAccompaniment: ['poleEmploi', 'cpam', 'impots', 'carsat', 'accompagnantCaf'], + publics: ['toutPublic'], + labelsQualifications: ['passNumerique'], + accessModality: ['telephoneVisio', 'surRdv'], + freeWorkShop: false, + createdAt: '2020-11-13T14:13:00.000Z', + updatedAt: '2021-03-02T10:09:30.000Z', + structureName: 'Le Son du Clic', + description: + "Entreprise de médiation numérique assurant l'animation d'atelier numériques en collectif ou l'accompagnement au numérique des particuliers en individuel. Structure agréée APTIC sur la métropole de Lyon, acceptant à ce titre le règlement de ses prestations en chèque PASS NUMERIQUE", + lockdownActivity: + 'Médiation numérique et formation pour les particuliers, en individuel, à domicile ou en visioconférence', + contactPhone: '06 60 60 60 60', + contactMail: 'jean-francois@test.fr', + website: 'http://lesonduclic.fr/site1/', + facebook: null, + twitter: null, + instagram: null, + pmrAccess: true, + exceptionalClosures: '', + jaccompagneLesUsagersDansLeursDemarchesEnLigne: true, + publicsAccompaniment: [], + autresAccompagnements: '', + equipmentsAndServices: ['ordinateurs'], + nbComputers: 8, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + hours: { + monday: { + open: true, + time: [ + { + closing: '17:00', + opening: '9:00', + }, + ], + }, + tuesday: { + open: true, + time: [ + { + closing: '17:00', + opening: '9:00', + }, + ], + }, + wednesday: { + open: true, + time: [ + { + closing: '17:00', + opening: '9:00', + }, + ], + }, + thursday: { + open: true, + time: [ + { + closing: '17:00', + opening: '9:00', + }, + ], + }, + friday: { + open: true, + time: [ + { + closing: '17:00', + opening: '9:00', + }, + ], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + __v: 0, + address: { + numero: '7', + street: 'Rue Robert et Reynier ', + commune: 'Saint-Fons', + }, + coord: [4.8608585, 45.7086482], + accountVerified: true, + linkedin: null, + nbScanners: 1, + otherDescription: null, + }, + ], +}; diff --git a/scripts/data/structuresType.js b/scripts/data/structuresType.js new file mode 100644 index 0000000000000000000000000000000000000000..efd9c7c1ee546ebac433d8caec8ca8b054b42b7d --- /dev/null +++ b/scripts/data/structuresType.js @@ -0,0 +1,33 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const mongoose = require('mongoose'); + +module.exports = { + data: [ + { + _id: mongoose.Types.ObjectId('601c223d3f612000068d4366'), + name: 'Publique', + values: [ + 'mairie', + 'CAF', + 'CCAS', + 'CARSAT', + 'poleEmploi', + 'mdm', + 'mediatheque', + 'prefecture', + 'bijPij', + 'logement', + ], + }, + { + _id: mongoose.Types.ObjectId('601c22543f612000068d4367'), + name: 'Privée à but non lucratif', + values: ['association', 'centreSocio', 'mjc', 'pimms', 'sij', 'missionsLocales'], + }, + { + _id: mongoose.Types.ObjectId('601c225e3f612000068d4368'), + name: 'Privée à but lucratif', + values: ['formation', 'insertion'], + }, + ], +}; diff --git a/scripts/data/users.js b/scripts/data/users.js index f678dc4d10096167762ac8c30bd43624922de1ff..beb7b1c359c6a90721a8aa14304f57c71fa570ef 100644 --- a/scripts/data/users.js +++ b/scripts/data/users.js @@ -5,10 +5,7 @@ module.exports = { data: [ { pendingStructuresLink: [], - structuresLink: [ - mongoose.Types.ObjectId('60059cf7dfb2ac4b00733db0'), - mongoose.Types.ObjectId('6001a48e16b08100062e4180'), - ], + structuresLink: [], phone: '06 06 06 06 06', newEmail: null, changeEmailToken: null, @@ -24,7 +21,7 @@ module.exports = { { structureOutdatedMailSent: [], pendingStructuresLink: [], - structuresLink: [mongoose.Types.ObjectId('6001a48e16b08100062e4180')], + structuresLink: [mongoose.Types.ObjectId('6001a39c16b08100062e4164')], newEmail: null, changeEmailToken: null, role: 0, @@ -39,7 +36,10 @@ module.exports = { { structureOutdatedMailSent: [], pendingStructuresLink: [], - structuresLink: [mongoose.Types.ObjectId('6001a48e16b08100062e4180')], + structuresLink: [ + mongoose.Types.ObjectId('6001a38516b08100062e4161'), + mongoose.Types.ObjectId('6001a3aa16b08100062e4166'), + ], newEmail: null, changeEmailToken: null, role: 0, diff --git a/scripts/init-db.js b/scripts/init-db.js index d65251eb5ed7bb7b8674f964aeef13466a8bced6..52c7ce70bb70524d78a66f44a1ede1ada701094a 100644 --- a/scripts/init-db.js +++ b/scripts/init-db.js @@ -2,6 +2,11 @@ const mongoose = require('mongoose'); // eslint-disable-next-line @typescript-eslint/no-var-requires const userData = require('./data/users'); +const structuresTypeData = require('./data/structuresType'); +const categoriesOthersData = require('./data/categoriesOthers'); +const categoriesAccompanementsData = require('./data/categoriesAccompanements'); +const categoriesFormationData = require('./data/categoriesFormation'); +const structuresData = require('./data/structures'); // eslint-disable-next-line @typescript-eslint/no-var-requires const bcrypt = require('bcrypt'); // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -28,6 +33,13 @@ function hashPassword() { return bcrypt.hashSync(process.env.USER_PWD, process.env.SALT); } +const handleError = async (name, err) => { + /* show messages */ + if (err) { + if (err.code === 26) console.error(`-- ${name} collection does not exists --`); + else throw err; + } else console.log(`-- ${name} collection dropped --`); +}; // define Schema var usersSchema = mongoose.Schema({ name: String, @@ -45,17 +57,82 @@ var usersSchema = mongoose.Schema({ password: String, phone: String, }); +var structuresTypeSchema = mongoose.Schema( + { + name: String, + values: [], + }, + { collection: 'structuretype' } +); +var categoriesOthersSchema = mongoose.Schema({ + name: String, + id: String, + modules: [], +}); +var categoriesAccompanementsSchema = mongoose.Schema({ + name: String, + id: String, + modules: [], +}); +var categoriesFormationSchema = mongoose.Schema({ + name: String, + id: String, + modules: [], +}); +var structuresSchema = mongoose.Schema({ + numero: String, + createdAt: String, + updatedAt: String, + structureName: String, + structureType: String, + description: String, + lockdownActivity: String, + address: Object, + contactPhone: String, + contactMail: String, + website: String, + facebook: String, + twitter: String, + instagram: String, + linkedin: String, + pmrAccess: Boolean, + accessModality: [], + otherDescription: String, + labelsQualifications: [], + publics: [], + exceptionalClosures: String, + publicsAccompaniment: [], + proceduresAccompaniment: [], + remoteAccompaniment: Boolean, + baseSkills: [], + accessRight: [], + socialAndProfessional: [], + parentingHelp: [], + digitalCultureSecurity: [], + equipmentsAndServices: [], + freeWorkShop: Boolean, + nbComputers: Number, + nbPrinters: Number, + nbTablets: Number, + nbNumericTerminal: Number, + nbScanners: Number, + hours: Object, + coord: [], + deletedAt: Date, + accountVerified: Boolean, +}); // compile schema to model var User = mongoose.model('Users', usersSchema); +var structuresType = mongoose.model('structureType', structuresTypeSchema); +var categoriesOthers = mongoose.model('categoriesOthers', categoriesOthersSchema); +var categoriesAccompanements = mongoose.model('CategoriesAccompagnement', categoriesAccompanementsSchema); +var categoriesFormation = mongoose.model('categoriesFormation', categoriesFormationSchema); +var structures = mongoose.model('structures', structuresSchema); /* drop users collections */ -mongoose.connection.dropCollection('users', function (err) { - /* show messages */ - if (err) { - if (err.code === 26) console.log('-- Users collection does not exists --'); - else throw err; - } else console.log('-- Users collection dropped --'); +mongoose.connection.dropCollection('users', async (err) => { + await handleError('Users', err); // Init passsword console.log('-- Users password encryption based on .env --'); @@ -66,6 +143,43 @@ mongoose.connection.dropCollection('users', function (err) { User.create(userData.data, function (error, user) { if (error) return console.error(error); console.log('-- Users collection initialized --'); + }); +}); + +/* Create structures ref */ +mongoose.connection.dropCollection('structuretype', async (err) => { + await handleError('structureType', err); + structuresType.create(structuresTypeData.data, (error) => { + if (error) return console.error(error); + }); +}); + +mongoose.connection.dropCollection('categoriesothers', async (err) => { + await handleError('categoriesOthers', err); + categoriesOthers.create(categoriesOthersData.data, (error) => { + if (error) return console.error(error); + }); +}); + +mongoose.connection.dropCollection('categoriesaccompagnements', async (err) => { + await handleError('categoriesAccompanements', err); + categoriesAccompanements.create(categoriesAccompanementsData.data, (error) => { + if (error) return console.error(error); + }); +}); + +mongoose.connection.dropCollection('categoriesformations', async (err) => { + await handleError('categoriesFormations', err); + categoriesFormation.create(categoriesFormationData.data, (error) => { + if (error) return console.error(error); + }); +}); + +/* Create structures */ +mongoose.connection.dropCollection('structures', async (err) => { + await handleError('structures', err); + structures.create(structuresData.data, (error) => { + if (error) return console.error(error); process.exit(0); }); }); diff --git a/scripts/init-ghost.js b/scripts/init-ghost.js index 1885884eaea57891b92435d0b74261c03cc66f84..345ed027d3792a0966ff63452cb05fddeb406fe1 100644 --- a/scripts/init-ghost.js +++ b/scripts/init-ghost.js @@ -81,6 +81,7 @@ function processImagesInHTML(html) { // Find images that Ghost Upload supports let imageRegex = /="([^"]*?(?:\.jpg|\.jpeg|\.gif|\.png|\.svg|\.sgvz))"/gim; let imagePromises = []; + let result; while ((result = imageRegex.exec(html)) !== null) { let file = result[1]; diff --git a/scripts/init-index.js b/scripts/init-index.js new file mode 100644 index 0000000000000000000000000000000000000000..837b1fdfa594d1e6d1484508a6721014eec40b0b --- /dev/null +++ b/scripts/init-index.js @@ -0,0 +1,27 @@ +const axios = require('axios'); +const path = require('path'); +require('dotenv').config({ path: path.resolve(__dirname, '../.env') }); + +axios + .post('http://localhost:3000/auth/login', { + email: 'admin@admin.com', + password: process.env.USER_PWD, + }) + .then((res) => { + const config = { + headers: { Authorization: `Bearer ${res.data.accessToken}` }, + }; + axios + .post('http://localhost:3000/structures/resetSearchIndex', {}, config) + .then((res) => { + console.log(`statusCode: ${res.status}`); + }) + .catch((error) => { + console.error('Error in index create'); + console.error(error); + }); + }) + .catch((error) => { + console.error('Error in auth'); + console.error(error); + }); diff --git a/src/admin/admin.controller.spec.ts b/src/admin/admin.controller.spec.ts index 0b8ca9028651014a25b02e06c12425dee70ab800..d5af5352ceb3950fce9459dbc131e41796bd9de5 100644 --- a/src/admin/admin.controller.spec.ts +++ b/src/admin/admin.controller.spec.ts @@ -1,13 +1,66 @@ +import { HttpModule } from '@nestjs/common'; +import { getModelToken } from '@nestjs/mongoose'; import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigurationModule } from '../configuration/configuration.module'; +import { MailerService } from '../mailer/mailer.service'; +import { NewsletterSubscription } from '../newsletter/newsletter-subscription.schema'; +import { NewsletterService } from '../newsletter/newsletter.service'; +import { SearchModule } from '../search/search.module'; +import { Structure } from '../structures/schemas/structure.schema'; +import { StructuresService } from '../structures/services/structures.service'; +import { StructuresSearchService } from '../structures/services/structures-search.service'; +import { User } from '../users/schemas/user.schema'; +import { UsersService } from '../users/users.service'; import { AdminController } from './admin.controller'; +import { mockJwtAuthGuard } from '../../test/mock/guards/jwt-auth.mock.guard'; +import { mockRoleGuard } from '../../test/mock/guards/role.mock.guard'; +import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; +import { RolesGuard } from '../users/guards/roles.guard'; +import { UsersServiceMock } from '../../test/mock/services/user.mock.service'; +import { StructuresServiceMock } from '../../test/mock/services/structures.mock.service'; +import { NewsletterServiceMock } from '../../test/mock/services/newsletter.mock.service'; describe('AdminController', () => { let controller: AdminController; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ + imports: [ConfigurationModule, HttpModule, SearchModule], + providers: [ + { + provide: UsersService, + useClass: UsersServiceMock, + }, + { + provide: StructuresService, + useClass: StructuresServiceMock, + }, + { + provide: NewsletterService, + useClass: NewsletterServiceMock, + }, + StructuresSearchService, + MailerService, + { + provide: getModelToken('User'), + useValue: User, + }, + { + provide: getModelToken('NewsletterSubscription'), + useValue: NewsletterSubscription, + }, + { + provide: getModelToken('Structure'), + useValue: Structure, + }, + ], controllers: [AdminController], - }).compile(); + }) + .overrideGuard(JwtAuthGuard) + .useValue(mockJwtAuthGuard) + .overrideGuard(RolesGuard) + .useValue(mockRoleGuard) + .compile(); controller = module.get<AdminController>(AdminController); }); @@ -15,4 +68,133 @@ describe('AdminController', () => { it('should be defined', () => { expect(controller).toBeDefined(); }); + + it('should get pending attachments', async () => { + expect((await controller.getPendingAttachments()).length).toBe(2); + expect(Object.keys((await controller.getPendingAttachments())[0]).length).toBe(3); + }); + + describe('Pending structures validation', () => { + it('should validate pending structure', async () => { + const pendingStructureTest = { + structureId: '6093ba0e2ab5775cfc01ed3e', + structureName: 'test', + userEmail: 'jean.paul@mii.com', + }; + expect((await controller.validatePendingStructure(pendingStructureTest)).length).toBe(2); + expect(Object.keys((await controller.validatePendingStructure(pendingStructureTest))[0]).length).toBe(3); + }); + + it('should get structure does not exist', async () => { + const pendingStructureTest = { + structureId: '1093ba0e2ab5775cfc01z2ki', + structureName: 'test', + userEmail: 'jean.paul@mii.com', + }; + try { + await controller.validatePendingStructure(pendingStructureTest); + } catch (e) { + expect(e.message).toBe('Structure does not exist'); + expect(e.status).toBe(404); + } + }); + }); + + describe('Pending structures cancel', () => { + it('should refuse pending structure', async () => { + const pendingStructureTest = { + structureId: '6093ba0e2ab5775cfc01ed3e', + structureName: 'test', + userEmail: 'jean.paul@mii.com', + }; + expect((await controller.refusePendingStructure(pendingStructureTest)).length).toBe(2); + expect(Object.keys((await controller.refusePendingStructure(pendingStructureTest))[0]).length).toBe(3); + }); + + it('should get structure does not exist', async () => { + const pendingStructureTest = { + structureId: '1093ba0e2ab5775cfc01z2ki', + structureName: 'test', + userEmail: 'jean.paul@mii.com', + }; + try { + await controller.refusePendingStructure(pendingStructureTest); + } catch (e) { + expect(e.message).toBe('Structure does not exist'); + expect(e.status).toBe(404); + } + }); + }); + + describe('Delete user', () => { + it('should delete user', async () => { + expect((await controller.deleteUser({ id: 'tsfsf6296' })).email).toBe('pauline.dupont@mii.com'); + }); + it('should return unexisting user', async () => { + try { + await controller.deleteUser({ id: 'userdoesnotexist' }); + } catch (e) { + expect(e.message).toBe('Invalid user id'); + expect(e.status).toBe(400); + } + }); + }); + + describe('Search user', () => { + it('should return all users, empty string', async () => { + expect((await controller.searchUsers({ searchString: '' })).length).toBe(2); + }); + it('should return all users, null input', async () => { + expect((await controller.searchUsers({ searchString: null })).length).toBe(2); + }); + it('should one user', async () => { + expect((await controller.searchUsers({ searchString: 'a@a.com' })).length).toBe(1); + expect((await controller.searchUsers({ searchString: 'a@a.com' }))[0].email).toBe('a@a.com'); + }); + it('should no user', async () => { + expect((await controller.searchUsers({ searchString: 'dfqfqsfqfqfa@a.com' })).length).toBe(0); + }); + }); + + describe('Search user newleetter subscription', () => { + it('should return all subscribed users, empty string', async () => { + expect((await controller.getNewsletterSubscriptions({ searchString: '' })).length).toBe(3); + }); + it('should return all subscribed users, null input', async () => { + expect((await controller.getNewsletterSubscriptions({ searchString: null })).length).toBe(3); + }); + it('should find one user', async () => { + expect((await controller.getNewsletterSubscriptions({ searchString: 'a@a.com' })).length).toBe(1); + expect((await controller.getNewsletterSubscriptions({ searchString: 'a@a.com' }))[0].email).toBe('a@a.com'); + }); + it('should find no user', async () => { + expect((await controller.getNewsletterSubscriptions({ searchString: 'adgdgsdg@a.com' })).length).toBe(0); + }); + }); + + it('should count user subscribed to newsletter', async () => { + expect(await controller.countNewsletterSubscriptions()).toBe(246); + }); + + describe('Search delete a user subscription', () => { + it('should return a deleted object', async () => { + expect((await controller.unsubscribeUserFromNewsletter('a@a.com')).email).toBe('a@a.com'); + expect(Object.keys(await controller.unsubscribeUserFromNewsletter('a@a.com')).length).toBe(4); + }); + it('should throw an error', async () => { + try { + await controller.unsubscribeUserFromNewsletter('test@test.com'); + } catch (e) { + expect(e.message).toBe('Invalid email'); + expect(e.status).toBe(401); + } + }); + }); + + it('should get pending structure list for admin', async () => { + expect((await controller.getAdminStructuresList()).inClaim.length).toBe(2); + expect((await controller.getAdminStructuresList()).toClaim.length).toEqual(2); + expect((await controller.getAdminStructuresList()).claimed.length).toEqual(0); + expect((await controller.getAdminStructuresList()).incomplete.length).toEqual(2); + }); }); diff --git a/src/admin/admin.controller.ts b/src/admin/admin.controller.ts index 858a0dcdb25829e013a48935db7ac788246edd2a..ad0a493f351f0a25a9b66e18930f632f3c9f4966 100644 --- a/src/admin/admin.controller.ts +++ b/src/admin/admin.controller.ts @@ -1,16 +1,35 @@ -import { Body } from '@nestjs/common'; -import { Controller, Get, Post, UseGuards } from '@nestjs/common'; -import { ApiOperation } from '@nestjs/swagger'; +import { ApiOperation, ApiParam } from '@nestjs/swagger'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; +import { + Body, + Delete, + Param, + Controller, + Get, + Post, + UseGuards, + HttpStatus, + HttpException, + Logger, +} from '@nestjs/common'; +import { NewsletterSubscription } from '../newsletter/newsletter-subscription.schema'; +import { NewsletterService } from '../newsletter/newsletter.service'; import { StructuresService } from '../structures/services/structures.service'; import { Roles } from '../users/decorators/roles.decorator'; import { RolesGuard } from '../users/guards/roles.guard'; import { UsersService } from '../users/users.service'; import { PendingStructureDto } from './dto/pending-structure.dto'; +import { validate } from 'class-validator'; +import { Structure } from '../structures/schemas/structure.schema'; @Controller('admin') export class AdminController { - constructor(private usersService: UsersService, private structuresService: StructuresService) {} + private readonly logger = new Logger(AdminController.name); + constructor( + private usersService: UsersService, + private structuresService: StructuresService, + private newsletterService: NewsletterService + ) {} @UseGuards(JwtAuthGuard, RolesGuard) @Roles('admin') @@ -18,7 +37,7 @@ export class AdminController { @ApiOperation({ description: 'Get pending structre for validation' }) public async getPendingAttachments(): Promise<PendingStructureDto[]> { const pendingStructure = await this.usersService.getPendingStructures(); - return await Promise.all( + return Promise.all( pendingStructure.map(async (structure) => { structure.structureName = (await this.structuresService.findOne(structure.structureId)).structureName; return structure; @@ -26,12 +45,55 @@ export class AdminController { ); } + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @Get('adminStructuresList') + @ApiOperation({ description: 'Get pending structre for validation' }) + public async getAdminStructuresList(): Promise<any> { + const structuresList = { claimed: [], inClaim: [], toClaim: [], incomplete: [] }; + structuresList.inClaim = await this.getPendingAttachments(); + structuresList.toClaim = (await this.structuresService.findAllUnclaimed()).filter( + (demand) => !structuresList.inClaim.find((elem) => elem.structureId == demand.structureId) + ); + const allStructures = await this.structuresService.findAll(); + structuresList.claimed = allStructures + .filter( + (demand) => + !structuresList.inClaim.find((elem) => elem.structureId == demand.id) && + !structuresList.toClaim.find((elem) => elem.structureId == demand.id) + ) + .map((structure) => { + return { structureId: structure.id, structureName: structure.structureName }; + }); + structuresList.incomplete = await Promise.all( + allStructures.map(async (struct) => { + const validity = await validate(new Structure(struct)); + if (validity.length > 0) { + this.logger.debug(`getAdminStructuresList - validation failed. errors: ${validity.toString()}`); + return { structureId: struct.id, structureName: struct.structureName }; + } else { + this.logger.debug('getAdminStructuresList - validation succeed'); + return null; + } + }) + ); + structuresList.incomplete = structuresList.incomplete.filter((structure) => structure); + structuresList.claimed.sort((a, b) => a.structureName.localeCompare(b.structureName)); + structuresList.inClaim.sort((a, b) => a.structureName.localeCompare(b.structureName)); + structuresList.toClaim.sort((a, b) => a.structureName.localeCompare(b.structureName)); + structuresList.incomplete.sort((a, b) => a.structureName.localeCompare(b.structureName)); + return structuresList; + } + @UseGuards(JwtAuthGuard, RolesGuard) @Roles('admin') @Post('validatePendingStructure') @ApiOperation({ description: 'Validate structure ownership' }) public async validatePendingStructure(@Body() pendingStructureDto: PendingStructureDto) { const structure = await this.structuresService.findOne(pendingStructureDto.structureId); + if (!structure || structure.deletedAt) { + throw new HttpException('Structure does not exist', HttpStatus.NOT_FOUND); + } await this.usersService.validatePendingStructure( pendingStructureDto.userEmail, pendingStructureDto.structureId, @@ -39,10 +101,12 @@ export class AdminController { true ); const pendingStructure = await this.usersService.getPendingStructures(); - return await Promise.all( - pendingStructure.map(async (structure) => { - structure.structureName = (await this.structuresService.findOne(structure.structureId)).structureName; - return structure; + return Promise.all( + pendingStructure.map(async (pendingStructureData) => { + pendingStructureData.structureName = ( + await this.structuresService.findOne(pendingStructureData.structureId) + ).structureName; + return pendingStructureData; }) ); } @@ -53,6 +117,9 @@ export class AdminController { @ApiOperation({ description: 'Refuse structure ownership' }) public async refusePendingStructure(@Body() pendingStructureDto: PendingStructureDto) { const structure = await this.structuresService.findOne(pendingStructureDto.structureId); + if (!structure || structure.deletedAt) { + throw new HttpException('Structure does not exist', HttpStatus.NOT_FOUND); + } await this.usersService.validatePendingStructure( pendingStructureDto.userEmail, pendingStructureDto.structureId, @@ -60,11 +127,62 @@ export class AdminController { false ); const pendingStructure = await this.usersService.getPendingStructures(); - return await Promise.all( - pendingStructure.map(async (structure) => { - structure.structureName = (await this.structuresService.findOne(structure.structureId)).structureName; - return structure; + return Promise.all( + pendingStructure.map(async (pendingStructureData) => { + pendingStructureData.structureName = ( + await this.structuresService.findOne(pendingStructureData.structureId) + ).structureName; + return pendingStructureData; }) ); } + + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @Delete('user/:id') + @ApiParam({ name: 'id', type: String, required: true }) + public async deleteUser(@Param() params) { + const user = await this.usersService.deleteOneId(params.id); + user.structuresLink.forEach((structureId) => { + this.usersService.isStructureClaimed(structureId.toString()).then((userFound) => { + if (!userFound) { + this.structuresService.deleteOne(structureId.toString()); + } + }); + }); + return user; + } + + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @Post('searchUsers') + public async searchUsers(@Body() searchString: { searchString: string }) { + if (searchString && searchString.searchString && searchString.searchString.length > 0) + return this.usersService.searchUsers(searchString.searchString); + else return this.usersService.findAll(); + } + + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @Post('searchNewsletterSubscriptions') + public async getNewsletterSubscriptions(@Body() searchString: { searchString: string }) { + if (searchString && searchString.searchString && searchString.searchString.length > 0) + return this.newsletterService.searchNewsletterSubscription(searchString.searchString); + else return this.newsletterService.findAll(); + } + + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @Get('countNewsletterSubscriptions') + public async countNewsletterSubscriptions(): Promise<number> { + return this.newsletterService.countNewsletterSubscriptions(); + } + + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + @Delete('newsletterSubscription/:email') + @ApiParam({ name: 'email', type: String, required: true }) + public async unsubscribeUserFromNewsletter(@Param() params): Promise<NewsletterSubscription> { + return this.newsletterService.deleteOneEmail(params.email); + } } diff --git a/src/admin/admin.module.ts b/src/admin/admin.module.ts index a13616a1802d24dc4f58d513714a9647193c591b..7854c19b255df99cc35837f56d9f9dfd637d7bf5 100644 --- a/src/admin/admin.module.ts +++ b/src/admin/admin.module.ts @@ -1,11 +1,12 @@ import { Module } from '@nestjs/common'; +import { NewsletterModule } from '../newsletter/newsletter.module'; import { StructuresModule } from '../structures/structures.module'; import { UsersModule } from '../users/users.module'; import { AdminController } from './admin.controller'; import { AdminService } from './admin.service'; @Module({ - imports: [UsersModule, StructuresModule], + imports: [UsersModule, StructuresModule, NewsletterModule], controllers: [AdminController], providers: [AdminService], }) diff --git a/src/admin/dto/pending-structure.dto.ts b/src/admin/dto/pending-structure.dto.ts index e07fd91f860cc5468be1e2449ce05897a26b1465..1f735be0f4256472524dba43286ab53cba836fcc 100644 --- a/src/admin/dto/pending-structure.dto.ts +++ b/src/admin/dto/pending-structure.dto.ts @@ -1,5 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; -import { IsEmail, IsNotEmpty, IsString } from 'class-validator'; +import { IsEmail, IsMongoId, IsNotEmpty, IsString } from 'class-validator'; export class PendingStructureDto { @IsNotEmpty() @@ -8,7 +8,7 @@ export class PendingStructureDto { readonly userEmail: string; @IsNotEmpty() - @IsString() + @IsMongoId() @ApiProperty({ type: String }) readonly structureId: string; diff --git a/src/admin/dto/unclaimed-structure-dto.ts b/src/admin/dto/unclaimed-structure-dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..c57eedbd30d908debab1d539676731e1a7c79388 --- /dev/null +++ b/src/admin/dto/unclaimed-structure-dto.ts @@ -0,0 +1,14 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsNotEmpty, IsString } from 'class-validator'; + +export class UnclaimedStructureDto { + @IsNotEmpty() + @IsString() + @ApiProperty({ type: String }) + readonly structureId: string; + + @IsNotEmpty() + @IsString() + @ApiProperty({ type: String }) + structureName: string; +} diff --git a/src/app.module.ts b/src/app.module.ts index 467fe404c31f6fdeadc948aec96bdf136aa676f3..3cd15b2b24ef294009ddb6c3a55989789bd9bfd4 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -12,6 +12,7 @@ import { TclModule } from './tcl/tcl.module'; import { AdminModule } from './admin/admin.module'; import { PostsModule } from './posts/posts.module'; import { TempUserModule } from './temp-user/temp-user.module'; +import { NewsletterModule } from './newsletter/newsletter.module'; @Module({ imports: [ ConfigurationModule, @@ -28,6 +29,7 @@ import { TempUserModule } from './temp-user/temp-user.module'; AdminModule, PostsModule, TempUserModule, + NewsletterModule, ], controllers: [AppController], }) diff --git a/src/auth/auth.controller.spec.ts b/src/auth/auth.controller.spec.ts index 52a4184107d34402e9bdd97e8d5e9dfd27209fb4..c92f1b8b66947641325ba1b79cd8d0c5f266f542 100644 --- a/src/auth/auth.controller.spec.ts +++ b/src/auth/auth.controller.spec.ts @@ -2,12 +2,14 @@ import { JwtModule } from '@nestjs/jwt'; import { getModelToken } from '@nestjs/mongoose'; import { PassportModule } from '@nestjs/passport'; import { Test, TestingModule } from '@nestjs/testing'; +import { AuthServiceMock } from '../../test/mock/services/auth.mock.service'; import { ConfigurationModule } from '../configuration/configuration.module'; import { MailerModule } from '../mailer/mailer.module'; import { User } from '../users/schemas/user.schema'; import { UsersService } from '../users/users.service'; import { AuthController } from './auth.controller'; import { AuthService } from './auth.service'; +import { LoginDto } from './login-dto'; describe('AuthController', () => { let controller: AuthController; @@ -27,6 +29,10 @@ describe('AuthController', () => { providers: [ AuthService, UsersService, + { + provide: AuthService, + useClass: AuthServiceMock, + }, { provide: getModelToken('User'), useValue: User, @@ -40,4 +46,31 @@ describe('AuthController', () => { it('should be defined', () => { expect(controller).toBeDefined(); }); + + it('should login valid user', async () => { + const loginCredentials: LoginDto = { email: 'paula.dubois@mii.com', password: process.env.USER_PWD }; + const result = await controller.login(loginCredentials); + expect(result).toStrictEqual({ + _id: 'tsfsf6296', + email: 'pauline.dupont@mii.com', + emailVerified: true, + name: 'DUBOIS', + password: '$2a$12$vLQjJ9zAWyUwiFLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu', + role: 0, + surname: 'Paula', + validationToken: + 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', + }); + }); + + it('should not login invalid user', async () => { + const loginCredentials: LoginDto = { email: 'jacques.dupont@mii.com', password: process.env.USER_PWD }; + try { + await controller.login(loginCredentials); + } catch (e) { + expect(e.response).toBe('Invalid credentials'); + expect(e.message).toBe('Invalid credentials'); + expect(e.status).toBe(401); + } + }); }); diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 63c11822e28d603d43b5fc766b70c50b9d244196..58127150c63d58830c720b7a32a39dfdff2399f8 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -7,7 +7,7 @@ export class AuthController { constructor(private authService: AuthService) {} @Post('login') - async login(@Body() loginDto: LoginDto) { + async login(@Body() loginDto: LoginDto): Promise<{ username; name; surname; token }> { return this.authService.login(loginDto); } } diff --git a/src/auth/auth.service.spec.ts b/src/auth/auth.service.spec.ts index 2e85b13e99460b761605d520d20d936392dc2d9c..188c44616d058d7ca507edd84ae321f047653bb0 100644 --- a/src/auth/auth.service.spec.ts +++ b/src/auth/auth.service.spec.ts @@ -1,11 +1,10 @@ -import { HttpException, HttpStatus } from '@nestjs/common'; -import { JwtModule } from '@nestjs/jwt'; -import { getModelToken } from '@nestjs/mongoose'; +import { JwtService } from '@nestjs/jwt'; import { PassportModule } from '@nestjs/passport'; import { Test, TestingModule } from '@nestjs/testing'; +import { JwtServiceMock } from '../../test/mock/services/jwt.mock.service'; +import { UsersServiceMock } from '../../test/mock/services/user.mock.service'; import { ConfigurationModule } from '../configuration/configuration.module'; import { MailerModule } from '../mailer/mailer.module'; -import { User } from '../users/schemas/user.schema'; import { UsersService } from '../users/users.service'; import { AuthService } from './auth.service'; import { LoginDto } from './login-dto'; @@ -15,21 +14,16 @@ describe('AuthService', () => { beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - imports: [ - PassportModule, - MailerModule, - ConfigurationModule, - JwtModule.register({ - secret: process.env.JWT_SECRET, - signOptions: { expiresIn: '86400s' }, // 24h validity - }), - ], + imports: [PassportModule, MailerModule, ConfigurationModule], providers: [ AuthService, - UsersService, { - provide: getModelToken('User'), - useValue: User, + provide: UsersService, + useClass: UsersServiceMock, + }, + { + provide: JwtService, + useClass: JwtServiceMock, }, ], }).compile(); @@ -52,45 +46,95 @@ describe('AuthService', () => { role: 0, }; const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR - jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); - expect(await service.validateUser(loginDto)).toBe(result); + expect(await service.validateUser(loginDto)).toStrictEqual(result); }); it('should not validateUser', async () => { - const result = null; - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR - jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); - expect(await service.validateUser(loginDto)).toBe(result); + const loginDto: LoginDto = { email: 'tom.dupont@mii.com', password: 'test1A!!!' }; //NOSONAR + expect(await service.validateUser(loginDto)).toBe(null); }); }); describe('login', () => { - it('should login user jacques.dupont@mii.com', async () => { - const result = { username: ' jacques.dupont@mii.com', token: 'tok3n!1sfq' }; - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR - jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<{ username; token }> => result); - expect(await service.validateUser(loginDto)).toBe(result); + it('should login user pauline.dupont@mii.com', async () => { + // Token creation mock + const token = { + accessToken: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InBhdWxpbmUuZHVwb250QG1paS5jb20iLCJyb2xlIjowLCJpYXQiOjE2MjAwNDg5MDYsImV4cCI6MTYyMDEzNTMwNn0.jbLazQNJzU_X9Yp1S7XH1rYD5W7yyd1pdGebmkyTMB4', + expiresAt: '2021-05-04T15:35:06.663+02:00', + }; + const _createToken = jest.spyOn(AuthService.prototype as any, '_createToken'); + _createToken.mockImplementation(() => token); + + const loginDto: LoginDto = { email: 'pauline.dupont@mii.com', password: 'test1A!!' }; //NOSONAR + expect(await service.login(loginDto)).toStrictEqual({ + accessToken: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InBhdWxpbmUuZHVwb250QG1paS5jb20iLCJyb2xlIjowLCJpYXQiOjE2MjAwNDg5MDYsImV4cCI6MTYyMDEzNTMwNn0.jbLazQNJzU_X9Yp1S7XH1rYD5W7yyd1pdGebmkyTMB4', + expiresAt: '2021-05-04T15:35:06.663+02:00', + username: 'pauline.dupont@mii.com', + name: 'DUPONT', + surname: 'Pauline', + }); }); - it('should not login jacques.dupont@mii.com, email not verified', async () => { - const result = new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); + it('should login not login user jacques.dupont@mii.com because email is not verified', async () => { + // Token creation mock + const token = { + accessToken: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InBhdWxpbmUuZHVwb250QG1paS5jb20iLCJyb2xlIjowLCJpYXQiOjE2MjAwNDg5MDYsImV4cCI6MTYyMDEzNTMwNn0.jbLazQNJzU_X9Yp1S7XH1rYD5W7yyd1pdGebmkyTMB4', + expiresAt: '2021-05-04T15:35:06.663+02:00', + }; + const _createToken = jest.spyOn(AuthService.prototype as any, '_createToken'); + _createToken.mockImplementation(() => token); + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR - jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); - expect(await service.validateUser(loginDto)).toBe(result); + try { + await service.login(loginDto); + } catch (e) { + expect(e.response).toBe('Invalid credentials'); + expect(e.message).toBe('Invalid credentials'); + expect(e.status).toBe(401); + } }); - it('should not login jacques.dupont@mii.com, bad password', async () => { - const result = new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR - jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); - expect(await service.validateUser(loginDto)).toBe(result); + it('should login not login user toto@mii.com because email does not exist', async () => { + // Token creation mock + const token = { + accessToken: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InBhdWxpbmUuZHVwb250QG1paS5jb20iLCJyb2xlIjowLCJpYXQiOjE2MjAwNDg5MDYsImV4cCI6MTYyMDEzNTMwNn0.jbLazQNJzU_X9Yp1S7XH1rYD5W7yyd1pdGebmkyTMB4', + expiresAt: '2021-05-04T15:35:06.663+02:00', + }; + const _createToken = jest.spyOn(AuthService.prototype as any, '_createToken'); + _createToken.mockImplementation(() => token); + + const loginDto: LoginDto = { email: 'toto@mii.com', password: 'test1A!!' }; //NOSONAR + try { + await service.login(loginDto); + } catch (e) { + expect(e.response).toBe('Invalid credentials'); + expect(e.message).toBe('Invalid credentials'); + expect(e.status).toBe(401); + } }); - it('should not login jacques.dupont@mii.com, username does not exist', async () => { - const result = new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); - const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR - jest.spyOn(service, 'validateUser').mockImplementation(async (): Promise<any> => result); - expect(await service.validateUser(loginDto)).toBe(result); + it('should login not login user toto@mii.com because password is invalid', async () => { + // Token creation mock + const token = { + accessToken: + 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InBhdWxpbmUuZHVwb250QG1paS5jb20iLCJyb2xlIjowLCJpYXQiOjE2MjAwNDg5MDYsImV4cCI6MTYyMDEzNTMwNn0.jbLazQNJzU_X9Yp1S7XH1rYD5W7yyd1pdGebmkyTMB4', + expiresAt: '2021-05-04T15:35:06.663+02:00', + }; + const _createToken = jest.spyOn(AuthService.prototype as any, '_createToken'); + _createToken.mockImplementation(() => token); + + const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: '1' }; //NOSONAR + try { + await service.login(loginDto); + } catch (e) { + expect(e.response).toBe('Invalid credentials'); + expect(e.message).toBe('Invalid credentials'); + expect(e.status).toBe(401); + } }); }); }); diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index f14cd8bf262a38d0a2550589ebb9f349bb262e8c..7d9ccce53e43cb2ef3968f9358680404fc7900f9 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -17,7 +17,7 @@ export class AuthService { return null; } - async login(loginDto: LoginDto): Promise<{ username; token }> { + async login(loginDto: LoginDto): Promise<{ username; name; surname; token }> { // find user in db const user: User = await this.usersService.findByLogin(loginDto); if (!user.emailVerified) { diff --git a/src/categories/categories.module.ts b/src/categories/categories.module.ts index 380468396bceb0829ce6ad1a93e5b029a4722799..3373d355f83e81b4d19fa7ebcf1f2ca1b4487c87 100644 --- a/src/categories/categories.module.ts +++ b/src/categories/categories.module.ts @@ -19,6 +19,10 @@ import { CategoriesAccompagnement, CategoriesAccompagnementSchema } from './sche ]), ], controllers: [CategoriesFormationsController, CategoriesAccompagnementController, CategoriesOthersController], + exports: [CategoriesFormationsService, CategoriesAccompagnementService, CategoriesOthersService], providers: [CategoriesFormationsService, CategoriesAccompagnementService, CategoriesOthersService], }) -export class CategoriesModule {} +export class CategoriesModule { + id: string; + text: any; +} diff --git a/src/categories/controllers/categories-accompagnement.controller.spec.ts b/src/categories/controllers/categories-accompagnement.controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..f3035f99d088bc9a6cf36db92b231f3f792eac7b --- /dev/null +++ b/src/categories/controllers/categories-accompagnement.controller.spec.ts @@ -0,0 +1,65 @@ +import { getModelToken } from '@nestjs/mongoose'; +import { Test, TestingModule } from '@nestjs/testing'; +import { mockJwtAuthGuard } from '../../../test/mock/guards/jwt-auth.mock.guard'; +import { mockRoleGuard } from '../../../test/mock/guards/role.mock.guard'; +import { CategoriesAccompagnementServiceMock } from '../../../test/mock/services/categoriesAccompagnement.mock.service'; +import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; +import { RolesGuard } from '../../users/guards/roles.guard'; +import { CreateCategoriesAccompagnement } from '../dto/create-categoriesAccompagnement.dto'; +import { CategoriesAccompagnement } from '../schemas/categoriesAccompagnement.schema'; +import { CategoriesAccompagnementService } from '../services/categories-accompagnement.service'; +import { CategoriesAccompagnementController } from './categories-accompagnement.controller'; + +describe('CategoriesAccompagnementController', () => { + let controller: CategoriesAccompagnementController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + providers: [ + { + provide: CategoriesAccompagnementService, + useClass: CategoriesAccompagnementServiceMock, + }, + { + provide: getModelToken('CategoriesAccompagnement'), + useValue: CategoriesAccompagnement, + }, + ], + controllers: [CategoriesAccompagnementController], + }) + .overrideGuard(JwtAuthGuard) + .useValue(mockJwtAuthGuard) + .overrideGuard(RolesGuard) + .useValue(mockRoleGuard) + .compile(); + + controller = module.get<CategoriesAccompagnementController>(CategoriesAccompagnementController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + it('should find all accompagnements', async () => { + expect((await controller.findAll()).length).toBe(1); + expect((await controller.findAll())[0].modules.length).toBe(8); + }); + + it('should create accompagnements', async () => { + const data: CreateCategoriesAccompagnement = { + name: 'test', + modules: [ + { + id: 'tst', + text: 'Test', + }, + { + id: 'antst', + text: 'Another test', + }, + ], + }; + expect((await controller.create(data)).modules.length).toBe(2); + }); +}); diff --git a/src/categories/controllers/categories-accompagnement.controller.ts b/src/categories/controllers/categories-accompagnement.controller.ts index 66ea90536b84624505ba92e826f7b3cbe9fa2b9d..51d7f482339ed2ff952db8e456ef72f8b6012556 100644 --- a/src/categories/controllers/categories-accompagnement.controller.ts +++ b/src/categories/controllers/categories-accompagnement.controller.ts @@ -1,15 +1,20 @@ -import { Body, Controller, Get, Post } from '@nestjs/common'; +import { Body, Controller, Get, Post, UseGuards } from '@nestjs/common'; import { CategoriesAccompagnementService } from '../services/categories-accompagnement.service'; import { CreateCategoriesAccompagnement } from '../dto/create-categoriesAccompagnement.dto'; import { CategoriesAccompagnement } from '../schemas/categoriesAccompagnement.schema'; +import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; +import { Roles } from '../../users/decorators/roles.decorator'; +import { RolesGuard } from '../../users/guards/roles.guard'; @Controller('categories/categoriesAccompagnement') export class CategoriesAccompagnementController { constructor(private readonly categoriesAccompagnementService: CategoriesAccompagnementService) {} @Post() - public async create(@Body() createStructureDto: CreateCategoriesAccompagnement) { - await this.categoriesAccompagnementService.create(createStructureDto); + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + public async create(@Body() createStructureDto: CreateCategoriesAccompagnement): Promise<CategoriesAccompagnement> { + return this.categoriesAccompagnementService.create(createStructureDto); } @Get() diff --git a/src/categories/controllers/categories-formations.controller.spec.ts b/src/categories/controllers/categories-formations.controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..3c9a1d3099db52bcb7c9f21e23b70e463a4746a3 --- /dev/null +++ b/src/categories/controllers/categories-formations.controller.spec.ts @@ -0,0 +1,55 @@ +import { getModelToken } from '@nestjs/mongoose'; +import { Test, TestingModule } from '@nestjs/testing'; +import { CategoriesFormationsServiceMock } from '../../../test/mock/services/categoriesFormations.mock.service'; +import { CreateCategoriesFormations } from '../dto/create-categoriesFormations.dto'; +import { CategoriesFormations } from '../schemas/categoriesFormations.schema'; +import { CategoriesFormationsService } from '../services/categories-formations.service'; +import { CategoriesFormationsController } from './categories-formations.controller'; + +describe('CategoriesFormationsController', () => { + let controller: CategoriesFormationsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + providers: [ + { + provide: CategoriesFormationsService, + useClass: CategoriesFormationsServiceMock, + }, + { + provide: getModelToken('CategoriesFormations'), + useValue: CategoriesFormations, + }, + ], + controllers: [CategoriesFormationsController], + }).compile(); + + controller = module.get<CategoriesFormationsController>(CategoriesFormationsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + it('should find all formations', async () => { + expect((await controller.findAll()).length).toBe(6); + expect((await controller.findAll())[0].modules.length).toBe(8); + }); + + it('should create a formation', async () => { + const data: CreateCategoriesFormations = { + name: 'test', + modules: [ + { + id: '74', + display_id: '74', + display_name: 'Modules APTIC - n°74', + digest: 'Smartphones et Tablettes sous Androïd', + text: 'Smartphones et Tablettes sous Androïd', + }, + ], + }; + expect((await controller.create(data)).modules.length).toBe(2); + }); +}); diff --git a/src/categories/controllers/categories-formations.controller.ts b/src/categories/controllers/categories-formations.controller.ts index 7b1ca152bc86bc15adcd48baa8e7dd4442678589..527a7ba9f33deddbcf5743dc29697f3261cd2ccf 100644 --- a/src/categories/controllers/categories-formations.controller.ts +++ b/src/categories/controllers/categories-formations.controller.ts @@ -1,15 +1,20 @@ -import { Body, Controller, Get, Post } from '@nestjs/common'; +import { Body, Controller, Get, Post, UseGuards } from '@nestjs/common'; import { CategoriesFormationsService } from '../services/categories-formations.service'; import { CreateCategoriesFormations } from '../dto/create-categoriesFormations.dto'; import { CategoriesFormations } from '../schemas/categoriesFormations.schema'; +import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; +import { Roles } from '../../users/decorators/roles.decorator'; +import { RolesGuard } from '../../users/guards/roles.guard'; @Controller('categories/categoriesFormations') export class CategoriesFormationsController { constructor(private readonly categoriesFormationsService: CategoriesFormationsService) {} @Post() - public async create(@Body() createStructureDto: CreateCategoriesFormations) { - await this.categoriesFormationsService.create(createStructureDto); + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + public async create(@Body() createStructureDto: CreateCategoriesFormations): Promise<CategoriesFormations> { + return this.categoriesFormationsService.create(createStructureDto); } @Get() diff --git a/src/categories/controllers/categories-others.controller.spec.ts b/src/categories/controllers/categories-others.controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e2ae12f29f88069bd398957876695c2dcd33e404 --- /dev/null +++ b/src/categories/controllers/categories-others.controller.spec.ts @@ -0,0 +1,52 @@ +import { getModelToken } from '@nestjs/mongoose'; +import { Test, TestingModule } from '@nestjs/testing'; +import { CategoriesOthersServiceMock } from '../../../test/mock/services/categoriesOthers.mock.service'; +import { CategoriesOthers } from '../schemas/categoriesOthers.schema'; +import { CategoriesOthersService } from '../services/categories-others.service'; +import { CategoriesOthersController } from './categories-others.controller'; + +describe('CategoriesOthersController', () => { + let controller: CategoriesOthersController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + providers: [ + { + provide: CategoriesOthersService, + useClass: CategoriesOthersServiceMock, + }, + { + provide: getModelToken('CategoriesOthers'), + useValue: CategoriesOthers, + }, + ], + controllers: [CategoriesOthersController], + }).compile(); + + controller = module.get<CategoriesOthersController>(CategoriesOthersController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + it('should find all formations', async () => { + expect((await controller.findAll()).length).toBe(1); + expect((await controller.findAll())[0].modules.length).toBe(6); + }); + + it('should create a formation', async () => { + const data: CategoriesOthers = { + id: 'publics', + name: 'test', + modules: [ + { + id: 'toutPublic', + text: 'Tout public', + }, + ], + }; + expect((await controller.create(data)).modules.length).toBe(1); + }); +}); diff --git a/src/categories/controllers/categories-others.controller.ts b/src/categories/controllers/categories-others.controller.ts index 6e284e397b877f14417040ba36d36516bb15e1eb..b45f1530ed2ef443f52ba5a9f9b5cee6b720fc66 100644 --- a/src/categories/controllers/categories-others.controller.ts +++ b/src/categories/controllers/categories-others.controller.ts @@ -1,15 +1,20 @@ -import { Body, Controller, Get, Post } from '@nestjs/common'; +import { Body, Controller, Get, Post, UseGuards } from '@nestjs/common'; import { CategoriesOthersService } from '../services/categories-others.service'; import { CreateCategoriesOthers } from '../dto/create-categoriesOthers.dto'; import { CategoriesOthers } from '../schemas/categoriesOthers.schema'; +import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard'; +import { Roles } from '../../users/decorators/roles.decorator'; +import { RolesGuard } from '../../users/guards/roles.guard'; @Controller('categories/categoriesOthers') export class CategoriesOthersController { constructor(private readonly categoriesOthersService: CategoriesOthersService) {} @Post() - public async create(@Body() createStructureDto: CreateCategoriesOthers) { - await this.categoriesOthersService.create(createStructureDto); + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + public async create(@Body() createStructureDto: CreateCategoriesOthers): Promise<CategoriesOthers> { + return this.categoriesOthersService.create(createStructureDto); } @Get() diff --git a/src/categories/schemas/categoriesAccompagnement.schema.ts b/src/categories/schemas/categoriesAccompagnement.schema.ts index 162073ab30538023385d25e75ae09da596c38d8b..6e3bd1c26347d76d715bd9cf532cbf0e1d628c02 100644 --- a/src/categories/schemas/categoriesAccompagnement.schema.ts +++ b/src/categories/schemas/categoriesAccompagnement.schema.ts @@ -11,6 +11,9 @@ export class CategoriesAccompagnement { @Prop() modules: CategoriesModule[]; + + @Prop() + id: string; } export const CategoriesAccompagnementSchema = SchemaFactory.createForClass(CategoriesAccompagnement); diff --git a/src/categories/schemas/categoriesFormations.schema.ts b/src/categories/schemas/categoriesFormations.schema.ts index 0ef918dcff3d11a5487a97062aff6419f38257fd..cb1819041eda8c05c4c3731e5eaaf48b55760e1d 100644 --- a/src/categories/schemas/categoriesFormations.schema.ts +++ b/src/categories/schemas/categoriesFormations.schema.ts @@ -11,6 +11,9 @@ export class CategoriesFormations { @Prop() modules: CategoriesFormationsModule[]; + + @Prop() + id: string; } export const CategoriesFormationsSchema = SchemaFactory.createForClass(CategoriesFormations); diff --git a/src/categories/schemas/categoriesFormationsModule.schema.ts b/src/categories/schemas/categoriesFormationsModule.schema.ts index 6be322e9c34eb02ca06e497d7d54ab98830dde44..4eaedd6da48c2012e6e63684db7febaf75102816 100644 --- a/src/categories/schemas/categoriesFormationsModule.schema.ts +++ b/src/categories/schemas/categoriesFormationsModule.schema.ts @@ -4,14 +4,11 @@ import { Document } from 'mongoose'; export type CategoriesFormationsModuleDocument = CategoriesFormationsModule & Document; export class CategoriesFormationsModule { - id: number; + id: string; display_id: string; display_name: string; digest: string; text: string; - url: string; - receipt_time: string; - last_update_time: string; } export const CategoriesFormationsModuleSchema = SchemaFactory.createForClass(CategoriesFormationsModule); diff --git a/src/categories/schemas/categoriesOthers.schema.ts b/src/categories/schemas/categoriesOthers.schema.ts index 239706b0dc784b0f0423ff70654e778f45f258af..688a31d5b928fca486a1feca6b5630e2076dd4cc 100644 --- a/src/categories/schemas/categoriesOthers.schema.ts +++ b/src/categories/schemas/categoriesOthers.schema.ts @@ -11,6 +11,9 @@ export class CategoriesOthers { @Prop() modules: CategoriesModule[]; + + @Prop() + id: string; } export const CategoriesOthersSchema = SchemaFactory.createForClass(CategoriesOthers); diff --git a/src/categories/services/categories-accompagnement.service.spec.ts b/src/categories/services/categories-accompagnement.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..2690850884d95e003009cd4395d8d7125889d03b --- /dev/null +++ b/src/categories/services/categories-accompagnement.service.spec.ts @@ -0,0 +1,27 @@ +import { getModelToken } from '@nestjs/mongoose'; +import { Test, TestingModule } from '@nestjs/testing'; +import { CategoriesAccompagnement } from '../schemas/categoriesAccompagnement.schema'; +import { CategoriesAccompagnementService } from './categories-accompagnement.service'; + +describe('CategoriesAccompagnementService', () => { + let service: CategoriesAccompagnementService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + providers: [ + CategoriesAccompagnementService, + { + provide: getModelToken('CategoriesAccompagnement'), + useValue: CategoriesAccompagnement, + }, + ], + }).compile(); + + service = module.get<CategoriesAccompagnementService>(CategoriesAccompagnementService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/categories/services/categories-formations.service.spec.ts b/src/categories/services/categories-formations.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..4f079fdd4611597a976174206557113ead3b3194 --- /dev/null +++ b/src/categories/services/categories-formations.service.spec.ts @@ -0,0 +1,27 @@ +import { getModelToken } from '@nestjs/mongoose'; +import { Test, TestingModule } from '@nestjs/testing'; +import { CategoriesFormations } from '../schemas/categoriesFormations.schema'; +import { CategoriesFormationsService } from './categories-formations.service'; + +describe('CategoriesFormationsService', () => { + let service: CategoriesFormationsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + providers: [ + CategoriesFormationsService, + { + provide: getModelToken('CategoriesFormations'), + useValue: CategoriesFormations, + }, + ], + }).compile(); + + service = module.get<CategoriesFormationsService>(CategoriesFormationsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/categories/services/categories-formations.service.ts b/src/categories/services/categories-formations.service.ts index 05ecae4af07f33c273ecdd2ded6a89c734358c8c..71a6c1073ad5245541c651836b272195dd96397c 100644 --- a/src/categories/services/categories-formations.service.ts +++ b/src/categories/services/categories-formations.service.ts @@ -16,4 +16,8 @@ export class CategoriesFormationsService { public async findAll(): Promise<CategoriesFormations[]> { return this.structureModel.find().exec(); } + + public findOne(categoryId: string): Promise<any> { + return this.structureModel.findOne({ id: categoryId }).select({ 'modules.id': 1 }).exec(); + } } diff --git a/src/categories/services/categories-others.service.spec.ts b/src/categories/services/categories-others.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..7c25eb3618f8bd75287bb29c7ebc52ba3256f33c --- /dev/null +++ b/src/categories/services/categories-others.service.spec.ts @@ -0,0 +1,27 @@ +import { getModelToken } from '@nestjs/mongoose'; +import { Test, TestingModule } from '@nestjs/testing'; +import { CategoriesOthers } from '../schemas/categoriesOthers.schema'; +import { CategoriesOthersService } from './categories-others.service'; + +describe('CategoriesFormationsService', () => { + let service: CategoriesOthersService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + providers: [ + CategoriesOthersService, + { + provide: getModelToken('CategoriesOthers'), + useValue: CategoriesOthers, + }, + ], + }).compile(); + + service = module.get<CategoriesOthersService>(CategoriesOthersService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/configuration/config.ts b/src/configuration/config.ts index e9d940409b5b8b927e138bb8b33a9e2ff6935743..97ab675e89c54d4e224c3ebec86ed372bbb45ce9 100644 --- a/src/configuration/config.ts +++ b/src/configuration/config.ts @@ -4,9 +4,9 @@ export const config = { host: 'localhost', protocol: 'http', port: '4200', - from: 'inclusionnumerique@grandlyon.com', + from: 'noreplyinclusionnumerique@grandlyon.com', from_name: 'Réseau des acteurs de la médiation numérique', - replyTo: 'inclusionnumerique@grandlyon.com', + replyTo: 'noreplyinclusionnumerique@grandlyon.com', templates: { directory: './src/mailer/mail-templates', verify: { @@ -45,5 +45,21 @@ export const config = { ejs: 'structureJoinRequest.ejs', json: 'structureJoinRequest.json', }, + adminStructureCreate: { + ejs: 'adminStructureCreate.ejs', + json: 'adminStructureCreate.json', + }, + structureErrorReport: { + ejs: 'structureErrorReport.ejs', + json: 'structureErrorReport.json', + }, + structureModificationNotification: { + ejs: 'structureModificationNotification.ejs', + json: 'structureModificationNotification.json', + }, + structureDeletionNotification: { + ejs: 'structureDeletionNotification.ejs', + json: 'structureDeletionNotification.json', + }, }, }; diff --git a/src/configuration/configuration.service.spec.ts b/src/configuration/configuration.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a5ddba0b94c2d6b95b5846ca549160d01bf42275 --- /dev/null +++ b/src/configuration/configuration.service.spec.ts @@ -0,0 +1,88 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigurationService } from './configuration.service'; + +describe('ConfigurationService', () => { + let service: ConfigurationService; + + process.env.NODE_ENV = 'local'; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + providers: [ConfigurationService], + }).compile(); + + service = module.get<ConfigurationService>(ConfigurationService); + }); + + describe('initialisation', () => { + const OLD_ENV = process.env; + beforeEach(async () => { + jest.resetModules(); // Most important - it clears the cache + process.env = { ...OLD_ENV }; // Make a copy + process.env.NODE_ENV = 'dev'; + }); + + afterAll(() => { + process.env = OLD_ENV; // Restore old environment + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + it('should init with dev conf', () => { + process.env.NODE_ENV = 'dev'; + expect(service.config.host).toBe('resin-dev.grandlyon.com'); + }); + }); + + describe('initialisation production', () => { + const OLD_ENV = process.env; + beforeEach(async () => { + jest.resetModules(); // Most important - it clears the cache + process.env = { ...OLD_ENV }; // Make a copy + process.env.NODE_ENV = 'production'; + }); + + afterAll(() => { + process.env = OLD_ENV; // Restore old environment + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + it('should init with prod conf', () => { + process.env.NODE_ENV = 'production'; + expect(service.config.host).toBe('resin.grandlyon.com'); + }); + }); + + describe('validateUser', () => { + it('should be local conf', () => { + process.env.NODE_ENV = 'local'; + expect(service.isLocalConf()).toBe(true); + }); + }); + + describe('get config', () => { + it('should get config', () => { + const config = service.config; + expect(Object.keys(config).length).toBe(9); + expect(Object.keys(config)).toEqual( + expect.arrayContaining([ + 'url', + 'token', + 'host', + 'protocol', + 'port', + 'from', + 'from_name', + 'replyTo', + 'templates', + ]) + ); + }); + }); +}); diff --git a/src/configuration/configuration.service.ts b/src/configuration/configuration.service.ts index ca6f9e6c44a78e2259c3b3e70c8a5168d3d30d95..e7a723f37c9985d4b24bc4a3b0070dce363a1fb6 100644 --- a/src/configuration/configuration.service.ts +++ b/src/configuration/configuration.service.ts @@ -18,11 +18,14 @@ export class ConfigurationService { Logger.log('App started with dev conf', 'ConfigurationService'); } else { this._config = config; - Logger.log('App started with local conf', 'ConfigurationService'); } dotenv.config(); } + public isLocalConf(): boolean { + return process.env.NODE_ENV === 'local'; + } + get config() { return this._config; } diff --git a/src/mailer/mail-templates/adminStructureClaim.ejs b/src/mailer/mail-templates/adminStructureClaim.ejs index 8eff0993341c0655469c5cd2dfbe1aa50a9180ff..1e7e162f39e671fdf5d6beb2e1765a7d284e37e5 100644 --- a/src/mailer/mail-templates/adminStructureClaim.ejs +++ b/src/mailer/mail-templates/adminStructureClaim.ejs @@ -1,4 +1,4 @@ -Bonjour<br /> +Bonjour,<br /> <br /> Une nouvelle structure a été revendiquée. Pour valider ou refuser la demande, merci de vous rendre sur <a href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/admin">ce lien</a>. diff --git a/src/mailer/mail-templates/adminStructureCreate.ejs b/src/mailer/mail-templates/adminStructureCreate.ejs new file mode 100644 index 0000000000000000000000000000000000000000..0fa351673b20ec097f09119ed1aefb97c9746382 --- /dev/null +++ b/src/mailer/mail-templates/adminStructureCreate.ejs @@ -0,0 +1,9 @@ +Bonjour,<br /> +<br /> +Une nouvelle structure a été créée: +<a href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/acteurs?id=<%= id %>" + ><strong><%= structureName %></strong></a +> +<br /> +Il est possible que la structure ne soit pas immédiatement visible sur la carto. L'utilisateur doit valider son compte +pour que celle-ci soit visible. diff --git a/src/mailer/mail-templates/adminStructureCreate.json b/src/mailer/mail-templates/adminStructureCreate.json new file mode 100644 index 0000000000000000000000000000000000000000..6411161d61c43167af972468e272bc69847c581a --- /dev/null +++ b/src/mailer/mail-templates/adminStructureCreate.json @@ -0,0 +1,3 @@ +{ + "subject": "Nouvelle structure" +} diff --git a/src/mailer/mail-templates/apticStructureDuplication.ejs b/src/mailer/mail-templates/apticStructureDuplication.ejs index 53d99ec48ecccb22849a867d2579fac919ec78f9..0b30ee72bff6faf595b43702914c0e7bb204b269 100644 --- a/src/mailer/mail-templates/apticStructureDuplication.ejs +++ b/src/mailer/mail-templates/apticStructureDuplication.ejs @@ -1,4 +1,4 @@ Bonjour,<br /> <br /> La fiche structure: <strong><%= name %></strong> a été créée après récupération des données aptic. Elle correspond -potientiellement a la structure existante : <strong><%= duplicatedStructureName %></strong>. +potientiellement à la structure existante : <strong><%= duplicatedStructureName %></strong>. diff --git a/src/mailer/mail-templates/resetPassword.ejs b/src/mailer/mail-templates/resetPassword.ejs index cf29cee55cd7ee9881479fef67ac49eaf27d1a7d..233966c0e062c056cb73c5afcbdd2461448c941b 100644 --- a/src/mailer/mail-templates/resetPassword.ejs +++ b/src/mailer/mail-templates/resetPassword.ejs @@ -1,4 +1,4 @@ -Bonjour<br /> +Bonjour,<br /> <br /> Vous avez demandé une réinitialisation de votre mot de passe pour le <em>Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon</em>. Pour changer de mot de passe, merci de @@ -7,4 +7,4 @@ cliquer sur le lien suivant : href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/reset-password?token=<%= token %>" >ce lien</a ><br /> -Si vous n'avez pas demander de réinitiallisation de votre mot de passe, merci d'ignorer cet email. +Si vous n'avez pas demandé de réinitiallisation de votre mot de passe, merci d'ignorer cet email. diff --git a/src/mailer/mail-templates/structureClaimValidation.ejs b/src/mailer/mail-templates/structureClaimValidation.ejs index 9e04b8973bf0a6fea16782f07e4537bf65369314..63622c87def5631e1568e59dd550d4cb969b8c88 100644 --- a/src/mailer/mail-templates/structureClaimValidation.ejs +++ b/src/mailer/mail-templates/structureClaimValidation.ejs @@ -1,11 +1,11 @@ -Bonjour<br /> +Bonjour,<br /> <br /> -La demande de rattachement de votre compte a la structure <strong><%= name %></strong> a été +La demande de rattachement de votre compte à la structure <strong><%= name %></strong> a été <strong><%= status %></strong>. <%if (status === 'refusée') { %> <p> - Vous considérer qu’une erreur a été commise, vous pouvez les contacter les administrateurs à l’adresse - <a href="mailto:inclusionnumerique@grandlyon.com">inclusionnumerique@grandlyon.com</a> + Vous considérez qu’une erreur a été commise, vous pouvez contacter les administrateurs à l’adresse + <a href="mailto:inclusionnumerique@grandlyon.com">inclusionnumerique@grandlyon.com</a>. </p> <% } else{ %> -<p>Vous pouvez dorénavant mettre à jour la fiche de votre structure</p> +<p>Vous pouvez dorénavant mettre à jour la fiche de votre structure.</p> <% } %> diff --git a/src/mailer/mail-templates/structureDeletionNotification.ejs b/src/mailer/mail-templates/structureDeletionNotification.ejs new file mode 100644 index 0000000000000000000000000000000000000000..0ea05b23462a8b189f4e73d923945c27f165fa94 --- /dev/null +++ b/src/mailer/mail-templates/structureDeletionNotification.ejs @@ -0,0 +1,3 @@ +Bonjour,<br /> +<br /> +Un utilisateur a supprimé la fiche de sa structure (<%= structureName %>). diff --git a/src/mailer/mail-templates/structureDeletionNotification.json b/src/mailer/mail-templates/structureDeletionNotification.json new file mode 100644 index 0000000000000000000000000000000000000000..3fabb0edbd05f73e363f5f035dafd55614d4a33f --- /dev/null +++ b/src/mailer/mail-templates/structureDeletionNotification.json @@ -0,0 +1,3 @@ +{ + "subject": "Une structure à été supprimé de Res'in, Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon" +} diff --git a/src/mailer/mail-templates/structureErrorReport.ejs b/src/mailer/mail-templates/structureErrorReport.ejs new file mode 100644 index 0000000000000000000000000000000000000000..18b32cd0ab99a7fcf5246656f1b19bd2a4121727 --- /dev/null +++ b/src/mailer/mail-templates/structureErrorReport.ejs @@ -0,0 +1,11 @@ +Bonjour,<br /> +<br /> +Un utilisateur de Res'in a relevé une erreur sur la fiche de votre structure (<%= structureName %>). +<br /> +Voici le message:<br /> +<br /> +<strong><%= content %></strong><br /> +<br /> +<a href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/acteurs?id=<%= id %>" + >Acceder à votre structure</a +>. diff --git a/src/mailer/mail-templates/structureErrorReport.json b/src/mailer/mail-templates/structureErrorReport.json new file mode 100644 index 0000000000000000000000000000000000000000..3faeacf33799d9891558bedba0a2771ef7344782 --- /dev/null +++ b/src/mailer/mail-templates/structureErrorReport.json @@ -0,0 +1,3 @@ +{ + "subject": "Une erreur a été remontée sur votre structure, Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon" +} diff --git a/src/mailer/mail-templates/structureJoinRequest.ejs b/src/mailer/mail-templates/structureJoinRequest.ejs index e668707556f5e096aa2a84028bbf179612091f52..cdfbb3c341198a71bc97947a5d59aaef20e0cdf9 100644 --- a/src/mailer/mail-templates/structureJoinRequest.ejs +++ b/src/mailer/mail-templates/structureJoinRequest.ejs @@ -1,6 +1,6 @@ -Bonjour<br /> +Bonjour,<br /> <br /> -Vous recevez ce message car <strong><%= surname %></strong> <strong><%= name %></strong> demande a rejoindre votre +Vous recevez ce message car <strong><%= surname %></strong> <strong><%= name %></strong> demande à rejoindre votre stucture <strong><%= structureName %></strong> sur RES'in, le réseau des acteurs de l'inclusion numérique de la Métropole de Lyon. Vous pouvez dès maintenant valider la demande en <a diff --git a/src/mailer/mail-templates/structureModificationNotification.ejs b/src/mailer/mail-templates/structureModificationNotification.ejs new file mode 100644 index 0000000000000000000000000000000000000000..6a055cd4595dc21c7546a30d0a0f791bb5b41f1a --- /dev/null +++ b/src/mailer/mail-templates/structureModificationNotification.ejs @@ -0,0 +1,7 @@ +Bonjour,<br /> +<br /> +Un utilisateur a modifié une ou plusieurs informations sur la fiche de sa structure (<%= structureName %>). +<br /> +<a href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/acteurs?id=<%= id %>" + >Acceder à cette structure</a +>. diff --git a/src/mailer/mail-templates/structureModificationNotification.json b/src/mailer/mail-templates/structureModificationNotification.json new file mode 100644 index 0000000000000000000000000000000000000000..516a30844c6f178ee77134da581d1b44786b6548 --- /dev/null +++ b/src/mailer/mail-templates/structureModificationNotification.json @@ -0,0 +1,3 @@ +{ + "subject": "Une fiche de structure à été mise à jour, Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon" +} diff --git a/src/mailer/mail-templates/structureOutdatedInfo.ejs b/src/mailer/mail-templates/structureOutdatedInfo.ejs index 589ec35605915f4ffb5a62ce3a6d5c7827d1064f..a5caf60e0c7cff65131144da363bfb58bcfecc38 100644 --- a/src/mailer/mail-templates/structureOutdatedInfo.ejs +++ b/src/mailer/mail-templates/structureOutdatedInfo.ejs @@ -1,8 +1,8 @@ -Bonjour<br /> +Bonjour,<br /> <br /> -Vous recevez ce message, parce que votre structure <strong><%= name %></strong> est référencée sur RES'in, le réseau des +Vous recevez ce message car votre structure <strong><%= name %></strong> est référencée sur RES'in, le réseau des acteurs de l'inclusion numérique de la Métropole de Lyon. Pouvez-vous nous aider en vérifiant que vos données sont bien à jour en -<a href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/home?id=<%= id %>" +<a href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/acteurs?id=<%= id %>" >cliquant ici</a >. diff --git a/src/mailer/mail-templates/tempUserRegistration.ejs b/src/mailer/mail-templates/tempUserRegistration.ejs index fb336b0625aa83309199cd5f791f6f4037db87d4..59e46a0b6678dae30977d9ca44dd514052a00526 100644 --- a/src/mailer/mail-templates/tempUserRegistration.ejs +++ b/src/mailer/mail-templates/tempUserRegistration.ejs @@ -1,6 +1,6 @@ -Bonjour<br /> +Bonjour,<br /> <br /> -Vous recevez ce message car vous avez été relié a la stucture <strong><%= name %></strong> sur RES'in, le réseau des +Vous recevez ce message car vous avez été relié à la stucture <strong><%= name %></strong> sur RES'in, le réseau des acteurs de l'inclusion numérique de la Métropole de Lyon. Vous pouvez dès maitenant vous créer un compte sur la plateforme pour accéder a votre structure en <a href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/register?id=<%= id %>" diff --git a/src/mailer/mail-templates/verify.ejs b/src/mailer/mail-templates/verify.ejs index 4f2780e183b6d598a6c94d5dc8ad463abe9bf06f..c2c57e73b624c9915da4af8680e1a3bcb4afba82 100644 --- a/src/mailer/mail-templates/verify.ejs +++ b/src/mailer/mail-templates/verify.ejs @@ -1,8 +1,8 @@ -Bonjour<br /> +Bonjour,<br /> <br /> Afin de pouvoir vous connecter sur la plateforme, merci de cliquer sur <a href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/users/verify/<%= userId %>?token=<%= token %>" >ce lien</a > -afin de valider votre inscription<br /> +pour valider votre inscription.<br /> diff --git a/src/mailer/mailer.service.spec.ts b/src/mailer/mailer.service.spec.ts index 086056cab0a7d8efe90a3fde1e61ac0b833e84ee..f3e369fba79fd3b542e6d4e5865b05db6103e402 100644 --- a/src/mailer/mailer.service.spec.ts +++ b/src/mailer/mailer.service.spec.ts @@ -1,10 +1,15 @@ -import { HttpModule } from '@nestjs/common'; +import { HttpModule, HttpService } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; +import { of, throwError } from 'rxjs'; +import { AxiosResponse } from 'axios'; import { ConfigurationService } from '../configuration/configuration.service'; import { MailerService } from './mailer.service'; +import * as fs from 'fs'; +import * as path from 'path'; describe('MailerService', () => { let service: MailerService; + let httpService: HttpService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ @@ -13,9 +18,104 @@ describe('MailerService', () => { }).compile(); service = module.get<MailerService>(MailerService); + httpService = module.get<HttpService>(HttpService); }); it('should be defined', () => { expect(service).toBeDefined(); }); + + describe('email sending', () => { + it('should send email', async () => { + const result: AxiosResponse = { + data: { + status: 200, + content: { + success: true, + response: [7010], + }, + }, + status: 200, + statusText: 'OK', + headers: {}, + config: {}, + }; + jest.spyOn(httpService, 'post').mockImplementationOnce(() => of(result)); + expect(await service.send('a@a.com', 'test', '<p>This is a test</p>')).toBe(result); + }); + + it('should not send email', async () => { + const result: AxiosResponse = { + data: { + errors: ['Subject cannot be blank'], + detail: 'There was a validation error', + status: 400, + type: 'validation_error', + title: 'There was a validation error', + }, + status: 400, + statusText: 'KO', + headers: {}, + config: {}, + }; + jest.spyOn(httpService, 'post').mockImplementationOnce(() => throwError(result)); + try { + await service.send('a@a.com', 'test', '<p>This is a test</p>'); + } catch (e) { + expect(e.data.detail).toBe('There was a validation error'); + expect(e.status).toBe(400); + } + }); + }); + + describe('template location', () => { + it('should get template location', async () => { + jest.spyOn(path, 'join').mockImplementationOnce(() => '/path/to/template'); + jest.spyOn(fs, 'existsSync').mockImplementationOnce(() => true); + expect(service.getTemplateLocation('filename')).toBe('/path/to/template'); + }); + + it('should not get template location', async () => { + const filename = 'templateFile'; + jest.spyOn(path, 'join').mockImplementationOnce(() => '/path/to/filename'); + jest.spyOn(fs, 'existsSync').mockImplementationOnce(() => false); + try { + expect(service.getTemplateLocation(filename)).toBe('/path/to/template'); + } catch (e) { + expect(e.message).toBe(`Email template '${filename}' cannot be found in ./src/mailer/mail-templates`); + } + }); + }); + + describe('json config', () => { + it('should get template location', async () => { + jest.spyOn(path, 'join').mockImplementationOnce(() => '/path/to/template'); + jest.spyOn(fs, 'existsSync').mockImplementationOnce(() => true); + const data = { test: 'test value', value: 'this is the value' }; + const buf = Buffer.from(JSON.stringify(data), 'utf8'); + jest.spyOn(fs, 'readFileSync').mockImplementationOnce(() => buf); + jest.spyOn(JSON, 'parse').mockImplementationOnce(() => JSON.stringify(data)); + expect(service.loadJsonConfig('filename')).toStrictEqual(JSON.stringify(data)); + }); + + it('should not get template location', async () => { + const filename = 'templateFile'; + jest.spyOn(path, 'join').mockImplementationOnce(() => '/path/to/filename'); + jest.spyOn(fs, 'existsSync').mockImplementationOnce(() => false); + try { + expect(service.loadJsonConfig(filename)).toBe('/path/to/template'); + } catch (e) { + expect(e.message).toBe( + `Email json definition file '${filename}' cannot be found in ./src/mailer/mail-templates` + ); + } + }); + }); + + it('should add signature', async () => { + const test = '<p>test email</p>'; + expect(service.addSignature(test)).toBe( + '<p>test email</p><br /><br /><p>L’équipe projet inclusion numérique.</p><img src="http://localhost:4200/assets/logos/resin.jpg" alt="Logo resin" width="168" height="58"><br /><br /><p>Ce mail est automatique. Merci de ne pas y répondre.</p>' + ); + }); }); diff --git a/src/mailer/mailer.service.ts b/src/mailer/mailer.service.ts index 0650bc48c0255866d15f86ed725254b665ad01bf..2914fd1383297e0f862b4405020ca8ed4b61e903 100644 --- a/src/mailer/mailer.service.ts +++ b/src/mailer/mailer.service.ts @@ -21,15 +21,15 @@ export class MailerService { * @param {string} html * @param {string} text */ - public async send(to: string, subject: string, html: string): Promise<AxiosResponse<any>> { + public async send(to: string | { email: string }[], subject: string, html: string): Promise<AxiosResponse<any>> { + const emailsToSend = typeof to === 'string' ? [{ email: to }] : to; const formData = new FormData(); - const data = JSON.stringify({ // eslint-disable-next-line camelcase from_email: this.config.from, // eslint-disable-next-line camelcase from_name: this.config.from_name, - to: [{ email: to }], + to: emailsToSend, reply_to: 'inclusionnumerique@grandlyon.com', subject: subject, content: this.addSignature(html), @@ -71,6 +71,7 @@ export class MailerService { } return ejsPath; } + /** * Load email json config file from config directory and given filename. Also, check if file exists * diff --git a/src/migrations/migrations-utils/db.ts b/src/migrations/migrations-utils/db.ts new file mode 100644 index 0000000000000000000000000000000000000000..4a5284a096c12204c8e3d1b9e3b5b620729d0092 --- /dev/null +++ b/src/migrations/migrations-utils/db.ts @@ -0,0 +1,11 @@ +import { MongoClient } from 'mongodb'; +import { config } from 'dotenv'; + +export const getDb = async () => { + config(); // Required for reading .env + const client: MongoClient = await MongoClient.connect( + `mongodb://${process.env.MONGO_NON_ROOT_USERNAME}:${process.env.MONGO_NON_ROOT_PASSWORD}@${process.env.MONGO_DB_HOST_AND_PORT}/ram`, + { useUnifiedTopology: true } + ); + return client.db(); +}; diff --git a/src/migrations/migrations-utils/template.ts b/src/migrations/migrations-utils/template.ts new file mode 100644 index 0000000000000000000000000000000000000000..d3f00960db09db7b37081642dadc328fa876ce13 --- /dev/null +++ b/src/migrations/migrations-utils/template.ts @@ -0,0 +1,13 @@ +import { Db } from 'mongodb'; +import { getDb } from '../migrations-utils/db'; + +export const up = async () => { + const db: Db = await getDb(); +}; + +export const down = async () => { + const db: Db = await getDb(); + /* + Code you downgrade script here! + */ +}; diff --git a/src/migrations/migrations-utils/ts-compiler.js b/src/migrations/migrations-utils/ts-compiler.js new file mode 100644 index 0000000000000000000000000000000000000000..1424f7e7c44aef954e45570d48ac921490e0f583 --- /dev/null +++ b/src/migrations/migrations-utils/ts-compiler.js @@ -0,0 +1,3 @@ +// eslint-disable-next-line @typescript-eslint/no-var-requires +const tsNode = require('ts-node'); +module.exports = tsNode.register; diff --git a/src/migrations/scripts/1617284203579-apticid.ts b/src/migrations/scripts/1617284203579-apticid.ts new file mode 100644 index 0000000000000000000000000000000000000000..b7d5efcf3f43e4000ae6805540ed185073f392df --- /dev/null +++ b/src/migrations/scripts/1617284203579-apticid.ts @@ -0,0 +1,394 @@ +import { getDb } from '../migrations-utils/db'; + +class ApticModule { + id: string; + display_id: string; + display_name: string; + url: string; + last_update_time: string; + receipt_time: string; +} + +class ApticDoc { + id: string; + modules: ApticModule[]; +} + +export const up = async () => { + const db = await getDb(); + await updateStructuresId(db); + await updateApticReferential(db); +}; + +export const down = async () => { + const db = await getDb(); + await downgradeApticReferential(db); + await downgradeStructuresId(db); +}; + +async function downgradeStructuresId(db) { + await db + .collection('structures') + .find({}) + .forEach((doc) => { + const newDoc = downgradeStructure(doc); + db.collection('structures').updateMany({ _id: doc._id }, [{ $set: newDoc }]); + }); +} + +async function updateStructuresId(db) { + await db + .collection('structures') + .find({}) + .forEach((doc) => { + const newDoc = updateStructure(doc); + db.collection('structures').updateMany({ _id: doc._id }, [{ $set: newDoc }]); + }); +} + +function updateStructure(structure): any { + let newArray = []; + // Social and professional + newArray.push(switchStructureId(structure.socialAndProfessional, '254', '6')); + newArray.push(switchStructureId(structure.socialAndProfessional, '240', '20')); + newArray.push(switchStructureId(structure.socialAndProfessional, '194', '66')); + newArray.push(switchStructureId(structure.socialAndProfessional, '193', '67')); + newArray.push(switchStructureId(structure.socialAndProfessional, '192', '68')); + newArray.push(switchStructureId(structure.socialAndProfessional, '191', '69')); + newArray.push(switchStructureId(structure.socialAndProfessional, '262', '124')); + newArray.push(switchStructureId(structure.socialAndProfessional, '263', '125')); + newArray.push(switchStructureId(structure.socialAndProfessional, '003', '127')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.socialAndProfessional = newArray; + + // Base Skills + newArray = []; + newArray.push(switchStructureId(structure.baseSkills, '260', '260')); //TODO: + newArray.push(switchStructureId(structure.baseSkills, '259', '1')); + newArray.push(switchStructureId(structure.baseSkills, '261', '11')); + newArray.push(switchStructureId(structure.baseSkills, '222', '38')); + newArray.push(switchStructureId(structure.baseSkills, '212', '48')); + newArray.push(switchStructureId(structure.baseSkills, '186', '74')); + newArray.push(switchStructureId(structure.baseSkills, '183', '77')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.baseSkills = newArray; + + // Access Right + newArray = []; + newArray.push(switchStructureId(structure.accessRight, '176', '84')); + newArray.push(switchStructureId(structure.accessRight, '175', '85')); + newArray.push(switchStructureId(structure.accessRight, '174', '86')); + newArray.push(switchStructureId(structure.accessRight, '173', '87')); + newArray.push(switchStructureId(structure.accessRight, '172', '88')); + newArray.push(switchStructureId(structure.accessRight, '171', '89')); + newArray.push(switchStructureId(structure.accessRight, '167', '93')); + newArray.push(switchStructureId(structure.accessRight, '165', '95')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.accessRight = newArray; + + // Parenting + newArray = []; + newArray.push(switchStructureId(structure.parentingHelp, '257', '3')); + newArray.push(switchStructureId(structure.parentingHelp, '238', '22')); + newArray.push(switchStructureId(structure.parentingHelp, '178', '82')); + newArray.push(switchStructureId(structure.parentingHelp, '166', '94')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.parentingHelp = newArray; + + // Digital Security + newArray = []; + newArray.push(switchStructureId(structure.digitalCultureSecurity, '264', '2')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '255', '5')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '265', '9')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '232', '28')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '225', '34')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '221', '39')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '218', '42')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '209', '51')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '208', '52')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '206', '54')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '195', '65')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '164', '96')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '163', '97')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '162', '98')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.digitalCultureSecurity = newArray; + + return structure; +} + +function downgradeStructure(structure): any { + let newArray = []; + // Social and professional + newArray.push(switchStructureId(structure.socialAndProfessional, '6', '254')); + newArray.push(switchStructureId(structure.socialAndProfessional, '20', '240')); + newArray.push(switchStructureId(structure.socialAndProfessional, '66', '194')); + newArray.push(switchStructureId(structure.socialAndProfessional, '67', '193')); + newArray.push(switchStructureId(structure.socialAndProfessional, '68', '192')); + newArray.push(switchStructureId(structure.socialAndProfessional, '69', '191')); + newArray.push(switchStructureId(structure.socialAndProfessional, '124', '262')); + newArray.push(switchStructureId(structure.socialAndProfessional, '125', '263')); + newArray.push(switchStructureId(structure.socialAndProfessional, '127', '003')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.socialAndProfessional = newArray; + + // Base Skills + newArray = []; + newArray.push(switchStructureId(structure.baseSkills, '260', '260')); + newArray.push(switchStructureId(structure.baseSkills, '1', '259')); + newArray.push(switchStructureId(structure.baseSkills, '11', '261')); + newArray.push(switchStructureId(structure.baseSkills, '38', '222')); + newArray.push(switchStructureId(structure.baseSkills, '48', '212')); + newArray.push(switchStructureId(structure.baseSkills, '74', '186')); + newArray.push(switchStructureId(structure.baseSkills, '77', '183')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.baseSkills = newArray; + + // Access Right + newArray = []; + newArray.push(switchStructureId(structure.accessRight, '84', '176')); + newArray.push(switchStructureId(structure.accessRight, '85', '175')); + newArray.push(switchStructureId(structure.accessRight, '86', '174')); + newArray.push(switchStructureId(structure.accessRight, '87', '173')); + newArray.push(switchStructureId(structure.accessRight, '88', '172')); + newArray.push(switchStructureId(structure.accessRight, '89', '171')); + newArray.push(switchStructureId(structure.accessRight, '93', '167')); + newArray.push(switchStructureId(structure.accessRight, '95', '165')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.accessRight = newArray; + + // Parenting + newArray = []; + newArray.push(switchStructureId(structure.parentingHelp, '3', '257')); + newArray.push(switchStructureId(structure.parentingHelp, '22', '238')); + newArray.push(switchStructureId(structure.parentingHelp, '82', '178')); + newArray.push(switchStructureId(structure.parentingHelp, '94', '166')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.parentingHelp = newArray; + + // Digital Security + newArray = []; + newArray.push(switchStructureId(structure.digitalCultureSecurity, '2', '264')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '5', '255')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '9', '265')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '28', '232')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '34', '225')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '39', '221')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '42', '218')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '51', '209')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '52', '208')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '54', '206')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '65', '195')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '96', '164')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '97', '163')); + newArray.push(switchStructureId(structure.digitalCultureSecurity, '98', '162')); + // Remove null cases + newArray = newArray.filter((obj) => obj); + structure.digitalCultureSecurity = newArray; + + return structure; +} + +async function updateApticReferential(db) { + // Base Skills + let newModule = { modules: [] }; + const baseSkills: ApticDoc = await db.collection('categoriesformations').findOne({ id: 'baseSkills' }); + newModule.modules.push(switchId(baseSkills.modules, '260', '260')); + newModule.modules.push(switchId(baseSkills.modules, '259', '1')); + newModule.modules.push(switchId(baseSkills.modules, '261', '11')); + newModule.modules.push(switchId(baseSkills.modules, '222', '38')); + newModule.modules.push(switchId(baseSkills.modules, '212', '48')); + newModule.modules.push(switchId(baseSkills.modules, '186', '74')); + newModule.modules.push(switchId(baseSkills.modules, '183', '77')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'baseSkills' }, + { $set: { modules: newModule.modules } } + ); + + // Access Right + newModule = { modules: [] }; + const accessRight: ApticDoc = await db.collection('categoriesformations').findOne({ id: 'accessRight' }); + newModule.modules.push(switchId(accessRight.modules, '176', '84')); + newModule.modules.push(switchId(accessRight.modules, '175', '85')); + newModule.modules.push(switchId(accessRight.modules, '174', '86')); + newModule.modules.push(switchId(accessRight.modules, '173', '87')); + newModule.modules.push(switchId(accessRight.modules, '172', '88')); + newModule.modules.push(switchId(accessRight.modules, '171', '89')); + newModule.modules.push(switchId(accessRight.modules, '167', '93')); + newModule.modules.push(switchId(accessRight.modules, '165', '95')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'accessRight' }, + { $set: { modules: newModule.modules } } + ); + + // Parenting + newModule = { modules: [] }; + const parentingHelp: ApticDoc = await db.collection('categoriesformations').findOne({ id: 'parentingHelp' }); + newModule.modules.push(switchId(parentingHelp.modules, '257', '3')); + newModule.modules.push(switchId(parentingHelp.modules, '238', '22')); + newModule.modules.push(switchId(parentingHelp.modules, '178', '82')); + newModule.modules.push(switchId(parentingHelp.modules, '166', '94')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'parentingHelp' }, + { $set: { modules: newModule.modules } } + ); + + // Social and professional + newModule = { modules: [] }; + const socialAndProfessional: ApticDoc = await db + .collection('categoriesformations') + .findOne({ id: 'socialAndProfessional' }); + newModule.modules.push(switchId(socialAndProfessional.modules, '254', '6')); + newModule.modules.push(switchId(socialAndProfessional.modules, '240', '20')); + newModule.modules.push(switchId(socialAndProfessional.modules, '194', '66')); + newModule.modules.push(switchId(socialAndProfessional.modules, '193', '67')); + newModule.modules.push(switchId(socialAndProfessional.modules, '192', '68')); + newModule.modules.push(switchId(socialAndProfessional.modules, '191', '69')); + newModule.modules.push(switchId(socialAndProfessional.modules, '262', '124')); + newModule.modules.push(switchId(socialAndProfessional.modules, '263', '125')); + newModule.modules.push(switchId(socialAndProfessional.modules, '003', '127')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'socialAndProfessional' }, + { $set: { modules: newModule.modules } } + ); + + // Digital security + newModule = { modules: [] }; + const digitalCultureSecurity: ApticDoc = await db + .collection('categoriesformations') + .findOne({ id: 'digitalCultureSecurity' }); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '264', '2')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '255', '5')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '265', '9')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '232', '28')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '225', '34')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '221', '39')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '218', '42')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '209', '51')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '208', '52')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '206', '54')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '195', '65')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '164', '96')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '163', '97')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '162', '98')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'digitalCultureSecurity' }, + { $set: { modules: newModule.modules } } + ); +} + +async function downgradeApticReferential(db) { + // Base Skills + let newModule = { modules: [] }; + const baseSkills: ApticDoc = await db.collection('categoriesformations').findOne({ id: 'baseSkills' }); + newModule.modules.push(switchId(baseSkills.modules, '260', '260')); //TODO: + newModule.modules.push(switchId(baseSkills.modules, '1', '259')); + newModule.modules.push(switchId(baseSkills.modules, '11', '261')); + newModule.modules.push(switchId(baseSkills.modules, '38', '222')); + newModule.modules.push(switchId(baseSkills.modules, '48', '212')); + newModule.modules.push(switchId(baseSkills.modules, '74', '186')); + newModule.modules.push(switchId(baseSkills.modules, '77', '183')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'baseSkills' }, + { $set: { modules: newModule.modules } } + ); + + // Access Right + newModule = { modules: [] }; + const accessRight: ApticDoc = await db.collection('categoriesformations').findOne({ id: 'accessRight' }); + newModule.modules.push(switchId(accessRight.modules, '84', '176')); + newModule.modules.push(switchId(accessRight.modules, '85', '175')); + newModule.modules.push(switchId(accessRight.modules, '86', '174')); + newModule.modules.push(switchId(accessRight.modules, '87', '173')); + newModule.modules.push(switchId(accessRight.modules, '88', '172')); + newModule.modules.push(switchId(accessRight.modules, '89', '171')); + newModule.modules.push(switchId(accessRight.modules, '93', '167')); + newModule.modules.push(switchId(accessRight.modules, '95', '165')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'accessRight' }, + { $set: { modules: newModule.modules } } + ); + + // Parenting + newModule = { modules: [] }; + const parentingHelp: ApticDoc = await db.collection('categoriesformations').findOne({ id: 'parentingHelp' }); + newModule.modules.push(switchId(parentingHelp.modules, '3', '257')); + newModule.modules.push(switchId(parentingHelp.modules, '22', '238')); + newModule.modules.push(switchId(parentingHelp.modules, '82', '178')); + newModule.modules.push(switchId(parentingHelp.modules, '94', '166')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'parentingHelp' }, + { $set: { modules: newModule.modules } } + ); + + // Social and professional + newModule = { modules: [] }; + const socialAndProfessional: ApticDoc = await db + .collection('categoriesformations') + .findOne({ id: 'socialAndProfessional' }); + newModule.modules.push(switchId(socialAndProfessional.modules, '6', '254')); + newModule.modules.push(switchId(socialAndProfessional.modules, '20', '240')); + newModule.modules.push(switchId(socialAndProfessional.modules, '66', '194')); + newModule.modules.push(switchId(socialAndProfessional.modules, '67', '193')); + newModule.modules.push(switchId(socialAndProfessional.modules, '68', '192')); + newModule.modules.push(switchId(socialAndProfessional.modules, '69', '191')); + newModule.modules.push(switchId(socialAndProfessional.modules, '124', '262')); + newModule.modules.push(switchId(socialAndProfessional.modules, '125', '263')); + newModule.modules.push(switchId(socialAndProfessional.modules, '127', '003')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'socialAndProfessional' }, + { $set: { modules: newModule.modules } } + ); + + // Digital security + newModule = { modules: [] }; + const digitalCultureSecurity: ApticDoc = await db + .collection('categoriesformations') + .findOne({ id: 'digitalCultureSecurity' }); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '2', '264')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '5', '255')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '9', '265')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '28', '232')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '34', '225')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '39', '221')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '42', '218')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '51', '209')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '52', '208')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '54', '206')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '65', '195')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '96', '164')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '97', '163')); + newModule.modules.push(switchId(digitalCultureSecurity.modules, '98', '162')); + db.collection('categoriesformations').findOneAndUpdate( + { id: 'digitalCultureSecurity' }, + { $set: { modules: newModule.modules } } + ); +} + +function switchStructureId(moduleArray: [], originalId: string, newId: string): string { + const module = moduleArray.find((id) => id === originalId); + if (module) { + return newId; + } + return null; +} + +function switchId(moduleArray: ApticModule[], originalId: string, newId: string): ApticModule { + const module = moduleArray.find((skill) => skill.id === originalId); + module.id = newId; + module.display_id = newId; + module.display_name = `Modules APTIC - n°${newId}`; + delete module.receipt_time; + delete module.last_update_time; + delete module.url; + return module; +} diff --git a/src/migrations/scripts/1618322296327-clean-data.ts b/src/migrations/scripts/1618322296327-clean-data.ts new file mode 100644 index 0000000000000000000000000000000000000000..03afdd82c811aefcbae834a4f84a3ed7e083a590 --- /dev/null +++ b/src/migrations/scripts/1618322296327-clean-data.ts @@ -0,0 +1,90 @@ +import { Db } from 'mongodb'; +import { getDb } from '../migrations-utils/db'; + +export const up = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('structures').find({}); + let document; + while ((document = await cursor.next())) { + const newDoc = updateStructure(document); + await db + .collection('structures') + .updateOne({ _id: document._id }, [ + { $set: newDoc }, + { $unset: ['equipmentsDetails', 'nomDeLusager', 'statutJuridique', 'documentsMeeting'] }, + ]); + } + console.log(`Update done`); +}; + +export const down = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('structures').find({}); + let document; + while ((document = await cursor.next())) { + const newDoc = downgradeStructure(document); + await db.collection('structures').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + console.log(`Update done`); +}; + +function updateStructure(doc) { + return updateHours(doc); +} + +function downgradeStructure(doc) { + doc = restoreHours(doc); + return doc; +} + +function updateHours(doc) { + if (doc.hours) { + Object.keys(doc.hours).forEach((key) => { + if (doc.hours[key].time.length > 0) { + doc.hours[key].time.forEach((timeRange) => { + timeRange.openning = formatHours(timeRange.openning); + timeRange.closing = formatHours(timeRange.closing); + }); + } + }); + return doc; + } else { + console.warn(`No hours on doc ${doc._id}`); + return doc; + } +} + +function restoreHours(doc) { + if (doc.hours) { + Object.keys(doc.hours).forEach((key) => { + if (doc.hours[key].time.length > 0) { + doc.hours[key].time.forEach((timeRange) => { + timeRange.openning = formatBackHours(timeRange.openning); + timeRange.closing = formatBackHours(timeRange.closing); + }); + } + }); + return doc; + } else { + console.warn(`No hours on doc ${doc._id}`); + return doc; + } +} + +function formatHours(hour): string { + const stringifiedHour = hour.toString(); + if (stringifiedHour.length === 3) { + // 930 + return stringifiedHour.slice(0, 1) + ':' + stringifiedHour.slice(1, 3); + } else if (stringifiedHour.length === 4) { + // 1200 + return stringifiedHour.slice(0, 2) + ':' + stringifiedHour.slice(2, 4); + } +} + +function formatBackHours(hour): number { + const splitedHour = hour.split(':'); + return parseInt(''.concat(...splitedHour), 10); +} diff --git a/src/migrations/scripts/1620229047628-opening-hours.ts b/src/migrations/scripts/1620229047628-opening-hours.ts new file mode 100644 index 0000000000000000000000000000000000000000..69c65461eaf66c60ef1444c3eeb40b154c57fb3a --- /dev/null +++ b/src/migrations/scripts/1620229047628-opening-hours.ts @@ -0,0 +1,66 @@ +import { Db } from 'mongodb'; +import { getDb } from '../migrations-utils/db'; + +export const up = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('structures').find({}); + let document; + while ((document = await cursor.next())) { + const newDoc = updateStructure(document); + await db.collection('structures').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + console.log(`Update done`); +}; + +export const down = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('structures').find({}); + let document; + while ((document = await cursor.next())) { + const newDoc = downgradeStructure(document); + await db.collection('structures').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + console.log(`Update done`); +}; + +function updateStructure(doc) { + return updateHours(doc); +} + +function downgradeStructure(doc) { + return restoreHours(doc); +} + +function updateHours(doc) { + if (doc.hours) { + Object.keys(doc.hours).forEach((key) => { + doc.hours[key].time.forEach((timeRange) => { + timeRange.opening = timeRange.openning; + delete timeRange.openning; + }); + }); + return doc; + } else { + console.warn(`No hours on doc ${doc._id}`); + return doc; + } +} + +function restoreHours(doc) { + if (doc.hours) { + Object.keys(doc.hours).forEach((key) => { + if (doc.hours[key].time.length > 0) { + doc.hours[key].time.forEach((timeRange) => { + timeRange.openning = timeRange.opening; + delete timeRange.opening; + }); + } + }); + return doc; + } else { + console.warn(`No hours on doc ${doc._id}`); + return doc; + } +} diff --git a/src/migrations/scripts/1620289895495-timestamp-format.ts b/src/migrations/scripts/1620289895495-timestamp-format.ts new file mode 100644 index 0000000000000000000000000000000000000000..1abbf94695e8f3f0280bb98d2f31754383ef668f --- /dev/null +++ b/src/migrations/scripts/1620289895495-timestamp-format.ts @@ -0,0 +1,46 @@ +import { Db } from 'mongodb'; +import { getDb } from '../migrations-utils/db'; + +export const up = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('structures').find({}); + let document; + while ((document = await cursor.next())) { + const newDoc = updateStructure(document); + await db.collection('structures').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + console.log(`Update done`); +}; + +export const down = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('structures').find({}); + let document; + while ((document = await cursor.next())) { + const newDoc = downgradeStructure(document); + await db.collection('structures').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + console.log(`Update done`); +}; + +function updateStructure(doc) { + return updateTimestamp(doc); +} + +function downgradeStructure(doc) { + return restoreTimestamp(doc); +} + +function updateTimestamp(doc) { + doc.createdAt = new Date(doc.createdAt).toISOString(); + doc.updatedAt = new Date(doc.updatedAt).toISOString(); + return doc; +} + +function restoreTimestamp(doc) { + doc.createdAt = new Date(doc.createdAt).toString(); + doc.updatedAt = new Date(doc.updatedAt).toISOString(); + return doc; +} diff --git a/src/migrations/scripts/1620308186636-public-women.ts b/src/migrations/scripts/1620308186636-public-women.ts new file mode 100644 index 0000000000000000000000000000000000000000..5b1ccfb8b6d53abb82077937bea23801774d80a1 --- /dev/null +++ b/src/migrations/scripts/1620308186636-public-women.ts @@ -0,0 +1,59 @@ +import { Db } from 'mongodb'; +import { getDb } from '../migrations-utils/db'; + +export const up = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'publics') { + const newDoc = updatePublic(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +export const down = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'publics') { + const newDoc = downgradePublic(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +function updatePublic(doc) { + doc = addWomen(doc); + return doc; +} + +function downgradePublic(doc) { + doc = removeWomen(doc); + return doc; +} + +function removeWomen(doc) { + if (doc.modules) { + doc.modules = doc.modules.filter(function (elem) { + return elem.id != 'uniquementFemmes' && elem.id != 'women'; + }); + } + return doc; +} + +function addWomen(doc) { + if (doc.modules) { + doc.modules.push({ + id: 'uniquementFemmes', + text: 'Uniquement femmes', + }); + } + return doc; +} diff --git a/src/migrations/scripts/1621433347542-pix-label.ts b/src/migrations/scripts/1621433347542-pix-label.ts new file mode 100644 index 0000000000000000000000000000000000000000..f1823d44ef9e823374493d83d6822af508afbfd6 --- /dev/null +++ b/src/migrations/scripts/1621433347542-pix-label.ts @@ -0,0 +1,59 @@ +import { Db } from 'mongodb'; +import { getDb } from '../migrations-utils/db'; + +export const up = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'labelsQualifications') { + const newDoc = updateLabel(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +export const down = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'labelsQualifications') { + const newDoc = downgradeLabel(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +function updateLabel(doc) { + doc = addPix(doc); + return doc; +} + +function downgradeLabel(doc) { + doc = removePix(doc); + return doc; +} + +function removePix(doc) { + if (doc.modules) { + doc.modules = doc.modules.filter(function (elem) { + return elem.id != 'pix'; + }); + } + return doc; +} + +function addPix(doc) { + if (doc.modules) { + doc.modules.push({ + id: 'pix', + text: 'Évaluation des compétences numériques', + }); + } + return doc; +} diff --git a/src/migrations/scripts/1632750776916-conseillernum-label.ts b/src/migrations/scripts/1632750776916-conseillernum-label.ts new file mode 100644 index 0000000000000000000000000000000000000000..f81a13c13f7251c0b0d14a71fbe71979b419b5dc --- /dev/null +++ b/src/migrations/scripts/1632750776916-conseillernum-label.ts @@ -0,0 +1,59 @@ +import { Db } from 'mongodb'; +import { getDb } from '../migrations-utils/db'; + +export const up = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'labelsQualifications') { + const newDoc = updateLabel(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +export const down = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'labelsQualifications') { + const newDoc = downgradeLabel(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +function updateLabel(doc) { + doc = addCNFS(doc); + return doc; +} + +function downgradeLabel(doc) { + doc = removeCNFS(doc); + return doc; +} + +function removeCNFS(doc) { + if (doc.modules) { + doc.modules = doc.modules.filter(function (elem) { + return elem.id != 'conseillerNumFranceServices'; + }); + } + return doc; +} + +function addCNFS(doc) { + if (doc.modules) { + doc.modules.push({ + id: 'conseillerNumFranceServices', + text: 'Conseiller numérique France services', + }); + } + return doc; +} diff --git a/src/migrations/scripts/1639062602934-solidarity-sell-service.ts b/src/migrations/scripts/1639062602934-solidarity-sell-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..5ca327c19a617f2ff60c0c7241743df4da1ae071 --- /dev/null +++ b/src/migrations/scripts/1639062602934-solidarity-sell-service.ts @@ -0,0 +1,49 @@ +import { Db } from 'mongodb'; +import { getDb } from '../migrations-utils/db'; + +export const up = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'equipmentsAndServices') { + const newDoc = updateLabel(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +export const down = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'equipmentsAndServices') { + const newDoc = downgradeLabel(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +function updateLabel(doc) { + if (doc.modules) { + doc.modules.push({ + id: 'venteMaterielPrixSolidaire', + text: 'Vente de matériel à prix solidaire', + }); + } + return doc; +} + +function downgradeLabel(doc) { + if (doc.modules) { + doc.modules = doc.modules.filter(function (elem) { + return elem.id != 'venteMaterielPrixSolidaire'; + }); + } + return doc; +} diff --git a/src/migrations/scripts/1640169291421-france-service.ts b/src/migrations/scripts/1640169291421-france-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..09e474dfd3c1865cb6c59e8bb7b0d1aa0db95caa --- /dev/null +++ b/src/migrations/scripts/1640169291421-france-service.ts @@ -0,0 +1,48 @@ +import { Db } from 'mongodb'; +import { getDb } from '../migrations-utils/db'; + +export const up = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'labelsQualifications') { + const newDoc = updateText(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +export const down = async () => { + const db: Db = await getDb(); + + const cursor = db.collection('categoriesothers').find({}); + let document; + while ((document = await cursor.next())) { + if (document.id == 'labelsQualifications') { + const newDoc = downgradeText(document); + await db.collection('categoriesothers').updateOne({ _id: document._id }, [{ $set: newDoc }]); + } + } + console.log(`Update done`); +}; + +function updateText(doc) { + doc.modules = doc.modules.filter((elem) => elem.id !== 'maisonFranceService'); + doc.modules.push({ + id: 'maisonFranceService', + text: 'Maison France services', + }); + return doc; +} + +function downgradeText(doc) { + doc.modules = doc.modules.filter((elem) => elem.id !== 'maisonFranceService'); + doc.modules.push({ + id: 'maisonFranceService', + text: 'Maison France Service', + }); + return doc; +} diff --git a/src/newsletter/interface/newsletter-subscription.interface.ts b/src/newsletter/interface/newsletter-subscription.interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..382e0911c13768f56e091db0c420ba4df013b3fd --- /dev/null +++ b/src/newsletter/interface/newsletter-subscription.interface.ts @@ -0,0 +1,5 @@ +import { Document } from 'mongoose'; + +export interface INewsletterSubscription extends Document { + email: string; +} diff --git a/src/newsletter/newsletter-subscription.schema.ts b/src/newsletter/newsletter-subscription.schema.ts new file mode 100644 index 0000000000000000000000000000000000000000..9ff18ab015a2e00b018ac1929bed0fb0a7a7ac48 --- /dev/null +++ b/src/newsletter/newsletter-subscription.schema.ts @@ -0,0 +1,12 @@ +import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +import { Document } from 'mongoose'; + +export type NewsletterSubscriptionDocument = NewsletterSubscription & Document; + +@Schema({ timestamps: { createdAt: 'createdAt', updatedAt: 'updatedAt' } }) +export class NewsletterSubscription { + @Prop({ required: true }) + email: string; +} + +export const NewsletterSubscriptionSchema = SchemaFactory.createForClass(NewsletterSubscription); diff --git a/src/newsletter/newsletter.controller.spec.ts b/src/newsletter/newsletter.controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..2e5adbb61affbb5606e32e2768ee9c60e09f1173 --- /dev/null +++ b/src/newsletter/newsletter.controller.spec.ts @@ -0,0 +1,44 @@ +import { HttpModule } from '@nestjs/common'; +import { getModelToken } from '@nestjs/mongoose'; +import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigurationModule } from '../configuration/configuration.module'; +import { NewsletterSubscription } from './newsletter-subscription.schema'; +import { NewsletterController } from './newsletter.controller'; +import { NewsletterService } from './newsletter.service'; +describe('NewsletterController', () => { + let controller: NewsletterController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ConfigurationModule, HttpModule], + providers: [ + NewsletterService, + { + provide: getModelToken('NewsletterSubscription'), + useValue: NewsletterSubscription, + }, + ], + controllers: [NewsletterController], + }).compile(); + + controller = module.get<NewsletterController>(NewsletterController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + it('should subscribe user', async () => { + const result = { email: 'email@test.com' }; + jest.spyOn(controller, 'newsletterSubscribe').mockImplementation(async (): Promise<{ email }> => result); + const email = { email: 'email@test.com' }; + expect(await controller.newsletterSubscribe(email)).toBe(result); + }); + + it('should unsubscribe user', async () => { + const result = { email: 'email@test.com' }; + jest.spyOn(controller, 'newsletterUnsubscribe').mockImplementation(async (): Promise<{ email }> => result); + const email = { email: 'email@test.com' }; + expect(await controller.newsletterUnsubscribe(email)).toBe(result); + }); +}); diff --git a/src/newsletter/newsletter.controller.ts b/src/newsletter/newsletter.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..8a7c77d35689d37df3e66c9c42d9405cc35c6655 --- /dev/null +++ b/src/newsletter/newsletter.controller.ts @@ -0,0 +1,17 @@ +import { Body, Controller, Post } from '@nestjs/common'; +import { NewsletterService } from './newsletter.service'; + +@Controller('newsletter') +export class NewsletterController { + constructor(private newsletterService: NewsletterService) {} + + @Post('subscribe') + public async newsletterSubscribe(@Body() email: { email: string }) { + return this.newsletterService.newsletterSubscribe(email.email); + } + + @Post('unsubscribe') + public async newsletterUnsubscribe(@Body() email: { email: string }) { + return this.newsletterService.newsletterUnsubscribe(email.email); + } +} diff --git a/src/newsletter/newsletter.module.ts b/src/newsletter/newsletter.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..2f949c385cffe4e07c54b645c30d0221f41b31f8 --- /dev/null +++ b/src/newsletter/newsletter.module.ts @@ -0,0 +1,15 @@ +import { HttpModule, Module } from '@nestjs/common'; +import { MongooseModule } from '@nestjs/mongoose'; +import { NewsletterService } from './newsletter.service'; +import { NewsletterController } from './newsletter.controller'; +import { NewsletterSubscription, NewsletterSubscriptionSchema } from './newsletter-subscription.schema'; +@Module({ + imports: [ + MongooseModule.forFeature([{ name: NewsletterSubscription.name, schema: NewsletterSubscriptionSchema }]), + HttpModule, + ], + providers: [NewsletterService], + exports: [NewsletterService], + controllers: [NewsletterController], +}) +export class NewsletterModule {} diff --git a/src/newsletter/newsletter.service.ts b/src/newsletter/newsletter.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..89020eddbaa0808f25f0cedd9c30fba7bc29d1f0 --- /dev/null +++ b/src/newsletter/newsletter.service.ts @@ -0,0 +1,54 @@ +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; +import { InjectModel } from '@nestjs/mongoose'; +import { Model } from 'mongoose'; +import { INewsletterSubscription } from './interface/newsletter-subscription.interface'; +import { NewsletterSubscription, NewsletterSubscriptionDocument } from './newsletter-subscription.schema'; + +@Injectable() +export class NewsletterService { + constructor( + @InjectModel(NewsletterSubscription.name) private newsletterSubscriptionModel: Model<INewsletterSubscription> + ) {} + + public async newsletterSubscribe(email: string): Promise<NewsletterSubscription> { + const existingEmail = await this.findOne(email); + if (existingEmail) { + throw new HttpException('Email already exists', HttpStatus.BAD_REQUEST); + } + const createSubscription = new this.newsletterSubscriptionModel({ email: email }); + createSubscription.save(); + return await this.findOne(email); + } + + public async newsletterUnsubscribe(email: string): Promise<NewsletterSubscription> { + const subscription = await this.newsletterSubscriptionModel.findOne({ email: email }).exec(); + if (!subscription) { + throw new HttpException('Invalid email', HttpStatus.BAD_REQUEST); + } + return subscription.deleteOne(); + } + + public async findOne(mail: string): Promise<NewsletterSubscription | undefined> { + return this.newsletterSubscriptionModel.findOne({ email: mail }).exec(); + } + + public async searchNewsletterSubscription(searchString: string): Promise<NewsletterSubscriptionDocument[]> { + return this.newsletterSubscriptionModel.find({ email: new RegExp(searchString, 'i') }).exec(); + } + + public async countNewsletterSubscriptions(): Promise<number> { + return this.newsletterSubscriptionModel.countDocuments({}).exec(); + } + + public async deleteOneEmail(mail: string): Promise<NewsletterSubscription | undefined> { + const subscription = await this.newsletterSubscriptionModel.findOne({ email: mail }).exec(); + if (!subscription) { + throw new HttpException('Invalid email', HttpStatus.BAD_REQUEST); + } + return subscription.deleteOne(); + } + + public async findAll(): Promise<NewsletterSubscription[]> { + return await this.newsletterSubscriptionModel.find().exec(); + } +} diff --git a/src/posts/posts.controller.spec.ts b/src/posts/posts.controller.spec.ts index 7784335f5040742d323ac81d6e04f2940f8e9088..39b091029861448339fa4a8c755dd634664a6d77 100644 --- a/src/posts/posts.controller.spec.ts +++ b/src/posts/posts.controller.spec.ts @@ -1,11 +1,17 @@ +import { HttpModule } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigurationModule } from '../configuration/configuration.module'; import { PostsController } from './posts.controller'; +import { PostsService } from './posts.service'; +import { PostWithMeta } from './schemas/postWithMeta.schema'; describe('PostsController', () => { let controller: PostsController; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ + imports: [ConfigurationModule, HttpModule], + providers: [PostsService], controllers: [PostsController], }).compile(); @@ -15,4 +21,24 @@ describe('PostsController', () => { it('should be defined', () => { expect(controller).toBeDefined(); }); + + it('should get pending attachments', async () => { + const result:PostWithMeta = {posts:[], meta:{pagination: null}}; + const query = ""; + jest.spyOn(controller, 'findAll').mockImplementation(async (): Promise<any> => result); + expect(await controller.findAll(query)).toBe(result); + }); + + it('should get pending attachments', async () => { + const result = { posts:[] }; + jest.spyOn(controller, 'findAllTags').mockImplementation(async (): Promise<any> => result); + expect(await controller.findAllTags()).toBe(result); + }); + + it('should get pending attachments', async () => { + const result = { public:[], comune:[], others:[] }; + const id = "78945945" + jest.spyOn(controller, 'getPostbyId').mockImplementation(async (): Promise<any> => result); + expect(await controller.getPostbyId(id)).toBe(result); + }); }); diff --git a/src/posts/posts.controller.ts b/src/posts/posts.controller.ts index 2f919b97474661f31fd42052ef998e3fe58fde46..d947390c55e7a81214f5228c8d558d23dab0b2a8 100644 --- a/src/posts/posts.controller.ts +++ b/src/posts/posts.controller.ts @@ -20,7 +20,7 @@ export class PostsController { @ApiQuery({ name: 'page', type: String, required: false }) @ApiQuery({ name: 'order', type: String, required: false }) public async findAll(@Query() query): Promise<PostWithMeta> { - const result = await this.httpService + const result = this.httpService .get(`${process.env.GHOST_HOST_AND_PORT}/ghost/api/v3/content/posts`, { params: { key: process.env.GHOST_CONTENT_API_KEY, @@ -36,13 +36,16 @@ export class PostsController { .pipe( map((response) => response.data), catchError((err) => { - throw new HttpException('Invalid structure id', HttpStatus.BAD_REQUEST); + Logger.error(err); + throw new HttpException('Invalid ghost configuration', HttpStatus.BAD_REQUEST); }) ); return new Promise((resolve) => { - result.subscribe((result: PostWithMeta) => { - result.posts.map((post: Post) => (!post.custom_excerpt ? (post.excerpt = 'Inconnu') : '')); - resolve(result); + result.subscribe((postData: PostWithMeta) => { + postData.posts.forEach((post: Post) => { + return this.postsService.formatPosts(post); + }); + resolve(postData); }); }); } @@ -59,7 +62,7 @@ export class PostsController { } @Get(':id') - public async getPostbyId(@Param('id') id: string): Promise<Observable<{ posts: Post }>> { + public async getPostbyId(@Param('id') id: string): Promise<Observable<{ posts: Post[] }>> { return this.httpService .get(`${process.env.GHOST_HOST_AND_PORT}/ghost/api/v3/content/posts/` + id, { params: { @@ -67,6 +70,10 @@ export class PostsController { include: 'tags,authors', }, }) - .pipe(map((response) => response.data)); + .pipe( + map((response) => { + return { posts: [this.postsService.formatPosts(response.data.posts[0])] }; + }) + ); } } diff --git a/src/posts/posts.service.spec.ts b/src/posts/posts.service.spec.ts index e15215844510d23bdf52ea0c96ac424148f57e6b..5b01e555650ff0b0f58f1a33e8f3f352846d4fbe 100644 --- a/src/posts/posts.service.spec.ts +++ b/src/posts/posts.service.spec.ts @@ -1,4 +1,6 @@ +import { HttpModule } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigurationModule } from '../configuration/configuration.module'; import { PostsService } from './posts.service'; describe('PostsService', () => { @@ -6,6 +8,7 @@ describe('PostsService', () => { beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ + imports: [ConfigurationModule, HttpModule], providers: [PostsService], }).compile(); diff --git a/src/posts/posts.service.ts b/src/posts/posts.service.ts index 498c69feda7a7bafcd08c88d54a40437a520498a..f239e7282af4f5d490de5648d9d3c10ebb731ace 100644 --- a/src/posts/posts.service.ts +++ b/src/posts/posts.service.ts @@ -1,9 +1,9 @@ -import { HttpService, Injectable } from '@nestjs/common'; -import { Logger } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import * as GhostAdminAPI from '@tryghost/admin-api'; import * as _ from 'lodash'; -import { map } from 'rxjs/operators'; +import { ConfigurationService } from '../configuration/configuration.service'; import { TagEnum } from './enums/tag.enum'; +import { Post } from './schemas/post.schema'; import { Tag } from './schemas/tag.schema'; @Injectable() @@ -13,7 +13,7 @@ export class PostsService { public readonly publicCategory = 'public'; private api: any; - constructor() { + constructor(private readonly configService: ConfigurationService) { // Configure Ghost client this.api = new GhostAdminAPI({ url: process.env.GHOST_HOST_AND_PORT, @@ -66,4 +66,20 @@ export class PostsService { arr.splice(toIndex, 0, element); return arr; } + + public formatPosts(postData: Post): Post { + // Handle excerpt field in case of no author + if (!postData.custom_excerpt) { + postData.excerpt = 'Inconnu'; + } + // Handle image display. Rewrite image URL to fit ghost infra issue. + if (postData.feature_image && !this.configService.isLocalConf()) { + postData.feature_image = `https://${this.configService.config.host}/blog/content${ + postData.feature_image.split('/content')[1] + }`; + const regex = /(https?:\/\/ghost):(\d*)?/g; + postData.html = postData.html.replace(regex, `https://${this.configService.config.host}`); + } + return postData; + } } diff --git a/src/posts/schemas/post.schema.ts b/src/posts/schemas/post.schema.ts index 6d5b65ab2df871c3335a296796c8476c71fe3838..3e2ac2ca992fc0be11e97e73b2e13f6730a6aa75 100644 --- a/src/posts/schemas/post.schema.ts +++ b/src/posts/schemas/post.schema.ts @@ -5,7 +5,7 @@ export class Post { slug: string; html: string; comment_id: string; - feature_image: null; + feature_image: string; featured: false; visibility: string; email_recipient_filter: string; diff --git a/src/search/search.module.ts b/src/search/search.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..8e9b5e85b2226d75c157886fe06eabf64c265d7b --- /dev/null +++ b/src/search/search.module.ts @@ -0,0 +1,22 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule, ConfigService } from '@nestjs/config'; +import { ElasticsearchModule } from '@nestjs/elasticsearch'; + +@Module({ + imports: [ + ConfigModule, + ElasticsearchModule.registerAsync({ + imports: [ConfigModule], + useFactory: async (configService: ConfigService) => ({ + node: configService.get('ELASTICSEARCH_NODE'), + auth: { + username: configService.get('ELASTICSEARCH_USERNAME'), + password: configService.get('ELASTICSEARCH_PASSWORD'), + }, + }), + inject: [ConfigService], + }), + ], + exports: [ElasticsearchModule], +}) +export class SearchModule {} diff --git a/src/structures/dto/structure.dto.ts b/src/structures/dto/structure.dto.ts index b4e417214280f76147dde7e07c55efc70d2a0100..12cd9f6078251651726e001f405bedeffe733101 100644 --- a/src/structures/dto/structure.dto.ts +++ b/src/structures/dto/structure.dto.ts @@ -39,6 +39,7 @@ export class structureDto { pmrAccess: boolean; publicsAccompaniment: string[]; proceduresAccompaniment: string[]; + remoteAccompaniment: boolean; @ArrayNotEmpty() accessModality: string[]; diff --git a/src/structures/interfaces/structure-search-body.interface.ts b/src/structures/interfaces/structure-search-body.interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..14857a413f2cf9931baecb307a05fe92857667ee --- /dev/null +++ b/src/structures/interfaces/structure-search-body.interface.ts @@ -0,0 +1,9 @@ +import { Address } from '../schemas/address.schema'; + +export interface StructureSearchBody { + structureId: string; + structureName: string; + structureType: string; + address: Address; + description: string; +} diff --git a/src/structures/interfaces/structure-search-response.interface.ts b/src/structures/interfaces/structure-search-response.interface.ts new file mode 100644 index 0000000000000000000000000000000000000000..79c5e31df2bfc3265023440dd17fc69c7ffae8c6 --- /dev/null +++ b/src/structures/interfaces/structure-search-response.interface.ts @@ -0,0 +1,11 @@ +import { StructureSearchBody } from './structure-search-body.interface'; + +export interface StructureSearchResult { + hits: { + total: number; + hits: Array<{ + _score: number; + _source: StructureSearchBody; + }>; + }; +} diff --git a/src/structures/schemas/aptic-catalog.schema.ts b/src/structures/schemas/aptic-catalog.schema.ts new file mode 100644 index 0000000000000000000000000000000000000000..fa98f194fb72dbf15ae1888b07753845d97c1614 --- /dev/null +++ b/src/structures/schemas/aptic-catalog.schema.ts @@ -0,0 +1,4 @@ +export class ApticCatalog { + code: string; + label: string; +} diff --git a/src/structures/schemas/aptic-structure.schema.ts b/src/structures/schemas/aptic-structure.schema.ts index afb95430cb303041c529327f43d417c6d46792b3..cd8b6b56dcb6af349084b8c7cec68346e01853e6 100644 --- a/src/structures/schemas/aptic-structure.schema.ts +++ b/src/structures/schemas/aptic-structure.schema.ts @@ -1,43 +1,37 @@ -export class ApticStructure { - presence_id: string; - - presence_name: string; - - presence_phone: string; - - presence_address: string; - - organization_id: string; - - organization_legal_status: string; - - organization_type: string; +import { ApticCatalog } from './aptic-catalog.schema'; - gps_lat: number; - - gps_lng: number; - - postal_code: string; - - city: string; - - city_lat: number; - - city_lng: number; +export class ApticStructure { + id: string; - department: string; + name: string; - department_code: string; + phone: string; - region_name: string; + website: string; - region_code: string; + address: { + main: string; + extra: string; + zip: string; + city: string; + gpsLat: number; + gpsLng: number; + department: string; + departmentCode: string; + region: string; + regionCode: string; + }; - catalog_id: string; + organization: { + id: string; + name: string; + type: string; + legalStatus: string; + }; - service_count: number; + catalogs: string[]; - created: string; + services: ApticCatalog[]; - updated: string; + serviceCount: number; } diff --git a/src/structures/schemas/structure.schema.ts b/src/structures/schemas/structure.schema.ts index fdd977bfc67d6f6ab411d60b1ba36f109a4a5573..1ac967167569fdb89c4ba11b87309363f4c4ad7e 100644 --- a/src/structures/schemas/structure.schema.ts +++ b/src/structures/schemas/structure.schema.ts @@ -1,12 +1,58 @@ import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; +import { Type } from 'class-transformer'; +import { ArrayNotEmpty, IsNotEmpty, ValidateNested } from 'class-validator'; import { Document } from 'mongoose'; import { Address } from './address.schema'; import { Week } from './week.schema'; export type StructureDocument = Structure & Document; -@Schema({ timestamps: { createdAt: 'createdAt', updatedAt: 'updatedAt' } }) +@Schema({ timestamps: true }) export class Structure { + constructor(data: Partial<Structure> = {}) { + this.structureName = data.structureName; + this.createdAt = data.createdAt; + this.updatedAt = data.updatedAt; + this.numero = data.numero; + this.structureType = data.structureType; + this.description = data.description; + this.lockdownActivity = data.lockdownActivity; + this.address = data.address; + this.contactPhone = data.contactPhone; + this.contactMail = data.contactMail; + this.website = data.website; + this.facebook = data.facebook; + this.twitter = data.twitter; + this.instagram = data.instagram; + this.linkedin = data.linkedin; + this.pmrAccess = data.pmrAccess; + this.accessModality = data.accessModality; + this.otherDescription = data.otherDescription; + this.labelsQualifications = data.labelsQualifications; + this.publics = data.publics; + this.exceptionalClosures = data.exceptionalClosures; + this.publicsAccompaniment = data.publicsAccompaniment; + this.proceduresAccompaniment = data.proceduresAccompaniment; + this.remoteAccompaniment = data.remoteAccompaniment; + this.baseSkills = data.baseSkills; + this.accessRight = data.accessRight; + this.socialAndProfessional = data.socialAndProfessional; + this.parentingHelp = data.parentingHelp; + this.exceptionalClosures = data.exceptionalClosures; + this.digitalCultureSecurity = data.digitalCultureSecurity; + this.equipmentsAndServices = data.equipmentsAndServices; + this.freeWorkShop = data.freeWorkShop; + this.nbTablets = data.nbTablets; + this.nbPrinters = data.nbPrinters; + this.nbComputers = data.nbComputers; + this.nbNumericTerminal = data.nbNumericTerminal; + this.nbScanners = data.nbScanners; + this.hours = data.hours; + this.coord = data.coord; + this.deletedAt = data.deletedAt; + this.accountVerified = data.accountVerified; + } + @Prop() numero: string; @@ -17,9 +63,11 @@ export class Structure { updatedAt: string; @Prop() + @IsNotEmpty() structureName: string; @Prop() + @IsNotEmpty() structureType: string; @Prop() @@ -29,13 +77,18 @@ export class Structure { lockdownActivity: string; @Prop() + @ValidateNested({ each: true }) + @Type(() => Address) address: Address; @Prop() + @IsNotEmpty() contactPhone: string; @Prop() + @IsNotEmpty() contactMail: string; + @Prop() website: string; @@ -52,9 +105,11 @@ export class Structure { linkedin: string; @Prop() + @IsNotEmpty() pmrAccess: boolean; @Prop() + @ArrayNotEmpty() accessModality: string[]; @Prop() @@ -64,6 +119,7 @@ export class Structure { labelsQualifications: string[]; @Prop() + @ArrayNotEmpty() publics: string[]; @Prop() @@ -75,6 +131,10 @@ export class Structure { @Prop() proceduresAccompaniment: string[]; + @Prop() + @IsNotEmpty() + remoteAccompaniment: boolean; + @Prop() baseSkills: string[]; @@ -94,21 +154,26 @@ export class Structure { equipmentsAndServices: string[]; @Prop() + @IsNotEmpty() freeWorkShop: boolean; @Prop() nbComputers: number; @Prop() + @IsNotEmpty() nbPrinters: number; @Prop() + @IsNotEmpty() nbTablets: number; @Prop() + @IsNotEmpty() nbNumericTerminal: number; @Prop() + @IsNotEmpty() nbScanners: number; @Prop() diff --git a/src/structures/schemas/time.schema.ts b/src/structures/schemas/time.schema.ts index 986b7773a38ace7f052d28519321bbb2e37efeab..8a2261331041add1791775b9da1c2e1ee323a708 100644 --- a/src/structures/schemas/time.schema.ts +++ b/src/structures/schemas/time.schema.ts @@ -4,8 +4,8 @@ import { Document } from 'mongoose'; export type TimeDocument = Time & Document; export class Time { - openning: number; - closing: number; + opening: string; + closing: string; } export const TimeSchema = SchemaFactory.createForClass(Time); diff --git a/src/structures/services/aptic-structures.service.ts b/src/structures/services/aptic-structures.service.ts index fff5c3326547acc5f68bebbc93d0e81ef050b198..766a7513fbdfe2cfeb5c88a2d6d86de0acdebbd4 100644 --- a/src/structures/services/aptic-structures.service.ts +++ b/src/structures/services/aptic-structures.service.ts @@ -11,52 +11,71 @@ import { Structure, StructureDocument } from '../schemas/structure.schema'; import { ApticStructure } from '../schemas/aptic-structure.schema'; import { Address } from '../schemas/address.schema'; import { UsersService } from '../../users/users.service'; +import { ApticCatalog } from '../schemas/aptic-catalog.schema'; +import { CategoriesFormationsService } from '../../categories/services/categories-formations.service'; +import { StructuresSearchService } from './structures-search.service'; @Injectable() export class ApticStructuresService { constructor( private readonly httpService: HttpService, private readonly userService: UsersService, + private readonly categoriesFormationsService: CategoriesFormationsService, + private structuresSearchService: StructuresSearchService, @InjectModel(Structure.name) private structureModel: Model<StructureDocument> ) {} - public formatApticStructures(postalCodeData: any[]): any { + /** + * Get all aptic structures in the given postal codes. + * @param postalCodeData + */ + public formatApticStructures(postalCodeData: any[]): void { // Get all postal code in one array - const postalCodeArray = _.flatten( - postalCodeData.map((data) => { - return data.codesPostaux; - }) - ); + const postalCodeArray = _.flatten(postalCodeData.map((data) => data.codesPostaux)); // Call APTIC Api's - const postalCodePromises = postalCodeArray.map((postalCode) => { - return this.getApticStructures(postalCode).toPromise(); - }); - - Promise.all(postalCodePromises).then((data) => { - const structuresData = _.flatten( - data.map((tmp: { data }) => { - return tmp.data.data; - }) + postalCodeArray.map((postalCode) => { + return this.getApticStructures(postalCode).subscribe( + (res) => { + res.data.presencePoints.forEach((structure) => { + // Call aptic api for offer + this.getApticStructureOffer(structure.catalogs[0]).subscribe( + (serviceData) => { + structure.services = serviceData.data.services; + // Create structure + this.createApticStructures(structure); + }, + (err) => { + Logger.log(err); + } + ); + }); + }, + (err) => { + Logger.log(`getApticStructures error on postal code: ${postalCode}. Code: ${err}`); + } ); - // Create structures if possible - structuresData.forEach((structure) => this.createApticStructures(structure)); }); } + /** + * Create a structure for app database given an aptic structure + * @param structure ApticStructure + */ private async createApticStructures(structure: ApticStructure): Promise<any> { - this.structureAlreadyExist(structure).then((exist) => { + this.structureAlreadyExist(structure).then(async (exist) => { if (!exist) { - Logger.log(`Create structure : ${structure.presence_name}`, 'ApticStructuresService - createApticStructures'); + Logger.log(`Create structure : ${structure.name}`, 'ApticStructuresService - createApticStructures'); const createdStructure = new this.structureModel(); // Known fields - createdStructure.structureName = structure.presence_name; - createdStructure.contactPhone = structure.presence_phone; + createdStructure.structureName = structure.name; + createdStructure.contactPhone = structure.phone; // Unkown fields (but mandatory) createdStructure.contactMail = 'unknown@unknown.com'; createdStructure.labelsQualifications = ['passNumerique']; createdStructure.structureType = 'autre'; createdStructure.pmrAccess = false; + createdStructure.remoteAccompaniment = false; createdStructure.accessModality = ['accesLibre']; createdStructure.publics = ['toutPublic']; createdStructure.accountVerified = true; @@ -67,32 +86,90 @@ export class ApticStructuresService { createdStructure.nbTablets = null; createdStructure.nbNumericTerminal = null; // Address - createdStructure.coord = [structure.gps_lng, structure.gps_lat]; + createdStructure.coord = [structure.address.gpsLng, structure.address.gpsLat]; createdStructure.address = this.formatAddress(structure); + // Set structure offer + createdStructure.parentingHelp = await this.setModules(structure, 'parentingHelp'); + createdStructure.baseSkills = await this.setModules(structure, 'baseSkills'); + createdStructure.accessRight = await this.setModules(structure, 'accessRight'); + createdStructure.socialAndProfessional = await this.setModules(structure, 'socialAndProfessional'); + createdStructure.digitalCultureSecurity = await this.setModules(structure, 'digitalCultureSecurity'); createdStructure.save(); + this.structuresSearchService.indexStructure(createdStructure); // Send admin weird structure mail this.verifyDuplication(createdStructure); } }); } + /** + * Given an aptic structure, this method return the corresponding services id by category. + * @param structure ApticStructure + * @param moduleCategory string + * @returns Promise<string[]> + */ + private async setModules(structure: ApticStructure, moduleCategory: string): Promise<string[]> { + const referentialIds = await this.categoriesFormationsService + .findOne(moduleCategory) + .then((referential) => referential.modules.map((element) => element.id)); + + return structure.services + .filter((service) => referentialIds.includes(service.code)) + .map((service) => { + return service.code; + }); + } + + /** + * Verifiy if an aptic structure already exist in database. + * - If it's true return true and update fields if needed + * - If it's false return false + * @param structure ApticStructure + * @returns boolean + */ private async structureAlreadyExist(structure: ApticStructure): Promise<boolean> { let existingStructure = await this.structureModel .findOne({ - structureName: { $regex: structure.presence_name, $options: 'i' }, + structureName: { $regex: structure.name, $options: 'i' }, }) .exec(); // Check without regex for case like 'TINEBRA*DANIEL/DANIEL/' if (!existingStructure) { - existingStructure = await this.structureModel.findOne({ structureName: structure.presence_name }).exec(); + existingStructure = await this.structureModel.findOne({ structureName: structure.name }).exec(); } if (existingStructure) { // Add aptic label if it's not the case if (!existingStructure.labelsQualifications.includes('passNumerique')) { existingStructure.labelsQualifications.push('passNumerique'); - existingStructure.save(); } + // Update service offer + existingStructure.parentingHelp = _.unionWith( + existingStructure.parentingHelp, + await this.setModules(structure, 'parentingHelp'), + _.isEqual + ); + existingStructure.baseSkills = _.unionWith( + existingStructure.baseSkills, + await this.setModules(structure, 'baseSkills'), + _.isEqual + ); + existingStructure.accessRight = _.unionWith( + existingStructure.accessRight, + await this.setModules(structure, 'accessRight'), + _.isEqual + ); + existingStructure.socialAndProfessional = _.unionWith( + existingStructure.socialAndProfessional, + await this.setModules(structure, 'socialAndProfessional'), + _.isEqual + ); + existingStructure.digitalCultureSecurity = _.unionWith( + existingStructure.digitalCultureSecurity, + await this.setModules(structure, 'digitalCultureSecurity'), + _.isEqual + ); + existingStructure.save(); return true; } return false; @@ -128,11 +205,21 @@ export class ApticStructuresService { return this.httpService.get(encodeURI(req)); } - public getApticStructures(postalCodeData: string): Observable<AxiosResponse<any>> { + public getApticStructures(postalCodeData: string): Observable<AxiosResponse<{ presencePoints: ApticStructure[] }>> { + const req = `https://aptisearch-api.aptic.fr/v1/postal-code/${postalCodeData}`; + Logger.log(`Request : ${req}`, 'ApticStructuresService'); + return this.httpService.get(req, { + headers: { + api_key: process.env.APTIC_TOKEN, + }, + }); + } + + public getApticStructureOffer(catalogId: string): Observable<AxiosResponse<{ services: ApticCatalog[] }>> { const agent = new https.Agent({ rejectUnauthorized: false, }); - const req = `https://presence.aptic.fr/postal_code/${postalCodeData}`; + const req = `https://aptisearch-api.aptic.fr/v1/catalog/${catalogId}/services`; Logger.log(`Request : ${req}`, 'ApticStructuresService'); return this.httpService.get(req, { httpsAgent: agent, @@ -161,13 +248,13 @@ export class ApticStructuresService { const address = new Address(); const regexWithSpace = /\d+\s/g; // NOSONAR const regex = /\d+/g; // NOSONAR - if (structure.presence_address.match(regex)) { - address.numero = structure.presence_address.match(regex)[0]; - address.street = structure.presence_address.replace(regexWithSpace, ''); + if (structure.address.main.match(regex)) { + address.numero = structure.address.main.match(regex)[0]; + address.street = structure.address.main.replace(regexWithSpace, ''); } else { - address.street = structure.presence_address; + address.street = structure.address.main; } - address.commune = structure.city; + address.commune = structure.address.city; return address; } } diff --git a/src/structures/services/structures-search.service.ts b/src/structures/services/structures-search.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..bd6f53beef23ba2148b6325e9ac713ecb5e75af1 --- /dev/null +++ b/src/structures/services/structures-search.service.ts @@ -0,0 +1,101 @@ +import { Injectable } from '@nestjs/common'; +import { ElasticsearchService } from '@nestjs/elasticsearch'; +import { structureDto } from '../dto/structure.dto'; +import { StructureDocument } from '../schemas/structure.schema'; +import { StructureSearchBody } from '../interfaces/structure-search-body.interface'; +import { StructureSearchResult } from '../interfaces/structure-search-response.interface'; + +@Injectable() +export class StructuresSearchService { + private index = 'structures'; + + constructor(private readonly elasticsearchService: ElasticsearchService) {} + + public async indexStructure(structure: StructureDocument): Promise<StructureDocument> { + this.elasticsearchService.index<StructureSearchResult, StructureSearchBody>({ + index: this.index, + id: structure._id, + body: { + structureName: structure.structureName, + structureType: structure.structureType, + structureId: structure._id, + address: structure.address, + description: structure.description, + }, + }); + return structure; + } + + public async createStructureIndex(): Promise<any> { + return this.elasticsearchService.indices.create({ + index: this.index, + }); + } + + public async dropIndex(): Promise<any> { + if ( + ( + await this.elasticsearchService.indices.exists({ + index: this.index, + }) + ).body + ) { + return this.elasticsearchService.indices.delete({ + index: this.index, + }); + } + } + + public async deleteIndexStructure(structure: StructureDocument): Promise<StructureDocument> { + this.elasticsearchService.delete<StructureSearchResult, StructureSearchBody>({ + index: this.index, + id: structure._id, + }); + return structure; + } + + public async search(searchString: string): Promise<StructureSearchBody[]> { + searchString = searchString ? searchString + '*' : '*'; + const { body } = await this.elasticsearchService.search<StructureSearchResult>({ + index: this.index, + body: { + from: 0, + size: 200, + query: { + query_string: { + analyze_wildcard: 'true', + query: searchString, + fields: ['structureName^5', 'structureType^5', 'address.commune^10', 'description'], + fuzziness: 'AUTO', + }, + }, + }, + }); + const maxScore = Math.max.apply( + Math, + body.hits.hits.map(function (hit) { + return hit._score; + }) + ); + const sortedHits = body.hits.hits.filter(function (elem) { + return elem._score >= maxScore / 1.5; + }); + return sortedHits.map((item) => item._source); + } + + public async update(structure: structureDto, id: string): Promise<any> { + return this.elasticsearchService.update({ + index: this.index, + id: id, + body: { + doc: { + structureName: structure.structureName, + structureType: structure.structureType, + structureId: id, + address: structure.address, + description: structure.description, + }, + }, + }); + } +} diff --git a/src/structures/services/structures.service.ts b/src/structures/services/structures.service.ts index ac2e32d264a55e171b5e4802dd6e48ef4168ca08..d5eb2c1eb593a6d49db7b508164aa3168d9d8994 100644 --- a/src/structures/services/structures.service.ts +++ b/src/structures/services/structures.service.ts @@ -1,6 +1,6 @@ import { HttpException, HttpService, Injectable, HttpStatus, Logger } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; -import { Types, Model } from 'mongoose'; +import { Types, Model, FilterQuery, DocumentDefinition } from 'mongoose'; import { Observable } from 'rxjs'; import { AxiosResponse } from 'axios'; import { Structure, StructureDocument } from '../schemas/structure.schema'; @@ -14,6 +14,13 @@ import { DateTime } from 'luxon'; import { IUser } from '../../users/interfaces/user.interface'; import * as _ from 'lodash'; import { OwnerDto } from '../../users/dto/owner.dto'; +import { StructuresSearchService } from './structures-search.service'; +import { CategoriesFormationsModule } from '../../categories/schemas/categoriesFormationsModule.schema'; +import { CategoriesModule } from '../../categories/categories.module'; +import { CategoriesAccompagnement } from '../../categories/schemas/categoriesAccompagnement.schema'; +import { CategoriesFormations } from '../../categories/schemas/categoriesFormations.schema'; +import { CategoriesOthers } from '../../categories/schemas/categoriesOthers.schema'; +import { UnclaimedStructureDto } from '../../admin/dto/unclaimed-structure-dto'; @Injectable() export class StructuresService { @@ -21,9 +28,45 @@ export class StructuresService { private readonly httpService: HttpService, private readonly userService: UsersService, private readonly mailerService: MailerService, + private structuresSearchService: StructuresSearchService, @InjectModel(Structure.name) private structureModel: Model<StructureDocument> ) {} + async initiateStructureIndex(): Promise<StructureDocument[]> { + Logger.log('Reset structures indexes'); + await this.structuresSearchService.dropIndex(); + await this.structuresSearchService.createStructureIndex(); + return this.populateES(); + } + + async searchForStructures(text: string, filters?: Array<any>): Promise<StructureDocument[]> { + const results = await this.structuresSearchService.search(text); + const ids = results.map((result) => result.structureId); + if (!ids.length) { + return []; + } + //we match ids from Elasticsearch with ids from mongoDB (and filters) and sort the result according to ElasticSearch order. + if (filters.length > 0) { + return ( + await this.structureModel + .find({ + _id: { $in: ids }, + $and: [...this.parseFilter(filters), { deletedAt: { $exists: false }, accountVerified: true }], + }) + .exec() + ).sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)); + } else { + return ( + await this.structureModel + .find({ + _id: { $in: ids }, + $and: [{ deletedAt: { $exists: false }, accountVerified: true }], + }) + .exec() + ).sort((a, b) => ids.indexOf(a.id) - ids.indexOf(b.id)); + } + } + public async create(idUser: string, structure: structureDto): Promise<Structure> { const user = await this.userService.findOne(idUser); if (!user) { @@ -32,14 +75,26 @@ export class StructuresService { const createdStructure = new this.structureModel(structure); createdStructure._id = Types.ObjectId(); await createdStructure.save(); - await this.getStructurePosition(createdStructure).then((postition: StructureDocument) => { - return this.structureModel - .findByIdAndUpdate(Types.ObjectId(createdStructure._id), { address: postition.address, coord: postition.coord }) - .exec(); + await this.getStructurePosition(createdStructure).then(async (postition: StructureDocument) => { + return this.structuresSearchService.indexStructure( + await this.structureModel + .findByIdAndUpdate(Types.ObjectId(createdStructure._id), { + address: postition.address, + coord: postition.coord, + }) + .exec() + ); }); user.structuresLink.push(createdStructure._id); user.save(); + // Senc admin notification mail + this.sendAdminStructureNotification( + createdStructure, + this.mailerService.config.templates.adminStructureCreate.ejs, + this.mailerService.config.templates.adminStructureCreate.json + ); + return createdStructure; } @@ -55,7 +110,7 @@ export class StructuresService { .exec(); } else if (filters) { return this.structureModel - .find({ $and: [{ $or: this.parseFilter(filters), deletedAt: { $exists: false }, accountVerified: true }] }) + .find({ $and: [{ $and: this.parseFilter(filters), deletedAt: { $exists: false }, accountVerified: true }] }) .exec(); } else { return this.structureModel @@ -99,6 +154,131 @@ export class StructuresService { return this.structureModel.find({ deletedAt: { $exists: false }, accountVerified: true }).exec(); } + public async findAllUnclaimed(): Promise<UnclaimedStructureDto[]> { + const structures = await this.structureModel.find({ deletedAt: { $exists: false } }).exec(); + const unclaimedStructures = []; + await Promise.all( + structures.map(async (structure: StructureDocument) => { + if (!(await this.userService.isStructureClaimed(structure.id))) { + unclaimedStructures.push({ structureId: structure.id, structureName: structure.structureName }); + } + }) + ); + return unclaimedStructures; + } + + public async populateES(): Promise<StructureDocument[]> { + const structures = await this.structureModel.find({ deletedAt: { $exists: false } }).exec(); + await Promise.all( + structures.map((structure: StructureDocument) => { + this.structuresSearchService.indexStructure(structure); + }) + ); + return structures; + } + + public async findAllFormated( + formationCategories: CategoriesFormations[], + accompagnementCategories: CategoriesAccompagnement[], + otherCategories: CategoriesOthers[] + ): Promise<StructureDocument[]> { + const structures = await this.structureModel.find({ deletedAt: { $exists: false } }).exec(); + // Update structures coord and address before sending them + await Promise.all( + structures.map((structure: StructureDocument) => { + // If structure has no address, add it + if (!structure.address || structure.coord.length <= 0) { + return this.getStructurePosition(structure).then((postition: StructureDocument) => { + this.structureModel + .findByIdAndUpdate(Types.ObjectId(structure._id), { + address: postition.address, + coord: postition.coord, + }) + .exec(); + }); + } + }) + ); + return ( + await this.structureModel + .find({ deletedAt: { $exists: false }, accountVerified: true }) + .select('-_id -accountVerified -otherDescription') + .exec() + ).map((structure) => { + // If structure has temp email, hide it + if (this.hasTempMail(structure)) { + structure.contactMail = null; + } + // Format date + structure.createdAt = new Date(structure.createdAt).toISOString(); + structure.updatedAt = new Date(structure.updatedAt).toISOString(); + // Add referentiel + structure.proceduresAccompaniment = this.mapModules( + structure.proceduresAccompaniment, + accompagnementCategories.find((category) => category.id === 'proceduresAccompaniment').modules + ); + structure.labelsQualifications = this.mapModules( + structure.labelsQualifications, + otherCategories.find((category) => category.id === 'labelsQualifications').modules + ); + structure.publics = this.mapModules( + structure.publics, + otherCategories.find((category) => category.id === 'publics').modules + ); + structure.accessModality = this.mapModules( + structure.accessModality, + otherCategories.find((category) => category.id === 'accessModality').modules + ); + structure.publicsAccompaniment = this.mapModules( + structure.publicsAccompaniment, + otherCategories.find((category) => category.id === 'publicsAccompaniment').modules + ); + structure.equipmentsAndServices = this.mapModules( + structure.equipmentsAndServices, + otherCategories.find((category) => category.id === 'equipmentsAndServices').modules + ); + structure.baseSkills = this.mapFormationModules( + structure.baseSkills, + formationCategories.find((category) => category.id === 'baseSkills').modules + ); + structure.accessRight = this.mapFormationModules( + structure.accessRight, + formationCategories.find((category) => category.id === 'accessRight').modules + ); + structure.socialAndProfessional = this.mapFormationModules( + structure.socialAndProfessional, + formationCategories.find((category) => category.id === 'socialAndProfessional').modules + ); + structure.parentingHelp = this.mapFormationModules( + structure.parentingHelp, + formationCategories.find((category) => category.id === 'parentingHelp').modules + ); + structure.digitalCultureSecurity = this.mapFormationModules( + structure.digitalCultureSecurity, + formationCategories.find((category) => category.id === 'digitalCultureSecurity').modules + ); + return structure; + }); + } + public mapFormationModules(structureModule: string[], baseModule: CategoriesFormationsModule[]): string[] { + if (structureModule == []) { + return []; + } + return structureModule.map((id) => { + const formatedText = baseModule.find((module) => module.display_id === id)?.text; + return formatedText ? formatedText : id; + }); + } + public mapModules(structureModule: string[], baseModule: CategoriesModule[]): string[] { + if (structureModule == []) { + return []; + } + return structureModule.map((id) => { + const formatedText = baseModule.find((module) => module.id === id)?.text; + return formatedText ? formatedText : id; + }); + } + public async update(idStructure: string, structure: structureDto): Promise<Structure> { const oldStructure = await this.findOne(idStructure); if (!_.isEqual(oldStructure.address, structure.address)) { @@ -108,6 +288,12 @@ export class StructuresService { if (!result) { throw new HttpException('Invalid structure id', HttpStatus.BAD_REQUEST); } else { + await this.structuresSearchService.update(structure, idStructure); + this.sendAdminStructureNotification( + result, + this.mailerService.config.templates.structureModificationNotification.ejs, + this.mailerService.config.templates.structureModificationNotification.json + ); this.userService.removeOutdatedStructureFromArray(idStructure); } return this.findOne(idStructure); @@ -159,7 +345,7 @@ export class StructuresService { const req = 'https://download.data.grandlyon.com/geocoding/photon-bal/api?q=' + data.searchQuery + - '&lat=45.75&lon=4.85&lang=fr&limit=5&osm_tag=:!construction&osm_tag=:!bus_stop'; + '&lat=45.75&lon=4.85&lang=fr&limit=50&osm_tag=:!construction&osm_tag=:!bus_stop'; return new Promise((resolve, reject) => { this.httpService .request({ @@ -184,14 +370,31 @@ export class StructuresService { * @param key structure key * @return [{id: 'key', count: 'value'}] */ - public async countByStructureKey(key: string): Promise<any> { + public async countByStructureKey(key: string, selected: { id: string; text: string }[]): Promise<any> { const uniqueElements = await this.structureModel.distinct(key).exec(); return await Promise.all( uniqueElements.map(async (value) => { + const keyList: FilterQuery<DocumentDefinition<StructureDocument>>[] = []; + keyList.push({ + [key]: { $elemMatch: { $eq: value } }, + deletedAt: { $exists: false }, + accountVerified: true, + }); + if (selected && selected.length > 0) { + for (const val of selected) { + keyList.push({ + [val.text]: { $elemMatch: { $eq: val.id } }, + deletedAt: { $exists: false }, + accountVerified: true, + }); + } + } return { id: value, count: await this.structureModel - .countDocuments({ $and: [{ [key]: { $elemMatch: { $eq: value } }, deletedAt: { $exists: false } }] }) + .countDocuments({ + $and: keyList, + }) .exec(), }; }) @@ -210,14 +413,43 @@ export class StructuresService { if (!structure) { throw new HttpException('Invalid structure id', HttpStatus.BAD_REQUEST); } + this.structuresSearchService.deleteIndexStructure(structure); structure.structureType = null; structure.deletedAt = DateTime.local().setZone('Europe/Paris').toString(); this.anonymizeStructure(structure).save(); // Remove structure from userModel this.userService.removeStructureIdFromUsers(structure._id); + this.sendAdminStructureNotification( + structure, + this.mailerService.config.templates.structureDeletionNotification.ejs, + this.mailerService.config.templates.structureDeletionNotification.json + ); return structure; } + public async sendAdminStructureNotification( + structure: StructureDocument, + templateLocation: any, + jsonConfigLocation: any + ) { + const uniqueAdminEmails = [...new Set((await this.userService.getAdmins()).map((admin) => admin.email))].map( + (item) => { + return { email: item }; + } + ); + + const config = this.mailerService.config; + const ejsPath = this.mailerService.getTemplateLocation(templateLocation); + const jsonConfig = this.mailerService.loadJsonConfig(jsonConfigLocation); + + const html = await ejs.renderFile(ejsPath, { + config, + id: structure ? structure._id : 0, + structureName: structure ? structure.structureName : '', + }); + this.mailerService.send(uniqueAdminEmails, jsonConfig.subject, html); + } + private anonymizeStructure(structure: StructureDocument): StructureDocument { structure.contactPhone = ''; structure.contactMail = ''; @@ -313,7 +545,7 @@ export class StructuresService { return this.userService.getStructureOwners(structureId); } - public async updateAccountVerified(idStructure: string, emailUser: string): Promise<Structure> { + public async updateAccountVerified(idStructure: string): Promise<Structure> { const structureLinked = await this.findOne(idStructure); const structure = new this.structureModel(structureLinked); if (!structure) { @@ -332,7 +564,41 @@ export class StructuresService { if (!structure) { throw new HttpException('Invalid structure id', HttpStatus.BAD_REQUEST); } - const owners = await this.userService.getStructureOwnersMails(idStructure, emailUser); + const owners = + typeof emailUser == 'undefined' + ? await this.userService.getStructureOwnersMails(structure._id, '') + : await this.userService.getStructureOwnersMails(structure._id, emailUser); return { structure: structure, owners: owners }; } + + public async reportStructureError(structureId: string, content: string) { + const structure = await this.findOne(structureId); + if (!structure) { + throw new HttpException('Invalid structure id', HttpStatus.BAD_REQUEST); + } + const owners = await this.userService.getStructureOwnersMails(structure._id, ''); + const admins = await this.userService.getAdmins(); + const emails = owners.map((owner) => owner.email).concat(admins.map((admin) => admin.email)); + const uniqueEmails = [...new Set(emails)]; + + const emailsObject: { email: string }[] = uniqueEmails.map((item) => { + return { email: item }; + }); + + const config = this.mailerService.config; + const ejsPath = this.mailerService.getTemplateLocation(config.templates.structureErrorReport.ejs); + const jsonConfig = this.mailerService.loadJsonConfig(config.templates.structureErrorReport.json); + + const html = await ejs.renderFile(ejsPath, { + config, + content: content, + id: structure._id, + structureName: structure.structureName, + }); + this.mailerService.send(emailsObject, jsonConfig.subject, html); + } + + private hasTempMail(structure: Structure): boolean { + return structure.contactMail === 'unknown@unknown.com'; + } } diff --git a/src/structures/structures.controller.spec.ts b/src/structures/structures.controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1eee0eaaa2d68dcb9b33924f6c2c58ad684808e2 --- /dev/null +++ b/src/structures/structures.controller.spec.ts @@ -0,0 +1,67 @@ +import { HttpService } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import { CategoriesAccompagnementServiceMock } from '../../test/mock/services/categoriesAccompagnement.mock.service'; +import { CategoriesFormationsServiceMock } from '../../test/mock/services/categoriesFormations.mock.service'; +import { CategoriesOthersServiceMock } from '../../test/mock/services/categoriesOthers.mock.service'; +import { HttpServiceMock } from '../../test/mock/services/http.mock.service'; +import { StructuresServiceMock } from '../../test/mock/services/structures.mock.service'; +import { TempUserServiceMock } from '../../test/mock/services/tempUser.mock.service'; +import { UsersServiceMock } from '../../test/mock/services/user.mock.service'; +import { CategoriesAccompagnementService } from '../categories/services/categories-accompagnement.service'; +import { CategoriesFormationsService } from '../categories/services/categories-formations.service'; +import { CategoriesOthersService } from '../categories/services/categories-others.service'; +import { TempUserService } from '../temp-user/temp-user.service'; +import { UsersService } from '../users/users.service'; +import { StructuresService } from './services/structures.service'; +import { StructuresController } from './structures.controller'; +describe('AuthController', () => { + let controller: StructuresController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + controllers: [StructuresController], + providers: [ + { + provide: HttpService, + useClass: HttpServiceMock, + }, + { + provide: StructuresService, + useClass: StructuresServiceMock, + }, + { + provide: UsersService, + useClass: UsersServiceMock, + }, + { + provide: TempUserService, + useClass: TempUserServiceMock, + }, + { + provide: CategoriesAccompagnementService, + useClass: CategoriesAccompagnementServiceMock, + }, + { + provide: CategoriesOthersService, + useClass: CategoriesOthersServiceMock, + }, + { + provide: CategoriesFormationsService, + useClass: CategoriesFormationsServiceMock, + }, + ], + }).compile(); + + controller = module.get<StructuresController>(StructuresController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + //TODO: test structure controler endpoint + //create, search, updateAccountVerified, update, findAll, findAllFormated, isClaimed + //updateStructureLinkedClaim, countCategories, searchAddress, find, findWithOwners + //delete, addOwner, join, joinValidation, removeOwner, reportStructureError +}); diff --git a/src/structures/structures.controller.ts b/src/structures/structures.controller.ts index b4aeea9bc83c7d3a6198af2d44909e4300b60f89..65dcfd00b0b4d5495ce84306e940f99a82982981 100644 --- a/src/structures/structures.controller.ts +++ b/src/structures/structures.controller.ts @@ -4,6 +4,7 @@ import { Delete, Get, HttpException, + HttpService, HttpStatus, Param, Post, @@ -14,6 +15,9 @@ import { import { ApiParam } from '@nestjs/swagger'; import { Types } from 'mongoose'; import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'; +import { CategoriesAccompagnementService } from '../categories/services/categories-accompagnement.service'; +import { CategoriesFormationsService } from '../categories/services/categories-formations.service'; +import { CategoriesOthersService } from '../categories/services/categories-others.service'; import { CreateTempUserDto } from '../temp-user/dto/create-temp-user.dto'; import { TempUserService } from '../temp-user/temp-user.service'; import { Roles } from '../users/decorators/roles.decorator'; @@ -23,17 +27,38 @@ import { UsersService } from '../users/users.service'; import { CreateStructureDto } from './dto/create-structure.dto'; import { QueryStructure } from './dto/query-structure.dto'; import { structureDto } from './dto/structure.dto'; -import { Structure } from './schemas/structure.schema'; +import { Structure, StructureDocument } from './schemas/structure.schema'; import { StructuresService } from './services/structures.service'; +import { RolesGuard } from '../users/guards/roles.guard'; @Controller('structures') export class StructuresController { constructor( + private readonly httpService: HttpService, private readonly structureService: StructuresService, private readonly userService: UsersService, - private readonly tempUserService: TempUserService + private readonly tempUserService: TempUserService, + private readonly categoriesFormationsService: CategoriesFormationsService, + private readonly categoriesOthersService: CategoriesOthersService, + private readonly categoriesAccompagnementService: CategoriesAccompagnementService ) {} + /** + * Return points of given town exist. + * @param zipcode + * @returns Array of points + */ + @Get('coordinates/:zipcode') + @ApiParam({ name: 'zipcode', type: String, required: true }) + public async getCoordinates(@Param('zipcode') city: string): Promise<any> { + return await this.httpService + .get(encodeURI('https://download.data.grandlyon.com/geocoding/photon-bal/api?q=' + city)) + .toPromise() + .then(async (res) => res.data.features) + .then((data) => data.filter((cityPoint) => cityPoint.properties.city.toLowerCase().includes(city.toLowerCase()))) + .then((data) => data.map((filteredCityPoint) => filteredCityPoint.geometry.coordinates)); + } + @Post() public async create(@Body() createStructureDto: CreateStructureDto): Promise<Structure> { return this.structureService.create(createStructureDto.idUser, createStructureDto.structure); @@ -41,15 +66,19 @@ export class StructuresController { @Post('search') public async search(@Query() query: QueryStructure, @Body() body): Promise<Structure[]> { - return this.structureService.search(query.query, body ? body.filters : null); + return await this.structureService.searchForStructures(query.query, body ? body.filters : null); + } + + @Post('resetSearchIndex') + @UseGuards(JwtAuthGuard, RolesGuard) + @Roles('admin') + public async resetES(): Promise<StructureDocument[]> { + return this.structureService.initiateStructureIndex(); } @Put('updateAfterOwnerVerify/:id') - public async updateAfterOwnerVerify( - @Param('id') id: string, - @Body() body: { emailUser: string } - ): Promise<Structure> { - return this.structureService.updateAccountVerified(id, body.emailUser); + public async updateAfterOwnerVerify(@Param('id') id: string): Promise<Structure> { + return this.structureService.updateAccountVerified(id); } @Put(':id') @@ -64,6 +93,14 @@ export class StructuresController { return this.structureService.findAll(); } + @Get('formated') + public async findAllFormated(): Promise<Structure[]> { + const formationCategories = await this.categoriesFormationsService.findAll(); + const accompagnementCategories = await this.categoriesAccompagnementService.findAll(); + const otherCategories = await this.categoriesOthersService.findAll(); + return this.structureService.findAllFormated(formationCategories, accompagnementCategories, otherCategories); + } + @Post(':id/isClaimed') public async isClaimed(@Param('id') id: string, @Body() user?: User): Promise<boolean> { return this.structureService.isClaimed(id, user); @@ -74,22 +111,25 @@ export class StructuresController { return this.userService.updateStructureLinkedClaim(user.email, idStructure); } - @Get('count') - public async countCategories(): Promise<Array<{ id: string; count: number }>> { + @Post('count') + public async countCategories( + @Body() + selectedFilter: { id: string; text: string }[] + ): Promise<Array<{ id: string; count: number }>> { const data = await Promise.all([ - this.structureService.countByStructureKey('proceduresAccompaniment'), - - this.structureService.countByStructureKey('accessRight'), - this.structureService.countByStructureKey('baseSkills'), - this.structureService.countByStructureKey('parentingHelp'), - this.structureService.countByStructureKey('digitalCultureSecurity'), - this.structureService.countByStructureKey('socialAndProfessional'), - - this.structureService.countByStructureKey('publicsAccompaniment'), - this.structureService.countByStructureKey('labelsQualifications'), - this.structureService.countByStructureKey('publics'), - this.structureService.countByStructureKey('accessModality'), - this.structureService.countByStructureKey('equipmentsAndServices'), + this.structureService.countByStructureKey('proceduresAccompaniment', selectedFilter), + + this.structureService.countByStructureKey('accessRight', selectedFilter), + this.structureService.countByStructureKey('baseSkills', selectedFilter), + this.structureService.countByStructureKey('parentingHelp', selectedFilter), + this.structureService.countByStructureKey('digitalCultureSecurity', selectedFilter), + this.structureService.countByStructureKey('socialAndProfessional', selectedFilter), + + this.structureService.countByStructureKey('publicsAccompaniment', selectedFilter), + this.structureService.countByStructureKey('labelsQualifications', selectedFilter), + this.structureService.countByStructureKey('publics', selectedFilter), + this.structureService.countByStructureKey('accessModality', selectedFilter), + this.structureService.countByStructureKey('equipmentsAndServices', selectedFilter), ]); // Return a concat of all arrays return data.reduce((a, b) => [...a, ...b]); @@ -102,7 +142,12 @@ export class StructuresController { @Get(':id') public async find(@Param('id') id: string) { - return this.structureService.findOne(id); + const result = await this.structureService.findOne(id); + if (!result || result.deletedAt) { + throw new HttpException('Structure does not exist', HttpStatus.NOT_FOUND); + } else { + return result; + } } @Post(':id/withOwners') @@ -217,4 +262,9 @@ export class StructuresController { } this.userService.removeFromStructureLinked(userFromDb.email, id); } + + @Post('reportStructureError') + public async reportStructureError(@Body() data: { structureId: string; content: string }): Promise<void> { + return await this.structureService.reportStructureError(data.structureId, data.content); + } } diff --git a/src/structures/structures.module.ts b/src/structures/structures.module.ts index 51ec4d11ca7c6d9640944f69b156cfaac87f1aa3..650e3adfd9b7ef57e13d8e06090f1b9100f26e33 100644 --- a/src/structures/structures.module.ts +++ b/src/structures/structures.module.ts @@ -10,6 +10,9 @@ import { ApticStructuresService } from './services/aptic-structures.service'; import { StructureTypeController } from './structure-type/structure-type.controller'; import { StructureTypeService } from './structure-type/structure-type.service'; import { StructureType, StructureTypeSchema } from './structure-type/structure-type.schema'; +import { CategoriesModule } from '../categories/categories.module'; +import { StructuresSearchService } from './services/structures-search.service'; +import { SearchModule } from '../search/search.module'; @Module({ imports: [ @@ -20,10 +23,12 @@ import { StructureType, StructureTypeSchema } from './structure-type/structure-t HttpModule, MailerModule, forwardRef(() => UsersModule), + CategoriesModule, TempUserModule, + SearchModule, ], controllers: [StructuresController, StructureTypeController], exports: [StructuresService, StructureTypeService], - providers: [StructuresService, StructureTypeService, ApticStructuresService], + providers: [StructuresSearchService, StructuresService, StructureTypeService, ApticStructuresService], }) export class StructuresModule {} diff --git a/src/tcl/tclStopPoint.service.spec.ts b/src/tcl/tclStopPoint.service.spec.ts index 4958e59315416027ed003c26d79fbbe8d82fcbf6..2c6d4220f3f2a135aabaa0b0ec423dab6713a53b 100644 --- a/src/tcl/tclStopPoint.service.spec.ts +++ b/src/tcl/tclStopPoint.service.spec.ts @@ -1,4 +1,7 @@ +import { HttpModule } from '@nestjs/common'; +import { getModelToken } from '@nestjs/mongoose'; import { Test, TestingModule } from '@nestjs/testing'; +import { TclStopPoint } from './tclStopPoint.schema'; import { TclStopPointService } from './tclStopPoint.service'; describe('TclService', () => { @@ -6,7 +9,14 @@ describe('TclService', () => { beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [TclStopPointService], + imports: [HttpModule], + providers: [ + TclStopPointService, + { + provide: getModelToken('TclStopPoint'), + useValue: TclStopPoint, + }, + ], }).compile(); service = module.get<TclStopPointService>(TclStopPointService); diff --git a/src/users/users.controller.spec.ts b/src/users/users.controller.spec.ts index 7dd57ee72fcb1a6243abc0c94b7351825843f492..68da5450f95300fde9828f6a2ad2d1905b738753 100644 --- a/src/users/users.controller.spec.ts +++ b/src/users/users.controller.spec.ts @@ -1,8 +1,15 @@ import { HttpModule } from '@nestjs/common'; import { getModelToken } from '@nestjs/mongoose'; import { Test, TestingModule } from '@nestjs/testing'; +import { CategoriesModule } from '../categories/categories.module'; import { ConfigurationModule } from '../configuration/configuration.module'; import { MailerService } from '../mailer/mailer.service'; +import { SearchModule } from '../search/search.module'; +import { Structure } from '../structures/schemas/structure.schema'; +import { StructuresService } from '../structures/services/structures.service'; +import { StructuresSearchService } from '../structures/services/structures-search.service'; +import { TempUser } from '../temp-user/temp-user.schema'; +import { TempUserService } from '../temp-user/temp-user.service'; import { User } from './schemas/user.schema'; import { UsersController } from './users.controller'; import { UsersService } from './users.service'; @@ -12,10 +19,21 @@ describe('UsersController', () => { beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - imports: [ConfigurationModule, HttpModule], + imports: [ConfigurationModule, HttpModule, SearchModule], providers: [ UsersService, + StructuresService, + StructuresSearchService, MailerService, + TempUserService, + { + provide: getModelToken('TempUser'), + useValue: TempUser, + }, + { + provide: getModelToken('Structure'), + useValue: Structure, + }, { provide: getModelToken('User'), useValue: User, diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 4bde1ea1bf7a9f8d264dc36dc3f9360145c78e12..6f513374851bfd2b405d920bf55e78b56cc5bd5e 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -9,13 +9,14 @@ import { PasswordResetDto } from './dto/reset-password.dto'; import { UsersService } from './users.service'; import { StructuresService } from '../structures/services/structures.service'; import { TempUserService } from '../temp-user/temp-user.service'; - +import { ConfigurationService } from '../configuration/configuration.service'; @Controller('users') export class UsersController { constructor( private usersService: UsersService, private structureService: StructuresService, - private tempUserService: TempUserService + private tempUserService: TempUserService, + private configurationService: ConfigurationService ) {} @UseGuards(JwtAuthGuard) @@ -40,6 +41,11 @@ export class UsersController { const user = await this.usersService.create(createUserDto); if (structureId) { this.usersService.updateStructureLinkedClaim(createUserDto.email, structureId); + this.structureService.sendAdminStructureNotification( + null, + this.configurationService.config.templates.adminStructureClaim.ejs, + this.configurationService.config.templates.adminStructureClaim.json + ); } // Remove temp user if exist const tempUser = await this.tempUserService.findOne(createUserDto.email); diff --git a/src/users/users.service.spec.ts b/src/users/users.service.spec.ts index 01f5207c753886b4a04644d506a7454f89ed52a4..558492b5df107e51b0380755c3ab14a8f29b46af 100644 --- a/src/users/users.service.spec.ts +++ b/src/users/users.service.spec.ts @@ -48,25 +48,48 @@ describe('UsersService', () => { changeEmailToken: '', resetPasswordToken: null, structuresLink: [], + structureOutdatedMailSent: [], + pendingStructuresLink: [], + name: 'Jacques', + surname: 'Dupont', + phone: '06 06 06 06 06', }; - const userDto: CreateUserDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR + const userDto: CreateUserDto = { + email: 'jacques.dupont@mii.com', + password: 'test1A!!', + name: 'Jacques', + surname: 'Dupont', + phone: '06 06 06 06 06', + }; //NOSONAR jest.spyOn(service, 'create').mockImplementation(async (): Promise<User> => result); expect(await service.create(userDto)).toBe(result); }); it('User should not be created, already exist', async () => { const result = new HttpException('User already exists', HttpStatus.BAD_REQUEST); - const userDto: CreateUserDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR + const userDto: CreateUserDto = { + email: 'jacques.dupont@mii.com', + password: 'test1A!!', + name: 'Jacques', + surname: 'Dupont', + phone: '06 06 06 06 06', + }; //NOSONAR jest.spyOn(service, 'create').mockImplementation(async (): Promise<any> => result); expect(await service.create(userDto)).toBe(result); }); it('User should not be created, weak password', async () => { const result = new HttpException( - 'Weak password, it must contain ne lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', + 'Weak password, it must contain one lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', HttpStatus.UNPROCESSABLE_ENTITY ); - const userDto: CreateUserDto = { email: 'jacques.dupont@mii.com', password: 'test' }; //NOSONAR + const userDto: CreateUserDto = { + email: 'jacques.dupont@mii.com', + password: 'test', + name: 'Jacques', + surname: 'Dupont', + phone: '06 06 06 06 06', + }; //NOSONAR jest.spyOn(service, 'create').mockImplementation(async (): Promise<any> => result); expect(await service.create(userDto)).toBe(result); }); @@ -85,6 +108,11 @@ describe('UsersService', () => { changeEmailToken: '', resetPasswordToken: null, structuresLink: [], + pendingStructuresLink: [], + structureOutdatedMailSent: [], + name: 'Jacques', + surname: 'Dupont', + phone: '06 06 06 06 06', }; const loginDto: LoginDto = { email: 'jacques.dupont@mii.com', password: 'test1A!!' }; //NOSONAR jest.spyOn(service, 'findByLogin').mockImplementation(async (): Promise<User> => result); @@ -143,6 +171,11 @@ describe('UsersService', () => { newEmail: 'test.dupont@mail.com', resetPasswordToken: '', structuresLink: [], + pendingStructuresLink: [], + structureOutdatedMailSent: [], + name: 'Jacques', + surname: 'Dupont', + phone: '06 06 06 06 06', changeEmailToken: '9bb3542bdc5ca8801ad4cee00403c1052bc95dee768dcbb65b1f719870578ed79f71f52fdc3e6bf02fd200a72b8b6f56fc26950df30c8cd7e427a485f80181b9', }; @@ -173,6 +206,11 @@ describe('UsersService', () => { resetPasswordToken: '', changeEmailToken: '', structuresLink: [], + pendingStructuresLink: [], + structureOutdatedMailSent: [], + name: 'Jacques', + surname: 'Dupont', + phone: '06 06 06 06 06', }; const token = '9bb3542bdc5ca8801ad4cee00403c1052bc95dee768dcbb65b1f719870578ed79f71f52fdc3e6bf02fd200a72b8b6f56fc26950df30c8cd7e427a485f80181b9'; //NOSONAR @@ -215,7 +253,7 @@ describe('UsersService', () => { it('should not validate new password: weak password', async () => { const result = new HttpException( - 'Weak password, it must contain ne lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', + 'Weak password, it must contain one lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', HttpStatus.UNPROCESSABLE_ENTITY ); jest.spyOn(service, 'validatePasswordResetToken').mockImplementation(async (): Promise<HttpException> => result); @@ -241,13 +279,13 @@ describe('UsersService', () => { it('should return structureLink tab ', async () => { const result = [53]; jest.spyOn(service, 'updateStructureLinked').mockImplementation(async (): Promise<any> => result); - expect(await service.updateStructureLinked('test@mii.com', 53)).toBe(result); + expect(await service.updateStructureLinked('test@mii.com', '6001a37716b08100062e4160')).toBe(result); }); it('should return invalid User ', async () => { const result = new HttpException('Invalid user', HttpStatus.NOT_FOUND); jest.spyOn(service, 'updateStructureLinked').mockImplementation(async (): Promise<any> => result); - expect(await service.updateStructureLinked('test@mii.com', 53)).toBe(result); + expect(await service.updateStructureLinked('test@mii.com', '6001a37716b08100062e4160')).toBe(result); }); }); }); diff --git a/src/users/users.service.ts b/src/users/users.service.ts index c7806f64e8ac23025e7aff33935f1fb1583e9adf..3782bd1d87544613dd9afe5a7915d220642bf77d 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -21,14 +21,14 @@ export class UsersService { * Create a user account * @param createUserDto CreateUserDto */ - public async create(createUserDto: CreateUserDto): Promise<User> { + public async create(createUserDto: CreateUserDto): Promise<User | HttpStatus> { const userInDb = await this.findOne(createUserDto.email); if (userInDb) { throw new HttpException('User already exists', HttpStatus.BAD_REQUEST); } if (!this.isStrongPassword(createUserDto.password)) { throw new HttpException( - 'Weak password, it must contain ne lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', + 'Weak password, it must contain one lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', HttpStatus.UNPROCESSABLE_ENTITY ); } @@ -57,7 +57,7 @@ export class UsersService { * @param password string */ private isStrongPassword(password: string): boolean { - const strongRegex = new RegExp('^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*])(?=.{8,})'); //NOSONAR + const strongRegex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[*.! @#$%^&(){}\[\]:;<>,?\/\\~_+\-=|])(?=.{8,})/; //NOSONAR return strongRegex.test(password); } @@ -138,24 +138,6 @@ export class UsersService { return user; } - /** - * Send to all admins validation email for structures - * a new account. - */ - private async sendAdminStructureValidationMail(): Promise<any> { - const config = this.mailerService.config; - const ejsPath = this.mailerService.getTemplateLocation(config.templates.adminStructureClaim.ejs); - const jsonConfig = this.mailerService.loadJsonConfig(config.templates.adminStructureClaim.json); - - const html = await ejs.renderFile(ejsPath, { - config, - }); - const admins = await this.getAdmins(); - admins.forEach((admin) => { - this.mailerService.send(admin.email, jsonConfig.subject, html); - }); - } - /** * Send to all admins mail for aptic duplicated data */ @@ -198,7 +180,7 @@ export class UsersService { * @param userId string * @param token string */ - public async validateUser(userId: string, token: string): Promise<User> { + public async validateUser(userId: string, token: string): Promise<User | HttpException> { const user = await this.findById(userId); if (user && user.validationToken === token) { user.validationToken = null; @@ -255,7 +237,7 @@ export class UsersService { } if (!this.isStrongPassword(newPassword)) { throw new HttpException( - 'Weak password, it must contain ne lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', + 'Weak password, it must contain one lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', HttpStatus.UNPROCESSABLE_ENTITY ); } @@ -299,7 +281,7 @@ export class UsersService { if (user) { if (!this.isStrongPassword(password)) { throw new HttpException( - 'Weak password, it must contain ne lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', + 'Weak password, it must contain one lowercase alphabetical character, one uppercase alphabetical character, one numeric character, one special character and be eight characters or longer', HttpStatus.UNPROCESSABLE_ENTITY ); } @@ -331,9 +313,28 @@ export class UsersService { return false; } + /** + * Send to all admins validation email for structures + * new account. + */ + private async sendAdminStructureValidationMail(): Promise<any> { + const config = this.mailerService.config; + const ejsPath = this.mailerService.getTemplateLocation(config.templates.adminStructureClaim.ejs); + const jsonConfig = this.mailerService.loadJsonConfig(config.templates.adminStructureClaim.json); + + const html = await ejs.renderFile(ejsPath, { + config, + }); + const admins = await this.getAdmins(); + admins.forEach((admin) => { + this.mailerService.send(admin.email, jsonConfig.subject, html); + }); + } + public async updateStructureLinkedClaim(userEmail: string, idStructure: string): Promise<Types.ObjectId[]> { const stucturesLinked = this.updatePendingStructureLinked(userEmail, idStructure); this.sendAdminStructureValidationMail(); + return stucturesLinked; } @@ -383,7 +384,7 @@ export class UsersService { if (user) { if (user.structuresLink.includes(Types.ObjectId(idStructure))) { user.structuresLink = user.structuresLink.filter((structureId) => { - return structureId == Types.ObjectId(idStructure); + return !structureId.equals(idStructure); }); await user.save(); return user.structuresLink; @@ -486,6 +487,14 @@ export class UsersService { return user.deleteOne(); } + public async deleteOneId(id: string): Promise<User> { + const user = await this.userModel.findOne({ _id: id }).exec(); + if (!user) { + throw new HttpException('Invalid user id', HttpStatus.BAD_REQUEST); + } + return user.deleteOne(); + } + public async getStructureOwnersMails(structureId: string, emailUser: string): Promise<OwnerDto[]> { const users = await this.userModel .find({ structuresLink: Types.ObjectId(structureId), email: { $ne: emailUser } }) @@ -499,4 +508,8 @@ export class UsersService { }); return owners; } + + public async searchUsers(searchString: string) { + return this.userModel.find({ email: new RegExp(searchString, 'i') }).exec(); + } } diff --git a/template.env b/template.env index 41cb576d15639e668ff90bbdadc2e508f70a9e03..027d8b6a62352ab2d9b95ae9c6d337d9e19d13c6 100644 --- a/template.env +++ b/template.env @@ -20,3 +20,10 @@ GHOST_CONTENT_API_KEY=<Ghost global api key, can be found in integration part of GHOST_ADMIN_API_KEY=<Ghost admin api key, can be found in integration part of ghost UI> GHOST_HOST_AND_PORT=<Ghost host and port, ex:http://localhost:2368> USER_PWD=<test user password, this password will be user by every test users> +ELASTICSEARCH_NODE=<elastic search container node> +ELASTICSEARCH_PATH=<elastic search container path> +ELASTICSEARCH_PORT=<elastic search port> +ELASTICSEARCH_USERNAME=<elastic search username> +ELASTICSEARCH_PASSWORD=<elastic search password> +ELASTIC_SECURITY=<elastic search security boolean (true = secure)> +KIBANA_PORT=<kibana port> \ No newline at end of file diff --git a/test/jest-e2e.json b/test/jest-e2e.json index e9d912f3e3cefc18505d3cd19b3a5a9f567f5de0..dece89cced28f1531d0a1dec57d83be79d488bb8 100644 --- a/test/jest-e2e.json +++ b/test/jest-e2e.json @@ -5,5 +5,6 @@ "testRegex": ".e2e-spec.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" - } + }, + "collectCoverage": true } diff --git a/test/jest.json b/test/jest.json new file mode 100644 index 0000000000000000000000000000000000000000..42ebab047a86e8e6ecaf5a0852056c3df9973cc1 --- /dev/null +++ b/test/jest.json @@ -0,0 +1,10 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": "../src", + "testEnvironment": "node", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "reporters": ["default", "jest-junit"], + "collectCoverage": true +} diff --git a/test/mock/guards/jwt-auth.mock.guard.ts b/test/mock/guards/jwt-auth.mock.guard.ts new file mode 100644 index 0000000000000000000000000000000000000000..d7392d9b9b5274778a22d37dc1b683ae0802ab1e --- /dev/null +++ b/test/mock/guards/jwt-auth.mock.guard.ts @@ -0,0 +1,2 @@ +import { CanActivate } from '@nestjs/common'; +export const mockJwtAuthGuard: CanActivate = { canActivate: jest.fn(() => true) }; diff --git a/test/mock/guards/role.mock.guard.ts b/test/mock/guards/role.mock.guard.ts new file mode 100644 index 0000000000000000000000000000000000000000..1f93ccdc0a52c5af9006e81442e00e6327664d3c --- /dev/null +++ b/test/mock/guards/role.mock.guard.ts @@ -0,0 +1,2 @@ +import { CanActivate } from '@nestjs/common'; +export const mockRoleGuard: CanActivate = { canActivate: jest.fn(() => true) }; diff --git a/test/mock/services/auth.mock.service.ts b/test/mock/services/auth.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..07d1d02da19bdb23dbcc9091f19daa557bfdc7be --- /dev/null +++ b/test/mock/services/auth.mock.service.ts @@ -0,0 +1,30 @@ +import { LoginDto } from '../../../src/auth/login-dto'; + +export class AuthServiceMock { + login(loginDto: LoginDto) { + if (loginDto.email === 'paula.dubois@mii.com') { + return { + _id: 'tsfsf6296', + validationToken: + 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', + emailVerified: true, + email: 'pauline.dupont@mii.com', + password: '$2a$12$vLQjJ9zAWyUwiFLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu', + role: 0, + name: 'DUBOIS', + surname: 'Paula', + }; + } + if (loginDto.email === 'jacques.dupont@mii.com') { + return { + _id: 'tsfsf6296', + validationToken: + 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', + emailVerified: false, + email: 'jacques.dupont@mii.com', + role: 0, + }; + } + return null; + } +} diff --git a/test/mock/services/categoriesAccompagnement.mock.service.ts b/test/mock/services/categoriesAccompagnement.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..00856ec270f151f9441339379269f479933c996f --- /dev/null +++ b/test/mock/services/categoriesAccompagnement.mock.service.ts @@ -0,0 +1,63 @@ +export class CategoriesAccompagnementServiceMock { + create() { + return { + modules: [ + { + id: 'tst', + text: 'Test', + }, + { + id: 'antst', + text: 'Another test', + }, + ], + name: 'test', + id: 'test', + __v: 0, + }; + } + + findAll() { + return [ + { + modules: [ + { + id: 'accompagnantCaf', + text: 'Accompagnant CAF', + }, + { + id: 'poleEmploi', + text: 'Pôle Emploi', + }, + { + id: 'cpam', + text: 'CPAM', + }, + { + id: 'impots', + text: 'Impôts', + }, + { + id: 'logement', + text: 'Logement', + }, + { + id: 'carsat', + text: 'CARSAT', + }, + { + id: 'demarcheMetropolitaine', + text: 'Démarches Métropolitaines', + }, + { + id: 'autres', + text: 'Autres', + }, + ], + name: 'Accompagnement des démarches', + id: 'proceduresAccompaniment', + __v: 0, + }, + ]; + } +} diff --git a/test/mock/services/categoriesFormations.mock.service.ts b/test/mock/services/categoriesFormations.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..da95bfec9da60a4845517c113d0a3d9a55dbfb98 --- /dev/null +++ b/test/mock/services/categoriesFormations.mock.service.ts @@ -0,0 +1,424 @@ +export class CategoriesFormationsServiceMock { + create() { + return { + modules: [ + { + id: 'tst', + text: 'Test', + }, + { + id: 'antst', + text: 'Another test', + }, + ], + name: 'test', + id: 'test', + __v: 0, + }; + } + + findAll() { + return [ + { + _id: '5fbb934180a5c257dc0161f6', + modules: [ + { + id: '84', + display_id: '84', + display_name: 'Modules APTIC - n°84', + digest: 'Pôle Emploi : faire ses déclarations en ligne', + text: 'Pôle Emploi : faire ses déclarations en ligne', + }, + { + id: '85', + display_id: '85', + display_name: 'Modules APTIC - n°85', + digest: 'Déclarer ses revenus en ligne et découvertes des services proposés', + text: 'Déclarer ses revenus en ligne et découvertes des services proposés', + }, + { + id: '86', + display_id: '86', + display_name: 'Modules APTIC - n°86', + digest: 'Accéder à ses droits sociaux et les gérer en ligne (RSA…)', + text: 'Accéder à ses droits sociaux et les gérer en ligne (RSA…)', + }, + { + id: '87', + display_id: '87', + display_name: 'Modules APTIC - n°87', + digest: 'Ouvrir et gérer son dossier de retraite (CNAF/CARSAT) en ligne', + text: 'Ouvrir et gérer son dossier de retraite (CNAF/CARSAT) en ligne', + }, + { + id: '88', + display_id: '88', + display_name: 'Modules APTIC - n°88', + digest: "Gérer son abonnement et ses factures d'électricité/gaz en ligne", + text: "Gérer son abonnement et ses factures d'électricité/gaz en ligne", + }, + { + id: '89', + display_id: '89', + display_name: 'Modules APTIC - n°89', + digest: "Gérer ses droits d'assuré social en ligne/sur internet", + text: "Gérer ses droits d'assuré social en ligne/sur internet", + }, + { + id: '93', + display_id: '93', + display_name: 'Modules APTIC - n°93', + digest: 'Plateforme Ameli.fr : la sécurité sociale en ligne', + text: 'Plateforme Ameli.fr : la sécurité sociale en ligne', + }, + { + id: '95', + display_id: '95', + display_name: 'Modules APTIC - n°95', + digest: 'Plateforme France Connect', + text: 'Plateforme France Connect', + }, + ], + name: 'Accès aux droits', + id: 'accessRight', + __v: 0, + }, + { + modules: [ + { + id: '260', + display_id: '260', + display_name: 'Modules APTIC - n°260', + digest: 'Maitrise de l’environnement d’un ordinateur (clavier, souris)', + text: 'Maitrise de l’environnement d’un ordinateur (clavier, souris)', + }, + { + id: '1', + display_id: '1', + display_name: 'Modules APTIC - n°1', + digest: 'Composantes et facettes de l’identité numérique', + text: 'Composantes et facettes de l’identité numérique', + }, + { + id: '11', + display_id: '11', + display_name: 'Modules APTIC - n°11', + digest: 'Internet : fonctionnement et outils de navigation web', + text: 'Internet : fonctionnement et outils de navigation web', + }, + { + id: '38', + display_id: '38', + display_name: 'Modules APTIC - n°38', + digest: 'Le smartphone : principes de fonctionnement', + text: 'Le smartphone : principes de fonctionnement', + }, + { + id: '48', + display_id: '48', + display_name: 'Modules APTIC - n°48', + digest: 'Internet : envoyer, recevoir, gérer ses emails', + text: 'Internet : envoyer, recevoir, gérer ses emails', + }, + { + id: '74', + display_id: '74', + display_name: 'Modules APTIC - n°74', + digest: 'Smartphones et Tablettes sous Androïd', + text: 'Smartphones et Tablettes sous Androïd', + }, + { + id: '77', + display_id: '77', + display_name: 'Modules APTIC - n°77', + digest: "Smartphone : Les principaux gestes pour l'écran tactile", + text: "Smartphone : Les principaux gestes pour l'écran tactile", + }, + ], + name: 'Les compétences de base', + id: 'baseSkills', + __v: 0, + }, + { + modules: [ + { + id: '3', + display_id: '3', + display_name: 'Modules APTIC - n°3', + digest: "Être parent à l'ère numérique: connaître les usages, jouer son rôle de parent", + text: "Être parent à l'ère numérique: connaître les usages, jouer son rôle de parent", + }, + { + id: '22', + display_id: '22', + display_name: 'Modules APTIC - n°22', + digest: 'Découvrir l’univers des jeux vidéo - 22', + text: 'Découvrir l’univers des jeux vidéo', + }, + { + id: '82', + display_id: '82', + display_name: 'Modules APTIC - n°82', + digest: 'Suivre la scolarité de son enfant - 82', + text: 'Suivre la scolarité de son enfant', + }, + { + id: '94', + display_id: '94', + display_name: 'Modules APTIC - n°94', + digest: "Découvrir les services en ligne de l'enfance de votre commune - 94", + text: "Découvrir les services en ligne de l'enfance de votre commune", + }, + ], + name: 'Aide à la parentalité', + id: 'parentingHelp', + __v: 0, + }, + { + modules: [ + { + id: '6', + display_id: '6', + display_name: 'Modules APTIC - n°6', + digest: "Utiliser les réseaux sociaux pour sa recherche d'emploi", + text: "Utiliser les réseaux sociaux pour sa recherche d'emploi", + }, + { + id: '20', + display_id: '20', + display_name: 'Modules APTIC - n°20', + digest: 'Panorama des plateformes de recherche d’emploi', + text: 'Panorama des plateformes de recherche d’emploi', + }, + { + id: '66', + display_id: '66', + display_name: 'Modules APTIC - n°66', + digest: 'Traitement de texte : découverte', + text: 'Traitement de texte : découverte', + }, + { + id: '67', + display_id: '67', + display_name: 'Modules APTIC - n°67', + digest: 'Traitement de texte : utilisation de base', + text: 'Traitement de texte : utilisation de base', + }, + { + id: '68', + display_id: '68', + display_name: 'Modules APTIC - n°68', + digest: 'Traitement de texte : utilisation avancée', + text: 'Traitement de texte : utilisation avancée', + }, + { + id: '69', + display_id: '69', + display_name: 'Modules APTIC - n°69', + digest: 'Tableur : découverte', + text: 'Tableur : découverte', + }, + { + id: '124', + display_id: '124', + display_name: 'Modules APTIC - n°124', + digest: 'Réalisation CV', + text: 'Réalisation CV', + }, + { + id: '125', + display_id: '125', + display_name: 'Modules APTIC - n°125', + digest: 'Diffuser son CV en ligne', + text: 'Diffuser son CV en ligne', + }, + { + id: '127', + display_id: '127', + display_name: 'Modules APTIC - n°127', + digest: "Organiser sa recherche d'emploi", + text: "Organiser sa recherche d'emploi", + }, + ], + name: 'Insertion sociale et professionnelle', + id: 'socialAndProfessional', + __v: 0, + }, + { + modules: [ + { + id: '6', + display_id: '6', + display_name: 'Modules APTIC - n°6', + digest: "Utiliser les réseaux sociaux pour sa recherche d'emploi", + text: "Utiliser les réseaux sociaux pour sa recherche d'emploi", + }, + { + id: '20', + display_id: '20', + display_name: 'Modules APTIC - n°20', + digest: 'Panorama des plateformes de recherche d’emploi', + text: 'Panorama des plateformes de recherche d’emploi', + }, + { + id: '66', + display_id: '66', + display_name: 'Modules APTIC - n°66', + digest: 'Traitement de texte : découverte', + text: 'Traitement de texte : découverte', + }, + { + id: '67', + display_id: '67', + display_name: 'Modules APTIC - n°67', + digest: 'Traitement de texte : utilisation de base', + text: 'Traitement de texte : utilisation de base', + }, + { + id: '68', + display_id: '68', + display_name: 'Modules APTIC - n°68', + digest: 'Traitement de texte : utilisation avancée', + text: 'Traitement de texte : utilisation avancée', + }, + { + id: '69', + display_id: '69', + display_name: 'Modules APTIC - n°69', + digest: 'Tableur : découverte', + text: 'Tableur : découverte', + }, + { + id: '124', + display_id: '124', + display_name: 'Modules APTIC - n°124', + digest: 'Réalisation CV', + text: 'Réalisation CV', + }, + { + id: '125', + display_id: '125', + display_name: 'Modules APTIC - n°125', + digest: 'Diffuser son CV en ligne', + text: 'Diffuser son CV en ligne', + }, + { + id: '127', + display_id: '127', + display_name: 'Modules APTIC - n°127', + digest: "Organiser sa recherche d'emploi", + text: "Organiser sa recherche d'emploi", + }, + ], + name: 'Insertion sociale et professionnelle', + id: 'socialAndProfessional', + __v: 0, + }, + { + modules: [ + { + id: '2', + display_id: '2', + display_name: 'Modules APTIC - n°2', + digest: 'Les conduites à risques et les bons usages du numérique - 02', + text: 'Les conduites à risques et les bons usages du numérique', + }, + { + id: '5', + display_id: '5', + display_name: 'Modules APTIC - n°5', + digest: 'Découvrir les réseaux sociaux : définition, fonctionnement - 05', + text: 'Découvrir les réseaux sociaux : définition, fonctionnement', + }, + { + id: '9', + display_id: '9', + display_name: 'Modules APTIC - n°9', + digest: 'Fablab : charte, valeurs et panorama des outils numériques - 09', + text: 'Fablab : charte, valeurs et panorama des outils numériques', + }, + { + id: '28', + display_id: '28', + display_name: 'Modules APTIC - n°28', + digest: 'Les paiements en ligne - 28', + text: 'Les paiements en ligne', + }, + { + id: '34', + display_id: '34', + display_name: 'Modules APTIC - n°34', + digest: 'Internet : comprendre les principes de fonctionnement - 35', + text: 'Internet : comprendre les principes de fonctionnement', + }, + { + id: '39', + display_id: '39', + display_name: 'Modules APTIC - n°39', + digest: 'Techniques de vérification de l’information - 39', + text: 'Techniques de vérification de l’information', + }, + { + id: '42', + display_id: '42', + display_name: 'Modules APTIC - n°42', + digest: 'Créer et paramétrer un compte Google - 42', + text: 'Créer et paramétrer un compte Google', + }, + { + id: '51', + display_id: '51', + display_name: 'Modules APTIC - n°51', + digest: 'Gérer ses données : sauvegarde en ligne (dans le cloud) - 51', + text: 'Gérer ses données : sauvegarde en ligne (dans le cloud)', + }, + { + id: '52', + display_id: '52', + display_name: 'Modules APTIC - n°52', + digest: 'Gérer ses données : sauvegardes locales (disques durs externes, clé USB) - 52', + text: 'Gérer ses données : sauvegardes locales (disques durs externes, clé USB)', + }, + { + id: '54', + display_id: '54', + display_name: 'Modules APTIC - n°54', + digest: 'Classer, gérer et partager ses photos - 54', + text: 'Classer, gérer et partager ses photos', + }, + { + id: '65', + display_id: '65', + display_name: 'Modules APTIC - n°65', + digest: 'Skype et autres outils de visioconférence - 65', + text: 'Skype et autres outils de visioconférence', + }, + { + id: '96', + display_id: '96', + display_name: 'Modules APTIC - n°96', + digest: 'Connaitre et gérer son identité numérique - 96', + text: 'Connaitre et gérer son identité numérique', + }, + { + id: '97', + display_id: '97', + display_name: 'Modules APTIC - n°97', + digest: 'Nettoyer son identité numérique - 97', + text: 'Nettoyer son identité numérique', + }, + { + id: '98', + display_id: '98', + display_name: 'Modules APTIC - n°98', + digest: 'Effacer ses traces sur le web, protéger ses données personnelles - 98', + text: 'Effacer ses traces sur le web, protéger ses données personnelles', + }, + ], + name: 'Culture et sécurité numérique', + id: 'digitalCultureSecurity', + __v: 0, + }, + ]; + } +} diff --git a/test/mock/services/categoriesOthers.mock.service.ts b/test/mock/services/categoriesOthers.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..70e0b3fa9de9d47913d317436e2d0d1dd7e1b92b --- /dev/null +++ b/test/mock/services/categoriesOthers.mock.service.ts @@ -0,0 +1,49 @@ +export class CategoriesOthersServiceMock { + create() { + return { + modules: [ + { + id: 'tst', + text: 'Test', + }, + ], + name: 'test', + id: 'test', + __v: 0, + }; + } + + findAll() { + return [ + { + modules: [ + { + id: "Personnes en situation d'illettrisme", + text: "Personnes en situation d'illettrisme", + }, + { + id: 'Langue étrangère (anglais)', + text: 'Langue étrangère (anglais)', + }, + { + id: 'Langues étrangères (autres)', + text: 'Langues étrangères (autres)', + }, + { + id: 'Surdité', + text: 'Surdité', + }, + { + id: 'Déficience visuelle', + text: 'Déficience visuelle', + }, + { + id: 'Handicap moteur', + text: 'Handicap moteur', + }, + ], + name: 'Accompagnement des publics spécifique', + }, + ]; + } +} diff --git a/test/mock/services/http.mock.service.ts b/test/mock/services/http.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..2295a70104969be97a1218df189c2e5a1f145d8e --- /dev/null +++ b/test/mock/services/http.mock.service.ts @@ -0,0 +1,8 @@ +import { AxiosRequestConfig, AxiosResponse } from 'axios'; +import { Observable } from 'rxjs'; + +export class HttpServiceMock { + get<T = any>(url: string, config?: AxiosRequestConfig): Observable<AxiosResponse<T>> { + return; + } +} diff --git a/test/mock/services/jwt.mock.service.ts b/test/mock/services/jwt.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a5c81b3344c930122a768d11f9db8ca49c55f67c --- /dev/null +++ b/test/mock/services/jwt.mock.service.ts @@ -0,0 +1,5 @@ +export class JwtServiceMock { + sign() { + return 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InBhdWxpbmUuZHVwb250QG1paS5jb20iLCJyb2xlIjowLCJpYXQiOjE2MjAwNDg5MDYsImV4cCI6MTYyMDEzNTMwNn0.jbLazQNJzU_X9Yp1S7XH1rYD5W7yyd1pdGebmkyTMB4'; + } +} diff --git a/test/mock/services/newsletter.mock.service.ts b/test/mock/services/newsletter.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..d7b4d640c0d9cd298961fe88a660aeebbb158b1d --- /dev/null +++ b/test/mock/services/newsletter.mock.service.ts @@ -0,0 +1,58 @@ +import { HttpException, HttpStatus } from '@nestjs/common'; + +export class NewsletterServiceMock { + findAll() { + return [ + { + _id: '607063e22b016303ad97f367', + email: 'xavier@mii.fr', + createdAt: '2021-04-09T10:14:01.939Z', + updatedAt: '2021-04-09T10:14:01.939Z', + }, + { + _id: '607063e22b016303ad97f368', + email: 'paula.dubois@mii.com', + createdAt: '2021-04-09T10:14:01.939Z', + updatedAt: '2021-04-09T10:14:01.939Z', + }, + { + _id: '607063e22b016303ad97f369', + email: 'a@a.com', + createdAt: '2021-04-09T10:14:01.939Z', + updatedAt: '2021-04-09T10:14:01.939Z', + }, + ]; + } + + searchNewsletterSubscription(search: string) { + if (search === 'a@a.com') { + return [ + { + _id: '607063e22b016303ad97f369', + email: 'a@a.com', + createdAt: '2021-04-09T10:14:01.939Z', + updatedAt: '2021-04-09T10:14:01.939Z', + }, + ]; + } + return []; + } + + countNewsletterSubscriptions() { + return new Promise((resolve) => { + resolve(246); + }); + } + + deleteOneEmail(email: string) { + if (email === 'test@test.com') { + throw new HttpException('Invalid email', HttpStatus.BAD_REQUEST); + } + return { + _id: '607063e22b016303ad97f397', + email: 'a@a.com', + createdAt: '2021-04-09T10:14:01.939Z', + updatedAt: '2021-04-09T10:14:01.939Z', + }; + } +} diff --git a/test/mock/services/structures.mock.service.ts b/test/mock/services/structures.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..a3432c034ab8ecb859199518b728d59adf6b5c8c --- /dev/null +++ b/test/mock/services/structures.mock.service.ts @@ -0,0 +1,638 @@ +import { HttpException, HttpStatus } from '@nestjs/common'; + +export class StructuresServiceMock { + findOne(id) { + if (id === '6093ba0e2ab5775cfc01ed3e') { + return { + _id: '6093ba0e2ab5775cfc01ed3e', + coord: [4.8498155, 45.7514817], + equipmentsAndServices: ['wifiEnAccesLibre'], + digitalCultureSecurity: [], + parentingHelp: [], + socialAndProfessional: [], + accessRight: [], + baseSkills: [], + proceduresAccompaniment: [], + publicsAccompaniment: [], + publics: ['adultes'], + labelsQualifications: [], + accessModality: ['telephoneVisio'], + structureType: null, + structureName: 'a', + description: null, + lockdownActivity: null, + address: { + numero: null, + street: 'Rue Alphonse Daudet', + commune: 'Lyon 7ème Arrondissement', + }, + contactMail: '', + contactPhone: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + linkedin: null, + hours: { + monday: { + open: false, + time: [], + }, + tuesday: { + open: false, + time: [], + }, + wednesday: { + open: false, + time: [], + }, + thursday: { + open: false, + time: [], + }, + friday: { + open: false, + time: [], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + pmrAccess: false, + exceptionalClosures: null, + otherDescription: null, + nbComputers: 1, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + nbScanners: 1, + freeWorkShop: false, + accountVerified: true, + createdAt: '2021-05-06T09:42:38.000Z', + updatedAt: '2021-05-06T09:42:50.000Z', + __v: 0, + }; + } + + if (id === '6903ba0e2ab5775cfc01ed4d') { + return { + _id: '6903ba0e2ab5775cfc01ed4d', + structureType: null, + digitalCultureSecurity: ['2', '5', '9', '28', '34', '39', '42', '51', '52', '54', '65', '96', '97', '98'], + parentingHelp: ['3', '22', '82', '94'], + socialAndProfessional: ['6', '20', '66', '67', '68', '69', '124', '125', '127'], + accessRight: ['84', '85', '86', '87', '88', '89', '93', '95'], + baseSkills: ['260', '1', '11', '38', '48', '74', '77'], + proceduresAccompaniment: ['cpam', 'impots', 'carsat', 'poleEmploi'], + publics: ['toutPublic'], + labelsQualifications: ['passNumerique', 'espacePublicNumeriqueepn'], + accessModality: ['accesLibre', 'telephoneVisio', 'surRdv'], + freeWorkShop: false, + createdAt: '2020-11-16T09:30:00.000Z', + updatedAt: '2021-04-12T08:48:00.000Z', + structureName: "L'Atelier Numérique", + description: + "L'Atelier Numérique est l'Espace Public Numérique des Centres Sociaux de Rillieux-la-Pape, ayant pour mission la médiation numérique pour toutes et tous.", + lockdownActivity: + 'accesLibres, permanences numériques téléphoniques, cours et ateliers à distance, formations professionnelles.', + contactPhone: '', + contactMail: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + pmrAccess: true, + exceptionalClosures: '', + jaccompagneLesUsagersDansLeursDemarchesEnLigne: true, + publicsAccompaniment: [], + autresAccompagnements: '', + equipmentsAndServices: ['ordinateurs', 'tablettes'], + nbComputers: 16, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + hours: { + monday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + tuesday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + wednesday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + thursday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + friday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + ], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + __v: 0, + address: { + numero: '30 bis', + street: 'Avenue Leclerc', + commune: 'Rillieux-la-Pape', + }, + coord: [4.9036773, 45.8142196], + accountVerified: true, + linkedin: null, + nbScanners: 1, + otherDescription: null, + }; + } + + return null; + } + + deleteOne(id) { + if (id === '6903ba0e2ab5775cfc01ed4d') { + return { + _id: '6903ba0e2ab5775cfc01ed4d', + structureType: null, + digitalCultureSecurity: ['2', '5', '9', '28', '34', '39', '42', '51', '52', '54', '65', '96', '97', '98'], + parentingHelp: ['3', '22', '82', '94'], + socialAndProfessional: ['6', '20', '66', '67', '68', '69', '124', '125', '127'], + accessRight: ['84', '85', '86', '87', '88', '89', '93', '95'], + baseSkills: ['260', '1', '11', '38', '48', '74', '77'], + proceduresAccompaniment: ['cpam', 'impots', 'carsat', 'poleEmploi'], + publics: ['toutPublic'], + labelsQualifications: ['passNumerique', 'espacePublicNumeriqueepn'], + accessModality: ['accesLibre', 'telephoneVisio', 'surRdv'], + freeWorkShop: false, + createdAt: '2020-11-16T09:30:00.000Z', + updatedAt: '2021-04-12T08:48:00.000Z', + structureName: "L'Atelier Numérique", + description: + "L'Atelier Numérique est l'Espace Public Numérique des Centres Sociaux de Rillieux-la-Pape, ayant pour mission la médiation numérique pour toutes et tous.", + lockdownActivity: + 'accesLibres, permanences numériques téléphoniques, cours et ateliers à distance, formations professionnelles.', + contactPhone: '', + contactMail: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + pmrAccess: true, + exceptionalClosures: '', + jaccompagneLesUsagersDansLeursDemarchesEnLigne: true, + publicsAccompaniment: [], + autresAccompagnements: '', + equipmentsAndServices: ['ordinateurs', 'tablettes'], + nbComputers: 16, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + hours: { + monday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + tuesday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + wednesday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + thursday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + { + closing: '17:00', + opening: '13:30', + }, + ], + }, + friday: { + open: true, + time: [ + { + closing: '12:30', + opening: '9:00', + }, + ], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + __v: 0, + address: { + numero: '30 bis', + street: 'Avenue Leclerc', + commune: 'Rillieux-la-Pape', + }, + coord: [4.9036773, 45.8142196], + accountVerified: true, + linkedin: null, + nbScanners: 1, + otherDescription: null, + }; + } + + throw new HttpException('Invalid structure id', HttpStatus.BAD_REQUEST); + } + + findAll() { + return [ + { + _id: '6093ba0e2ab5775cfc01abce', + coord: [4.8498155, 45.7514817], + equipmentsAndServices: ['wifiEnAccesLibre'], + digitalCultureSecurity: [], + parentingHelp: [], + socialAndProfessional: [], + accessRight: [], + baseSkills: [], + proceduresAccompaniment: [], + publicsAccompaniment: [], + publics: ['adultes'], + labelsQualifications: [], + accessModality: ['telephoneVisio'], + structureType: null, + structureName: 'a', + description: null, + lockdownActivity: null, + address: { + numero: null, + street: 'Rue Alphonse Daudet', + commune: 'Lyon 7ème Arrondissement', + }, + contactMail: '', + contactPhone: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + linkedin: null, + hours: { + monday: { + open: false, + time: [], + }, + tuesday: { + open: false, + time: [], + }, + wednesday: { + open: false, + time: [], + }, + thursday: { + open: false, + time: [], + }, + friday: { + open: false, + time: [], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + pmrAccess: false, + exceptionalClosures: null, + otherDescription: null, + nbComputers: 1, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + nbScanners: 1, + freeWorkShop: false, + accountVerified: true, + createdAt: '2021-05-06T09:42:38.000Z', + updatedAt: '2021-05-06T09:42:50.000Z', + __v: 0, + }, + { + _id: '6093ba0e2ab5775cfc01fffe', + coord: [4.8498155, 45.7514817], + equipmentsAndServices: ['wifiEnAccesLibre'], + digitalCultureSecurity: [], + parentingHelp: [], + socialAndProfessional: [], + accessRight: [], + baseSkills: [], + proceduresAccompaniment: [], + publicsAccompaniment: [], + publics: ['adultes'], + labelsQualifications: [], + accessModality: ['telephoneVisio'], + structureType: null, + structureName: 'a', + description: null, + lockdownActivity: null, + address: { + numero: null, + street: 'Rue Alphonse Daudet', + commune: 'Lyon 7ème Arrondissement', + }, + contactMail: '', + contactPhone: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + linkedin: null, + hours: { + monday: { + open: false, + time: [], + }, + tuesday: { + open: false, + time: [], + }, + wednesday: { + open: false, + time: [], + }, + thursday: { + open: false, + time: [], + }, + friday: { + open: false, + time: [], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + pmrAccess: false, + exceptionalClosures: null, + otherDescription: null, + nbComputers: 1, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + nbScanners: 1, + freeWorkShop: false, + accountVerified: true, + createdAt: '2021-05-06T09:42:38.000Z', + updatedAt: '2021-05-06T09:42:50.000Z', + __v: 0, + }, + ]; + } + + findAllUnclaimed() { + return [ + { + _id: '6093ba0e2ab5775cfc01abcd', + coord: [4.8498155, 45.7514817], + equipmentsAndServices: ['wifiEnAccesLibre'], + digitalCultureSecurity: [], + parentingHelp: [], + socialAndProfessional: [], + accessRight: [], + baseSkills: [], + proceduresAccompaniment: [], + publicsAccompaniment: [], + publics: ['adultes'], + labelsQualifications: [], + accessModality: ['telephoneVisio'], + structureType: null, + structureName: 'a', + description: null, + lockdownActivity: null, + address: { + numero: null, + street: 'Rue Alphonse Daudet', + commune: 'Lyon 7ème Arrondissement', + }, + contactMail: '', + contactPhone: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + linkedin: null, + hours: { + monday: { + open: false, + time: [], + }, + tuesday: { + open: false, + time: [], + }, + wednesday: { + open: false, + time: [], + }, + thursday: { + open: false, + time: [], + }, + friday: { + open: false, + time: [], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + pmrAccess: false, + exceptionalClosures: null, + otherDescription: null, + nbComputers: 1, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + nbScanners: 1, + freeWorkShop: false, + accountVerified: true, + createdAt: '2021-05-06T09:42:38.000Z', + updatedAt: '2021-05-06T09:42:50.000Z', + __v: 0, + }, + { + _id: '6093ba0e2ab5775cfc01ffff', + coord: [4.8498155, 45.7514817], + equipmentsAndServices: ['wifiEnAccesLibre'], + digitalCultureSecurity: [], + parentingHelp: [], + socialAndProfessional: [], + accessRight: [], + baseSkills: [], + proceduresAccompaniment: [], + publicsAccompaniment: [], + publics: ['adultes'], + labelsQualifications: [], + accessModality: ['telephoneVisio'], + structureType: null, + structureName: 'a', + description: null, + lockdownActivity: null, + address: { + numero: null, + street: 'Rue Alphonse Daudet', + commune: 'Lyon 7ème Arrondissement', + }, + contactMail: '', + contactPhone: '', + website: '', + facebook: null, + twitter: null, + instagram: null, + linkedin: null, + hours: { + monday: { + open: false, + time: [], + }, + tuesday: { + open: false, + time: [], + }, + wednesday: { + open: false, + time: [], + }, + thursday: { + open: false, + time: [], + }, + friday: { + open: false, + time: [], + }, + saturday: { + open: false, + time: [], + }, + sunday: { + open: false, + time: [], + }, + }, + pmrAccess: false, + exceptionalClosures: null, + otherDescription: null, + nbComputers: 1, + nbPrinters: 1, + nbTablets: 1, + nbNumericTerminal: 1, + nbScanners: 1, + freeWorkShop: false, + accountVerified: true, + createdAt: '2021-05-06T09:42:38.000Z', + updatedAt: '2021-05-06T09:42:50.000Z', + __v: 0, + }, + ]; + } +} diff --git a/test/mock/services/tempUser.mock.service.ts b/test/mock/services/tempUser.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..8769fa94f3b52596b1a366312475df0f08b05830 --- /dev/null +++ b/test/mock/services/tempUser.mock.service.ts @@ -0,0 +1 @@ +export class TempUserServiceMock {} diff --git a/test/mock/services/user.mock.service.ts b/test/mock/services/user.mock.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..cd00bb6011952deba844c48bc3c9e5fe170805c8 --- /dev/null +++ b/test/mock/services/user.mock.service.ts @@ -0,0 +1,190 @@ +import { HttpException, HttpStatus } from '@nestjs/common'; +import { PendingStructureDto } from '../../../src/admin/dto/pending-structure.dto'; +import { LoginDto } from '../../../src/auth/login-dto'; + +export class UsersServiceMock { + findOne(mail: string, passwordQuery?: boolean) { + if (mail === 'pauline.dupont@mii.com') { + return { + _id: 'tsfsf6296', + validationToken: + 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', + emailVerified: true, + email: 'pauline.dupont@mii.com', + password: '$2a$12$vLQjJ9zAWyUwiFLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu', + role: 0, + name: 'DUPONT', + surname: 'Pauline', + }; + } + if (mail === 'jacques.dupont@mii.com') { + if (passwordQuery) { + return { + _id: 'tsfsf6296', + validationToken: + 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', + emailVerified: false, + email: 'jacques.dupont@mii.com', + password: '$2a$12$vLQjJ9zAWyUwiFLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu', + role: 0, + }; + } + return { + _id: 'tsfsf6296', + validationToken: + 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', + emailVerified: false, + email: 'jacques.dupont@mii.com', + role: 0, + }; + } + return null; + } + + findByLogin({ email, password }: LoginDto) { + const user = this.findOne(email, true); + + if (!user) { + throw new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); + } + + let areEqual = true; + if (password === '1') { + areEqual = false; + } + + if (!areEqual) { + throw new HttpException('Invalid credentials', HttpStatus.UNAUTHORIZED); + } + + return user; + } + + getPendingStructures() { + return [ + { + structureId: '6093ba0e2ab5775cfc01ed3e', + structureName: 'a', + userEmail: 'paula.dubois@mii.com', + }, + { + structureId: '6903ba0e2ab5775cfc01ed4d', + structureName: "L'Atelier Numérique", + userEmail: 'jacques.dupont@mii.com', + }, + ]; + } + + validatePendingStructure(): PendingStructureDto[] { + return this.getPendingStructures(); + } + + deleteOneId(id: string) { + if (id === 'tsfsf6296') { + return { + _id: 'tsfsf6296', + validationToken: + 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', + emailVerified: true, + email: 'pauline.dupont@mii.com', + password: '$2a$12$vLQjJ9zAWyUwiFLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu', + role: 0, + name: 'DUPONT', + surname: 'Pauline', + structuresLink: ['abcdefgh', '18sfqfq'], + }; + } + throw new HttpException('Invalid user id', HttpStatus.BAD_REQUEST); + } + + isStructureClaimed(id: string) { + if (id === 'abcdefgh') { + return new Promise((resolve) => { + resolve({ + _id: 'abcdefgh', + validationToken: + 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', + emailVerified: true, + email: 'pauline.dupont@mii.com', + password: '$2a$12$vLQjJ9zAWyUwiFLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu', + role: 0, + name: 'DUPONT', + surname: 'Pauline', + structuresLink: ['abcdefgh', '18sfqfq', '6093ba0e2ab5775cfc01fffe'], + }); + }); + } + return new Promise((resolve) => { + resolve(null); + }); + } + + searchUsers(searchString: string) { + if (searchString === 'a@a.com') { + return [ + { + structureOutdatedMailSent: [], + pendingStructuresLink: ['6001a48e16b08100062e4180', '6093ba0e2ab5775cfc01fffe'], + structuresLink: ['6093ba0e2ab5775cfc01fffe'], + newEmail: null, + changeEmailToken: null, + role: 0, + resetPasswordToken: null, + validationToken: + 'b2b6caca1d38ca26d203b5f12b0d925df2928fab8ee7ccf9bbe78802ffa625f5abce825783bc62d0b11be5a90132cf5045a9a7776f01694c63b60bf64b0f680f', + emailVerified: false, + _id: '6036721022462b001334c4bb', + email: 'a@a.com', + name: 'Xavier', + surname: 'NIEL', + phone: '06 11 11 11 11', + password: '$2a$12$vLQjJ9zAWyUwiXLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu', + __v: 1, + }, + ]; + } + return []; + } + + findAll() { + return [ + { + structureOutdatedMailSent: [], + pendingStructuresLink: ['6001a48e16b08100062e4180', '6093ba0e2ab5775cfc01fffe'], + structuresLink: ['6093ba0e2ab5775cfc01fffe'], + newEmail: null, + changeEmailToken: null, + role: 0, + resetPasswordToken: null, + validationToken: + 'b2b6caca1d38ca26d203b5f12b0d925df2928fab8ee7ccf9bbe78802ffa625f5abce825783bc62d0b11be5a90132cf5045a9a7776f01694c63b60bf64b0f680f', + emailVerified: false, + _id: '6036721022462b001334c4bb', + email: 'a@a.com', + name: 'Xavier', + surname: 'NIEL', + phone: '06 11 11 11 11', + password: '$2a$12$vLQjJ9zAWyUwiXLeQDa6w.XzrlgPBhw.2GWrjog/yuEjIaZnQwmZu', + __v: 1, + }, + { + structureOutdatedMailSent: [], + pendingStructuresLink: ['6001a3c216b08100062e4169', '601d6aa2c94cf895c4e23860', '6093ba0e2ab5775cfc01fffe'], + structuresLink: ['6037aa17d8189c0014f62421', '6093ba0e2ab5775cfc01fffe'], + newEmail: null, + changeEmailToken: null, + role: 0, + resetPasswordToken: null, + validationToken: null, + emailVerified: true, + _id: '6037aa16d8189c0014f6241f', + email: 'ptitduf@mii.com', + name: 'hjhj', + surname: 'hh', + phone: '05 79 87 65 78', + password: '$2a$12$vLQjJ9zAWyUwiXLeQDa6w.3KdcYb.cLqZzkX2rstcpc2QTgbJ0FlC', + __v: 3, + }, + ]; + } +}