From db020da38701c52e46f59c0c187caf00466274c4 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 16:14:39 +0200 Subject: [PATCH 001/144] add commit hash with link to github into frontend --- .env.shell | 1 + deployment/bare_metal/build_frontend.sh | 4 +++- frontend/src/views/Layout/ContentFooter.vue | 5 +++++ frontend/vue.config.js | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 .env.shell diff --git a/.env.shell b/.env.shell new file mode 100644 index 000000000..ac6181fc5 --- /dev/null +++ b/.env.shell @@ -0,0 +1 @@ +BUILD_COMMIT="$(git rev-parse HEAD)" \ No newline at end of file diff --git a/deployment/bare_metal/build_frontend.sh b/deployment/bare_metal/build_frontend.sh index fc0feb747..2e7e59381 100755 --- a/deployment/bare_metal/build_frontend.sh +++ b/deployment/bare_metal/build_frontend.sh @@ -2,7 +2,9 @@ # For that to work, node v12.19.0 needs to be installed with nvm for root # or NPM_BIN Path and NVM_DIR must be adjusted -cd /var/www/html/gradido/frontend +cd /var/www/html/gradido +eval "echo \"$(cat .env.shell)\"" > .env +cd frontend NPM_BIN=/root/.nvm/versions/node/v12.19.0/bin/npm diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/views/Layout/ContentFooter.vue index 09a2418fd..2584747b1 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/views/Layout/ContentFooter.vue @@ -15,6 +15,9 @@ App version {{ version }} + + {{ shortHash }} + @@ -59,6 +62,8 @@ export default { return { year: new Date().getFullYear(), version: CONFIG.APP_VERSION, + hash: process.env.VUE_APP_BUILD_COMMIT, + shortHash: process.env.VUE_APP_BUILD_COMMIT.substr(0, 8), } }, } diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 9fffda28c..698aca1de 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,6 +1,8 @@ const path = require('path') const dotenv = require('dotenv-webpack') +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT + // vue.config.js module.exports = { devServer: { From 0413e13ee0efe9a1be979228a3fb425547678be9 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 17:12:53 +0200 Subject: [PATCH 002/144] add BUILD_COMMIT to test --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4606566df..04b004ae3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -297,7 +297,7 @@ jobs: ########################################################################## - name: frontend | Unit tests run: | - docker run -v ~/coverage:/app/coverage --rm gradido/frontend:test yarn run test + docker run -e BUILD_COMMIT="$(git rev-parse HEAD)" -v ~/coverage:/app/coverage --rm gradido/frontend:test yarn run test cp -r ~/coverage ./coverage ########################################################################## # COVERAGE REPORT FRONTEND ################################################ From 761bd17290c55fd42632f47d5d9fea5913987680 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 17:27:51 +0200 Subject: [PATCH 003/144] next try --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 04b004ae3..b12e1c152 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: ########################################################################## - name: Frontend | Build `test` image run: | - docker build --target test -t "gradido/frontend:test" frontend/ + docker build -e BUILD_COMMIT="$(git rev-parse HEAD)" --target test -t "gradido/frontend:test" frontend/ docker save "gradido/frontend:test" > /tmp/frontend.tar - name: Upload Artifact uses: actions/upload-artifact@v2 From 2937fc7c07c1058bb66f5db34b952e407791574a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 17:32:23 +0200 Subject: [PATCH 004/144] replace -e with --build-arg in docker build call --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b12e1c152..f79959234 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: ########################################################################## - name: Frontend | Build `test` image run: | - docker build -e BUILD_COMMIT="$(git rev-parse HEAD)" --target test -t "gradido/frontend:test" frontend/ + docker build --build-arg BUILD_COMMIT="$(git rev-parse HEAD)" --target test -t "gradido/frontend:test" frontend/ docker save "gradido/frontend:test" > /tmp/frontend.tar - name: Upload Artifact uses: actions/upload-artifact@v2 From e7c1771d2adca5a52afd41cb34bd80f17d868e3a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 17:44:44 +0200 Subject: [PATCH 005/144] try with default value --- .github/workflows/test.yml | 4 ++-- frontend/vue.config.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f79959234..4606566df 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: ########################################################################## - name: Frontend | Build `test` image run: | - docker build --build-arg BUILD_COMMIT="$(git rev-parse HEAD)" --target test -t "gradido/frontend:test" frontend/ + docker build --target test -t "gradido/frontend:test" frontend/ docker save "gradido/frontend:test" > /tmp/frontend.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -297,7 +297,7 @@ jobs: ########################################################################## - name: frontend | Unit tests run: | - docker run -e BUILD_COMMIT="$(git rev-parse HEAD)" -v ~/coverage:/app/coverage --rm gradido/frontend:test yarn run test + docker run -v ~/coverage:/app/coverage --rm gradido/frontend:test yarn run test cp -r ~/coverage ./coverage ########################################################################## # COVERAGE REPORT FRONTEND ################################################ diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 698aca1de..dc406c98a 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,7 +1,7 @@ const path = require('path') const dotenv = require('dotenv-webpack') -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT ? process.env.BUILD_COMMIT : '000000000' // vue.config.js module.exports = { From e355271ea80a30026d775354209aa1a9c61a3863 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 7 Sep 2021 11:36:11 +0200 Subject: [PATCH 006/144] update default --- frontend/vue.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/vue.config.js b/frontend/vue.config.js index dc406c98a..5a8495cc2 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,7 +1,7 @@ const path = require('path') const dotenv = require('dotenv-webpack') -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT ? process.env.BUILD_COMMIT : '000000000' +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT || '000000000' // vue.config.js module.exports = { From e24c3e21a689f47ed025498c6d18d62cd64ef645 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 7 Sep 2021 11:48:42 +0200 Subject: [PATCH 007/144] additional zero check for fixing broken tests --- frontend/src/views/Layout/ContentFooter.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/views/Layout/ContentFooter.vue index 2584747b1..6bf24af23 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/views/Layout/ContentFooter.vue @@ -63,7 +63,10 @@ export default { year: new Date().getFullYear(), version: CONFIG.APP_VERSION, hash: process.env.VUE_APP_BUILD_COMMIT, - shortHash: process.env.VUE_APP_BUILD_COMMIT.substr(0, 8), + shortHash: + process.env.VUE_APP_BUILD_COMMIT !== undefined + ? process.env.VUE_APP_BUILD_COMMIT.substr(0, 8) + : '00000000', } }, } From 434fbb6d2f9f93ea4543c4df25ba6e9faf6e14be Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 9 Sep 2021 12:52:54 +0200 Subject: [PATCH 008/144] adding moritz suggestion to don't show the commit hash link if no commit hash was given --- frontend/src/views/Layout/ContentFooter.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/views/Layout/ContentFooter.vue index 6bf24af23..97c27230f 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/views/Layout/ContentFooter.vue @@ -15,7 +15,11 @@ App version {{ version }} - + {{ shortHash }} From 27e99fbd03f256362d81c4132ad0431db7971399 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 9 Sep 2021 13:04:04 +0200 Subject: [PATCH 009/144] make it possible to use additional local .env entries --- .env.local.dist | 1 + deployment/bare_metal/build_frontend.sh | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .env.local.dist diff --git a/.env.local.dist b/.env.local.dist new file mode 100644 index 000000000..951a04b94 --- /dev/null +++ b/.env.local.dist @@ -0,0 +1 @@ +// for local .env entries \ No newline at end of file diff --git a/deployment/bare_metal/build_frontend.sh b/deployment/bare_metal/build_frontend.sh index 2e7e59381..2e968179d 100755 --- a/deployment/bare_metal/build_frontend.sh +++ b/deployment/bare_metal/build_frontend.sh @@ -3,7 +3,8 @@ # or NPM_BIN Path and NVM_DIR must be adjusted cd /var/www/html/gradido -eval "echo \"$(cat .env.shell)\"" > .env +eval "echo \"$(cat .env.local)\"" > .env +eval "echo \"$(cat .env.shell)\"" >> .env cd frontend NPM_BIN=/root/.nvm/versions/node/v12.19.0/bin/npm From a1db1153368a42daf921e3dc5fb8c4a8bf1c0761 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 10 Sep 2021 15:38:05 +0200 Subject: [PATCH 010/144] encapsulate --- frontend/src/config/index.js | 1 + frontend/src/views/Layout/ContentFooter.vue | 7 ++----- frontend/vue.config.js | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index dd35eb185..fbef2abbb 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -20,6 +20,7 @@ const CONFIG = { ...environment, ...server, APP_VERSION: pkg.version, + COMMIT_HASH: process.env.VUE_APP_BUILD_COMMIT, } export default CONFIG diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/views/Layout/ContentFooter.vue index 97c27230f..c18608545 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/views/Layout/ContentFooter.vue @@ -66,11 +66,8 @@ export default { return { year: new Date().getFullYear(), version: CONFIG.APP_VERSION, - hash: process.env.VUE_APP_BUILD_COMMIT, - shortHash: - process.env.VUE_APP_BUILD_COMMIT !== undefined - ? process.env.VUE_APP_BUILD_COMMIT.substr(0, 8) - : '00000000', + hash: CONFIG.COMMIT_HASH, + shortHash: CONFIG.COMMIT_HASH.substr(0, 8), } }, } diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 5a8495cc2..79917948c 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,7 +1,7 @@ const path = require('path') const dotenv = require('dotenv-webpack') -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT || '000000000' +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT || '00000000' // vue.config.js module.exports = { From b5eaf30ee44a53cf985eff64a26cb32563e3a25a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 10 Sep 2021 18:05:11 +0200 Subject: [PATCH 011/144] add additional check --- frontend/src/config/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index fbef2abbb..a7807b57c 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -20,7 +20,7 @@ const CONFIG = { ...environment, ...server, APP_VERSION: pkg.version, - COMMIT_HASH: process.env.VUE_APP_BUILD_COMMIT, + COMMIT_HASH: process.env.VUE_APP_BUILD_COMMIT || '00000000', } export default CONFIG From 6e1b0e8586c4be11aa39ff79f8e4ee7f15f608f0 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 14 Sep 2021 11:23:41 +0200 Subject: [PATCH 012/144] ... --- frontend/src/config/index.js | 8 +++++++- frontend/vue.config.js | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index a7807b57c..878ed3c55 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -16,11 +16,17 @@ const server = { GRAPHQL_URI: process.env.GRAPHQL_URI || 'http://localhost:4000/graphql', } +// eslint-disable-next-line no-console +console.log('hash: %o', process.env.VUE_APP_BUILD_COMMIT) + const CONFIG = { ...environment, ...server, APP_VERSION: pkg.version, - COMMIT_HASH: process.env.VUE_APP_BUILD_COMMIT || '00000000', + COMMIT_HASH: + process.env.VUE_APP_BUILD_COMMIT === 'undefined' + ? '00000000' + : process.env.VUE_APP_BUILD_COMMIT, } export default CONFIG diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 79917948c..698aca1de 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,7 +1,7 @@ const path = require('path') const dotenv = require('dotenv-webpack') -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT || '00000000' +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT // vue.config.js module.exports = { From 980e6e0a1cde1a32efb2f511aa4a4965a239f812 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 16:14:39 +0200 Subject: [PATCH 013/144] add commit hash with link to github into frontend --- .env.shell | 1 + deployment/bare_metal/build_frontend.sh | 4 +++- frontend/src/views/Layout/ContentFooter.vue | 5 +++++ frontend/vue.config.js | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 .env.shell diff --git a/.env.shell b/.env.shell new file mode 100644 index 000000000..ac6181fc5 --- /dev/null +++ b/.env.shell @@ -0,0 +1 @@ +BUILD_COMMIT="$(git rev-parse HEAD)" \ No newline at end of file diff --git a/deployment/bare_metal/build_frontend.sh b/deployment/bare_metal/build_frontend.sh index fc0feb747..2e7e59381 100755 --- a/deployment/bare_metal/build_frontend.sh +++ b/deployment/bare_metal/build_frontend.sh @@ -2,7 +2,9 @@ # For that to work, node v12.19.0 needs to be installed with nvm for root # or NPM_BIN Path and NVM_DIR must be adjusted -cd /var/www/html/gradido/frontend +cd /var/www/html/gradido +eval "echo \"$(cat .env.shell)\"" > .env +cd frontend NPM_BIN=/root/.nvm/versions/node/v12.19.0/bin/npm diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/views/Layout/ContentFooter.vue index 09a2418fd..2584747b1 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/views/Layout/ContentFooter.vue @@ -15,6 +15,9 @@ App version {{ version }} + + {{ shortHash }} + @@ -59,6 +62,8 @@ export default { return { year: new Date().getFullYear(), version: CONFIG.APP_VERSION, + hash: process.env.VUE_APP_BUILD_COMMIT, + shortHash: process.env.VUE_APP_BUILD_COMMIT.substr(0, 8), } }, } diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 9fffda28c..698aca1de 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,6 +1,8 @@ const path = require('path') const dotenv = require('dotenv-webpack') +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT + // vue.config.js module.exports = { devServer: { From 2cbe284069e2942f1303f35395eb5f3e71ca21c1 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 17:12:53 +0200 Subject: [PATCH 014/144] add BUILD_COMMIT to test --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4606566df..04b004ae3 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -297,7 +297,7 @@ jobs: ########################################################################## - name: frontend | Unit tests run: | - docker run -v ~/coverage:/app/coverage --rm gradido/frontend:test yarn run test + docker run -e BUILD_COMMIT="$(git rev-parse HEAD)" -v ~/coverage:/app/coverage --rm gradido/frontend:test yarn run test cp -r ~/coverage ./coverage ########################################################################## # COVERAGE REPORT FRONTEND ################################################ From 49d6d75f6338e5e09b0412aae5ba0d457503f008 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 17:27:51 +0200 Subject: [PATCH 015/144] next try --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 04b004ae3..b12e1c152 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: ########################################################################## - name: Frontend | Build `test` image run: | - docker build --target test -t "gradido/frontend:test" frontend/ + docker build -e BUILD_COMMIT="$(git rev-parse HEAD)" --target test -t "gradido/frontend:test" frontend/ docker save "gradido/frontend:test" > /tmp/frontend.tar - name: Upload Artifact uses: actions/upload-artifact@v2 From 97b6ef0ac219349af886ab1951e83cb5558ab887 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 17:32:23 +0200 Subject: [PATCH 016/144] replace -e with --build-arg in docker build call --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b12e1c152..f79959234 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: ########################################################################## - name: Frontend | Build `test` image run: | - docker build -e BUILD_COMMIT="$(git rev-parse HEAD)" --target test -t "gradido/frontend:test" frontend/ + docker build --build-arg BUILD_COMMIT="$(git rev-parse HEAD)" --target test -t "gradido/frontend:test" frontend/ docker save "gradido/frontend:test" > /tmp/frontend.tar - name: Upload Artifact uses: actions/upload-artifact@v2 From a29ade293068b76a398f328795b211086952ba15 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 6 Sep 2021 17:44:44 +0200 Subject: [PATCH 017/144] try with default value --- .github/workflows/test.yml | 4 ++-- frontend/vue.config.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f79959234..4606566df 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -22,7 +22,7 @@ jobs: ########################################################################## - name: Frontend | Build `test` image run: | - docker build --build-arg BUILD_COMMIT="$(git rev-parse HEAD)" --target test -t "gradido/frontend:test" frontend/ + docker build --target test -t "gradido/frontend:test" frontend/ docker save "gradido/frontend:test" > /tmp/frontend.tar - name: Upload Artifact uses: actions/upload-artifact@v2 @@ -297,7 +297,7 @@ jobs: ########################################################################## - name: frontend | Unit tests run: | - docker run -e BUILD_COMMIT="$(git rev-parse HEAD)" -v ~/coverage:/app/coverage --rm gradido/frontend:test yarn run test + docker run -v ~/coverage:/app/coverage --rm gradido/frontend:test yarn run test cp -r ~/coverage ./coverage ########################################################################## # COVERAGE REPORT FRONTEND ################################################ diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 698aca1de..dc406c98a 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,7 +1,7 @@ const path = require('path') const dotenv = require('dotenv-webpack') -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT ? process.env.BUILD_COMMIT : '000000000' // vue.config.js module.exports = { From d4ca210e8f5d93c604f2513c86460af4fb922b38 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 7 Sep 2021 11:36:11 +0200 Subject: [PATCH 018/144] update default --- frontend/vue.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/vue.config.js b/frontend/vue.config.js index dc406c98a..5a8495cc2 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,7 +1,7 @@ const path = require('path') const dotenv = require('dotenv-webpack') -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT ? process.env.BUILD_COMMIT : '000000000' +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT || '000000000' // vue.config.js module.exports = { From 9787764e6c840a50e497b3803c028e131844438c Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 7 Sep 2021 11:48:42 +0200 Subject: [PATCH 019/144] additional zero check for fixing broken tests --- frontend/src/views/Layout/ContentFooter.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/views/Layout/ContentFooter.vue index 2584747b1..6bf24af23 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/views/Layout/ContentFooter.vue @@ -63,7 +63,10 @@ export default { year: new Date().getFullYear(), version: CONFIG.APP_VERSION, hash: process.env.VUE_APP_BUILD_COMMIT, - shortHash: process.env.VUE_APP_BUILD_COMMIT.substr(0, 8), + shortHash: + process.env.VUE_APP_BUILD_COMMIT !== undefined + ? process.env.VUE_APP_BUILD_COMMIT.substr(0, 8) + : '00000000', } }, } From 47e283ac6599d0e69725decfff5e637592e509db Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 9 Sep 2021 12:52:54 +0200 Subject: [PATCH 020/144] adding moritz suggestion to don't show the commit hash link if no commit hash was given --- frontend/src/views/Layout/ContentFooter.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/views/Layout/ContentFooter.vue index 6bf24af23..97c27230f 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/views/Layout/ContentFooter.vue @@ -15,7 +15,11 @@ App version {{ version }} - + {{ shortHash }} From 6569ec0743eedf415c62189e336a0651083bd8f9 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 9 Sep 2021 13:04:04 +0200 Subject: [PATCH 021/144] make it possible to use additional local .env entries --- .env.local.dist | 1 + deployment/bare_metal/build_frontend.sh | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 .env.local.dist diff --git a/.env.local.dist b/.env.local.dist new file mode 100644 index 000000000..951a04b94 --- /dev/null +++ b/.env.local.dist @@ -0,0 +1 @@ +// for local .env entries \ No newline at end of file diff --git a/deployment/bare_metal/build_frontend.sh b/deployment/bare_metal/build_frontend.sh index 2e7e59381..2e968179d 100755 --- a/deployment/bare_metal/build_frontend.sh +++ b/deployment/bare_metal/build_frontend.sh @@ -3,7 +3,8 @@ # or NPM_BIN Path and NVM_DIR must be adjusted cd /var/www/html/gradido -eval "echo \"$(cat .env.shell)\"" > .env +eval "echo \"$(cat .env.local)\"" > .env +eval "echo \"$(cat .env.shell)\"" >> .env cd frontend NPM_BIN=/root/.nvm/versions/node/v12.19.0/bin/npm From abdbbab2ea2503266e69522ccbb04fe99ece2198 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 10 Sep 2021 15:38:05 +0200 Subject: [PATCH 022/144] encapsulate --- frontend/src/config/index.js | 1 + frontend/src/views/Layout/ContentFooter.vue | 7 ++----- frontend/vue.config.js | 2 +- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index dd35eb185..fbef2abbb 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -20,6 +20,7 @@ const CONFIG = { ...environment, ...server, APP_VERSION: pkg.version, + COMMIT_HASH: process.env.VUE_APP_BUILD_COMMIT, } export default CONFIG diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/views/Layout/ContentFooter.vue index 97c27230f..c18608545 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/views/Layout/ContentFooter.vue @@ -66,11 +66,8 @@ export default { return { year: new Date().getFullYear(), version: CONFIG.APP_VERSION, - hash: process.env.VUE_APP_BUILD_COMMIT, - shortHash: - process.env.VUE_APP_BUILD_COMMIT !== undefined - ? process.env.VUE_APP_BUILD_COMMIT.substr(0, 8) - : '00000000', + hash: CONFIG.COMMIT_HASH, + shortHash: CONFIG.COMMIT_HASH.substr(0, 8), } }, } diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 5a8495cc2..79917948c 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,7 +1,7 @@ const path = require('path') const dotenv = require('dotenv-webpack') -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT || '000000000' +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT || '00000000' // vue.config.js module.exports = { From 133a394158a2645d566172865e2df75f0b95dca8 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 10 Sep 2021 18:05:11 +0200 Subject: [PATCH 023/144] add additional check --- frontend/src/config/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index fbef2abbb..a7807b57c 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -20,7 +20,7 @@ const CONFIG = { ...environment, ...server, APP_VERSION: pkg.version, - COMMIT_HASH: process.env.VUE_APP_BUILD_COMMIT, + COMMIT_HASH: process.env.VUE_APP_BUILD_COMMIT || '00000000', } export default CONFIG From 01cb8fae90d3043d0a625f6a3434e516cfa93e6d Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Tue, 14 Sep 2021 11:23:41 +0200 Subject: [PATCH 024/144] ... --- frontend/src/config/index.js | 8 +++++++- frontend/vue.config.js | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index a7807b57c..878ed3c55 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -16,11 +16,17 @@ const server = { GRAPHQL_URI: process.env.GRAPHQL_URI || 'http://localhost:4000/graphql', } +// eslint-disable-next-line no-console +console.log('hash: %o', process.env.VUE_APP_BUILD_COMMIT) + const CONFIG = { ...environment, ...server, APP_VERSION: pkg.version, - COMMIT_HASH: process.env.VUE_APP_BUILD_COMMIT || '00000000', + COMMIT_HASH: + process.env.VUE_APP_BUILD_COMMIT === 'undefined' + ? '00000000' + : process.env.VUE_APP_BUILD_COMMIT, } export default CONFIG diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 79917948c..698aca1de 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,7 +1,7 @@ const path = require('path') const dotenv = require('dotenv-webpack') -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT || '00000000' +process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT // vue.config.js module.exports = { From 489b62b27a05eae16248e6c352917a0c088909c2 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 00:11:56 +0200 Subject: [PATCH 025/144] added .env(docker) to ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 02347691f..a5dadd281 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ messages.pot .skeema nbproject .metadata +/.env From 5b6d1b4ca29a4ed6050d78d8afc851ceb8d1094a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 00:32:22 +0200 Subject: [PATCH 026/144] updated yarn lock(?) --- frontend/yarn.lock | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/frontend/yarn.lock b/frontend/yarn.lock index c910ea9de..eff78ada1 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -13576,13 +13576,6 @@ vue-jest@^3.0.5, vue-jest@^3.0.7: tsconfig "^7.0.0" vue-template-es2015-compiler "^1.6.0" -vue-jwt-decode@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/vue-jwt-decode/-/vue-jwt-decode-0.1.0.tgz#f9caf7b9030d5459cc567b1c3117d9d1f291458f" - integrity sha512-4iP0NzYHkAF7G13tYPc/nudk4oNpB8GCVZupc7lekxXok1XKEgefNaGTpDT14g7RKe5H9GaMphPduDj4UVfZwQ== - dependencies: - vue "^2.3.3" - vue-loader@^15.7.0: version "15.9.6" resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.6.tgz#f4bb9ae20c3a8370af3ecf09b8126d38ffdb6b8b" @@ -13662,11 +13655,6 @@ vue@^2.2.6, vue@^2.5.17, vue@^2.6.11: resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123" integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg== -vue@^2.3.3: - version "2.6.14" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235" - integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ== - vuex-persistedstate@^4.0.0-beta.3: version "4.0.0-beta.3" resolved "https://registry.yarnpkg.com/vuex-persistedstate/-/vuex-persistedstate-4.0.0-beta.3.tgz#89dd712de72d28e85cc95467d066002c1405f277" From 871d0fc76df15c98274a9aac18feab919a4a3ede Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 02:36:00 +0200 Subject: [PATCH 027/144] default value for BUILD_COMMIT in .env in frontend, but not active --- frontend/.env.dist | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/.env.dist b/frontend/.env.dist index a22b31307..1252faf5b 100644 --- a/frontend/.env.dist +++ b/frontend/.env.dist @@ -2,3 +2,4 @@ LOGIN_API_URL=http://localhost/login_api/ COMMUNITY_API_URL=http://localhost/api/ ALLOW_REGISTER=true GRAPHQL_URI=http://localhost:4000/graphql +//BUILD_COMMIT=0000000 \ No newline at end of file From f9021a8b2e47b5a7ba3dab62af17b5218cca37b9 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 10:19:01 +0200 Subject: [PATCH 028/144] remove .env.local.dist since this is a structure relevant for vue, but this is a docker .env --- .env.local.dist | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .env.local.dist diff --git a/.env.local.dist b/.env.local.dist deleted file mode 100644 index 951a04b94..000000000 --- a/.env.local.dist +++ /dev/null @@ -1 +0,0 @@ -// for local .env entries \ No newline at end of file From 32c69a376065ab8ad8c1d52d782dbe8f731cbfe1 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 10:19:28 +0200 Subject: [PATCH 029/144] removed .env.local from eval shell --- deployment/bare_metal/build_frontend.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/deployment/bare_metal/build_frontend.sh b/deployment/bare_metal/build_frontend.sh index 2e968179d..2e7e59381 100755 --- a/deployment/bare_metal/build_frontend.sh +++ b/deployment/bare_metal/build_frontend.sh @@ -3,8 +3,7 @@ # or NPM_BIN Path and NVM_DIR must be adjusted cd /var/www/html/gradido -eval "echo \"$(cat .env.local)\"" > .env -eval "echo \"$(cat .env.shell)\"" >> .env +eval "echo \"$(cat .env.shell)\"" > .env cd frontend NPM_BIN=/root/.nvm/versions/node/v12.19.0/bin/npm From 4a2ee3d16207a9a632032aa155568de811d90e4b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 10:20:00 +0200 Subject: [PATCH 030/144] remove nuxt reference, we do not use nuxt --- docker-compose.override.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 5eb808b99..84906a5a9 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -13,7 +13,6 @@ services: environment: - NODE_ENV="development" # - DEBUG=true - - NUXT_BUILD=/tmp/nuxt # avoid file permission issues when `rm -rf .nuxt/` volumes: # This makes sure the docker container has its own node modules. # Therefore it is possible to have a different node version on the host machine From 9024534eaca7591866eba404b7ee8d94c91328e9 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 10:24:36 +0200 Subject: [PATCH 031/144] restructured config, refactor BUILD_COMMIT --- frontend/src/config/index.js | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index 878ed3c55..1409db9ad 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -1,13 +1,31 @@ -// ATTENTION: DO NOT PUT ANY SECRETS IN HERE (or the .env) +// ATTENTION: DO NOT PUT ANY SECRETS IN HERE (or the .env). +// The whole contents is exposed to the client // Load Package Details for some default values const pkg = require('../../package') +const version = { + APP_VERSION: pkg.version, + BUILD_COMMIT: + process.env.BUILD_COMMIT || + // the check for undefined is because of a conflict between webpack-dotenv and vue cli env filtering + (process.env.VUE_APP_BUILD_COMMIT !== 'undefined' ? process.env.VUE_APP_BUILD_COMMIT : null) || + null, + // self reference of `version.BUILD_COMMIT` is not possible at this point, hence the duplicate code + BUILD_COMMIT_SHORT: ( + process.env.BUILD_COMMIT || + (process.env.VUE_APP_BUILD_COMMIT !== 'undefined' ? process.env.VUE_APP_BUILD_COMMIT : null) || + '0000000' + ).substr(0, 7), + // unused + // BUILD_DATE: process.env.BUILD_DATE || process.env.VUE_APP_BUILD_DATE || '1970-01-01T00:00:00.00Z', + // BUILD_VERSION: process.env.BUILD_VERSION || process.env.VUE_APP_BUILD_VERSION || '0.0.0.0', +} + const environment = { NODE_ENV: process.env.NODE_ENV, DEBUG: process.env.NODE_ENV !== 'production' || false, PRODUCTION: process.env.NODE_ENV === 'production' || false, - ALLOW_REGISTER: process.env.ALLOW_REGISTER !== 'false', } const server = { @@ -16,17 +34,15 @@ const server = { GRAPHQL_URI: process.env.GRAPHQL_URI || 'http://localhost:4000/graphql', } -// eslint-disable-next-line no-console -console.log('hash: %o', process.env.VUE_APP_BUILD_COMMIT) +const options = { + ALLOW_REGISTER: process.env.ALLOW_REGISTER !== 'false', +} const CONFIG = { + ...version, ...environment, ...server, - APP_VERSION: pkg.version, - COMMIT_HASH: - process.env.VUE_APP_BUILD_COMMIT === 'undefined' - ? '00000000' - : process.env.VUE_APP_BUILD_COMMIT, + ...options, } export default CONFIG From 3eb2e4b5414b4375aa519d2bcb8aef0d35c6d843 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 10:25:41 +0200 Subject: [PATCH 032/144] Contentfooter - brackets - use BUILD_COMMIT and BUILD_COMMIT_SHORT - check for null value instead of 0000000 --- frontend/src/views/Layout/ContentFooter.vue | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/views/Layout/ContentFooter.vue b/frontend/src/views/Layout/ContentFooter.vue index c18608545..4350e3f55 100755 --- a/frontend/src/views/Layout/ContentFooter.vue +++ b/frontend/src/views/Layout/ContentFooter.vue @@ -16,11 +16,11 @@ App version {{ version }} - {{ shortHash }} + ({{ shortHash }}) @@ -66,8 +66,8 @@ export default { return { year: new Date().getFullYear(), version: CONFIG.APP_VERSION, - hash: CONFIG.COMMIT_HASH, - shortHash: CONFIG.COMMIT_HASH.substr(0, 8), + hash: CONFIG.BUILD_COMMIT, + shortHash: CONFIG.BUILD_COMMIT_SHORT, } }, } From f3e7917d415cd0b6e36a57df385ed1dbcb283bfe Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 10:27:24 +0200 Subject: [PATCH 033/144] remove empty default values and reference the .env file instead --- docker-compose.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 70d36521e..8fdab9f17 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,14 +22,13 @@ services: # Envs used in Dockerfile # - DOCKER_WORKDIR="/app" # - PORT=3000 - - BUILD_DATE - - BUILD_VERSION - - BUILD_COMMIT + # - BUILD_DATE="1970-01-01T00:00:00.00Z" + # - BUILD_VERSION="0.0.0.0" + # - BUILD_COMMIT="0000000" - NODE_ENV="production" - # Application only envs - #- HOST=0.0.0.0 # This is nuxt specific, alternative value is HOST=webapp - #env_file: - # - ./frontend/.env + env_file: + - ./.env + # - ./frontend/.env ######################################################### ## MARIADB ############################################## From 9cf1221040f65415e19114b6e5bda180b2742d7d Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 10:28:10 +0200 Subject: [PATCH 034/144] update docker file to properly transmit cli parameters to vue --- frontend/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 5ec90fe81..b222d7f1a 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -8,14 +8,18 @@ FROM node:12.19.0-alpine3.10 as base ENV DOCKER_WORKDIR="/app" ## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0 ENV BUILD_DATE="1970-01-01T00:00:00.00Z" +ENV VUE_APP_BUILD_DATE="${BUILD_DATE}" ## We cannot do $(npm run version).${BUILD_NUMBER} here so we default to 0.0.0.0 ENV BUILD_VERSION="0.0.0.0" +ENV VUE_APP_BUILD_VERSION="${BUILD_VERSION}" ## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000 ENV BUILD_COMMIT="0000000" +ENV VUE_APP_BUILD_COMMIT="${BUILD_COMMIT}" ## SET NODE_ENV ENV NODE_ENV="production" ## App relevant Envs ENV PORT="3000" +# TODO ENV VUE_APP_PORT="${PORT}" # Labels LABEL org.label-schema.build-date="${BUILD_DATE}" From f9af5f961f3b48d9c31060c8c00da144d14b127d Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 14:30:11 +0200 Subject: [PATCH 035/144] env/process.env working in docker & without --- frontend/Dockerfile | 4 ---- frontend/src/config/index.js | 15 ++------------- frontend/vue.config.js | 18 +++++++++++++----- 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/frontend/Dockerfile b/frontend/Dockerfile index b222d7f1a..5ec90fe81 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -8,18 +8,14 @@ FROM node:12.19.0-alpine3.10 as base ENV DOCKER_WORKDIR="/app" ## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0 ENV BUILD_DATE="1970-01-01T00:00:00.00Z" -ENV VUE_APP_BUILD_DATE="${BUILD_DATE}" ## We cannot do $(npm run version).${BUILD_NUMBER} here so we default to 0.0.0.0 ENV BUILD_VERSION="0.0.0.0" -ENV VUE_APP_BUILD_VERSION="${BUILD_VERSION}" ## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000 ENV BUILD_COMMIT="0000000" -ENV VUE_APP_BUILD_COMMIT="${BUILD_COMMIT}" ## SET NODE_ENV ENV NODE_ENV="production" ## App relevant Envs ENV PORT="3000" -# TODO ENV VUE_APP_PORT="${PORT}" # Labels LABEL org.label-schema.build-date="${BUILD_DATE}" diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index 1409db9ad..54c2c7aeb 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -6,20 +6,9 @@ const pkg = require('../../package') const version = { APP_VERSION: pkg.version, - BUILD_COMMIT: - process.env.BUILD_COMMIT || - // the check for undefined is because of a conflict between webpack-dotenv and vue cli env filtering - (process.env.VUE_APP_BUILD_COMMIT !== 'undefined' ? process.env.VUE_APP_BUILD_COMMIT : null) || - null, + BUILD_COMMIT: process.env.BUILD_COMMIT || null, // self reference of `version.BUILD_COMMIT` is not possible at this point, hence the duplicate code - BUILD_COMMIT_SHORT: ( - process.env.BUILD_COMMIT || - (process.env.VUE_APP_BUILD_COMMIT !== 'undefined' ? process.env.VUE_APP_BUILD_COMMIT : null) || - '0000000' - ).substr(0, 7), - // unused - // BUILD_DATE: process.env.BUILD_DATE || process.env.VUE_APP_BUILD_DATE || '1970-01-01T00:00:00.00Z', - // BUILD_VERSION: process.env.BUILD_VERSION || process.env.VUE_APP_BUILD_VERSION || '0.0.0.0', + BUILD_COMMIT_SHORT: (process.env.BUILD_COMMIT || '0000000').substr(0, 7), } const environment = { diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 698aca1de..45903e9cf 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -1,7 +1,6 @@ const path = require('path') -const dotenv = require('dotenv-webpack') - -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT +const webpack = require('webpack') +const Dotenv = require('dotenv-webpack') // vue.config.js module.exports = { @@ -25,8 +24,17 @@ module.exports = { assets: path.join(__dirname, 'src/assets'), }, }, - // eslint-disable-next-line new-cap - plugins: [new dotenv()], + plugins: [ + new Dotenv(), + new webpack.DefinePlugin({ + // Those are Environment Variables transmitted via Docker + // 'process.env.DOCKER_WORKDIR': JSON.stringify(process.env.DOCKER_WORKDIR), + // 'process.env.BUILD_DATE': JSON.stringify(process.env.BUILD_DATE), + // 'process.env.BUILD_VERSION': JSON.stringify(process.env.BUILD_VERSION), + 'process.env.BUILD_COMMIT': JSON.stringify(process.env.BUILD_COMMIT), + // 'process.env.PORT': JSON.stringify(process.env.PORT), + }), + ], }, css: { // Enable CSS source maps. From afcfe1d913921f06b57c3e6457d2cce4d8b8c790 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Wed, 15 Sep 2021 14:47:55 +0200 Subject: [PATCH 036/144] do not reference the .env file at given point - in development mode we will have 0000000 as hash displayed --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8fdab9f17..652daae13 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,8 +26,8 @@ services: # - BUILD_VERSION="0.0.0.0" # - BUILD_COMMIT="0000000" - NODE_ENV="production" - env_file: - - ./.env + # env_file: + # - ./.env # - ./frontend/.env ######################################################### From ba1f3c0fc6d7c57c5ed9cb13a8447edde004f0f9 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 15 Sep 2021 15:06:52 +0200 Subject: [PATCH 037/144] removed old code --- frontend/src/config/index.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index e372a033f..54c2c7aeb 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -32,10 +32,6 @@ const CONFIG = { ...environment, ...server, ...options, - COMMIT_HASH: - process.env.VUE_APP_BUILD_COMMIT === 'undefined' - ? '00000000' - : process.env.VUE_APP_BUILD_COMMIT, } export default CONFIG From de750e79a2a51167fba7bce07657c4e4e821597f Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Wed, 15 Sep 2021 15:13:05 +0200 Subject: [PATCH 038/144] add as env on shell --- deployment/bare_metal/build_frontend.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/deployment/bare_metal/build_frontend.sh b/deployment/bare_metal/build_frontend.sh index 2e7e59381..4b3a8a444 100755 --- a/deployment/bare_metal/build_frontend.sh +++ b/deployment/bare_metal/build_frontend.sh @@ -4,6 +4,7 @@ cd /var/www/html/gradido eval "echo \"$(cat .env.shell)\"" > .env +export BUILD_COMMIT="$(git rev-parse HEAD)" cd frontend NPM_BIN=/root/.nvm/versions/node/v12.19.0/bin/npm From 827cdd636f9564a55aede36315a1980a6a2b091f Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 16 Sep 2021 13:01:00 +0200 Subject: [PATCH 039/144] remove old code --- frontend/vue.config.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/vue.config.js b/frontend/vue.config.js index fa12f8200..45903e9cf 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -2,8 +2,6 @@ const path = require('path') const webpack = require('webpack') const Dotenv = require('dotenv-webpack') -process.env.VUE_APP_BUILD_COMMIT = process.env.BUILD_COMMIT - // vue.config.js module.exports = { devServer: { From 00219c049ed46167e1de945334cd726319e545f1 Mon Sep 17 00:00:00 2001 From: ogerly Date: Thu, 16 Sep 2021 15:54:35 +0200 Subject: [PATCH 040/144] decay calculation is calculated and displayed at the transaction in a more user-friendly way --- frontend/src/components/DecayInformation.vue | 33 +++++++++++++++++++ frontend/src/locales/de.json | 3 ++ frontend/src/locales/en.json | 2 ++ .../AccountOverview/GddTransactionList.vue | 4 +-- 4 files changed, 40 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue index 24acbd47e..c7571140b 100644 --- a/frontend/src/components/DecayInformation.vue +++ b/frontend/src/components/DecayInformation.vue @@ -10,6 +10,7 @@
+
@@ -19,6 +20,7 @@
+
{{ $t('decay.last_transaction') }}
@@ -62,6 +64,35 @@
+
+
+
+
{{ $t('form.amount') }}
+
{{ $t('form.amount') }}
+
+
+
{{balance}}
+
+
+
+
+
{{ $t('decay.decay') }}
+
+
+
{{ decay.balance }}
+
+
+
+
+
{{ $t('decay.sent') }}
+
{{ $t('decay.received') }}
+
+
+
{{ parseInt(balance) + decay.balance }}
+
{{ parseInt(balance) - decay.balance }}
+
+
+
@@ -71,6 +102,8 @@ export default { name: 'DecayInformation', props: { + balance: { type: String, default: '' }, + type: { type: String, default: '' }, decay: { balance: '', decayDuration: '', diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 908d7b12c..4fd157de5 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -28,6 +28,9 @@ "decayStart": " - Startblock für Vergänglichkeit am: ", "last_transaction":"Letzte Transaktion", "past_time":"Vergangene Zeit", + "balanceForTransaction":"Balance vor Transaktion", + "balanceAfterTransaction":"Balance nach Transaktion", + "amountOfTransaction":"Betrag der Transaktion", "since_introduction":"seit Einführung der Vergänglichkeit", "year":"Jahre", "months":"Monate", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index f9e17b38b..229de1244 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -28,6 +28,8 @@ "decayStart": " - Starting block for decay at: ", "last_transaction": "Last transaction:", "past_time": "Past time", + "balanceForTransaction": "Balance before transaction", + "amountOfTransaction": "Amount of the transaction", "since_introduction": "Since the introduction of Decay", "year": "Years", "months": "Months", diff --git a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue index 206b12a76..416e6392e 100644 --- a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue +++ b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue @@ -23,7 +23,7 @@
- +
@@ -76,7 +76,7 @@
- +
From e7d925b7943dba639f50bec1bab71d40d4e6c7ea Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 17 Sep 2021 09:07:01 +0200 Subject: [PATCH 041/144] transmit and receive, calculation of the decay as text: 'total' --- frontend/src/components/DecayInformation.vue | 4 ++-- frontend/src/locales/de.json | 3 ++- frontend/src/locales/en.json | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue index c7571140b..55ca03317 100644 --- a/frontend/src/components/DecayInformation.vue +++ b/frontend/src/components/DecayInformation.vue @@ -84,8 +84,8 @@
-
{{ $t('decay.sent') }}
-
{{ $t('decay.received') }}
+
{{ $t('decay.total') }}
+
{{ parseInt(balance) + decay.balance }}
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 4fd157de5..03d8d0fe9 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -43,7 +43,8 @@ "created":"Geschöpft", "fromCommunity":"Aus der Gemeinschaft", "toCommunity":"An die Gemeinschaft", - "noDecay": "Keine Vergänglichkeit" + "noDecay": "Keine Vergänglichkeit", + "total":"Gesamt" }, "form": { "cancel": "Abbrechen", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 229de1244..18b416f30 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -42,7 +42,8 @@ "created":"Created", "fromCommunity":"From the community", "toCommunity":"To the community", - "noDecay": "No Decay" + "noDecay": "No Decay", + "total":"Total" }, "form": { "cancel":"Cancel", From db15a5da4e5ccf64775674e6e3746025ccf2e06a Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 17 Sep 2021 13:19:10 +0200 Subject: [PATCH 042/144] add tests for commit hash --- frontend/src/views/Layout/ContentFooter.spec.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/frontend/src/views/Layout/ContentFooter.spec.js b/frontend/src/views/Layout/ContentFooter.spec.js index 8d0c6dfbd..368b6c743 100644 --- a/frontend/src/views/Layout/ContentFooter.spec.js +++ b/frontend/src/views/Layout/ContentFooter.spec.js @@ -59,6 +59,16 @@ describe('ContentFooter', () => { 'https://github.com/gradido/gradido/releases/latest', ) }) + + it('git commit hash and link', async () => { + wrapper.setData({ shortHash: 'ACCEDED' }) + wrapper.setData({ hash: 'ACCEDEDC001D00DC001D00DC001D00DC001CAFA' }) + await wrapper.vm.$nextTick() + expect(wrapper.find('div.copyright').findAll('a').at(2).text()).toEqual('(ACCEDED)') + expect(wrapper.find('div.copyright').findAll('a').at(2).attributes('href')).toEqual( + 'https://github.com/gradido/gradido/commit/ACCEDEDC001D00DC001D00DC001D00DC001CAFA', + ) + }) }) describe('links to gradido.net', () => { From 675917a8c0a2e111731a69c5240bbb739123cd72 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Fri, 17 Sep 2021 16:37:39 +0200 Subject: [PATCH 043/144] split test in two --- frontend/src/views/Layout/ContentFooter.spec.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/Layout/ContentFooter.spec.js b/frontend/src/views/Layout/ContentFooter.spec.js index 368b6c743..4b360d581 100644 --- a/frontend/src/views/Layout/ContentFooter.spec.js +++ b/frontend/src/views/Layout/ContentFooter.spec.js @@ -60,11 +60,16 @@ describe('ContentFooter', () => { ) }) - it('git commit hash and link', async () => { + it('has last commit hash', async () => { wrapper.setData({ shortHash: 'ACCEDED' }) wrapper.setData({ hash: 'ACCEDEDC001D00DC001D00DC001D00DC001CAFA' }) await wrapper.vm.$nextTick() expect(wrapper.find('div.copyright').findAll('a').at(2).text()).toEqual('(ACCEDED)') + }) + + it('links to last release commit', async () => { + wrapper.setData({ hash: 'ACCEDEDC001D00DC001D00DC001D00DC001CAFA' }) + await wrapper.vm.$nextTick() expect(wrapper.find('div.copyright').findAll('a').at(2).attributes('href')).toEqual( 'https://github.com/gradido/gradido/commit/ACCEDEDC001D00DC001D00DC001D00DC001CAFA', ) From 0c7bb13b4e1e414b751d6ec12b1ccd349eb8eea3 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 17 Sep 2021 21:13:14 +0200 Subject: [PATCH 044/144] change state_users table to user and rename colums in camelCase, adapt --- backend/src/index.ts | 2 +- .../src/Controller/AppController.php | 16 +++--- .../JsonRequestHandlerController.php | 6 +- .../Controller/StateUserRolesController.php | 4 +- .../src/Controller/StateUsersController.php | 18 +++--- .../TransactionCreationsController.php | 20 +++---- .../src/Model/Entity/StateUser.php | 14 ++--- .../src/Model/Table/StateUsersTable.php | 16 ++---- .../Model/Transactions/TransactionBase.php | 6 +- .../Transactions/TransactionCreation.php | 4 +- .../Transactions/TransactionTransfer.php | 4 +- database/migrations/0002-update_user.ts | 56 +++++++++++++++++++ 12 files changed, 106 insertions(+), 60 deletions(-) create mode 100644 database/migrations/0002-update_user.ts diff --git a/backend/src/index.ts b/backend/src/index.ts index b99e5bee4..07086c544 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -21,7 +21,7 @@ import { isAuthorized } from './auth/auth' // TODO implement // import queryComplexity, { simpleEstimator, fieldConfigEstimator } from "graphql-query-complexity"; -const DB_VERSION = '0001-init_db' +const DB_VERSION = '0002-update_user' const context = (args: any) => { const authorization = args.req.headers.authorization diff --git a/community_server/src/Controller/AppController.php b/community_server/src/Controller/AppController.php index e70b8e7bd..2c4b2b5e5 100644 --- a/community_server/src/Controller/AppController.php +++ b/community_server/src/Controller/AppController.php @@ -223,22 +223,22 @@ class AppController extends Controller $public_key_bin = hex2bin($json['user']['public_hex']); $stateUserQuery = $stateUserTable ->find('all') - ->where(['public_key' => $public_key_bin]) + ->where(['pubkey' => $public_key_bin]) ->contain('StateBalances', function ($q) { return $q->order(['record_date' => 'DESC']) ->limit(1); }); if ($stateUserQuery->count() == 1) { $stateUser = $stateUserQuery->first(); - if ($stateUser->first_name != $json['user']['first_name'] || - $stateUser->last_name != $json['user']['last_name'] || + if ($stateUser->firstName != $json['user']['first_name'] || + $stateUser->lastName != $json['user']['last_name'] || $stateUser->disabled != $json['user']['disabled'] || //$stateUser->username != $json['user']['username'] || // -> throws error $stateUser->email != $json['user']['email'] ) { - $stateUser->first_name = $json['user']['first_name']; - $stateUser->last_name = $json['user']['last_name']; + $stateUser->firstName = $json['user']['first_name']; + $stateUser->lastName = $json['user']['last_name']; $stateUser->disabled = intval($json['user']['disabled']); //$stateUser->username = $json['user']['username']; $stateUser->email = $json['user']['email']; @@ -250,9 +250,9 @@ class AppController extends Controller //echo $stateUser['id']; } else { $newStateUser = $stateUserTable->newEntity(); - $newStateUser->public_key = $public_key_bin; - $newStateUser->first_name = $json['user']['first_name']; - $newStateUser->last_name = $json['user']['last_name']; + $newStateUser->pubkey = $public_key_bin; + $newStateUser->firstName = $json['user']['first_name']; + $newStateUser->lastName = $json['user']['last_name']; $newStateUser->disabled = intval($json['user']['disabled']); //$newStateUser->username = $json['user']['username']; $newStateUser->email = $json['user']['email']; diff --git a/community_server/src/Controller/JsonRequestHandlerController.php b/community_server/src/Controller/JsonRequestHandlerController.php index 611984118..150cce4ae 100644 --- a/community_server/src/Controller/JsonRequestHandlerController.php +++ b/community_server/src/Controller/JsonRequestHandlerController.php @@ -308,7 +308,7 @@ class JsonRequestHandlerController extends AppController { $stateError = $stateErrorTable->newEntity(); // $pubkey = hex2bin($jsonData->public_key); - $user_query = $stateUsersTable->find('all')->select(['id'])->where(['public_key' => $pubkey]); + $user_query = $stateUsersTable->find('all')->select(['id'])->where(['pubkey' => $pubkey]); if($user_query->count() != 1) { return $this->returnJson(['state' => 'error', 'msg' => 'user not found', 'details' => 'user pubkey hex:' . $jsonData->public_key]); } @@ -412,7 +412,7 @@ class JsonRequestHandlerController extends AppController { //$pubkeys->sender //$pubkeys->receiver $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - $user = $stateUserTable->find('all')->where(['public_key' => hex2bin($pubkeys->sender)])->contain(['StateBalances']); + $user = $stateUserTable->find('all')->where(['pubkey' => hex2bin($pubkeys->sender)])->contain(['StateBalances']); if(!$user->count()) { return $this->returnJson(['state' => 'not found', 'msg' => 'user not found or empty balance']); } @@ -461,7 +461,7 @@ class JsonRequestHandlerController extends AppController { private function userDelete($userPubkeyHex) { $stateUserTable = TableRegistry::getTableLocator()->get('StateUsers'); - $user = $stateUserTable->find('all')->where(['public_key' => hex2bin($userPubkeyHex)]); + $user = $stateUserTable->find('all')->where(['pubkey' => hex2bin($userPubkeyHex)]); if(!$user || $user->count == 0) { return $this->returnJson(['state' => 'error', 'msg' => 'user not found']); } diff --git a/community_server/src/Controller/StateUserRolesController.php b/community_server/src/Controller/StateUserRolesController.php index 9238c7ad6..80b168f35 100644 --- a/community_server/src/Controller/StateUserRolesController.php +++ b/community_server/src/Controller/StateUserRolesController.php @@ -132,7 +132,7 @@ class StateUserRolesController extends AppController $public_hex = hex2bin($requestData['public_hex']); - $stateUser = $this->StateUsers->find('all')->where(['public_key' => $public_hex])->first(); + $stateUser = $this->StateUsers->find('all')->where(['pubkey' => $public_hex])->first(); foreach($requestData['role_id'] as $role_id) { @@ -158,7 +158,7 @@ class StateUserRolesController extends AppController $publichex = hex2bin($public_hex); - $stateUser = $this->StateUsers->find('all')->where(['public_key' => $publichex])->first(); + $stateUser = $this->StateUsers->find('all')->where(['pubkey' => $publichex])->first(); $stateUserRoles = $this->StateUserRoles->find('all')->where(['state_user_id' => $stateUser->id])->all(); diff --git a/community_server/src/Controller/StateUsersController.php b/community_server/src/Controller/StateUsersController.php index fc6ec8614..25171f462 100644 --- a/community_server/src/Controller/StateUsersController.php +++ b/community_server/src/Controller/StateUsersController.php @@ -182,15 +182,15 @@ class StateUsersController extends AppController if($account_state == 'email not activated') { if(count($pubkeySorted) > 0) { - $communityUsers->where(['hex(public_key) IN' => array_keys($pubkeySorted)]); + $communityUsers->where(['hex(pubkey) IN' => array_keys($pubkeySorted)]); } else { $communityUsers = null; } } else { $globalSearch = '%' . $searchString . '%'; $communityUsers->where(['OR' => [ - 'first_name LIKE' => $globalSearch, - 'last_name LIKE' => $globalSearch, + 'firstName LIKE' => $globalSearch, + 'lastName LIKE' => $globalSearch, 'email LIKE' => $globalSearch ]]); } @@ -199,7 +199,7 @@ class StateUsersController extends AppController //var_dump($communityUsers->toArray()); if($communityUsers) { foreach($communityUsers as $u) { - $pubkey_hex = bin2hex(stream_get_contents($u->public_key)); + $pubkey_hex = bin2hex(stream_get_contents($u->pubkey)); $u->public_hex = $pubkey_hex; if(!isset($pubkeySorted[$pubkey_hex])) { $pubkeySorted[$pubkey_hex] = ['login' => [], 'community' => []]; @@ -229,9 +229,9 @@ class StateUsersController extends AppController $color = 'danger'; if(count($user['community']) == 1) { $c_user = $user['community'][0]; - $finalUser['name'] = $c_user->first_name . ' ' . $c_user->last_name; - $finalUser['first_name'] = $c_user->first_name; - $finalUser['last_name'] = $c_user->last_name; + $finalUser['name'] = $c_user->firstName . ' ' . $c_user->lastName; + $finalUser['first_name'] = $c_user->firstName; + $finalUser['last_name'] = $c_user->lastName; $finalUser['email'] = $c_user->email; } } else if(count($user['login']) == 1) { @@ -415,7 +415,7 @@ class StateUsersController extends AppController //$user = $jsonData['user']; //var_dump($jsonData); $pubkey = hex2bin($jsonData['pubkeyhex']); - $stateUsers = $this->StateUsers->find('all')->where(['public_key' => $pubkey]); + $stateUsers = $this->StateUsers->find('all')->where(['pubkey' => $pubkey]); if($stateUsers->count() != 1) { return $this->returnJson(['state' => 'error', 'msg' => 'invalid result count']); } @@ -448,7 +448,7 @@ class StateUsersController extends AppController $pubkey = hex2bin($jsonData['pubkeyhex']); $stateUsers = $this->StateUsers ->find('all') - ->where(['public_key' => $pubkey]) + ->where(['pubkey' => $pubkey]) ->select(['id']); if($stateUsers->count() != 1) { return $this->returnJson(['state' => 'error', 'msg' => 'invalid result count']); diff --git a/community_server/src/Controller/TransactionCreationsController.php b/community_server/src/Controller/TransactionCreationsController.php index d02320d25..f024e5cb4 100644 --- a/community_server/src/Controller/TransactionCreationsController.php +++ b/community_server/src/Controller/TransactionCreationsController.php @@ -101,7 +101,7 @@ class TransactionCreationsController extends AppController $receiverProposal = []; foreach ($stateUsers as $stateUser) { $name = $stateUser->email; - $keyHex = bin2hex(stream_get_contents($stateUser->public_key)); + $keyHex = bin2hex(stream_get_contents($stateUser->pubkey)); if ($name === null) { $name = $stateUser->first_name . ' ' . $stateUser->last_name; } @@ -241,14 +241,14 @@ class TransactionCreationsController extends AppController $this->log("search for text: ".$requestData['searchText'], 'debug'); $stateUsers = $stateUserTable ->find('all') - ->select(['id', 'first_name', 'last_name', 'email']) - ->order(['first_name', 'last_name']) + ->select(['id', 'firstName', 'lastName', 'email']) + ->order(['firstName', 'lastName']) ->where( ['AND' => [ 'disabled' => 0, 'OR' => [ - 'LOWER(first_name) LIKE' => '%'.strtolower($requestData['searchText']).'%', - 'LOWER(last_name) LIKE' => '%'.strtolower($requestData['searchText']).'%', + 'LOWER(firstName) LIKE' => '%'.strtolower($requestData['searchText']).'%', + 'LOWER(lastName) LIKE' => '%'.strtolower($requestData['searchText']).'%', 'LOWER(email) LIKE' => '%'.strtolower($requestData['searchText']).'%' ] ] @@ -265,10 +265,10 @@ class TransactionCreationsController extends AppController } else { $stateUsers = $stateUserTable ->find('all') - ->select(['id', 'first_name', 'last_name', 'email']) + ->select(['id', 'firstName', 'lastName', 'email']) //->order(['id']) ->where(['disabled' => 0]) - ->order(['first_name', 'last_name']) + ->order(['firstName', 'lastName']) ->contain(['TransactionCreations' => [ 'fields' => [ 'TransactionCreations.amount', @@ -300,7 +300,7 @@ class TransactionCreationsController extends AppController //if($sumAmount < 20000000) { array_push($possibleReceivers, [ - 'name' => $stateUser->first_name . ' ' . $stateUser->last_name, + 'name' => $stateUser->firstName . ' ' . $stateUser->lastName, 'id' => $stateUser->id, 'email' => $stateUser->email, 'amount' => $sumAmount, @@ -353,7 +353,7 @@ class TransactionCreationsController extends AppController } $receiverUsers = $stateUserTable->find('all') ->where(['id IN' => array_keys($users)]) - ->select(['public_key', 'email', 'id']) + ->select(['pubkey', 'email', 'id']) ->contain(false); foreach ($receiverUsers as $receiverUser) { @@ -371,7 +371,7 @@ class TransactionCreationsController extends AppController } else { $pendings[$id] = $localAmountCent; } - $pubKeyHex = bin2hex(stream_get_contents($receiverUser->public_key)); + $pubKeyHex = bin2hex(stream_get_contents($receiverUser->pubkey)); $requestAnswear = $this->JsonRequestClient->sendRequest(json_encode([ 'session_id' => $session->read('session_id'), 'email' => $receiverUser->email, diff --git a/community_server/src/Model/Entity/StateUser.php b/community_server/src/Model/Entity/StateUser.php index 5fac7cda7..374e8d608 100644 --- a/community_server/src/Model/Entity/StateUser.php +++ b/community_server/src/Model/Entity/StateUser.php @@ -30,16 +30,14 @@ class StateUser extends Entity * @var array */ protected $_accessible = [ - 'index_id' => true, - 'state_group_id' => true, - 'public_key' => true, + 'groupId' => true, + 'pubkey' => true, 'email' => true, - 'first_name' => true, - 'last_name' => true, + 'firstName' => true, + 'lastName' => true, 'disabled' => true, 'username' => true, 'index' => true, - 'state_group' => true, 'state_balances' => true, 'state_created' => true, 'transaction_creations' => true, @@ -48,11 +46,11 @@ class StateUser extends Entity public function getEmailWithName() { - return $this->first_name . ' ' . $this->last_name . ' <' . $this->email . '>'; + return $this->firstName . ' ' . $this->lastName . ' <' . $this->email . '>'; } public function getNames() { - return $this->first_name . ' ' . $this->last_name; + return $this->firstName . ' ' . $this->lastName; } } diff --git a/community_server/src/Model/Table/StateUsersTable.php b/community_server/src/Model/Table/StateUsersTable.php index 5b01609f3..729b7800a 100644 --- a/community_server/src/Model/Table/StateUsersTable.php +++ b/community_server/src/Model/Table/StateUsersTable.php @@ -37,18 +37,10 @@ class StateUsersTable extends Table { parent::initialize($config); - $this->setTable('state_users'); + $this->setTable('user'); $this->setDisplayField('email'); $this->setPrimaryKey('id'); - /*$this->belongsTo('Indices', [ - 'foreignKey' => 'index_id', - 'joinType' => 'INNER' - ]);*/ - $this->belongsTo('StateGroups', [ - 'foreignKey' => 'state_group_id', - 'joinType' => 'INNER' - ]); $this->hasMany('StateBalances', [ 'foreignKey' => 'state_user_id' ]); @@ -80,8 +72,8 @@ class StateUsersTable extends Table ->allowEmptyString('id', null, 'create'); $validator - ->requirePresence('public_key', 'create') - ->notEmptyString('public_key'); + ->requirePresence('pubkey', 'create') + ->notEmptyString('pubkey'); return $validator; } @@ -124,7 +116,7 @@ class StateUsersTable extends Table $involvedUser = $this->find('all', [ 'contain' => [], 'where' => ['id IN' => $involvedUserIds], - 'fields' => ['id', 'first_name', 'last_name', 'email'], + 'fields' => ['id', 'firstName', 'lastName', 'email'], ]); //var_dump($involvedUser->toArray()); $involvedUserIndices = []; diff --git a/community_server/src/Model/Transactions/TransactionBase.php b/community_server/src/Model/Transactions/TransactionBase.php index 6b3817201..8c2709a96 100644 --- a/community_server/src/Model/Transactions/TransactionBase.php +++ b/community_server/src/Model/Transactions/TransactionBase.php @@ -49,13 +49,13 @@ class TransactionBase { protected function getStateUserId($publicKey) { $stateUsersTable = self::getTable('state_users'); - $stateUser = $stateUsersTable->find('all')->select(['id'])->where(['public_key' => $publicKey])->first(); + $stateUser = $stateUsersTable->find('all')->select(['id'])->where(['pubkey' => $publicKey])->first(); if($stateUser) { return $stateUser->id; } // create new entry $stateUserEntity = $stateUsersTable->newEntity(); - $stateUserEntity->public_key = $publicKey; + $stateUserEntity->pubkey = $publicKey; if($stateUsersTable->save($stateUserEntity)) { return $stateUserEntity->id; } else { @@ -77,7 +77,7 @@ class TransactionBase { protected function getStateUserFromPublickey($publicKey) { $stateUsersTable = self::getTable('state_users'); - $stateUser = $stateUsersTable->find('all')->where(['public_key' => $publicKey])->first(); + $stateUser = $stateUsersTable->find('all')->where(['pubkey' => $publicKey])->first(); if($stateUser) { return $stateUser; } diff --git a/community_server/src/Model/Transactions/TransactionCreation.php b/community_server/src/Model/Transactions/TransactionCreation.php index 87f2d2104..a8263c60d 100644 --- a/community_server/src/Model/Transactions/TransactionCreation.php +++ b/community_server/src/Model/Transactions/TransactionCreation.php @@ -95,7 +95,7 @@ class TransactionCreation extends TransactionBase { $existingCreations2 = $this->transactionCreationsTable ->find('all') ->select(['amount', 'state_user_id', 'target_date']) - ->contain(['StateUsers' => ['fields' => ['StateUsers.public_key']]]); + ->contain(['StateUsers' => ['fields' => ['StateUsers.pubkey']]]); $q = $existingCreations2; $targetDate = $this->protoTransactionCreation->getTargetDate(); @@ -230,7 +230,7 @@ class TransactionCreation extends TransactionBase { $receiverAmount = new \Proto\Gradido\TransferAmount(); - $receiverAmount->setPubkey(stream_get_contents($stateUser->public_key)); + $receiverAmount->setPubkey(stream_get_contents($stateUser->pubkey)); $receiverAmount->setAmount($transactionCreationEntity->amount); $protoCreation->setReceiver($receiverAmount); diff --git a/community_server/src/Model/Transactions/TransactionTransfer.php b/community_server/src/Model/Transactions/TransactionTransfer.php index dc1606f55..2bd470e73 100644 --- a/community_server/src/Model/Transactions/TransactionTransfer.php +++ b/community_server/src/Model/Transactions/TransactionTransfer.php @@ -96,7 +96,7 @@ class TransactionTransfer extends TransactionBase { $user = $stateUsersTable ->find('all') ->select(['id']) - ->where(['public_key' => $senderPublic]) + ->where(['pubkey' => $senderPublic]) ->contain(['StateBalances' => ['fields' => ['amount', 'state_user_id']]])->first(); if(!$user) { $this->addError($functionName, 'couldn\'t find sender in db' ); @@ -114,7 +114,7 @@ class TransactionTransfer extends TransactionBase { return false; } // check if receiver exist - $receiver_user = $stateUsersTable->find('all')->select(['id'])->where(['public_key' => $receiver_public_key])->first(); + $receiver_user = $stateUsersTable->find('all')->select(['id'])->where(['pubkey' => $receiver_public_key])->first(); if(!$receiver_user) { $this->addError($functionName, 'couldn\'t find receiver in db' ); return false; diff --git a/database/migrations/0002-update_user.ts b/database/migrations/0002-update_user.ts new file mode 100644 index 000000000..54e6acc7e --- /dev/null +++ b/database/migrations/0002-update_user.ts @@ -0,0 +1,56 @@ +/* FIRST MIGRATION + * + * This migration is special since it takes into account that + * the database can be setup already but also may not be. + * Therefore you will find all `CREATE TABLE` statements with + * a `IF NOT EXISTS`, all `INSERT` with an `IGNORE` and in the + * downgrade function all `DROP TABLE` with a `IF EXISTS`. + * This ensures compatibility for existing or non-existing + * databases. + */ + +export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // write upgrade logic as parameter of queryFn + + // rename table + await queryFn(` + ALTER TABLE state_users + RENAME TO user; + `) + // drop not used columns + await queryFn(` + ALTER TABLE user + DROP COLUMN index_id; + `) + // rename from snake case to camel case (cakePHP standard to typeorm standard) + await queryFn(` + ALTER TABLE user + CHANGE COLUMN group_id groupId int(10) unsigned NOT NULL DEFAULT '0', + CHANGE COLUMN public_key pubkey binary(32) NOT NULL, + CHANGE COLUMN first_name firstName varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + CHANGE COLUMN last_name lastName varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL; + `) + } + + export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // write downgrade logic as parameter of queryFn + // rename table + await queryFn(` + ALTER TABLE user + RENAME TO state_users; + `) + // put back dropped column + await queryFn(` + ALTER TABLE state_users + ADD index_id smallint(6) NOT NULL DEFAULT '0'; + `) + // rename from camel case to snake case (typeorm standard to cakePHP standard) + await queryFn(` + ALTER TABLE state_users + CHANGE COLUMN groupId group_id int(10) unsigned NOT NULL DEFAULT '0', + CHANGE COLUMN pubkey public_key binary(32) NOT NULL, + CHANGE COLUMN firstName first_name varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + CHANGE COLUMN lastName last_name varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL; + `) + } + \ No newline at end of file From 95cb6a5bb8783dc499d897c5d596efa25b6c17be Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 17 Sep 2021 21:34:04 +0200 Subject: [PATCH 045/144] fix linting and community server test --- ...{StateUsersFixture.php => UserFixture.php} | 19 +++++---- .../JsonRequestHandlerControllerTest.php | 2 +- database/migrations/0002-update_user.ts | 39 +++++++++---------- 3 files changed, 29 insertions(+), 31 deletions(-) rename community_server/tests/Fixture/{StateUsersFixture.php => UserFixture.php} (55%) diff --git a/community_server/tests/Fixture/StateUsersFixture.php b/community_server/tests/Fixture/UserFixture.php similarity index 55% rename from community_server/tests/Fixture/StateUsersFixture.php rename to community_server/tests/Fixture/UserFixture.php index a9b033bf7..e6d59a238 100644 --- a/community_server/tests/Fixture/StateUsersFixture.php +++ b/community_server/tests/Fixture/UserFixture.php @@ -6,7 +6,7 @@ use Cake\TestSuite\Fixture\TestFixture; /** * StateUsersFixture */ -class StateUsersFixture extends BaseTestFixture +class UserFixture extends BaseTestFixture { /** * Fields @@ -16,17 +16,16 @@ class StateUsersFixture extends BaseTestFixture // @codingStandardsIgnoreStart public $fields = [ 'id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => null, 'comment' => '', 'autoIncrement' => true, 'precision' => null], - 'index_id' => ['type' => 'smallinteger', 'length' => 6, 'unsigned' => false, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null], - 'group_id' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null, 'autoIncrement' => null], - 'public_key' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], + 'groupId' => ['type' => 'integer', 'length' => 10, 'unsigned' => true, 'null' => false, 'default' => '0', 'comment' => '', 'precision' => null, 'autoIncrement' => null], + 'pubkey' => ['type' => 'binary', 'length' => 32, 'null' => false, 'default' => null, 'comment' => '', 'precision' => null], 'email' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'first_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], - 'last_name' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], + 'firstNname' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], + 'lastName' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], 'username' => ['type' => 'string', 'length' => 255, 'null' => true, 'default' => null, 'collate' => 'utf8mb4_unicode_ci', 'comment' => '', 'precision' => null, 'fixed' => null], 'disabled' => ['type' => 'tinyinteger', 'length' => 4, 'unsigned' => false, 'null' => true, 'default' => '0', 'comment' => '', 'precision' => null], '_constraints' => [ 'primary' => ['type' => 'primary', 'columns' => ['id'], 'length' => []], - 'public_key' => ['type' => 'unique', 'columns' => ['public_key'], 'length' => []], + 'pubkey' => ['type' => 'unique', 'columns' => ['pubkey'], 'length' => []], ], '_options' => [ 'engine' => 'InnoDB', @@ -44,9 +43,9 @@ class StateUsersFixture extends BaseTestFixture public function init() { $sql_entrys = [ - [1, 0, 0, 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f', 'test1.gmail.de', 'Max', 'Mustermann', NULL, 0], - [3, 0, 0, '131c7f68dd94b2be4c913400ff7ff4cdc03ac2bda99c2d29edcacb3b065c67e6', 'test2.gmail.com', 'Ines', 'Mustermann', NULL, 0], - [4, 0, 0, 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2', 'test3.yahoo.com', 'Samuel', 'Schmied', NULL, 0] + [1, 0, 'f7f4a49a4ac10379f8b9ddcb731c4d9ec495e6edd16075f52672cd25e3179f0f', 'test1.gmail.de', 'Max', 'Mustermann', NULL, 0], + [3, 0, '131c7f68dd94b2be4c913400ff7ff4cdc03ac2bda99c2d29edcacb3b065c67e6', 'test2.gmail.com', 'Ines', 'Mustermann', NULL, 0], + [4, 0, 'e3369de3623ce8446d0424c4013e7a1d71a2671ae3d7bf1e798ebf0665d145f2', 'test3.yahoo.com', 'Samuel', 'Schmied', NULL, 0] ]; $this->records = $this->sqlEntrysToRecords($sql_entrys, $this->fields); parent::init(); diff --git a/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php b/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php index f990b3e57..496e7e3c5 100644 --- a/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php +++ b/community_server/tests/TestCase/Controller/JsonRequestHandlerControllerTest.php @@ -21,7 +21,7 @@ class JsonRequestHandlerControllerTest extends TestCase public $fixtures = [ 'app.TransactionCreations', 'app.Transactions', - 'app.StateUsers', + 'app.User', 'app.StateUserTransactions', 'app.StateErrors', 'app.TransactionSignatures', diff --git a/database/migrations/0002-update_user.ts b/database/migrations/0002-update_user.ts index 54e6acc7e..d23beab90 100644 --- a/database/migrations/0002-update_user.ts +++ b/database/migrations/0002-update_user.ts @@ -10,47 +10,46 @@ */ export async function upgrade(queryFn: (query: string, values?: any[]) => Promise>) { - // write upgrade logic as parameter of queryFn - - // rename table - await queryFn(` + // write upgrade logic as parameter of queryFn + + // rename table + await queryFn(` ALTER TABLE state_users RENAME TO user; `) - // drop not used columns - await queryFn(` + // drop not used columns + await queryFn(` ALTER TABLE user DROP COLUMN index_id; `) - // rename from snake case to camel case (cakePHP standard to typeorm standard) - await queryFn(` + // rename from snake case to camel case (cakePHP standard to typeorm standard) + await queryFn(` ALTER TABLE user CHANGE COLUMN group_id groupId int(10) unsigned NOT NULL DEFAULT '0', CHANGE COLUMN public_key pubkey binary(32) NOT NULL, CHANGE COLUMN first_name firstName varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, CHANGE COLUMN last_name lastName varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL; `) - } - - export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { - // write downgrade logic as parameter of queryFn - // rename table - await queryFn(` +} + +export async function downgrade(queryFn: (query: string, values?: any[]) => Promise>) { + // write downgrade logic as parameter of queryFn + // rename table + await queryFn(` ALTER TABLE user RENAME TO state_users; `) - // put back dropped column - await queryFn(` + // put back dropped column + await queryFn(` ALTER TABLE state_users ADD index_id smallint(6) NOT NULL DEFAULT '0'; `) - // rename from camel case to snake case (typeorm standard to cakePHP standard) - await queryFn(` + // rename from camel case to snake case (typeorm standard to cakePHP standard) + await queryFn(` ALTER TABLE state_users CHANGE COLUMN groupId group_id int(10) unsigned NOT NULL DEFAULT '0', CHANGE COLUMN pubkey public_key binary(32) NOT NULL, CHANGE COLUMN firstName first_name varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, CHANGE COLUMN lastName last_name varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL; `) - } - \ No newline at end of file +} From 8d668aebdc60b257b8879b1fac8a0e422e03c704 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 17 Sep 2021 21:49:23 +0200 Subject: [PATCH 046/144] fix test --- .../tests/TestCase/Controller/AdminErrorsControllerTest.php | 2 +- .../tests/TestCase/Controller/ProfilesControllerTest.php | 2 +- .../tests/TestCase/Controller/StateBalancesControllerTest.php | 2 +- .../tests/TestCase/Controller/StateErrorsControllerTest.php | 2 +- .../TestCase/Controller/StateUserTransactionsControllerTest.php | 2 +- .../TestCase/Controller/TransactionCreationsControllerTest.php | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php b/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php index a9044b4ae..04aee90fa 100644 --- a/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php +++ b/community_server/tests/TestCase/Controller/AdminErrorsControllerTest.php @@ -21,7 +21,7 @@ class AdminErrorsControllerTest extends TestCase */ public $fixtures = [ 'app.AdminErrors', - 'app.StateUsers' + 'app.User' ]; /** diff --git a/community_server/tests/TestCase/Controller/ProfilesControllerTest.php b/community_server/tests/TestCase/Controller/ProfilesControllerTest.php index d87558e55..77e2576ef 100644 --- a/community_server/tests/TestCase/Controller/ProfilesControllerTest.php +++ b/community_server/tests/TestCase/Controller/ProfilesControllerTest.php @@ -20,7 +20,7 @@ class ProfilesControllerTest extends TestCase * @var array */ public $fixtures = [ - 'app.StateUsers', + 'app.User', 'app.CommunityProfiles', ]; diff --git a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php index 9ef8d28e9..f533f344e 100644 --- a/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php +++ b/community_server/tests/TestCase/Controller/StateBalancesControllerTest.php @@ -24,7 +24,7 @@ class StateBalancesControllerTest extends TestCase public $fixtures = [ 'app.TransactionCreations', 'app.Transactions', - 'app.StateUsers', + 'app.User', 'app.StateUserTransactions', 'app.StateErrors', 'app.TransactionSignatures', diff --git a/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php b/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php index 452af54fc..df45ff59d 100644 --- a/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php +++ b/community_server/tests/TestCase/Controller/StateErrorsControllerTest.php @@ -21,7 +21,7 @@ class StateErrorsControllerTest extends TestCase */ public $fixtures = [ 'app.StateErrors', - 'app.StateUsers', + 'app.User', 'app.TransactionTypes' ]; diff --git a/community_server/tests/TestCase/Controller/StateUserTransactionsControllerTest.php b/community_server/tests/TestCase/Controller/StateUserTransactionsControllerTest.php index 0c9e0a513..39be9ec66 100644 --- a/community_server/tests/TestCase/Controller/StateUserTransactionsControllerTest.php +++ b/community_server/tests/TestCase/Controller/StateUserTransactionsControllerTest.php @@ -21,7 +21,7 @@ class StateUserTransactionsControllerTest extends TestCase */ public $fixtures = [ 'app.StateUserTransactions', - 'app.StateUsers', + 'app.User', 'app.Transactions', 'app.TransactionTypes', ]; diff --git a/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php b/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php index 74c0e4b1e..7a34c52a5 100644 --- a/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php +++ b/community_server/tests/TestCase/Controller/TransactionCreationsControllerTest.php @@ -22,7 +22,7 @@ class TransactionCreationsControllerTest extends TestCase public $fixtures = [ 'app.TransactionCreations', 'app.Transactions', - 'app.StateUsers' + 'app.User' ]; /** From cdbd5f59b51a51103e34a37b74741109214197d7 Mon Sep 17 00:00:00 2001 From: ogerly Date: Mon, 20 Sep 2021 08:58:58 +0200 Subject: [PATCH 047/144] after remove conflicts, fix lint --- frontend/src/components/DecayInformation.vue | 53 ++++++++++--------- .../AccountOverview/GddTransactionList.vue | 10 +++- 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue index 55ca03317..c827b26ee 100644 --- a/frontend/src/components/DecayInformation.vue +++ b/frontend/src/components/DecayInformation.vue @@ -10,7 +10,6 @@
-
@@ -20,7 +19,6 @@
-
{{ $t('decay.last_transaction') }}
@@ -65,33 +63,36 @@
-
-
-
{{ $t('form.amount') }}
-
{{ $t('form.amount') }}
+
+
+
{{ $t('form.amount') }}
+
{{ $t('form.amount') }}
+
+
+
{{ balance }}
+
-
-
{{balance}}
+
+
+
{{ $t('decay.decay') }}
+
+
+
{{ decay.balance }}
+
-
-
-
-
{{ $t('decay.decay') }}
+
+
+
{{ $t('decay.total') }}
+
+
+
+ {{ parseInt(balance) + decay.balance }} +
+
+ {{ parseInt(balance) - decay.balance }} +
+
-
-
{{ decay.balance }}
-
-
-
-
-
{{ $t('decay.total') }}
- -
-
-
{{ parseInt(balance) + decay.balance }}
-
{{ parseInt(balance) - decay.balance }}
-
-
diff --git a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue index 416e6392e..bdf4199f3 100644 --- a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue +++ b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue @@ -23,7 +23,7 @@
- +
@@ -76,7 +76,13 @@
- +
From e6d386c5984898985449599f862b1997614946f0 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 20 Sep 2021 11:22:00 +0200 Subject: [PATCH 048/144] refactor: Queries to Mutations --- backend/src/graphql/resolvers/UserResolver.ts | 6 ++-- .../src/components/LanguageSwitch.spec.js | 8 ++--- frontend/src/components/LanguageSwitch.vue | 6 ++-- frontend/src/graphql/mutations.js | 32 +++++++++++++++++++ frontend/src/graphql/queries.js | 32 ------------------- .../src/views/Pages/ResetPassword.spec.js | 8 +++-- frontend/src/views/Pages/ResetPassword.vue | 7 ++-- .../UserProfile/UserCard_FormUserData.spec.js | 2 +- .../UserProfile/UserCard_FormUserData.vue | 6 ++-- .../UserProfile/UserCard_FormUserMail.spec.js | 2 +- .../UserProfile/UserCard_FormUserMail.vue | 6 ++-- .../UserCard_FormUserPasswort.spec.js | 2 +- .../UserProfile/UserCard_FormUserPasswort.vue | 6 ++-- .../UserProfile/UserCard_FormUsername.spec.js | 2 +- .../UserProfile/UserCard_FormUsername.vue | 6 ++-- .../UserProfile/UserCard_Language.spec.js | 2 +- .../Pages/UserProfile/UserCard_Language.vue | 6 ++-- 17 files changed, 71 insertions(+), 68 deletions(-) diff --git a/backend/src/graphql/resolvers/UserResolver.ts b/backend/src/graphql/resolvers/UserResolver.ts index 7e618cf42..93172875c 100644 --- a/backend/src/graphql/resolvers/UserResolver.ts +++ b/backend/src/graphql/resolvers/UserResolver.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ -import { Resolver, Query, Args, Arg, Authorized, Ctx, UseMiddleware } from 'type-graphql' +import { Resolver, Query, Args, Arg, Authorized, Ctx, UseMiddleware, Mutation } from 'type-graphql' import CONFIG from '../../config' import { CheckUsernameResponse } from '../models/CheckUsernameResponse' import { LoginViaVerificationCode } from '../models/LoginViaVerificationCode' @@ -104,7 +104,7 @@ export class UserResolver { return new SendPasswordResetEmailResponse(response.data) } - @Query(() => String) + @Mutation(() => String) async resetPassword( @Args() { sessionId, email, password }: ChangePasswordArgs, @@ -122,7 +122,7 @@ export class UserResolver { } @Authorized() - @Query(() => UpdateUserInfosResponse) + @Mutation(() => UpdateUserInfosResponse) async updateUserInfos( @Args() { diff --git a/frontend/src/components/LanguageSwitch.spec.js b/frontend/src/components/LanguageSwitch.spec.js index afe98b357..dc76d854b 100644 --- a/frontend/src/components/LanguageSwitch.spec.js +++ b/frontend/src/components/LanguageSwitch.spec.js @@ -3,7 +3,7 @@ import LanguageSwitch from './LanguageSwitch' const localVue = global.localVue -const updateUserInfosQueryMock = jest.fn().mockResolvedValue({ +const updateUserInfosMutationMock = jest.fn().mockResolvedValue({ data: { updateUserInfos: { validValues: 1, @@ -28,7 +28,7 @@ describe('LanguageSwitch', () => { locale: 'en', }, $apollo: { - query: updateUserInfosQueryMock, + mutate: updateUserInfosMutationMock, }, } @@ -119,7 +119,7 @@ describe('LanguageSwitch', () => { describe('calls the API', () => { it("with locale 'en'", () => { wrapper.findAll('li').at(0).find('a').trigger('click') - expect(updateUserInfosQueryMock).toBeCalledWith( + expect(updateUserInfosMutationMock).toBeCalledWith( expect.objectContaining({ variables: { email: 'he@ho.he', @@ -131,7 +131,7 @@ describe('LanguageSwitch', () => { it("with locale 'de'", () => { wrapper.findAll('li').at(1).find('a').trigger('click') - expect(updateUserInfosQueryMock).toBeCalledWith( + expect(updateUserInfosMutationMock).toBeCalledWith( expect.objectContaining({ variables: { email: 'he@ho.he', diff --git a/frontend/src/components/LanguageSwitch.vue b/frontend/src/components/LanguageSwitch.vue index f0528a935..14894e46e 100644 --- a/frontend/src/components/LanguageSwitch.vue +++ b/frontend/src/components/LanguageSwitch.vue @@ -14,7 +14,7 @@ From a0b35dad239cc7b83965401e64b7f1f6339d597d Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 22 Sep 2021 11:36:30 +0200 Subject: [PATCH 066/144] Changed the method name to something a bit more meaningfull. --- frontend/src/views/Pages/UserProfile/UserCard_Language.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue index e0b5c3a72..055441aec 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue @@ -23,7 +23,7 @@ {{ $t('language') }} - {{ $t(buildLanguage()) }} + {{ $t(buildTagFromLanguageString()) }}
@@ -106,7 +106,7 @@ export default { }) }, - buildLanguage() { + buildTagFromLanguageString() { return 'languages.' + this.$store.state.language }, }, From 3ca200bb96b9cc3dcc3a8e6c656e5d0b2df9c11f Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 22 Sep 2021 12:12:28 +0200 Subject: [PATCH 067/144] Added a success message in case where language has been switched. --- frontend/src/locales/de.json | 3 ++- frontend/src/locales/en.json | 3 ++- frontend/src/views/Pages/UserProfile/UserCard_Language.vue | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 851f2a376..5db1c0a82 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -105,7 +105,8 @@ "language": "Sprache", "languages": { "de": "Deutsch", - "en": "English" + "en": "English", + "success": "Deine Sprache wurde erfolgreich geändert." }, "login": "Anmeldung", "logout": "Abmelden", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 4edf8e72d..9ca544440 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -105,7 +105,8 @@ "language": "Language", "languages": { "de": "Deutsch", - "en": "English" + "en": "English", + "success": "Your language has been successfully updated." }, "login": "Login", "logout": "Logout", diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue index 055441aec..1bf9a8415 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue @@ -100,6 +100,7 @@ export default { .then(() => { this.$store.commit('language', this.language) this.cancelEdit() + this.$toasted.success(this.$t('languages.success')) }) .catch((error) => { this.$toasted.error(error.message) From 0acb58c2311d4bff8f77cdc4a68f2a6e4d454ef3 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Wed, 22 Sep 2021 12:28:36 +0200 Subject: [PATCH 068/144] use database for migration test db, remove debug code --- .github/workflows/test.yml | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e31fa6b7d..046d63681 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -413,22 +413,31 @@ jobs: needs: [build_test_community_server] services: mariadb: - image: gradido/mariadb:test + image: mariadb/server:10.5 env: MARIADB_ALLOW_EMPTY_PASSWORD: 1 MARIADB_USER: root - # ports: - # - 3306:3306 + MARIADB_DATABASE: gradido_community_test options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=5s --health-retries=3 + database: + image: gradido/database:production_up + build: + context: ./database + target: production_up + depends_on: + - mariadb + networks: + - internal-net + environment: + - NODE_ENV="production" + - DB_HOST=mariadb steps: - name: get mariadb container id run: echo "::set-output name=id::$(docker container ls | grep mariadb | awk '{ print $1 }')" id: mariadb_container - - name: show networks - run: echo "$(docker network ls)" - name: get automatic created network run: echo "::set-output name=id::$(docker network ls | grep github_network | awk '{ print $1 }')" id: network @@ -452,12 +461,6 @@ jobs: path: /tmp - name: Load Docker Image run: docker load < /tmp/community_server.tar - - # for debugging login-server - - name: check login-server - run: docker logs ${{ steps.login_server_container.outputs.id }} - - name: check mariadb - run: docker logs ${{ steps.mariadb_container.outputs.id }} ########################################################################## # UNIT TESTS BACKEND COMMUNITY-SERVER ####################################### ########################################################################## From 09e87526def054991b354132ee1a2314c7b2b5f1 Mon Sep 17 00:00:00 2001 From: elweyn Date: Wed, 22 Sep 2021 12:29:21 +0200 Subject: [PATCH 069/144] Added a success message for language switch in profile. --- frontend/src/views/Pages/UserProfile/UserCard_Language.vue | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue index 1bf9a8415..d7a059715 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue @@ -62,6 +62,7 @@ - + From 3bf0c2ad9c1caf1f17452a28af5093f3dacd0d27 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 24 Sep 2021 11:17:58 +0200 Subject: [PATCH 100/144] minimal change to trigger rebuild --- .github/workflows/test.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e31fa6b7d..aea0cc1b1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,5 @@ name: gradido test CI - on: [push] jobs: From d5c1d3bca045bf7ba72998c652810f79cb25f568 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 24 Sep 2021 11:33:49 +0200 Subject: [PATCH 101/144] class clo to element b-col --- frontend/src/components/DecayInformation.vue | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue index f219973bd..e6cbd54bd 100644 --- a/frontend/src/components/DecayInformation.vue +++ b/frontend/src/components/DecayInformation.vue @@ -20,10 +20,10 @@
-
+
{{ $t('decay.last_transaction') }}
-
+
{{ $t('decay.Starting_block_decay') }}
@@ -41,10 +41,10 @@
-
+
{{ $t('decay.past_time') }}
-
+
{{ $t('decay.since_introduction') }}
{{ duration.years }} {{ $t('decay.year') }}, @@ -64,29 +64,29 @@
-
+
{{ $t('decay.sent') }}
{{ $t('decay.received') }}
-
+
- {{ balance }}
+ {{ balance }}
-
+
{{ $t('decay.decay') }}
-
+
- {{ decay.balance }}

-
+
{{ $t('decay.total') }}
-
+
- {{ parseInt(balance) + decay.balance }}
From 092d3f6f5ddafba3d0ff6c61fe44a791f43a1487 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 24 Sep 2021 12:13:48 +0200 Subject: [PATCH 102/144] Better explanation and presentation of the calculation of the total sum with the inclusion of decay --- frontend/src/components/DecayInformation.vue | 95 ++++++++++++-------- 1 file changed, 57 insertions(+), 38 deletions(-) diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue index c9ffa9115..9abc6cfbe 100644 --- a/frontend/src/components/DecayInformation.vue +++ b/frontend/src/components/DecayInformation.vue @@ -19,12 +19,12 @@
-
-
-
{{ $t('decay.last_transaction') }}
-
-
-
+ + +
{{ $t('decay.last_transaction') }}
+
+ +
{{ $t('decay.Starting_block_decay') }}
{{ $t('decay.decay_introduced') }} : @@ -37,15 +37,15 @@ {{ $i18n.locale === 'de' ? 'Uhr' : '' }}
-
-
+ + -
-
+ +
{{ $t('decay.past_time') }}
-
-
-
{{ $t('decay.since_introduction') }}
+ + +
{{ $t('decay.since_introduction') }}
{{ duration.years }} {{ $t('decay.year') }}, @@ -60,42 +60,61 @@ {{ duration.seconds }} {{ $t('decay.seconds') }} -
-
+ + +
-
-
+ + + +
{{ $t('decay.decay') }}
+
+ +
- {{ decay.balance }}
+
+
+
+ + + Berechnung der Gesamtsumme + + + + +
{{ $t('decay.sent') }}
{{ $t('decay.received') }}
-
-
+ +
- {{ balance }}
+ {{ balance }}
-
-
-
-
-
{{ $t('decay.decay') }}
-
-
-
- {{ decay.balance }}
-
-
-
-
-
-
{{ $t('decay.total') }}
-
-
+ + + + + + +
{{ $t('decay.total') }}
+
+
- {{ parseInt(balance) + decay.balance }}
{{ parseInt(balance) - decay.balance }}
-
-
-
+ + + + + + (Vergänglichkeit plus Gesendet) + (Vergänglichkeit minus Empfangen) + + + + +
From 4c574c1081a5be382d80580cde1383e0a03d1362 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 24 Sep 2021 12:27:39 +0200 Subject: [PATCH 103/144] add lacales, fix locales, fix lint --- frontend/src/components/DecayInformation.vue | 34 ++++++++++++-------- frontend/src/locales/de.json | 3 ++ frontend/src/locales/en.json | 3 ++ 3 files changed, 26 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue index 9abc6cfbe..6b88e5cac 100644 --- a/frontend/src/components/DecayInformation.vue +++ b/frontend/src/components/DecayInformation.vue @@ -21,10 +21,10 @@ -
{{ $t('decay.last_transaction') }}
+
{{ $t('decay.last_transaction') }}
-
+
{{ $t('decay.Starting_block_decay') }}
{{ $t('decay.decay_introduced') }} : @@ -45,7 +45,7 @@
{{ $t('decay.past_time') }}
-
{{ $t('decay.since_introduction') }}
+
{{ $t('decay.since_introduction') }}
{{ duration.years }} {{ $t('decay.year') }}, @@ -62,7 +62,7 @@
- +
@@ -73,10 +73,10 @@
- {{ decay.balance }}
-
+
- Berechnung der Gesamtsumme + {{ $t('decay.calculation_total') }} @@ -90,11 +90,19 @@
+ {{ balance }}
- + + + +
{{ $t('decay.decay') }}
+
+ +
- {{ decay.balance }}
+
+
-
{{ $t('decay.total') }}
+
{{ $t('decay.total') }}
@@ -105,16 +113,14 @@
- + - (Vergänglichkeit plus Gesendet) - (Vergänglichkeit minus Empfangen) + {{ $t('decay.formula_total_sent') }} + {{ $t('decay.formula_total_received') }} - - -
+
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index af7e19fc5..27fa0e906 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -12,12 +12,15 @@ }, "decay": { "calculation_decay": "Berechnung der Vergänglichkeit", + "calculation_total": "Berechnung der Gesamtsumme", "created": "Geschöpft", "days": "Tage", "decay": "Vergänglichkeit", "decayStart": " - Startblock für Vergänglichkeit am: ", "decay_introduced": "Die Vergänglichkeit wurde Eingeführt am ", "decay_since_last_transaction": "Vergänglichkeit seit der letzten Transaktion", + "formula_total_received": "(Empfangen minus Vergänglichkeit)", + "formula_total_sent": "(Gesendet plus Vergänglichkeit)", "fromCommunity": "Aus der Gemeinschaft", "hours": "Stunden", "last_transaction": "Letzte Transaktion", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 8bd6aea99..90de4b9eb 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -12,12 +12,15 @@ }, "decay": { "calculation_decay": "Calculation of Decay", + "calculation_total": "Calculation of the total", "created": "Created", "days": "Days", "decay": "Decay", "decayStart": " - Starting block for decay at: ", "decay_introduced": "Decay was Introduced on", "decay_since_last_transaction": "Decay since the last transaction", + "formula_total_received": "(Received minus decay)", + "formula_total_sent": "(Sent plus decay)", "fromCommunity": "From the community", "hours": "Hours", "last_transaction": "Last transaction:", From 1f99be5eec6971410acd88917a6631bfcc2ca845 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 24 Sep 2021 12:29:41 +0200 Subject: [PATCH 104/144] exchange t for typeorm with db for db model.. it's more clear --- backend/src/graphql/resolvers/BalanceResolver.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/src/graphql/resolvers/BalanceResolver.ts b/backend/src/graphql/resolvers/BalanceResolver.ts index c42d3d101..34aedac37 100644 --- a/backend/src/graphql/resolvers/BalanceResolver.ts +++ b/backend/src/graphql/resolvers/BalanceResolver.ts @@ -5,8 +5,8 @@ import { Resolver, Query, Ctx, Authorized } from 'type-graphql' import CONFIG from '../../config' import { Balance } from '../models/Balance' import { apiGet } from '../../apis/HttpRequest' -import { User as tUser } from '../../typeorm/entity/User' -import { Balance as tBalance } from '../../typeorm/entity/Balance' +import { User as dbUser } from '../../typeorm/entity/User' +import { Balance as dbBalance } from '../../typeorm/entity/Balance' import calculateDecay from '../../util/decay' import { roundFloorFrom4 } from '../../util/round' @@ -20,8 +20,8 @@ export class BalanceResolver { if (!result.success) throw new Error(result.data) // load user and balance - const userEntity = await tUser.findByPubkeyHex(result.data.user.public_hex) - const balanceEntity = await tBalance.findByUser(userEntity.id) + const userEntity = await dbUser.findByPubkeyHex(result.data.user.public_hex) + const balanceEntity = await dbBalance.findByUser(userEntity.id) const now = new Date() const balance = new Balance({ balance: roundFloorFrom4(balanceEntity.amount), From eefc506e9767f3313eff438eef1620c819c2deba Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 24 Sep 2021 12:32:30 +0200 Subject: [PATCH 105/144] linting and use db for db Models --- .../src/graphql/inputs/TransactionInput.ts | 2 +- .../graphql/resolvers/TransactionResolver.ts | 22 ++-- .../src/graphql/resolvers/listTransactions.ts | 102 +++++++++--------- backend/src/typeorm/entity/User.ts | 3 +- backend/src/typeorm/entity/UserTransaction.ts | 25 ++--- 5 files changed, 81 insertions(+), 73 deletions(-) diff --git a/backend/src/graphql/inputs/TransactionInput.ts b/backend/src/graphql/inputs/TransactionInput.ts index 1f79d193e..016fe9720 100644 --- a/backend/src/graphql/inputs/TransactionInput.ts +++ b/backend/src/graphql/inputs/TransactionInput.ts @@ -9,7 +9,7 @@ export class TransactionListInput { items: number @Field(() => String) - order: "ASC" | "DESC" + order: 'ASC' | 'DESC' } @ArgsType() diff --git a/backend/src/graphql/resolvers/TransactionResolver.ts b/backend/src/graphql/resolvers/TransactionResolver.ts index cd17ae993..15de4d145 100644 --- a/backend/src/graphql/resolvers/TransactionResolver.ts +++ b/backend/src/graphql/resolvers/TransactionResolver.ts @@ -6,8 +6,8 @@ import CONFIG from '../../config' import { TransactionList } from '../models/Transaction' import { TransactionListInput, TransactionSendArgs } from '../inputs/TransactionInput' import { apiGet, apiPost } from '../../apis/HttpRequest' -import { User } from '../../typeorm/entity/User' -import { Balance } from '../../typeorm/entity/Balance' +import { User as dbUser } from '../../typeorm/entity/User' +import { Balance as dbBalance } from '../../typeorm/entity/Balance' import listTransactions from './listTransactions' import { roundFloorFrom4 } from '../../util/round' import calculateDecay from '../../util/decay' @@ -25,24 +25,26 @@ export class TransactionResolver { if (!result.success) throw new Error(result.data) // load user - const userEntity = await User.findByPubkeyHex(result.data.user.public_hex) + const userEntity = await dbUser.findByPubkeyHex(result.data.user.public_hex) const transactions = await listTransactions(firstPage, items, order, userEntity) - // get gdt sum - const resultGDTSum = await apiPost( - `${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, {email: userEntity.email} - ) + // get gdt sum + const resultGDTSum = await apiPost(`${CONFIG.GDT_API_URL}/GdtEntries/sumPerEmailApi`, { + email: userEntity.email, + }) if (!resultGDTSum.success) throw new Error(resultGDTSum.data) transactions.gdtSum = resultGDTSum.data.sum // get balance - const balanceEntity = await Balance.findByUser(userEntity.id) + const balanceEntity = await dbBalance.findByUser(userEntity.id) const now = new Date() transactions.balance = roundFloorFrom4(balanceEntity.amount) - transactions.decay = roundFloorFrom4(calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now)) + transactions.decay = roundFloorFrom4( + calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), + ) transactions.decayDate = now.toString() - + return transactions } diff --git a/backend/src/graphql/resolvers/listTransactions.ts b/backend/src/graphql/resolvers/listTransactions.ts index a7889a954..ed992fe81 100644 --- a/backend/src/graphql/resolvers/listTransactions.ts +++ b/backend/src/graphql/resolvers/listTransactions.ts @@ -1,61 +1,67 @@ - -import { User } from '../../typeorm/entity/User' +import { User as dbUser } from '../../typeorm/entity/User' import { TransactionList, Transaction } from '../models/Transaction' import { UserTransaction } from '../../typeorm/entity/UserTransaction' function calculateAndAddDecayTransactions( - userTransactions:UserTransaction[], - user: User, - decay:boolean, - skipFirstTransaction:boolean -): Transaction[] -{ - let transactions: Transaction[] = [] + userTransactions: UserTransaction[], + user: dbUser, + decay: boolean, + skipFirstTransaction: boolean, +): Transaction[] { + const transactions: Transaction[] = [] - return transactions + return transactions } - export default async function listTransactions( - firstPage:number, - items:number, - order:"ASC" | "DESC", - user:User) : Promise -{ + firstPage: number, + items: number, + order: 'ASC' | 'DESC', + user: dbUser, +): Promise { + let limit = items + let offset = 0 + let skipFirstTransaction = false + if (firstPage > 1) { + offset = (firstPage - 1) * items - 1 + limit++ + } - let limit = items - let offset = 0 - let skipFirstTransaction = false - if(firstPage > 1) { - offset = (( firstPage - 1 ) * items) - 1; - limit++; + if (offset && order === 'ASC') { + offset-- + } + let [userTransactions, userTransactionsCount] = await UserTransaction.findByUserPaged( + user.id, + limit, + offset, + order, + ) + skipFirstTransaction = userTransactionsCount > offset + limit + const decay = !(firstPage > 1) + const transactions: Transaction[] = [] + if (userTransactions.length) { + if (order === 'DESC') { + userTransactions = userTransactions.reverse() } - - if(offset && order == 'ASC') { - offset--; - } - let [userTransactions, userTransactionsCount] = await UserTransaction.findByUserPaged(user.id, limit, offset, order) - skipFirstTransaction = userTransactionsCount > offset + limit - const decay = !(firstPage > 1) - let transactions: Transaction[] = [] - if(userTransactions.length) { - if(order === 'DESC') { - userTransactions = userTransactions.reverse() - } - let transactions = calculateAndAddDecayTransactions(userTransactions, user, decay, skipFirstTransaction) - if(order === 'DESC') { - transactions = transactions.reverse() - } + let transactions = calculateAndAddDecayTransactions( + userTransactions, + user, + decay, + skipFirstTransaction, + ) + if (order === 'DESC') { + transactions = transactions.reverse() } + } - const transactionList = new TransactionList({ - gdtSum: 0, - count: userTransactionsCount, - balance: 0, - decay: 0, - decay_date: '', - transactions: transactions - }) + const transactionList = new TransactionList({ + gdtSum: 0, + count: userTransactionsCount, + balance: 0, + decay: 0, + decay_date: '', + transactions: transactions, + }) - return transactionList -} \ No newline at end of file + return transactionList +} diff --git a/backend/src/typeorm/entity/User.ts b/backend/src/typeorm/entity/User.ts index c675a1d53..cb9de27c8 100644 --- a/backend/src/typeorm/entity/User.ts +++ b/backend/src/typeorm/entity/User.ts @@ -1,5 +1,4 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm' -import { UserTransaction } from './UserTransaction' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' // import { Group } from "./Group" @Entity('state_users') diff --git a/backend/src/typeorm/entity/UserTransaction.ts b/backend/src/typeorm/entity/UserTransaction.ts index 6232c220d..494f57103 100644 --- a/backend/src/typeorm/entity/UserTransaction.ts +++ b/backend/src/typeorm/entity/UserTransaction.ts @@ -1,6 +1,4 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, Timestamp, ManyToOne } from 'typeorm' -import { User } from './User' - +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, Timestamp } from 'typeorm' @Entity('state_user_transactions') export class UserTransaction extends BaseEntity { @@ -21,15 +19,18 @@ export class UserTransaction extends BaseEntity { @Column({ name: 'balance_date', type: 'timestamp' }) balanceDate: Timestamp - - static findByUserPaged(userId: number, limit: number, offset: number, order: "ASC" | "DESC") - :Promise<[UserTransaction[], number]> - { + + static findByUserPaged( + userId: number, + limit: number, + offset: number, + order: 'ASC' | 'DESC', + ): Promise<[UserTransaction[], number]> { return this.createQueryBuilder('userTransaction') - .where('userTransaction.userId = :userId', { userId }) - .orderBy('userTransaction.balanceDate', order) - .limit(limit) - .offset(offset) - .getManyAndCount() + .where('userTransaction.userId = :userId', { userId }) + .orderBy('userTransaction.balanceDate', order) + .limit(limit) + .offset(offset) + .getManyAndCount() } } From 2d1a0d8c4eb56b2fd13c0dda6cf991190587fde3 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 24 Sep 2021 13:08:01 +0200 Subject: [PATCH 106/144] now in the correct file --- backend/src/graphql/resolvers/GdtResolver.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/graphql/resolvers/GdtResolver.ts b/backend/src/graphql/resolvers/GdtResolver.ts index 212d2b42f..4396c5ac9 100644 --- a/backend/src/graphql/resolvers/GdtResolver.ts +++ b/backend/src/graphql/resolvers/GdtResolver.ts @@ -6,7 +6,7 @@ import CONFIG from '../../config' import { GdtEntryList } from '../models/GdtEntryList' import { GdtTransactionSessionIdInput } from '../inputs/GdtInputs' import { apiGet } from '../../apis/HttpRequest' -import { User as tUser } from '../../typeorm/entity/User' +import { User as dbUser } from '../../typeorm/entity/User' @Resolver() export class GdtResolver { @@ -23,7 +23,7 @@ export class GdtResolver { if (!result.success) throw new Error(result.data) // load user - const userEntity = await tUser.findByPubkeyHex(result.data.user.public_hex) + const userEntity = await dbUser.findByPubkeyHex(result.data.user.public_hex) const resultGDT = await apiGet( `${CONFIG.GDT_API_URL}/GdtEntries/listPerEmailApi/${userEntity.email}/${currentPage}/${pageSize}/${order}`, From 05bab6e7575ca6e67cca52ca769814473d81d1d8 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 24 Sep 2021 13:10:04 +0200 Subject: [PATCH 107/144] remove formal totale sum --- frontend/src/components/DecayInformation.vue | 7 ------- frontend/src/locales/de.json | 2 -- frontend/src/locales/en.json | 2 -- 3 files changed, 11 deletions(-) diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue index 6b88e5cac..1fb0df3a4 100644 --- a/frontend/src/components/DecayInformation.vue +++ b/frontend/src/components/DecayInformation.vue @@ -113,13 +113,6 @@
- - - - {{ $t('decay.formula_total_sent') }} - {{ $t('decay.formula_total_received') }} - -
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 27fa0e906..280c9cf67 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -19,8 +19,6 @@ "decayStart": " - Startblock für Vergänglichkeit am: ", "decay_introduced": "Die Vergänglichkeit wurde Eingeführt am ", "decay_since_last_transaction": "Vergänglichkeit seit der letzten Transaktion", - "formula_total_received": "(Empfangen minus Vergänglichkeit)", - "formula_total_sent": "(Gesendet plus Vergänglichkeit)", "fromCommunity": "Aus der Gemeinschaft", "hours": "Stunden", "last_transaction": "Letzte Transaktion", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 90de4b9eb..67aa135c4 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -19,8 +19,6 @@ "decayStart": " - Starting block for decay at: ", "decay_introduced": "Decay was Introduced on", "decay_since_last_transaction": "Decay since the last transaction", - "formula_total_received": "(Received minus decay)", - "formula_total_sent": "(Sent plus decay)", "fromCommunity": "From the community", "hours": "Hours", "last_transaction": "Last transaction:", From c1f5a425b4a56b6ae64912ed3e235dc115f0cd81 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Fri, 24 Sep 2021 13:14:51 +0200 Subject: [PATCH 108/144] Update en.json --- frontend/src/locales/en.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 67aa135c4..48a0659d1 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -12,7 +12,7 @@ }, "decay": { "calculation_decay": "Calculation of Decay", - "calculation_total": "Calculation of the total", + "calculation_total": "Calculation of the grand total", "created": "Created", "days": "Days", "decay": "Decay", From e80cea5fc4b688244c04e3af480cdfaaf029d184 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 24 Sep 2021 13:24:18 +0200 Subject: [PATCH 109/144] add more typeorm models --- backend/src/typeorm/entity/Transaction.ts | 23 ++++++++++++++ .../src/typeorm/entity/TransactionCreation.ts | 25 +++++++++++++++ .../src/typeorm/entity/TransactionSendCoin.ts | 31 +++++++++++++++++++ 3 files changed, 79 insertions(+) create mode 100644 backend/src/typeorm/entity/Transaction.ts create mode 100644 backend/src/typeorm/entity/TransactionCreation.ts create mode 100644 backend/src/typeorm/entity/TransactionSendCoin.ts diff --git a/backend/src/typeorm/entity/Transaction.ts b/backend/src/typeorm/entity/Transaction.ts new file mode 100644 index 000000000..4fdaf6eb8 --- /dev/null +++ b/backend/src/typeorm/entity/Transaction.ts @@ -0,0 +1,23 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, Timestamp } from 'typeorm' + +@Entity('transactions') +export class Transaction extends BaseEntity { + @PrimaryGeneratedColumn() + id: number + + @Column({ name: 'transaction_type_id' }) + transactionTypeId: number + + @Column({ name: 'tx_hash', type: 'binary', length: 48 }) + txHash: Buffer + + @Column() + memo: string + + @Column({ type: 'timestamp' }) + received: Timestamp + + @Column({ name: 'blockchain_type_id' }) + blockchainTypeId: number + +} diff --git a/backend/src/typeorm/entity/TransactionCreation.ts b/backend/src/typeorm/entity/TransactionCreation.ts new file mode 100644 index 000000000..ec473a13b --- /dev/null +++ b/backend/src/typeorm/entity/TransactionCreation.ts @@ -0,0 +1,25 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, Timestamp, OneToOne, JoinColumn } from 'typeorm' +import { Transaction } from './Transaction' + +@Entity('transaction_creations') +export class TransactionCreation extends BaseEntity { + @PrimaryGeneratedColumn() + id: number + + @Column({ name: 'transaction_id' }) + transactionId: number + + @Column({ name: 'state_user_id' }) + userId: number + + @Column() + amount: number + + @Column({ name: 'target_date', type: 'timestamp' }) + targetDate: Timestamp + + @OneToOne(() => Transaction) + @JoinColumn() + transaction: Transaction + +} diff --git a/backend/src/typeorm/entity/TransactionSendCoin.ts b/backend/src/typeorm/entity/TransactionSendCoin.ts new file mode 100644 index 000000000..b5b675d42 --- /dev/null +++ b/backend/src/typeorm/entity/TransactionSendCoin.ts @@ -0,0 +1,31 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm' +import { Transaction } from './Transaction' + +@Entity('transaction_send_coins') +export class TransactionSendCoin extends BaseEntity { + @PrimaryGeneratedColumn() + id: number + + @Column({ name: 'transaction_id' }) + transactionId: number + + @Column({ name: 'sender_public_key', type: 'binary', length: 32 }) + senderPublic: Buffer + + @Column({ name: 'state_user_id' }) + userId: number + + @Column({ name: 'receiver_public_key', type: 'binary', length: 32}) + recipiantPublic: Buffer + + @Column({ name: 'receiver_user_id' }) + recipiantUserId: number + + @Column() + amount: number + + @OneToOne(() => Transaction) + @JoinColumn() + transaction: Transaction + +} From d6dbc50c925c6ee2015fca43683848d5fb39542d Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Sep 2021 13:46:09 +0200 Subject: [PATCH 110/144] check db version with typeORM --- backend/src/database/connection.ts | 18 -------------- backend/src/index.ts | 33 +++++++++++-------------- backend/src/typeorm/entity/Migration.ts | 21 ++++++++++++++++ backend/src/typeorm/getDBVersion.ts | 15 +++++++++++ 4 files changed, 51 insertions(+), 36 deletions(-) delete mode 100644 backend/src/database/connection.ts create mode 100644 backend/src/typeorm/entity/Migration.ts create mode 100644 backend/src/typeorm/getDBVersion.ts diff --git a/backend/src/database/connection.ts b/backend/src/database/connection.ts deleted file mode 100644 index 584b657d2..000000000 --- a/backend/src/database/connection.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { createConnection, Connection } from 'mysql2/promise' -import CONFIG from '../config' - -const connection = async (): Promise => { - const con = await createConnection({ - host: CONFIG.DB_HOST, - port: CONFIG.DB_PORT, - user: CONFIG.DB_USER, - password: CONFIG.DB_PASSWORD, - database: CONFIG.DB_DATABASE, - }) - - await con.connect() - - return con -} - -export default connection diff --git a/backend/src/index.ts b/backend/src/index.ts index bd58f8c86..36442a4ca 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -5,12 +5,12 @@ import express from 'express' import cors from 'cors' import { buildSchema } from 'type-graphql' import { ApolloServer } from 'apollo-server-express' -import { RowDataPacket } from 'mysql2/promise' -import connection from './database/connection' -import typeOrmConnection from './typeorm/connection' import CONFIG from './config' +import connection from './typeorm/connection' +import getDBVersion from './typeorm/getDBVersion' + // TODO move to extern import { UserResolver } from './graphql/resolvers/UserResolver' import { BalanceResolver } from './graphql/resolvers/BalanceResolver' @@ -39,20 +39,20 @@ const context = (args: any) => { } async function main() { - // check for correct database version + // open mysql connection const con = await connection() - const [rows] = await con.query(`SELECT * FROM migrations ORDER BY version DESC LIMIT 1;`) - if ( - (rows).length === 0 || - !(rows)[0].fileName || - (rows)[0].fileName.indexOf(DB_VERSION) === -1 - ) { - throw new Error(`Wrong database version - the backend requires '${DB_VERSION}'`) + if (!con.isConnected) { + throw new Error(`Couldn't open connection to database`) } - const toCon = await typeOrmConnection() - if (!toCon.isConnected) { - throw new Error(`Couldn't open typeorm db connection`) + // check for correct database version + const dbVersion = await getDBVersion() + if (!dbVersion || dbVersion.indexOf(DB_VERSION) === -1) { + throw new Error( + `Wrong database version - the backend requires '${DB_VERSION}' but found '${ + dbVersion || 'None' + }'`, + ) } const schema = await buildSchema({ @@ -61,10 +61,7 @@ async function main() { }) // Graphiql interface - let playground = false - if (CONFIG.GRAPHIQL) { - playground = true - } + const playground = CONFIG.GRAPHIQL // Express Server const server = express() diff --git a/backend/src/typeorm/entity/Migration.ts b/backend/src/typeorm/entity/Migration.ts new file mode 100644 index 000000000..fbeeca14d --- /dev/null +++ b/backend/src/typeorm/entity/Migration.ts @@ -0,0 +1,21 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' + +@Entity('migrations') +export class Migration extends BaseEntity { + @PrimaryGeneratedColumn() // This is actually not a primary column + version: number + + @Column({ length: 256, nullable: true, default: null }) + fileName: string + + @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' }) + date: Date + + /* + static findByUser(userId: number): Promise { + return this.createQueryBuilder('balance') + .where('balance.userId = :userId', { userId }) + .getOneOrFail() + } + */ +} diff --git a/backend/src/typeorm/getDBVersion.ts b/backend/src/typeorm/getDBVersion.ts new file mode 100644 index 000000000..497a6da5e --- /dev/null +++ b/backend/src/typeorm/getDBVersion.ts @@ -0,0 +1,15 @@ +import { getConnection } from 'typeorm' +import { Migration } from './entity/Migration' + +const getDBVersion = async (): Promise => { + const connection = getConnection() + const migrations = connection.getRepository(Migration) + try { + const dbVersion = await migrations.findOne({ order: { version: 'DESC' } }) + return dbVersion ? dbVersion.fileName : null + } catch (error) { + return null + } +} + +export default getDBVersion From 91849b5130066efbe52bb2e1f503d8ae5c95d626 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Sep 2021 14:02:01 +0200 Subject: [PATCH 111/144] externalize resolver import --- backend/src/graphql/resolvers/index.ts | 19 +++++++++++++++++++ backend/src/index.ts | 13 ++++++------- 2 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 backend/src/graphql/resolvers/index.ts diff --git a/backend/src/graphql/resolvers/index.ts b/backend/src/graphql/resolvers/index.ts new file mode 100644 index 000000000..f42829645 --- /dev/null +++ b/backend/src/graphql/resolvers/index.ts @@ -0,0 +1,19 @@ +import { UserResolver } from './UserResolver' +import { BalanceResolver } from './BalanceResolver' +import { GdtResolver } from './GdtResolver' +import { TransactionResolver } from './TransactionResolver' +import { KlicktippResolver } from './KlicktippResolver' +import { NonEmptyArray } from 'type-graphql' + +export { UserResolver, BalanceResolver, GdtResolver, TransactionResolver, KlicktippResolver } + +// eslint-disable-next-line @typescript-eslint/ban-types +const resolvers = (): NonEmptyArray => [ + UserResolver, + BalanceResolver, + GdtResolver, + TransactionResolver, + KlicktippResolver, +] + +export default resolvers diff --git a/backend/src/index.ts b/backend/src/index.ts index 36442a4ca..679221691 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -6,18 +6,17 @@ import cors from 'cors' import { buildSchema } from 'type-graphql' import { ApolloServer } from 'apollo-server-express' +// config import CONFIG from './config' +// database import connection from './typeorm/connection' import getDBVersion from './typeorm/getDBVersion' -// TODO move to extern -import { UserResolver } from './graphql/resolvers/UserResolver' -import { BalanceResolver } from './graphql/resolvers/BalanceResolver' -import { GdtResolver } from './graphql/resolvers/GdtResolver' -import { TransactionResolver } from './graphql/resolvers/TransactionResolver' -import { KlicktippResolver } from './graphql/resolvers/KlicktippResolver' +// graphql +import resolvers from './graphql/resolvers' +// auth import { isAuthorized } from './auth/auth' // TODO implement @@ -56,7 +55,7 @@ async function main() { } const schema = await buildSchema({ - resolvers: [UserResolver, BalanceResolver, TransactionResolver, GdtResolver, KlicktippResolver], + resolvers: resolvers(), authChecker: isAuthorized, }) From 4601c3df345d4c9e0b33108f36387814a3e9e603 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Sep 2021 14:10:54 +0200 Subject: [PATCH 112/144] build schema in graphql folder not in index --- backend/src/graphql/index.ts | 14 ++++++++++++++ backend/src/index.ts | 21 +++++++-------------- 2 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 backend/src/graphql/index.ts diff --git a/backend/src/graphql/index.ts b/backend/src/graphql/index.ts new file mode 100644 index 000000000..a36d1dcdf --- /dev/null +++ b/backend/src/graphql/index.ts @@ -0,0 +1,14 @@ +import { GraphQLSchema } from 'graphql' +import { buildSchema } from 'type-graphql' + +import resolvers from './resolvers' +import { isAuthorized } from '../auth/auth' + +const schema = async (): Promise => { + return buildSchema({ + resolvers: resolvers(), + authChecker: isAuthorized, + }) +} + +export { schema } diff --git a/backend/src/index.ts b/backend/src/index.ts index 679221691..c6121aeee 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -3,7 +3,6 @@ import 'reflect-metadata' import express from 'express' import cors from 'cors' -import { buildSchema } from 'type-graphql' import { ApolloServer } from 'apollo-server-express' // config @@ -14,10 +13,7 @@ import connection from './typeorm/connection' import getDBVersion from './typeorm/getDBVersion' // graphql -import resolvers from './graphql/resolvers' - -// auth -import { isAuthorized } from './auth/auth' +import { schema } from './graphql' // TODO implement // import queryComplexity, { simpleEstimator, fieldConfigEstimator } from "graphql-query-complexity"; @@ -54,14 +50,6 @@ async function main() { ) } - const schema = await buildSchema({ - resolvers: resolvers(), - authChecker: isAuthorized, - }) - - // Graphiql interface - const playground = CONFIG.GRAPHIQL - // Express Server const server = express() @@ -89,7 +77,12 @@ async function main() { ] // Apollo Server - const apollo = new ApolloServer({ schema, playground, context, plugins }) + const apollo = new ApolloServer({ + schema: await schema(), + playground: CONFIG.GRAPHIQL, + context, + plugins, + }) apollo.applyMiddleware({ app: server }) // Start Server From 255244fbecdc7f9173381e36c36b6c66f2149f0b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Sep 2021 14:21:14 +0200 Subject: [PATCH 113/144] have schema extern have cors extern have plugins exter have context extern --- backend/src/graphql/{index.ts => schema.ts} | 2 +- backend/src/index.ts | 45 ++++----------------- backend/src/server/context.ts | 14 +++++++ backend/src/server/cors.ts | 8 ++++ backend/src/server/plugins.ts | 17 ++++++++ 5 files changed, 48 insertions(+), 38 deletions(-) rename backend/src/graphql/{index.ts => schema.ts} (93%) create mode 100644 backend/src/server/context.ts create mode 100644 backend/src/server/cors.ts create mode 100644 backend/src/server/plugins.ts diff --git a/backend/src/graphql/index.ts b/backend/src/graphql/schema.ts similarity index 93% rename from backend/src/graphql/index.ts rename to backend/src/graphql/schema.ts index a36d1dcdf..f18a3bea6 100644 --- a/backend/src/graphql/index.ts +++ b/backend/src/graphql/schema.ts @@ -11,4 +11,4 @@ const schema = async (): Promise => { }) } -export { schema } +export default schema diff --git a/backend/src/index.ts b/backend/src/index.ts index c6121aeee..c138deba7 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -2,7 +2,6 @@ import 'reflect-metadata' import express from 'express' -import cors from 'cors' import { ApolloServer } from 'apollo-server-express' // config @@ -12,27 +11,19 @@ import CONFIG from './config' import connection from './typeorm/connection' import getDBVersion from './typeorm/getDBVersion' +// server +import cors from './server/cors' +import context from './server/context' +import plugins from './server/plugins' + // graphql -import { schema } from './graphql' +import schema from './graphql/schema' // TODO implement // import queryComplexity, { simpleEstimator, fieldConfigEstimator } from "graphql-query-complexity"; const DB_VERSION = '0001-init_db' -const context = (args: any) => { - const authorization = args.req.headers.authorization - let token = null - if (authorization) { - token = authorization.replace(/^Bearer /, '') - } - const context = { - token, - setHeaders: [], - } - return context -} - async function main() { // open mysql connection const con = await connection() @@ -53,28 +44,8 @@ async function main() { // Express Server const server = express() - const corsOptions = { - origin: '*', - exposedHeaders: ['token'], - } - - server.use(cors(corsOptions)) - - const plugins = [ - { - requestDidStart() { - return { - willSendResponse(requestContext: any) { - const { setHeaders = [] } = requestContext.context - setHeaders.forEach(({ key, value }: { [key: string]: string }) => { - requestContext.response.http.headers.append(key, value) - }) - return requestContext - }, - } - }, - }, - ] + // cors + server.use(cors) // Apollo Server const apollo = new ApolloServer({ diff --git a/backend/src/server/context.ts b/backend/src/server/context.ts new file mode 100644 index 000000000..2ad4b520d --- /dev/null +++ b/backend/src/server/context.ts @@ -0,0 +1,14 @@ +const context = (args: any) => { + const authorization = args.req.headers.authorization + let token = null + if (authorization) { + token = authorization.replace(/^Bearer /, '') + } + const context = { + token, + setHeaders: [], + } + return context +} + +export default context diff --git a/backend/src/server/cors.ts b/backend/src/server/cors.ts new file mode 100644 index 000000000..e76ed1591 --- /dev/null +++ b/backend/src/server/cors.ts @@ -0,0 +1,8 @@ +import cors from 'cors' + +const corsOptions = { + origin: '*', + exposedHeaders: ['token'], +} + +export default cors(corsOptions) diff --git a/backend/src/server/plugins.ts b/backend/src/server/plugins.ts new file mode 100644 index 000000000..6b27d19ea --- /dev/null +++ b/backend/src/server/plugins.ts @@ -0,0 +1,17 @@ +const plugins = [ + { + requestDidStart() { + return { + willSendResponse(requestContext: any) { + const { setHeaders = [] } = requestContext.context + setHeaders.forEach(({ key, value }: { [key: string]: string }) => { + requestContext.response.http.headers.append(key, value) + }) + return requestContext + }, + } + }, + }, +] + +export default plugins From 7164b53407cfdde48d42e8f35dfbb6a9d03d2312 Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 24 Sep 2021 14:24:18 +0200 Subject: [PATCH 114/144] fix bug col to cols on --- frontend/src/components/DecayInformation.vue | 208 +++++++++--------- frontend/src/components/Transaction.vue | 16 +- .../AccountOverview/GddTransactionList.vue | 6 +- 3 files changed, 112 insertions(+), 118 deletions(-) diff --git a/frontend/src/components/DecayInformation.vue b/frontend/src/components/DecayInformation.vue index 470f45dc7..04a850040 100644 --- a/frontend/src/components/DecayInformation.vue +++ b/frontend/src/components/DecayInformation.vue @@ -1,120 +1,114 @@ diff --git a/frontend/src/components/Transaction.vue b/frontend/src/components/Transaction.vue index 4358a3596..4071e809d 100644 --- a/frontend/src/components/Transaction.vue +++ b/frontend/src/components/Transaction.vue @@ -19,40 +19,40 @@ - + {{ getLinesByType(gdtEntryType).description }} - + {{ getLinesByType(gdtEntryType).descriptiontext }} - + {{ $t('gdt.credit') }} - + {{ getLinesByType(gdtEntryType).credittext }} - + {{ $t('form.memo') }} - + {{ comment }} - + {{ $t('form.date') }} - + {{ $d($moment(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }} diff --git a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue index bdf4199f3..7348f96de 100644 --- a/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue +++ b/frontend/src/views/Pages/AccountOverview/GddTransactionList.vue @@ -18,13 +18,13 @@
- +
-
+
@@ -70,7 +70,7 @@
- +
From 8326eaac95f0f231bfa22e0cdf92422d63f06a72 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Sep 2021 14:32:33 +0200 Subject: [PATCH 115/144] removed dead code --- backend/src/typeorm/entity/Migration.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/backend/src/typeorm/entity/Migration.ts b/backend/src/typeorm/entity/Migration.ts index fbeeca14d..f1163cfbc 100644 --- a/backend/src/typeorm/entity/Migration.ts +++ b/backend/src/typeorm/entity/Migration.ts @@ -10,12 +10,4 @@ export class Migration extends BaseEntity { @Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' }) date: Date - - /* - static findByUser(userId: number): Promise { - return this.createQueryBuilder('balance') - .where('balance.userId = :userId', { userId }) - .getOneOrFail() - } - */ } From 66324fe1ca35d9f1760e8245d8f426600f3f5964 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Sep 2021 14:42:07 +0200 Subject: [PATCH 116/144] fix connection error for case database not running --- backend/src/index.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index c138deba7..18ac9d9c1 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -26,8 +26,11 @@ const DB_VERSION = '0001-init_db' async function main() { // open mysql connection - const con = await connection() - if (!con.isConnected) { + let con = null + try { + con = await connection() + } catch (error) {} + if (!con || !con.isConnected) { throw new Error(`Couldn't open connection to database`) } From e092af22e3f2edd51039353ee98e182daea48d12 Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Fri, 24 Sep 2021 14:44:18 +0200 Subject: [PATCH 117/144] removed some logic from index --- backend/src/index.ts | 5 +---- backend/src/typeorm/connection.ts | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/backend/src/index.ts b/backend/src/index.ts index 18ac9d9c1..1c3814096 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -26,10 +26,7 @@ const DB_VERSION = '0001-init_db' async function main() { // open mysql connection - let con = null - try { - con = await connection() - } catch (error) {} + const con = await connection() if (!con || !con.isConnected) { throw new Error(`Couldn't open connection to database`) } diff --git a/backend/src/typeorm/connection.ts b/backend/src/typeorm/connection.ts index b108c5ef5..db7dbcb29 100644 --- a/backend/src/typeorm/connection.ts +++ b/backend/src/typeorm/connection.ts @@ -2,18 +2,21 @@ import { createConnection, Connection } from 'typeorm' import CONFIG from '../config' import path from 'path' -const connection = async (): Promise => { - const con = await createConnection({ - name: 'default', - type: 'mysql', - host: CONFIG.DB_HOST, - port: CONFIG.DB_PORT, - username: CONFIG.DB_USER, - password: CONFIG.DB_PASSWORD, - database: CONFIG.DB_DATABASE, - entities: [path.join(__dirname, 'entity', '*.ts')], - synchronize: false, - }) +const connection = async (): Promise => { + let con = null + try { + con = await createConnection({ + name: 'default', + type: 'mysql', + host: CONFIG.DB_HOST, + port: CONFIG.DB_PORT, + username: CONFIG.DB_USER, + password: CONFIG.DB_PASSWORD, + database: CONFIG.DB_DATABASE, + entities: [path.join(__dirname, 'entity', '*.ts')], + synchronize: false, + }) + } catch (error) {} return con } From c9839dce21ddc3e9869f9311b8765e630b1904dc Mon Sep 17 00:00:00 2001 From: ogerly Date: Fri, 24 Sep 2021 14:47:59 +0200 Subject: [PATCH 118/144] bug fix givenType 2,3,5,6 change to givenType 1 --- frontend/src/components/Transaction.vue | 16 ++++++++-------- frontend/src/components/TransactionCollapse.vue | 14 ++++++++------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/Transaction.vue b/frontend/src/components/Transaction.vue index 4358a3596..4071e809d 100644 --- a/frontend/src/components/Transaction.vue +++ b/frontend/src/components/Transaction.vue @@ -19,40 +19,40 @@ - + {{ getLinesByType(gdtEntryType).description }} - + {{ getLinesByType(gdtEntryType).descriptiontext }} - + {{ $t('gdt.credit') }} - + {{ getLinesByType(gdtEntryType).credittext }} - + {{ $t('form.memo') }} - + {{ comment }} - + {{ $t('form.date') }} - + {{ $d($moment(date), 'long') }} {{ $i18n.locale === 'de' ? 'Uhr' : '' }} diff --git a/frontend/src/components/TransactionCollapse.vue b/frontend/src/components/TransactionCollapse.vue index 444012820..aacc3b4f6 100644 --- a/frontend/src/components/TransactionCollapse.vue +++ b/frontend/src/components/TransactionCollapse.vue @@ -4,21 +4,21 @@ style="border: 0px; background-color: #f1f1f1" > -
+ {{ getLinesByType(gdtEntryType).headline }} -
+
-
+
{{ getLinesByType(gdtEntryType).first }}
{{ getLinesByType(gdtEntryType).second }}
-
-
+ +
{{ getLinesByType(gdtEntryType).firstMath }}
{{ getLinesByType(gdtEntryType).secondMath }}
-
+
@@ -33,6 +33,8 @@ export default { }, methods: { getLinesByType(givenType) { + if (givenType === 2 || givenType === 3 || givenType === 5 || givenType === 6) givenType = 1 + const linesByType = { 1: { headline: this.$t('gdt.calculation'), From e2f6d1a0068e7ef647a4c2734aa688ba0fc28d05 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Fri, 24 Sep 2021 14:53:23 +0200 Subject: [PATCH 119/144] work on implementing --- backend/src/graphql/models/Transaction.ts | 28 +++++---- .../src/graphql/resolvers/listTransactions.ts | 60 +++++++++++++++++-- backend/src/typeorm/entity/Transaction.ts | 7 +++ backend/src/typeorm/entity/User.ts | 12 ++++ 4 files changed, 89 insertions(+), 18 deletions(-) diff --git a/backend/src/graphql/models/Transaction.ts b/backend/src/graphql/models/Transaction.ts index a2f2d19c1..7ce7d4494 100644 --- a/backend/src/graphql/models/Transaction.ts +++ b/backend/src/graphql/models/Transaction.ts @@ -10,18 +10,22 @@ import { Decay } from './Decay' @ObjectType() export class Transaction { - constructor(json: any) { - this.type = json.type - this.balance = Number(json.balance) - this.decayStart = json.decay_start - this.decayEnd = json.decay_end - this.decayDuration = json.decay_duration - this.memo = json.memo - this.transactionId = json.transaction_id - this.name = json.name - this.email = json.email - this.date = json.date - this.decay = json.decay ? new Decay(json.decay) : undefined + constructor() + constructor(json: any) + constructor(json?: any) { + if(json) { + this.type = json.type + this.balance = Number(json.balance) + this.decayStart = json.decay_start + this.decayEnd = json.decay_end + this.decayDuration = json.decay_duration + this.memo = json.memo + this.transactionId = json.transaction_id + this.name = json.name + this.email = json.email + this.date = json.date + this.decay = json.decay ? new Decay(json.decay) : undefined + } } @Field(() => String) diff --git a/backend/src/graphql/resolvers/listTransactions.ts b/backend/src/graphql/resolvers/listTransactions.ts index ed992fe81..fc4c6de43 100644 --- a/backend/src/graphql/resolvers/listTransactions.ts +++ b/backend/src/graphql/resolvers/listTransactions.ts @@ -1,16 +1,64 @@ import { User as dbUser } from '../../typeorm/entity/User' import { TransactionList, Transaction } from '../models/Transaction' -import { UserTransaction } from '../../typeorm/entity/UserTransaction' +import { UserTransaction as dbUserTransaction } from '../../typeorm/entity/UserTransaction' +import { Transaction as dbTransaction } from '../../typeorm/entity/Transaction' +import { TransactionSendCoin as dbTransactionSendCoin} from '../../typeorm/entity/TransactionSendCoin' +import { TransactionCreation as dbTransactionCreation} from '../../typeorm/entity/TransactionCreation' +import calculateDecay from '../../util/decay' +import { roundFloorFrom4 } from '../../util/round' -function calculateAndAddDecayTransactions( - userTransactions: UserTransaction[], +async function calculateAndAddDecayTransactions( + userTransactions: dbUserTransaction[], user: dbUser, decay: boolean, skipFirstTransaction: boolean, -): Transaction[] { - const transactions: Transaction[] = [] +): Promise { + let finalTransactions: Transaction[] = [] + let transactionIds: number[] = [] + let involvedUserIds: number[] = [] - return transactions + userTransactions.forEach((userTransaction: dbUserTransaction) => { + transactionIds.push(userTransaction.transactionId) + involvedUserIds.push(userTransaction.userId) + }) + // remove duplicates + // https://stackoverflow.com/questions/1960473/get-all-unique-values-in-a-javascript-array-remove-duplicates + const involvedUsersUnique = involvedUserIds.filter((v, i, a) => a.indexOf(v) === i) + const userIndiced = dbUser.getUsersIndiced(involvedUsersUnique) + + const transactions = await dbTransaction + .createQueryBuilder('transaction') + .where('transaction.id IN (:...transactions)', { transactions: transactionIds}) + .leftJoinAndSelect('transaction.sendCoin', 'transactionSendCoin', 'transactionSendCoin.transactionid = transaction.id') + .leftJoinAndSelect('transaction.creation', 'transactionCreation', 'transactionSendCoin.transactionid = transaction.id') + .getMany() + + let transactionIndiced: dbTransaction[] = [] + transactions.forEach((transaction: dbTransaction) => { + transactionIndiced[transaction.id] = transaction + }) + + const decayStartTransaction = await dbTransaction.createQueryBuilder('transaction') + .where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: 9}) + .orderBy('received', 'ASC') + .getOne() + + userTransactions.forEach((userTransaction: dbUserTransaction, i:number) => { + const transaction = transactionIndiced[userTransaction.transactionId] + let finalTransaction = new Transaction + finalTransaction.transactionId = transaction.id + finalTransaction.date = transaction.received.toString() + finalTransaction.memo = transaction.memo + + let prev = i > 0 ? userTransactions[i-1] : null + if(prev && prev.balance > 0) { + + } + + }) + + + return finalTransactions } export default async function listTransactions( diff --git a/backend/src/typeorm/entity/Transaction.ts b/backend/src/typeorm/entity/Transaction.ts index 4fdaf6eb8..c9ecbf29f 100644 --- a/backend/src/typeorm/entity/Transaction.ts +++ b/backend/src/typeorm/entity/Transaction.ts @@ -20,4 +20,11 @@ export class Transaction extends BaseEntity { @Column({ name: 'blockchain_type_id' }) blockchainTypeId: number + static async findByTransactionTypeId(transactionTypeId: number): Promise { + return this.createQueryBuilder('transaction') + .where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: transactionTypeId}) + .getMany() + } + + } diff --git a/backend/src/typeorm/entity/User.ts b/backend/src/typeorm/entity/User.ts index cb9de27c8..e7bca8647 100644 --- a/backend/src/typeorm/entity/User.ts +++ b/backend/src/typeorm/entity/User.ts @@ -32,4 +32,16 @@ export class User extends BaseEntity { .where('hex(user.pubkey) = :pubkeyHex', { pubkeyHex }) .getOneOrFail() } + + static async getUsersIndiced(userIds: number[]): Promise { + const users = await this.createQueryBuilder('user') + .select(['user.id', 'user.firstName', 'user.lastName', 'user.email']) + .where('user.id IN (:...users)', { users: userIds}) + .getMany() + let usersIndiced: User[] = [] + users.forEach((value, index) => { + usersIndiced[index] = value + }) + return usersIndiced + } } From fb39441f419a527e6f2a3bace376e0152923d33e Mon Sep 17 00:00:00 2001 From: Dario Rekowski on RockPI Date: Fri, 24 Sep 2021 14:48:05 +0000 Subject: [PATCH 120/144] fix for working alos with build --- backend/src/typeorm/connection.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/typeorm/connection.ts b/backend/src/typeorm/connection.ts index b108c5ef5..012cdd63b 100644 --- a/backend/src/typeorm/connection.ts +++ b/backend/src/typeorm/connection.ts @@ -11,7 +11,7 @@ const connection = async (): Promise => { username: CONFIG.DB_USER, password: CONFIG.DB_PASSWORD, database: CONFIG.DB_DATABASE, - entities: [path.join(__dirname, 'entity', '*.ts')], + entities: [path.join(__dirname, 'entity', '*.{ts,js}')], synchronize: false, }) From decf4d5013ba55653e6e5337022d3e741a90b194 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 27 Sep 2021 12:24:19 +0200 Subject: [PATCH 121/144] implement at least one special char rule for password in frontend --- .../Inputs/InputPasswordConfirmation.vue | 1 + frontend/src/locales/de.json | 1 + frontend/src/locales/en.json | 1 + frontend/src/validation-rules.js | 7 +++++ frontend/src/views/Pages/Register.spec.js | 10 +++---- .../src/views/Pages/ResetPassword.spec.js | 6 ++-- .../UserCard_FormUserPasswort.spec.js | 29 ++++++++++++------- 7 files changed, 37 insertions(+), 18 deletions(-) diff --git a/frontend/src/components/Inputs/InputPasswordConfirmation.vue b/frontend/src/components/Inputs/InputPasswordConfirmation.vue index 19d4ab02e..d0dc81156 100644 --- a/frontend/src/components/Inputs/InputPasswordConfirmation.vue +++ b/frontend/src/components/Inputs/InputPasswordConfirmation.vue @@ -9,6 +9,7 @@ containsUppercaseCharacter: true, containsNumericCharacter: true, atLeastEightCharactera: true, + atLeastOneSpecialCharater: true, }" :label="register ? $t('form.password') : $t('form.password_new')" :showAllErrors="true" diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 5db1c0a82..be418352e 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -168,6 +168,7 @@ "lowercase": "Ein Kleinbuchstabe erforderlich.", "minimum": "Mindestens 8 Zeichen.", "one_number": "Eine Zahl erforderlich.", + "special-char": "Ein Sonderzeichen required (z.B. _ oder ä)", "subtitle": "Werde Teil der Gemeinschaft!", "title": "Erstelle dein Gradido-Konto", "uppercase": "Ein Großbuchstabe erforderlich." diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 9ca544440..b3148fe3f 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -168,6 +168,7 @@ "lowercase": "One lowercase letter required.", "minimum": "8 characters minimum.", "one_number": "One number required.", + "special-char": "One special character required (e.g. _ or ä)", "subtitle": "Become a part of the community!", "title": "Create your Gradido account", "uppercase": "One uppercase letter required." diff --git a/frontend/src/validation-rules.js b/frontend/src/validation-rules.js index da4e07b78..e836de56b 100644 --- a/frontend/src/validation-rules.js +++ b/frontend/src/validation-rules.js @@ -112,6 +112,13 @@ export const loadAllRules = (i18nCallback) => { message: (_, values) => i18nCallback.t('site.signup.minimum', values), }) + extend('atLeastOneSpecialCharater', { + validate(value) { + return !!value.match(/[^a-zA-Z0-9 \t\n]/) + }, + message: (_, values) => i18nCallback.t('site.signup.special-char', values), + }) + extend('samePassword', { validate(value, [pwd]) { return value === pwd diff --git a/frontend/src/views/Pages/Register.spec.js b/frontend/src/views/Pages/Register.spec.js index a0de965d5..2529b118d 100644 --- a/frontend/src/views/Pages/Register.spec.js +++ b/frontend/src/views/Pages/Register.spec.js @@ -131,8 +131,8 @@ describe('Register', () => { wrapper.find('#registerFirstname').setValue('Max') wrapper.find('#registerLastname').setValue('Mustermann') wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net') - wrapper.find('input[name="form.password"]').setValue('Aa123456') - wrapper.find('input[name="form.passwordRepeat"]').setValue('Aa123456') + wrapper.find('input[name="form.password"]').setValue('Aa123456_') + wrapper.find('input[name="form.passwordRepeat"]').setValue('Aa123456_') wrapper.find('.language-switch-select').findAll('option').at(1).setSelected() wrapper.find('input[name="site.signup.agree"]').setChecked(true) }) @@ -185,8 +185,8 @@ describe('Register', () => { wrapper.find('#registerFirstname').setValue('Max') wrapper.find('#registerLastname').setValue('Mustermann') wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net') - wrapper.find('input[name="form.password"]').setValue('Aa123456') - wrapper.find('input[name="form.passwordRepeat"]').setValue('Aa123456') + wrapper.find('input[name="form.password"]').setValue('Aa123456_') + wrapper.find('input[name="form.passwordRepeat"]').setValue('Aa123456_') wrapper.find('.language-switch-select').findAll('option').at(1).setSelected() }) @@ -233,7 +233,7 @@ describe('Register', () => { email: 'max.mustermann@gradido.net', firstName: 'Max', lastName: 'Mustermann', - password: 'Aa123456', + password: 'Aa123456_', language: 'de', }, }), diff --git a/frontend/src/views/Pages/ResetPassword.spec.js b/frontend/src/views/Pages/ResetPassword.spec.js index 9f3830a55..a28051502 100644 --- a/frontend/src/views/Pages/ResetPassword.spec.js +++ b/frontend/src/views/Pages/ResetPassword.spec.js @@ -138,8 +138,8 @@ describe('ResetPassword', () => { beforeEach(async () => { await wrapper.setData({ authenticated: true, sessionId: 1 }) await wrapper.vm.$nextTick() - await wrapper.findAll('input').at(0).setValue('Aa123456') - await wrapper.findAll('input').at(1).setValue('Aa123456') + await wrapper.findAll('input').at(0).setValue('Aa123456_') + await wrapper.findAll('input').at(1).setValue('Aa123456_') await flushPromises() await wrapper.find('form').trigger('submit') }) @@ -167,7 +167,7 @@ describe('ResetPassword', () => { variables: { sessionId: 1, email: 'user@example.org', - password: 'Aa123456', + password: 'Aa123456_', }, }), ) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js index fa4aceb0c..7e9703c02 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js @@ -105,12 +105,13 @@ describe('UserCard_FormUserPasswort', () => { describe('validation', () => { it('displays all password requirements', () => { const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span') - expect(feedbackArray).toHaveLength(5) + expect(feedbackArray).toHaveLength(6) expect(feedbackArray.at(0).text()).toBe('validations.messages.required') expect(feedbackArray.at(1).text()).toBe('site.signup.lowercase') expect(feedbackArray.at(2).text()).toBe('site.signup.uppercase') expect(feedbackArray.at(3).text()).toBe('site.signup.one_number') expect(feedbackArray.at(4).text()).toBe('site.signup.minimum') + expect(feedbackArray.at(5).text()).toBe('site.signup.special-char') }) it('removes first message when a character is given', async () => { @@ -125,7 +126,7 @@ describe('UserCard_FormUserPasswort', () => { await wrapper.findAll('input').at(1).setValue('a') await flushPromises() const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span') - expect(feedbackArray).toHaveLength(3) + expect(feedbackArray).toHaveLength(4) expect(feedbackArray.at(0).text()).toBe('site.signup.uppercase') }) @@ -133,7 +134,7 @@ describe('UserCard_FormUserPasswort', () => { await wrapper.findAll('input').at(1).setValue('Aa') await flushPromises() const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span') - expect(feedbackArray).toHaveLength(2) + expect(feedbackArray).toHaveLength(3) expect(feedbackArray.at(0).text()).toBe('site.signup.one_number') }) @@ -141,14 +142,22 @@ describe('UserCard_FormUserPasswort', () => { await wrapper.findAll('input').at(1).setValue('Aa1') await flushPromises() const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span') - expect(feedbackArray).toHaveLength(1) + expect(feedbackArray).toHaveLength(2) expect(feedbackArray.at(0).text()).toBe('site.signup.minimum') }) - it('removes all messages when all rules are fulfilled', async () => { + it('removes the first five messages when a eight lowercase, uppercase and numeric characters are given', async () => { await wrapper.findAll('input').at(1).setValue('Aa123456') await flushPromises() const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span') + expect(feedbackArray).toHaveLength(1) + expect(feedbackArray.at(0).text()).toBe('site.signup.special-char') + }) + + it('removes all messages when a eight lowercase, uppercase and numeric characters are given', async () => { + await wrapper.findAll('input').at(1).setValue('Aa123456_') + await flushPromises() + const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span') expect(feedbackArray).toHaveLength(0) }) }) @@ -164,8 +173,8 @@ describe('UserCard_FormUserPasswort', () => { }, }) await form.findAll('input').at(0).setValue('1234') - await form.findAll('input').at(1).setValue('Aa123456') - await form.findAll('input').at(2).setValue('Aa123456') + await form.findAll('input').at(1).setValue('Aa123456_') + await form.findAll('input').at(2).setValue('Aa123456_') await form.trigger('submit') await flushPromises() }) @@ -176,7 +185,7 @@ describe('UserCard_FormUserPasswort', () => { variables: { email: 'user@example.org', password: '1234', - passwordNew: 'Aa123456', + passwordNew: 'Aa123456_', }, }), ) @@ -197,8 +206,8 @@ describe('UserCard_FormUserPasswort', () => { message: 'error', }) await form.findAll('input').at(0).setValue('1234') - await form.findAll('input').at(1).setValue('Aa123456') - await form.findAll('input').at(2).setValue('Aa123456') + await form.findAll('input').at(1).setValue('Aa123456_') + await form.findAll('input').at(2).setValue('Aa123456_') await form.trigger('submit') await flushPromises() }) From 77b5f9939e8135379ac4623cb7531834d7dcf530 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 27 Sep 2021 12:30:32 +0200 Subject: [PATCH 122/144] fix wrong German translation --- frontend/src/locales/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index be418352e..c7a0946f5 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -168,7 +168,7 @@ "lowercase": "Ein Kleinbuchstabe erforderlich.", "minimum": "Mindestens 8 Zeichen.", "one_number": "Eine Zahl erforderlich.", - "special-char": "Ein Sonderzeichen required (z.B. _ oder ä)", + "special-char": "Ein Sonderzeichen erforderlich (z.B. _ oder ä)", "subtitle": "Werde Teil der Gemeinschaft!", "title": "Erstelle dein Gradido-Konto", "uppercase": "Ein Großbuchstabe erforderlich." From 362f439aaf058a63542c9f5310493da0ac215cb4 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 27 Sep 2021 12:58:56 +0200 Subject: [PATCH 123/144] fix: Warnings in Gdd Transaction List Spec --- .../views/Pages/AccountOverview/GddTransactionList.spec.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js b/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js index 5af115546..5418ff3ba 100644 --- a/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js +++ b/frontend/src/views/Pages/AccountOverview/GddTransactionList.spec.js @@ -54,7 +54,7 @@ describe('GddTransactionList', () => { await wrapper.setProps({ transactions: [ { - balance: '19.93', + balance: 19.93, date: '2021-05-25T17:38:13+00:00', memo: 'Alles Gute zum Geburtstag', name: 'Bob der Baumeister', @@ -63,7 +63,7 @@ describe('GddTransactionList', () => { decay: { balance: '0.5' }, }, { - balance: '1000', + balance: 1000, date: '2021-04-29T15:34:49+00:00', memo: 'Gut das du da bist!', name: 'Gradido Akademie', @@ -71,7 +71,7 @@ describe('GddTransactionList', () => { type: 'creation', }, { - balance: '314.98', + balance: 314.98, date: '2021-04-29T17:26:40+00:00', memo: 'Für das Fahrrad!', name: 'Jan Ulrich', From 8a7acbf3ce77aa80083df2e986069d7b7ecbd6e8 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 27 Sep 2021 13:09:01 +0200 Subject: [PATCH 124/144] remove unnecessary .* from regexp --- login_server/src/cpp/SingletonManager/SessionManager.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/login_server/src/cpp/SingletonManager/SessionManager.cpp b/login_server/src/cpp/SingletonManager/SessionManager.cpp index 13f2a7dd4..1966c6726 100644 --- a/login_server/src/cpp/SingletonManager/SessionManager.cpp +++ b/login_server/src/cpp/SingletonManager/SessionManager.cpp @@ -50,18 +50,18 @@ bool SessionManager::init() case VALIDATE_PASSPHRASE: mValidations[i] = new Poco::RegularExpression("^(?:[a-z]* ){23}[a-z]*\s*$"); break; case VALIDATE_GROUP_ALIAS: mValidations[i] = new Poco::RegularExpression("^[a-z0-9-]{3,120}"); break; case VALIDATE_HEDERA_ID: mValidations[i] = new Poco::RegularExpression("^[0-9]*\.[0-9]*\.[0-9]\.$"); break; - case VALIDATE_HAS_NUMBER: mValidations[i] = new Poco::RegularExpression(".*[0-9].*"); break; + case VALIDATE_HAS_NUMBER: mValidations[i] = new Poco::RegularExpression("[0-9]"); break; case VALIDATE_ONLY_INTEGER: mValidations[i] = new Poco::RegularExpression("^[0-9]*$"); break; case VALIDATE_ONLY_DECIMAL: mValidations[i] = new Poco::RegularExpression("^[0-9]*(\.|,)[0-9]*$"); break; case VALIDATE_ONLY_HEX: mValidations[i] = new Poco::RegularExpression("^(0x)?[a-fA-F0-9]*$"); break; //case VALIDATE_ONLY_URL: mValidations[i] = new Poco::RegularExpression("^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}$"); break; case VALIDATE_ONLY_URL: mValidations[i] = new Poco::RegularExpression("^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\/?"); break; - case VALIDATE_HAS_SPECIAL_CHARACTER: mValidations[i] = new Poco::RegularExpression(".*[^a-zA-Z0-9].*"); break; + case VALIDATE_HAS_SPECIAL_CHARACTER: mValidations[i] = new Poco::RegularExpression("[^a-zA-Z0-9]"); break; case VALIDATE_HAS_UPPERCASE_LETTER: - mValidations[i] = new Poco::RegularExpression(".*[A-Z].*"); + mValidations[i] = new Poco::RegularExpression("[A-Z]"); ServerConfig::g_ServerKeySeed->put(i, DRRandom::r64()); break; - case VALIDATE_HAS_LOWERCASE_LETTER: mValidations[i] = new Poco::RegularExpression(".*[a-z].*"); break; + case VALIDATE_HAS_LOWERCASE_LETTER: mValidations[i] = new Poco::RegularExpression("[a-z]"); break; default: printf("[SessionManager::%s] unknown validation type\n", __FUNCTION__); } } From 9ef5f1e8119aaaa12a95b780ca275a17dab32dcb Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 27 Sep 2021 13:30:18 +0200 Subject: [PATCH 125/144] exclude space, tab, newline from special chars --- login_server/src/cpp/SingletonManager/SessionManager.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/login_server/src/cpp/SingletonManager/SessionManager.cpp b/login_server/src/cpp/SingletonManager/SessionManager.cpp index 1966c6726..c4039b10d 100644 --- a/login_server/src/cpp/SingletonManager/SessionManager.cpp +++ b/login_server/src/cpp/SingletonManager/SessionManager.cpp @@ -46,7 +46,7 @@ bool SessionManager::init() case VALIDATE_NAME: mValidations[i] = new Poco::RegularExpression("^[^<>&;]{2,}$"); break; case VALIDATE_USERNAME: mValidations[i] = new Poco::RegularExpression("^[a-zA-Z][a-zA-Z0-9_-]*$"); break; case VALIDATE_EMAIL: mValidations[i] = new Poco::RegularExpression("^[a-zA-Z0-9.!#$%&?*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$"); break; - case VALIDATE_PASSWORD: mValidations[i] = new Poco::RegularExpression("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9]).{8,}$"); break; + case VALIDATE_PASSWORD: mValidations[i] = new Poco::RegularExpression("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[^a-zA-Z0-9 \\t\\n\\r]).{8,}$"); break; case VALIDATE_PASSPHRASE: mValidations[i] = new Poco::RegularExpression("^(?:[a-z]* ){23}[a-z]*\s*$"); break; case VALIDATE_GROUP_ALIAS: mValidations[i] = new Poco::RegularExpression("^[a-z0-9-]{3,120}"); break; case VALIDATE_HEDERA_ID: mValidations[i] = new Poco::RegularExpression("^[0-9]*\.[0-9]*\.[0-9]\.$"); break; @@ -56,7 +56,7 @@ bool SessionManager::init() case VALIDATE_ONLY_HEX: mValidations[i] = new Poco::RegularExpression("^(0x)?[a-fA-F0-9]*$"); break; //case VALIDATE_ONLY_URL: mValidations[i] = new Poco::RegularExpression("^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}$"); break; case VALIDATE_ONLY_URL: mValidations[i] = new Poco::RegularExpression("^https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\/?"); break; - case VALIDATE_HAS_SPECIAL_CHARACTER: mValidations[i] = new Poco::RegularExpression("[^a-zA-Z0-9]"); break; + case VALIDATE_HAS_SPECIAL_CHARACTER: mValidations[i] = new Poco::RegularExpression("[^a-zA-Z0-9 \\t\\n\\r]"); break; case VALIDATE_HAS_UPPERCASE_LETTER: mValidations[i] = new Poco::RegularExpression("[A-Z]"); ServerConfig::g_ServerKeySeed->put(i, DRRandom::r64()); From d53ef3fc28092d4367ed41d5c4bbd697292423a8 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 27 Sep 2021 13:31:56 +0200 Subject: [PATCH 126/144] entferne 'ein' --- login_server/src/LOCALE/de_DE.mo | Bin 2378 -> 2374 bytes login_server/src/LOCALE/de_DE.po | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/login_server/src/LOCALE/de_DE.mo b/login_server/src/LOCALE/de_DE.mo index 6a1735b6aeff6403fe194c5790665ba6c8fec182..d3d2c86e96c799c6ba3ded9274335f3dd4fac11d 100644 GIT binary patch delta 92 zcmX>lbWCW252I}t0|Ucqb_NDjAZ^CMz@Px6V}P_Ckgf&NDnNP-kk$p#7lE`kkp2&( grGT{d=1#^d%mbV_K052I}#0|Ucqb_NDjAZ^9Lz@Px66M(cHkZuIhDnNPzkk$p#SAn!PkY?s& lV2}dR`kOl$uQ0P4D;SzvnObg6VZFe_tdN?y*_cC^5dg{|51Ie~ diff --git a/login_server/src/LOCALE/de_DE.po b/login_server/src/LOCALE/de_DE.po index 2b97bd88c..b9eea0d59 100644 --- a/login_server/src/LOCALE/de_DE.po +++ b/login_server/src/LOCALE/de_DE.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-09-23 17:56+0200\n" -"PO-Revision-Date: 2021-09-23 17:59+0200\n" +"PO-Revision-Date: 2021-09-27 13:31+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: de_DE\n" @@ -458,7 +458,7 @@ msgid "" "case letters, at least one number and one special character!" msgstr "" "Bitte gebe ein gültiges Password ein mit mindestens 8 Zeichen, Groß- und " -"Kleinbuchstaben, mindestens einer Zahl und einem Sonderzeichen ein!" +"Kleinbuchstaben, mindestens einer Zahl und einem Sonderzeichen!" #: src/cpp/SingletonManager/SessionManager.cpp:610 msgid "Your password is to short!" From 342649ae1e8094b3536814f09b7eac8ad31bdf9b Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 27 Sep 2021 13:34:58 +0200 Subject: [PATCH 127/144] no white space rule in password --- .../src/components/Inputs/InputPasswordConfirmation.vue | 1 + frontend/src/locales/de.json | 1 + frontend/src/locales/en.json | 1 + frontend/src/validation-rules.js | 9 ++++++++- .../Pages/UserProfile/UserCard_FormUserPasswort.spec.js | 3 ++- 5 files changed, 13 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/Inputs/InputPasswordConfirmation.vue b/frontend/src/components/Inputs/InputPasswordConfirmation.vue index d0dc81156..ecb3aa55a 100644 --- a/frontend/src/components/Inputs/InputPasswordConfirmation.vue +++ b/frontend/src/components/Inputs/InputPasswordConfirmation.vue @@ -10,6 +10,7 @@ containsNumericCharacter: true, atLeastEightCharactera: true, atLeastOneSpecialCharater: true, + noWhitespaceCharacters: true, }" :label="register ? $t('form.password') : $t('form.password_new')" :showAllErrors="true" diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index c7a0946f5..f998df196 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -167,6 +167,7 @@ "dont_match": "Die Passwörter stimmen nicht überein.", "lowercase": "Ein Kleinbuchstabe erforderlich.", "minimum": "Mindestens 8 Zeichen.", + "no-whitespace": "Keine Leerzeichen und Tabulatoren", "one_number": "Eine Zahl erforderlich.", "special-char": "Ein Sonderzeichen erforderlich (z.B. _ oder ä)", "subtitle": "Werde Teil der Gemeinschaft!", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index b3148fe3f..e7eba4b93 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -167,6 +167,7 @@ "dont_match": "Passwords don't match.", "lowercase": "One lowercase letter required.", "minimum": "8 characters minimum.", + "no-whitespace": "No white spaces and tabs", "one_number": "One number required.", "special-char": "One special character required (e.g. _ or ä)", "subtitle": "Become a part of the community!", diff --git a/frontend/src/validation-rules.js b/frontend/src/validation-rules.js index e836de56b..9ea954a92 100644 --- a/frontend/src/validation-rules.js +++ b/frontend/src/validation-rules.js @@ -114,11 +114,18 @@ export const loadAllRules = (i18nCallback) => { extend('atLeastOneSpecialCharater', { validate(value) { - return !!value.match(/[^a-zA-Z0-9 \t\n]/) + return !!value.match(/[^a-zA-Z0-9]/) }, message: (_, values) => i18nCallback.t('site.signup.special-char', values), }) + extend('noWhitespaceCharacters', { + validate(value) { + return !!value.match(/[^ \t\n\r]/) + }, + message: (_, values) => i18nCallback.t('site.signup.no-whitespace', values), + }) + extend('samePassword', { validate(value, [pwd]) { return value === pwd diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js index 7e9703c02..a1fa1dd3f 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js @@ -105,13 +105,14 @@ describe('UserCard_FormUserPasswort', () => { describe('validation', () => { it('displays all password requirements', () => { const feedbackArray = wrapper.findAll('div.invalid-feedback').at(1).findAll('span') - expect(feedbackArray).toHaveLength(6) + expect(feedbackArray).toHaveLength(7) expect(feedbackArray.at(0).text()).toBe('validations.messages.required') expect(feedbackArray.at(1).text()).toBe('site.signup.lowercase') expect(feedbackArray.at(2).text()).toBe('site.signup.uppercase') expect(feedbackArray.at(3).text()).toBe('site.signup.one_number') expect(feedbackArray.at(4).text()).toBe('site.signup.minimum') expect(feedbackArray.at(5).text()).toBe('site.signup.special-char') + expect(feedbackArray.at(6).text()).toBe('site.signup.no-whitespace') }) it('removes first message when a character is given', async () => { From 5afe8fe741da375e47b4a9bda5d27eb5f15066a0 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Mon, 27 Sep 2021 13:35:39 +0200 Subject: [PATCH 128/144] add \r to js regexp --- frontend/src/validation-rules.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/validation-rules.js b/frontend/src/validation-rules.js index e836de56b..a1c9a46c7 100644 --- a/frontend/src/validation-rules.js +++ b/frontend/src/validation-rules.js @@ -114,7 +114,7 @@ export const loadAllRules = (i18nCallback) => { extend('atLeastOneSpecialCharater', { validate(value) { - return !!value.match(/[^a-zA-Z0-9 \t\n]/) + return !!value.match(/[^a-zA-Z0-9 \t\n\r]/) }, message: (_, values) => i18nCallback.t('site.signup.special-char', values), }) From 4dec84321ae11b2b171c62d721ddfe321f6da2ff Mon Sep 17 00:00:00 2001 From: ogerly Date: Mon, 27 Sep 2021 15:35:17 +0200 Subject: [PATCH 129/144] Cleaned up locales for settings and adjusted texts in files --- .../src/components/LanguageSwitchSelect.vue | 6 +- frontend/src/locales/de.json | 71 ++++++++----------- frontend/src/locales/en.json | 71 ++++++++----------- .../src/views/Pages/ForgotPassword.spec.js | 4 +- frontend/src/views/Pages/ForgotPassword.vue | 6 +- frontend/src/views/Pages/Login.spec.js | 2 +- frontend/src/views/Pages/Login.vue | 2 +- .../src/views/Pages/ResetPassword.spec.js | 12 ++-- frontend/src/views/Pages/ResetPassword.vue | 8 +-- .../UserProfile/UserCard_FormUserData.spec.js | 2 +- .../UserProfile/UserCard_FormUserData.vue | 4 +- .../UserCard_FormUserPasswort.spec.js | 2 +- .../UserProfile/UserCard_FormUserPasswort.vue | 2 +- .../UserProfile/UserCard_FormUsername.spec.js | 2 +- .../UserProfile/UserCard_FormUsername.vue | 2 +- .../Pages/UserProfile/UserCard_Language.vue | 4 +- .../UserProfile/UserCard_Newsletter.spec.js | 2 +- .../Pages/UserProfile/UserCard_Newsletter.vue | 12 ++-- 18 files changed, 96 insertions(+), 118 deletions(-) diff --git a/frontend/src/components/LanguageSwitchSelect.vue b/frontend/src/components/LanguageSwitchSelect.vue index 518bcf6cf..b53b82a18 100644 --- a/frontend/src/components/LanguageSwitchSelect.vue +++ b/frontend/src/components/LanguageSwitchSelect.vue @@ -14,9 +14,9 @@ export default { return { selected: null, options: [ - { value: null, text: this.$t('select_language') }, - { value: 'de', text: this.$t('languages.de') }, - { value: 'en', text: this.$t('languages.en') }, + { value: null, text: this.$t('setting.language.select_language') }, + { value: 'de', text: this.$t('setting.language.de') }, + { value: 'en', text: this.$t('setting.language.en') }, ], } }, diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 2842a6a39..ac9aa89d4 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -45,21 +45,14 @@ "amount": "Betrag", "at": "am", "cancel": "Abbrechen", - "change": "ändern", - "change-name": "Name ändern", - "change-password": "Passwort ändern", - "changeLanguage": "Sprache ändern", - "change_username_info": "Einmal gespeichert, kann der Username ncht mehr geändert werden!", "close": "schließen", "date": "Datum", "description": "Beschreibung", "edit": "bearbeiten", "email": "E-Mail", - "email_repeat": "eMail wiederholen", "firstname": "Vorname", "from": "von", "lastname": "Nachname", - "max_gdd_info": "Maximale anzahl GDD zum versenden erreicht!", "memo": "Nachricht", "message": "Nachricht", "password": "Passwort", @@ -81,12 +74,9 @@ "time": "Zeit", "to": "bis", "to1": "an", - "username": "Username", "validation": { "gddSendAmount": "Das Feld {_field_} muss eine Zahl zwischen {min} und {max} mit höchstens zwei Nachkommastellen sein", - "is-not": "Du kannst dir selbst keine Gradidos überweisen", - "usernmae-regex": "Der Username muss mit einem Buchstaben beginnen auf den mindestens zwei alfanumerische Zeichen folgen müssen.", - "usernmae-unique": "Der Username ist bereits vergeben." + "is-not": "Du kannst dir selbst keine Gradidos überweisen" } }, "gdt": { @@ -106,29 +96,40 @@ }, "imprint": "Impressum", "language": "Sprache", - "languages": { - "de": "Deutsch", - "en": "English", - "success": "Deine Sprache wurde erfolgreich geändert." - }, "login": "Anmeldung", "logout": "Abmelden", "members_area": "Mitgliederbereich", "message": "hallo gradido !!", "privacy_policy": "Datenschutzerklärung", - "reset": "Passwort zurücksetzen", - "reset-password": { - "not-authenticated": "Leider konnten wir dich nicht authentifizieren. Bitte wende dich an den Support.", - "text": "Jetzt kannst du ein neues Passwort speichern, mit dem du dich zukünftig in der Gradido-App anmelden kannst.", - "title": "Passwort zurücksetzen" - }, - "select_language": "Bitte wähle eine Sprache für die App und Newsletter", "send": "Senden", "setting": { - "changeNewsletter": "Newsletter Status ändern", - "newsletter": "Newsletter", - "newsletterFalse": "Du bist aus Newslettersystem ausgetragen.", - "newsletterTrue": "Du bist im Newslettersystem eingetraten." + "language": { + "changeLanguage": "Sprache ändern", + "de": "Deutsch", + "en": "English", + "select_language": "Bitte wähle eine Sprache.", + "success": "Deine Sprache wurde erfolgreich geändert." + }, + "name": { + "change-name": "Name ändern", + "change-success": "Dein Name wurde erfolgreich geändert." + }, + "newsletter": { + "newsletter": "Newsletter", + "newsletterFalse": "Du bist aus Newslettersystem ausgetragen.", + "newsletterTrue": "Du bist im Newslettersystem eingetraten." + }, + "password": { + "change-password": "Passwort ändern", + "forgot_pwd": "Passwort vergessen?", + "reset": "Passwort zurücksetzen", + "reset-password": { + "not-authenticated": "Leider konnten wir dich nicht authentifizieren. Bitte wende dich an den Support.", + "text": "Jetzt kannst du ein neues Passwort speichern, mit dem du dich zukünftig in der Gradido-App anmelden kannst." + }, + "send_now": "Jetzt senden", + "subtitle": "Wenn du dein Passwort vergessen hast, kannst du es hier zurücksetzen." + } }, "signup": "Registrieren", "site": { @@ -143,28 +144,13 @@ }, "login": { "community": "Tausend Dank, weil du bei uns bist!", - "forgot_pwd": "Passwort vergessen?", "new_wallet": "Neues Konto erstellen", - "remember": "Passwort merken", "signin": "Anmelden" }, "navbar": { - "activity": "Aktivität", "my-profil": "Mein Profil", - "settings": "Einstellungen", "support": "Support" }, - "overview": { - "account_overview": "Kontoübersicht", - "add_work": "neuer Gemeinschaftsbeitrag", - "send_gradido": "Gradido versenden", - "since_last_month": "seid letzten Monat" - }, - "password": { - "send_now": "Jetzt senden", - "subtitle": "Wenn du dein Passwort vergessen hast, kannst du es hier zurücksetzen.", - "title": "Passwort zurücksetzen" - }, "signup": { "agree": "Ich stimme der Datenschutzerklärung zu.", "dont_match": "Die Passwörter stimmen nicht überein.", @@ -192,6 +178,5 @@ "show_all": "Alle {count} Transaktionen ansehen" }, "transactions": "Transaktionen", - "welcome": "Willkommen!", "whitepaper": "Whitepaper" } diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 90faa6b33..1967fc124 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -45,21 +45,14 @@ "amount": "Amount", "at": "at", "cancel": "Cancel", - "change": "change", - "change-name": "Change name", - "change-password": "Change password", - "changeLanguage": "Change language", - "change_username_info": "Once saved, the username cannot be changed again!", "close": "Close", "date": "Date", "description": "Description", "edit": "Edit", "email": "Email", - "email_repeat": "Repeat Email", "firstname": "Firstname", "from": "from", "lastname": "Lastname", - "max_gdd_info": "Maximum number of GDDs to be sent has been reached!", "memo": "Message", "message": "Message", "password": "Password", @@ -81,12 +74,9 @@ "time": "Time", "to": "to", "to1": "to", - "username": "Username", "validation": { "gddSendAmount": "The {_field_} field must be a number between {min} and {max} with at most two digits", - "is-not": "You cannot send Gradidos to yourself", - "usernmae-regex": "The username must start with a letter, followed by at least two alphanumeric characters.", - "usernmae-unique": "The username is already taken." + "is-not": "You cannot send Gradidos to yourself" } }, "gdt": { @@ -106,29 +96,40 @@ }, "imprint": "Legal notice", "language": "Language", - "languages": { - "de": "Deutsch", - "en": "English", - "success": "Your language has been successfully updated." - }, "login": "Login", "logout": "Logout", "members_area": "Member's area", "message": "hello gradido !!", "privacy_policy": "Privacy policy", - "reset": "Reset password", - "reset-password": { - "not-authenticated": "Unfortunately we could not authenticate you. Please contact the support.", - "text": "Now you can save a new password to login to the Gradido-App in the future.", - "title": "Reset Password" - }, - "select_language": "Please choose a language for the app and newsletter", "send": "Send", "setting": { - "changeNewsletter": "Newsletter status change", - "newsletter": "Newsletter", - "newsletterFalse": "You are unsubscribed from newsletter system.", - "newsletterTrue": "You are subscribed to newsletter system." + "language": { + "changeLanguage": "Change language", + "de": "Deutsch", + "en": "English", + "select_language": "Please choose a language.", + "success": "Your language has been successfully updated." + }, + "name": { + "change-name": "Change name", + "change-success": "Your name has been successfully changed." + }, + "newsletter": { + "newsletter": "Newsletter", + "newsletterFalse": "You are unsubscribed from newsletter system.", + "newsletterTrue": "You are subscribed to newsletter system." + }, + "password": { + "change-password": "Change password", + "forgot_pwd": "Forgot password?", + "reset": "Reset password", + "reset-password": { + "not-authenticated": "Unfortunately we could not authenticate you. Please contact the support.", + "text": "Now you can save a new password to login to the Gradido-App in the future." + }, + "send_now": "Send now", + "subtitle": "If you have forgotten your password, you can reset it here." + } }, "signup": "Sign up", "site": { @@ -143,28 +144,13 @@ }, "login": { "community": "A thousand thanks for being with us!", - "forgot_pwd": "Forgot password?", "new_wallet": "Create new account", - "remember": "Remember password", "signin": "Sign in" }, "navbar": { - "activity": "Activity", "my-profil": "My profile", - "settings": "Settings", "support": "Support" }, - "overview": { - "account_overview": "Account overview", - "add_work": "New Community Contribution", - "send_gradido": "Send Gradido", - "since_last_month": "since last month" - }, - "password": { - "send_now": "Send now", - "subtitle": "If you have forgotten your password, you can reset it here.", - "title": "Reset password" - }, "signup": { "agree": "I agree to the privacy policy.", "dont_match": "Passwords don't match.", @@ -192,6 +178,5 @@ "show_all": "View all {count} transactions." }, "transactions": "Transactions", - "welcome": "Welcome!", "whitepaper": "Whitepaper" } diff --git a/frontend/src/views/Pages/ForgotPassword.spec.js b/frontend/src/views/Pages/ForgotPassword.spec.js index d4615c221..5f0311fcb 100644 --- a/frontend/src/views/Pages/ForgotPassword.spec.js +++ b/frontend/src/views/Pages/ForgotPassword.spec.js @@ -39,11 +39,11 @@ describe('ForgotPassword', () => { }) it('has a title', () => { - expect(wrapper.find('h1').text()).toEqual('site.password.title') + expect(wrapper.find('h1').text()).toEqual('setting.password.reset') }) it('has a subtitle', () => { - expect(wrapper.find('p.text-lead').text()).toEqual('site.password.subtitle') + expect(wrapper.find('p.text-lead').text()).toEqual('setting.password.subtitle') }) describe('back button', () => { diff --git a/frontend/src/views/Pages/ForgotPassword.vue b/frontend/src/views/Pages/ForgotPassword.vue index ad56ae95e..c68b94a56 100644 --- a/frontend/src/views/Pages/ForgotPassword.vue +++ b/frontend/src/views/Pages/ForgotPassword.vue @@ -5,8 +5,8 @@
-

{{ $t('site.password.title') }}

-

{{ $t('site.password.subtitle') }}

+

{{ $t('setting.password.reset') }}

+

{{ $t('setting.password.subtitle') }}

@@ -22,7 +22,7 @@
- {{ $t('site.password.send_now') }} + {{ $t('setting.password.send_now') }}
diff --git a/frontend/src/views/Pages/Login.spec.js b/frontend/src/views/Pages/Login.spec.js index 20eead7a3..30f6cb4bd 100644 --- a/frontend/src/views/Pages/Login.spec.js +++ b/frontend/src/views/Pages/Login.spec.js @@ -71,7 +71,7 @@ describe('Login', () => { describe('links', () => { it('has a link "Forgot Password?"', () => { expect(wrapper.findAllComponents(RouterLinkStub).at(0).text()).toEqual( - 'site.login.forgot_pwd', + 'setting.password.forgot_pwd', ) }) diff --git a/frontend/src/views/Pages/Login.vue b/frontend/src/views/Pages/Login.vue index e5b365d75..90fa5eb61 100755 --- a/frontend/src/views/Pages/Login.vue +++ b/frontend/src/views/Pages/Login.vue @@ -40,7 +40,7 @@ - {{ $t('site.login.forgot_pwd') }} + {{ $t('setting.password.forgot_pwd') }} diff --git a/frontend/src/views/Pages/ResetPassword.spec.js b/frontend/src/views/Pages/ResetPassword.spec.js index 87198ba62..2df1cd75e 100644 --- a/frontend/src/views/Pages/ResetPassword.spec.js +++ b/frontend/src/views/Pages/ResetPassword.spec.js @@ -71,8 +71,10 @@ describe('ResetPassword', () => { }) it('has a message suggesting to contact the support', () => { - expect(wrapper.find('div.header').text()).toContain('reset-password.title') - expect(wrapper.find('div.header').text()).toContain('reset-password.not-authenticated') + expect(wrapper.find('div.header').text()).toContain('setting.password.reset') + expect(wrapper.find('div.header').text()).toContain( + 'setting.password.reset-password.not-authenticated', + ) }) }) @@ -99,8 +101,10 @@ describe('ResetPassword', () => { describe('Register header', () => { it('has a welcome message', async () => { - expect(wrapper.find('div.header').text()).toContain('reset-password.title') - expect(wrapper.find('div.header').text()).toContain('reset-password.text') + expect(wrapper.find('div.header').text()).toContain('setting.password.reset') + expect(wrapper.find('div.header').text()).toContain( + 'setting.password.reset-password.text', + ) }) }) diff --git a/frontend/src/views/Pages/ResetPassword.vue b/frontend/src/views/Pages/ResetPassword.vue index a9ca9e6c0..f72100600 100644 --- a/frontend/src/views/Pages/ResetPassword.vue +++ b/frontend/src/views/Pages/ResetPassword.vue @@ -5,13 +5,13 @@
-

{{ $t('reset-password.title') }}

+

{{ $t('setting.password.reset') }}

- {{ $t('reset-password.text') }} + {{ $t('setting.password.reset-password.text') }} - {{ $t('reset-password.not-authenticated') }} + {{ $t('setting.password.reset-password.not-authenticated') }}
@@ -29,7 +29,7 @@
- {{ $t('reset') }} + {{ $t('setting.password.reset') }}
diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.spec.js index 87bb3edb9..0c7cae799 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.spec.js @@ -139,7 +139,7 @@ describe('UserCard_FormUserData', () => { }) it('toasts a success message', () => { - expect(toastSuccessMock).toBeCalledWith('site.profil.user-data.change-success') + expect(toastSuccessMock).toBeCalledWith('setting.name.change-success') }) it('has an edit button again', () => { diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue index abdf9bb19..0cd8ba965 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue @@ -4,7 +4,7 @@ - {{ $t('form.change-name') }} + {{ $t('setting.name.change-name') }} @@ -122,7 +122,7 @@ export default { this.$store.commit('lastName', this.form.lastName) this.$store.commit('description', this.form.description) this.showUserData = true - this.$toasted.success(this.$t('site.profil.user-data.change-success')) + this.$toasted.success(this.$t('setting.name.change-success')) }) .catch((error) => { this.$toasted.error(error.message) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js index dcce66b7f..048f12ff1 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js @@ -47,7 +47,7 @@ describe('UserCard_FormUserPasswort', () => { }) it('has a change password button with text "form.change-password"', () => { - expect(wrapper.find('a').text()).toEqual('form.change-password') + expect(wrapper.find('a').text()).toEqual('setting.password.change-password') }) it('has a change password button with a pencil icon', () => { diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue index f1c531468..5095f7b74 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue @@ -4,7 +4,7 @@ - {{ $t('form.change-password') }} + {{ $t('setting.password.change-password') }} diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.spec.js index 1791d326c..4c667d782 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.spec.js @@ -125,7 +125,7 @@ describe('UserCard_FormUsername', () => { }) it('toasts an success message', () => { - expect(toastSuccessMock).toBeCalledWith('site.profil.user-data.change-success') + expect(toastSuccessMock).toBeCalledWith('setting.name.change-success') }) it('has no edit button anymore', () => { diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue index 7c100f41f..eae499c07 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue @@ -98,7 +98,7 @@ export default { this.$store.commit('username', this.form.username) this.username = this.form.username this.showUsername = true - this.$toasted.success(this.$t('site.profil.user-data.change-success')) + this.$toasted.success(this.$t('setting.name.change-success')) }) .catch((error) => { this.$toasted.error(error.message) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue index 2632f8186..0d5872179 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue @@ -4,7 +4,7 @@ - {{ $t('form.changeLanguage') }} + {{ $t('setting.language.changeLanguage') }} @@ -97,7 +97,7 @@ export default { this.$i18n.locale = this.language localeChanged(this.language) this.cancelEdit() - this.$toasted.success(this.$t('languages.success')) + this.$toasted.success(this.$t('setting.language.success')) }) .catch((error) => { this.language = this.$store.state.language diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js index febb47fd6..8f15a855b 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js @@ -74,7 +74,7 @@ describe('UserCard_Newsletter', () => { }) it('toasts a success message', () => { - expect(toastSuccessMock).toBeCalledWith('setting.newsletterFalse') + expect(toastSuccessMock).toBeCalledWith('setting.newsletter.newsletterFalse') }) }) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue index c571ef99a..7b0f124f4 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue @@ -4,7 +4,7 @@ - {{ $t('setting.newsletter') }} + {{ $t('setting.newsletter.newsletter') }} @@ -15,7 +15,11 @@ switch @change="onSubmit" > - {{ newsletterState ? $t('setting.newsletterTrue') : $t('setting.newsletterFalse') }} + {{ + newsletterState + ? $t('setting.newsletter.newsletterTrue') + : $t('setting.newsletter.newsletterFalse') + }} @@ -46,8 +50,8 @@ export default { this.$store.commit('newsletterState', this.newsletterState) this.$toasted.success( this.newsletterState - ? this.$t('setting.newsletterTrue') - : this.$t('setting.newsletterFalse'), + ? this.$t('setting.newsletter.newsletterTrue') + : this.$t('setting.newsletter.newsletterFalse'), ) }) .catch((error) => { From 06c80ebdfd70fc71e398034e1fafc71ffad4fe49 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Mon, 27 Sep 2021 18:57:36 +0200 Subject: [PATCH 130/144] implement listTransactions and neccessary changes for it --- backend/src/graphql/models/Decay.ts | 31 ++-- backend/src/graphql/models/Transaction.ts | 8 +- .../src/graphql/resolvers/BalanceResolver.ts | 4 +- .../src/graphql/resolvers/listTransactions.ts | 152 +++++++++++++----- backend/src/typeorm/entity/Transaction.ts | 23 ++- .../src/typeorm/entity/TransactionCreation.ts | 13 +- .../src/typeorm/entity/TransactionSendCoin.ts | 5 +- backend/src/typeorm/entity/User.ts | 8 +- backend/src/typeorm/entity/UserTransaction.ts | 4 +- backend/src/util/decay.ts | 53 +++++- 10 files changed, 232 insertions(+), 69 deletions(-) diff --git a/backend/src/graphql/models/Decay.ts b/backend/src/graphql/models/Decay.ts index e0234f588..09564c5ca 100644 --- a/backend/src/graphql/models/Decay.ts +++ b/backend/src/graphql/models/Decay.ts @@ -1,29 +1,42 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { ObjectType, Field, Int } from 'type-graphql' +import { Transaction } from '../../typeorm/entity/Transaction' @ObjectType() export class Decay { - constructor(json: any) { - this.balance = Number(json.balance) - this.decayStart = json.decay_start - this.decayEnd = json.decay_end - this.decayDuration = json.decay_duration - this.decayStartBlock = json.decay_start_block + constructor() + constructor(json?: any) { + if (json) { + this.balance = Number(json.balance) + this.decayStart = json.decay_start + this.decayEnd = json.decay_end + this.decayDuration = json.decay_duration + this.decayStartBlock = json.decay_start_block + } + } + + static async getDecayStartBlock(): Promise { + if (!this.decayStartBlockTransaction) { + this.decayStartBlockTransaction = await Transaction.getDecayStartBlock() + } + return this.decayStartBlockTransaction } @Field(() => Number) balance: number @Field(() => Int, { nullable: true }) - decayStart?: number + decayStart: number @Field(() => Int, { nullable: true }) - decayEnd?: number + decayEnd: number @Field(() => String, { nullable: true }) - decayDuration?: string + decayDuration?: number @Field(() => Int, { nullable: true }) decayStartBlock?: number + + static decayStartBlockTransaction: Transaction | undefined } diff --git a/backend/src/graphql/models/Transaction.ts b/backend/src/graphql/models/Transaction.ts index 7ce7d4494..01dcf280d 100644 --- a/backend/src/graphql/models/Transaction.ts +++ b/backend/src/graphql/models/Transaction.ts @@ -13,19 +13,19 @@ export class Transaction { constructor() constructor(json: any) constructor(json?: any) { - if(json) { + if (json) { this.type = json.type this.balance = Number(json.balance) this.decayStart = json.decay_start this.decayEnd = json.decay_end - this.decayDuration = json.decay_duration + this.decayDuration = parseFloat(json.decay_duration) this.memo = json.memo this.transactionId = json.transaction_id this.name = json.name this.email = json.email this.date = json.date this.decay = json.decay ? new Decay(json.decay) : undefined - } + } } @Field(() => String) @@ -44,7 +44,7 @@ export class Transaction { decayEnd?: number @Field({ nullable: true }) - decayDuration?: string + decayDuration?: number @Field(() => String) memo: string diff --git a/backend/src/graphql/resolvers/BalanceResolver.ts b/backend/src/graphql/resolvers/BalanceResolver.ts index 34aedac37..02c148ffb 100644 --- a/backend/src/graphql/resolvers/BalanceResolver.ts +++ b/backend/src/graphql/resolvers/BalanceResolver.ts @@ -25,7 +25,9 @@ export class BalanceResolver { const now = new Date() const balance = new Balance({ balance: roundFloorFrom4(balanceEntity.amount), - decay: roundFloorFrom4(calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now)), + decay: roundFloorFrom4( + await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), + ), decay_date: now.toString(), }) diff --git a/backend/src/graphql/resolvers/listTransactions.ts b/backend/src/graphql/resolvers/listTransactions.ts index fc4c6de43..9bbb77bb5 100644 --- a/backend/src/graphql/resolvers/listTransactions.ts +++ b/backend/src/graphql/resolvers/listTransactions.ts @@ -2,9 +2,8 @@ import { User as dbUser } from '../../typeorm/entity/User' import { TransactionList, Transaction } from '../models/Transaction' import { UserTransaction as dbUserTransaction } from '../../typeorm/entity/UserTransaction' import { Transaction as dbTransaction } from '../../typeorm/entity/Transaction' -import { TransactionSendCoin as dbTransactionSendCoin} from '../../typeorm/entity/TransactionSendCoin' -import { TransactionCreation as dbTransactionCreation} from '../../typeorm/entity/TransactionCreation' -import calculateDecay from '../../util/decay' +import { Decay } from '../models/Decay' +import { calculateDecayWithInterval } from '../../util/decay' import { roundFloorFrom4 } from '../../util/round' async function calculateAndAddDecayTransactions( @@ -13,9 +12,9 @@ async function calculateAndAddDecayTransactions( decay: boolean, skipFirstTransaction: boolean, ): Promise { - let finalTransactions: Transaction[] = [] - let transactionIds: number[] = [] - let involvedUserIds: number[] = [] + const finalTransactions: Transaction[] = [] + const transactionIds: number[] = [] + const involvedUserIds: number[] = [] userTransactions.forEach((userTransaction: dbUserTransaction) => { transactionIds.push(userTransaction.transactionId) @@ -24,39 +23,120 @@ async function calculateAndAddDecayTransactions( // remove duplicates // https://stackoverflow.com/questions/1960473/get-all-unique-values-in-a-javascript-array-remove-duplicates const involvedUsersUnique = involvedUserIds.filter((v, i, a) => a.indexOf(v) === i) - const userIndiced = dbUser.getUsersIndiced(involvedUsersUnique) + const userIndiced = await dbUser.getUsersIndiced(involvedUsersUnique) const transactions = await dbTransaction - .createQueryBuilder('transaction') - .where('transaction.id IN (:...transactions)', { transactions: transactionIds}) - .leftJoinAndSelect('transaction.sendCoin', 'transactionSendCoin', 'transactionSendCoin.transactionid = transaction.id') - .leftJoinAndSelect('transaction.creation', 'transactionCreation', 'transactionSendCoin.transactionid = transaction.id') - .getMany() - - let transactionIndiced: dbTransaction[] = [] + .createQueryBuilder('transaction') + .where('transaction.id IN (:...transactions)', { transactions: transactionIds }) + .leftJoinAndSelect( + 'transaction.sendCoin', + 'transactionSendCoin', + 'transactionSendCoin.transactionid = transaction.id', + ) + .leftJoinAndSelect( + 'transaction.creation', + 'transactionCreation', + 'transactionSendCoin.transactionid = transaction.id', + ) + .getMany() + + const transactionIndiced: dbTransaction[] = [] transactions.forEach((transaction: dbTransaction) => { transactionIndiced[transaction.id] = transaction - }) - - const decayStartTransaction = await dbTransaction.createQueryBuilder('transaction') - .where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: 9}) - .orderBy('received', 'ASC') - .getOne() - - userTransactions.forEach((userTransaction: dbUserTransaction, i:number) => { - const transaction = transactionIndiced[userTransaction.transactionId] - let finalTransaction = new Transaction - finalTransaction.transactionId = transaction.id - finalTransaction.date = transaction.received.toString() - finalTransaction.memo = transaction.memo - - let prev = i > 0 ? userTransactions[i-1] : null - if(prev && prev.balance > 0) { - - } - }) + const decayStartTransaction = await Decay.getDecayStartBlock() + + userTransactions.forEach(async (userTransaction: dbUserTransaction, i: number) => { + const transaction = transactionIndiced[userTransaction.transactionId] + const finalTransaction = new Transaction() + finalTransaction.transactionId = transaction.id + finalTransaction.date = transaction.received.toString() + finalTransaction.memo = transaction.memo + finalTransaction.totalBalance = roundFloorFrom4(userTransaction.balance) + + const prev = i > 0 ? userTransactions[i - 1] : null + if (prev && prev.balance > 0) { + const current = userTransaction + const decay = await calculateDecayWithInterval( + prev.balance, + prev.balanceDate, + current.balanceDate, + ) + const balance = prev.balance - decay.balance + + if (balance) { + finalTransaction.decay = decay + finalTransaction.decay.balance = roundFloorFrom4(finalTransaction.decay.balance) + finalTransaction.decay.balance = roundFloorFrom4(balance) + if ( + decayStartTransaction && + prev.transactionId < decayStartTransaction.id && + current.transactionId > decayStartTransaction.id + ) { + finalTransaction.decay.decayStartBlock = decayStartTransaction.received.getTime() + } + } + } + + // sender or receiver when user has sended money + // group name if creation + // type: gesendet / empfangen / geschöpft + // transaktion nr / id + // date + // balance + if (userTransaction.transactionTypeId === 1) { + // creation + const creation = transaction.transactionCreation + + finalTransaction.name = 'Gradido Akademie' + finalTransaction.type = 'creation' + // finalTransaction.targetDate = creation.targetDate + finalTransaction.balance = roundFloorFrom4(creation.amount) + } else if (userTransaction.transactionTypeId === 2) { + // send coin + const sendCoin = transaction.transactionSendCoin + let otherUser: dbUser | undefined + finalTransaction.balance = roundFloorFrom4(sendCoin.amount) + if (sendCoin.userId === user.id) { + finalTransaction.type = 'send' + otherUser = userIndiced[sendCoin.recipiantUserId] + // finalTransaction.pubkey = sendCoin.recipiantPublic + } else if (sendCoin.recipiantUserId === user.id) { + finalTransaction.type = 'receive' + otherUser = userIndiced[sendCoin.userId] + // finalTransaction.pubkey = sendCoin.senderPublic + } else { + throw new Error('invalid transaction') + } + if (otherUser) { + finalTransaction.name = otherUser.firstName + ' ' + otherUser.lastName + finalTransaction.email = otherUser.email + } + } + if (i > 0 || !skipFirstTransaction) { + finalTransactions.push(finalTransaction) + } + if (i === userTransactions.length - 1 && decay) { + const now = new Date() + const decay = await calculateDecayWithInterval( + userTransaction.balance, + userTransaction.balanceDate, + now.getTime(), + ) + const balance = userTransaction.balance - decay.balance + if (balance) { + const decayTransaction = new Transaction() + decayTransaction.type = 'decay' + decayTransaction.balance = roundFloorFrom4(balance) + decayTransaction.decayDuration = decay.decayDuration + decayTransaction.decayStart = decay.decayStart + decayTransaction.decayEnd = decay.decayEnd + finalTransactions.push(decayTransaction) + } + } + return finalTransactions + }) return finalTransactions } @@ -78,7 +158,7 @@ export default async function listTransactions( if (offset && order === 'ASC') { offset-- } - let [userTransactions, userTransactionsCount] = await UserTransaction.findByUserPaged( + let [userTransactions, userTransactionsCount] = await dbUserTransaction.findByUserPaged( user.id, limit, offset, @@ -86,12 +166,12 @@ export default async function listTransactions( ) skipFirstTransaction = userTransactionsCount > offset + limit const decay = !(firstPage > 1) - const transactions: Transaction[] = [] + let transactions: Transaction[] = [] if (userTransactions.length) { if (order === 'DESC') { userTransactions = userTransactions.reverse() } - let transactions = calculateAndAddDecayTransactions( + transactions = await calculateAndAddDecayTransactions( userTransactions, user, decay, diff --git a/backend/src/typeorm/entity/Transaction.ts b/backend/src/typeorm/entity/Transaction.ts index c9ecbf29f..d8b87828c 100644 --- a/backend/src/typeorm/entity/Transaction.ts +++ b/backend/src/typeorm/entity/Transaction.ts @@ -1,4 +1,6 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, Timestamp } from 'typeorm' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, OneToOne } from 'typeorm' +import { TransactionCreation } from './TransactionCreation' +import { TransactionSendCoin } from './TransactionSendCoin' @Entity('transactions') export class Transaction extends BaseEntity { @@ -15,16 +17,29 @@ export class Transaction extends BaseEntity { memo: string @Column({ type: 'timestamp' }) - received: Timestamp + received: Date @Column({ name: 'blockchain_type_id' }) blockchainTypeId: number + @OneToOne(() => TransactionSendCoin, (transactionSendCoin) => transactionSendCoin.transaction) + transactionSendCoin: TransactionSendCoin + + @OneToOne(() => TransactionCreation, (transactionCreation) => transactionCreation.transaction) + transactionCreation: TransactionCreation + static async findByTransactionTypeId(transactionTypeId: number): Promise { return this.createQueryBuilder('transaction') - .where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: transactionTypeId}) + .where('transaction.transactionTypeId = :transactionTypeId', { + transactionTypeId: transactionTypeId, + }) .getMany() } - + static async getDecayStartBlock(): Promise { + return this.createQueryBuilder('transaction') + .where('transaction.transactionTypeId = :transactionTypeId', { transactionTypeId: 9 }) + .orderBy('received', 'ASC') + .getOne() + } } diff --git a/backend/src/typeorm/entity/TransactionCreation.ts b/backend/src/typeorm/entity/TransactionCreation.ts index ec473a13b..e9efa2e23 100644 --- a/backend/src/typeorm/entity/TransactionCreation.ts +++ b/backend/src/typeorm/entity/TransactionCreation.ts @@ -1,4 +1,12 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, Timestamp, OneToOne, JoinColumn } from 'typeorm' +import { + BaseEntity, + Entity, + PrimaryGeneratedColumn, + Column, + Timestamp, + OneToOne, + JoinColumn, +} from 'typeorm' import { Transaction } from './Transaction' @Entity('transaction_creations') @@ -19,7 +27,6 @@ export class TransactionCreation extends BaseEntity { targetDate: Timestamp @OneToOne(() => Transaction) - @JoinColumn() + @JoinColumn() transaction: Transaction - } diff --git a/backend/src/typeorm/entity/TransactionSendCoin.ts b/backend/src/typeorm/entity/TransactionSendCoin.ts index b5b675d42..40ceb298b 100644 --- a/backend/src/typeorm/entity/TransactionSendCoin.ts +++ b/backend/src/typeorm/entity/TransactionSendCoin.ts @@ -15,7 +15,7 @@ export class TransactionSendCoin extends BaseEntity { @Column({ name: 'state_user_id' }) userId: number - @Column({ name: 'receiver_public_key', type: 'binary', length: 32}) + @Column({ name: 'receiver_public_key', type: 'binary', length: 32 }) recipiantPublic: Buffer @Column({ name: 'receiver_user_id' }) @@ -25,7 +25,6 @@ export class TransactionSendCoin extends BaseEntity { amount: number @OneToOne(() => Transaction) - @JoinColumn() + @JoinColumn() transaction: Transaction - } diff --git a/backend/src/typeorm/entity/User.ts b/backend/src/typeorm/entity/User.ts index e7bca8647..e82ba5deb 100644 --- a/backend/src/typeorm/entity/User.ts +++ b/backend/src/typeorm/entity/User.ts @@ -36,12 +36,12 @@ export class User extends BaseEntity { static async getUsersIndiced(userIds: number[]): Promise { const users = await this.createQueryBuilder('user') .select(['user.id', 'user.firstName', 'user.lastName', 'user.email']) - .where('user.id IN (:...users)', { users: userIds}) + .where('user.id IN (:...users)', { users: userIds }) .getMany() - let usersIndiced: User[] = [] - users.forEach((value, index) => { + const usersIndiced: User[] = [] + users.forEach((value, index) => { usersIndiced[index] = value - }) + }) return usersIndiced } } diff --git a/backend/src/typeorm/entity/UserTransaction.ts b/backend/src/typeorm/entity/UserTransaction.ts index 494f57103..1f32dc454 100644 --- a/backend/src/typeorm/entity/UserTransaction.ts +++ b/backend/src/typeorm/entity/UserTransaction.ts @@ -1,4 +1,4 @@ -import { BaseEntity, Entity, PrimaryGeneratedColumn, Column, Timestamp } from 'typeorm' +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' @Entity('state_user_transactions') export class UserTransaction extends BaseEntity { @@ -18,7 +18,7 @@ export class UserTransaction extends BaseEntity { balance: number @Column({ name: 'balance_date', type: 'timestamp' }) - balanceDate: Timestamp + balanceDate: number static findByUserPaged( userId: number, diff --git a/backend/src/util/decay.ts b/backend/src/util/decay.ts index 44a041a00..ccb6beeb4 100644 --- a/backend/src/util/decay.ts +++ b/backend/src/util/decay.ts @@ -1,4 +1,51 @@ -export default function (amount: number, from: Date, to: Date): number { - const decayDuration = (to.getTime() - from.getTime()) / 1000 - return amount * Math.pow(0.99999997802044727, decayDuration) +import { Decay } from '../graphql/models/Decay' + +function decayFormula(amount: number, durationInSeconds: number): number { + return amount * Math.pow(0.99999997802044727, durationInSeconds) } + +async function calculateDecay(amount: number, from: Date, to: Date): Promise { + // load decay start block + const decayStartBlock = await Decay.getDecayStartBlock() + + // if decay hasn't started yet we return input amount + if (!decayStartBlock) return amount + + const decayDuration = (to.getTime() - from.getTime()) / 1000 + return decayFormula(amount, decayDuration) +} + +async function calculateDecayWithInterval( + amount: number, + from: number, + to: number, +): Promise { + const decayStartBlock = await Decay.getDecayStartBlock() + const result = new Decay() + result.balance = amount + result.decayStart = from + result.decayEnd = from + + // (amount, from.getTime(), to.getTime()) + + // if no decay start block exist or decay startet after end date + if (decayStartBlock === undefined || decayStartBlock.received.getTime() > to) { + return result + } + + // if decay start date is before start date we calculate decay for full duration + if (decayStartBlock.received.getTime() < from) { + result.decayDuration = to - from + } + // if decay start in between start date and end date we caculcate decay from decay start time to end date + else { + result.decayDuration = to - decayStartBlock.received.getTime() + } + // js use timestamp in milliseconds but we calculate with seconds + result.decayDuration /= 1000 + result.balance = decayFormula(amount, result.decayDuration) + + return result +} + +export { calculateDecay, calculateDecayWithInterval } From 0d33202946c98912c1b89159c356407f208df787 Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Mon, 27 Sep 2021 19:52:46 +0200 Subject: [PATCH 131/144] fix what don't work --- backend/src/graphql/models/Decay.ts | 3 +-- backend/src/graphql/models/Transaction.ts | 2 +- .../src/graphql/resolvers/BalanceResolver.ts | 2 +- .../graphql/resolvers/TransactionResolver.ts | 4 ++-- .../src/graphql/resolvers/listTransactions.ts | 20 +++++++++---------- .../src/typeorm/entity/TransactionCreation.ts | 2 +- .../src/typeorm/entity/TransactionSendCoin.ts | 2 +- backend/src/util/decay.ts | 2 +- 8 files changed, 18 insertions(+), 19 deletions(-) diff --git a/backend/src/graphql/models/Decay.ts b/backend/src/graphql/models/Decay.ts index 09564c5ca..9bc89f6ec 100644 --- a/backend/src/graphql/models/Decay.ts +++ b/backend/src/graphql/models/Decay.ts @@ -5,8 +5,7 @@ import { Transaction } from '../../typeorm/entity/Transaction' @ObjectType() export class Decay { - constructor() - constructor(json?: any) { + constructor(json: any) { if (json) { this.balance = Number(json.balance) this.decayStart = json.decay_start diff --git a/backend/src/graphql/models/Transaction.ts b/backend/src/graphql/models/Transaction.ts index 01dcf280d..c34cac1c5 100644 --- a/backend/src/graphql/models/Transaction.ts +++ b/backend/src/graphql/models/Transaction.ts @@ -18,7 +18,7 @@ export class Transaction { this.balance = Number(json.balance) this.decayStart = json.decay_start this.decayEnd = json.decay_end - this.decayDuration = parseFloat(json.decay_duration) + this.memo = json.memo this.transactionId = json.transaction_id this.name = json.name diff --git a/backend/src/graphql/resolvers/BalanceResolver.ts b/backend/src/graphql/resolvers/BalanceResolver.ts index 02c148ffb..e7e8d73a3 100644 --- a/backend/src/graphql/resolvers/BalanceResolver.ts +++ b/backend/src/graphql/resolvers/BalanceResolver.ts @@ -7,7 +7,7 @@ import { Balance } from '../models/Balance' import { apiGet } from '../../apis/HttpRequest' import { User as dbUser } from '../../typeorm/entity/User' import { Balance as dbBalance } from '../../typeorm/entity/Balance' -import calculateDecay from '../../util/decay' +import { calculateDecay } from '../../util/decay' import { roundFloorFrom4 } from '../../util/round' @Resolver() diff --git a/backend/src/graphql/resolvers/TransactionResolver.ts b/backend/src/graphql/resolvers/TransactionResolver.ts index 0e4106991..f8cf2db62 100644 --- a/backend/src/graphql/resolvers/TransactionResolver.ts +++ b/backend/src/graphql/resolvers/TransactionResolver.ts @@ -10,7 +10,7 @@ import { User as dbUser } from '../../typeorm/entity/User' import { Balance as dbBalance } from '../../typeorm/entity/Balance' import listTransactions from './listTransactions' import { roundFloorFrom4 } from '../../util/round' -import calculateDecay from '../../util/decay' +import { calculateDecay } from '../../util/decay' @Resolver() export class TransactionResolver { @@ -41,7 +41,7 @@ export class TransactionResolver { const now = new Date() transactions.balance = roundFloorFrom4(balanceEntity.amount) transactions.decay = roundFloorFrom4( - calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), + await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), ) transactions.decayDate = now.toString() diff --git a/backend/src/graphql/resolvers/listTransactions.ts b/backend/src/graphql/resolvers/listTransactions.ts index 9bbb77bb5..73ddea150 100644 --- a/backend/src/graphql/resolvers/listTransactions.ts +++ b/backend/src/graphql/resolvers/listTransactions.ts @@ -12,7 +12,7 @@ async function calculateAndAddDecayTransactions( decay: boolean, skipFirstTransaction: boolean, ): Promise { - const finalTransactions: Transaction[] = [] + let finalTransactions: Transaction[] = [] const transactionIds: number[] = [] const involvedUserIds: number[] = [] @@ -29,14 +29,14 @@ async function calculateAndAddDecayTransactions( .createQueryBuilder('transaction') .where('transaction.id IN (:...transactions)', { transactions: transactionIds }) .leftJoinAndSelect( - 'transaction.sendCoin', - 'transactionSendCoin', - 'transactionSendCoin.transactionid = transaction.id', + 'transaction.transactionSendCoin', + 'transactionSendCoin' + //'transactionSendCoin.transaction_id = transaction.id', ) .leftJoinAndSelect( - 'transaction.creation', - 'transactionCreation', - 'transactionSendCoin.transactionid = transaction.id', + 'transaction.transactionCreation', + 'transactionCreation' + //'transactionSendCoin.transaction_id = transaction.id', ) .getMany() @@ -47,7 +47,7 @@ async function calculateAndAddDecayTransactions( const decayStartTransaction = await Decay.getDecayStartBlock() - userTransactions.forEach(async (userTransaction: dbUserTransaction, i: number) => { + await userTransactions.forEach(async (userTransaction: dbUserTransaction, i: number) => { const transaction = transactionIndiced[userTransaction.transactionId] const finalTransaction = new Transaction() finalTransaction.transactionId = transaction.id @@ -117,6 +117,7 @@ async function calculateAndAddDecayTransactions( if (i > 0 || !skipFirstTransaction) { finalTransactions.push(finalTransaction) } + if (i === userTransactions.length - 1 && decay) { const now = new Date() const decay = await calculateDecayWithInterval( @@ -135,7 +136,6 @@ async function calculateAndAddDecayTransactions( finalTransactions.push(decayTransaction) } } - return finalTransactions }) return finalTransactions @@ -176,7 +176,7 @@ export default async function listTransactions( user, decay, skipFirstTransaction, - ) + ) if (order === 'DESC') { transactions = transactions.reverse() } diff --git a/backend/src/typeorm/entity/TransactionCreation.ts b/backend/src/typeorm/entity/TransactionCreation.ts index e9efa2e23..4a8bdd571 100644 --- a/backend/src/typeorm/entity/TransactionCreation.ts +++ b/backend/src/typeorm/entity/TransactionCreation.ts @@ -27,6 +27,6 @@ export class TransactionCreation extends BaseEntity { targetDate: Timestamp @OneToOne(() => Transaction) - @JoinColumn() + @JoinColumn({ name: 'transaction_id' }) transaction: Transaction } diff --git a/backend/src/typeorm/entity/TransactionSendCoin.ts b/backend/src/typeorm/entity/TransactionSendCoin.ts index 40ceb298b..4054ea755 100644 --- a/backend/src/typeorm/entity/TransactionSendCoin.ts +++ b/backend/src/typeorm/entity/TransactionSendCoin.ts @@ -25,6 +25,6 @@ export class TransactionSendCoin extends BaseEntity { amount: number @OneToOne(() => Transaction) - @JoinColumn() + @JoinColumn({ name: 'transaction_id' }) transaction: Transaction } diff --git a/backend/src/util/decay.ts b/backend/src/util/decay.ts index ccb6beeb4..6b07cb35f 100644 --- a/backend/src/util/decay.ts +++ b/backend/src/util/decay.ts @@ -21,7 +21,7 @@ async function calculateDecayWithInterval( to: number, ): Promise { const decayStartBlock = await Decay.getDecayStartBlock() - const result = new Decay() + const result = new Decay(undefined) result.balance = amount result.decayStart = from result.decayEnd = from From 01ea24099acfb98f3990d2db3ad9f215c051eb1c Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 27 Sep 2021 21:26:07 +0200 Subject: [PATCH 132/144] warnings throw errors when running unit tests --- frontend/test/testSetup.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/frontend/test/testSetup.js b/frontend/test/testSetup.js index 7005ff5be..daf862548 100644 --- a/frontend/test/testSetup.js +++ b/frontend/test/testSetup.js @@ -1,6 +1,7 @@ import { createLocalVue } from '@vue/test-utils' import { BootstrapVue, IconsPlugin } from 'bootstrap-vue' import Vuex from 'vuex' +import Vue from 'vue' import { ValidationProvider, ValidationObserver, extend } from 'vee-validate' import * as rules from 'vee-validate/dist/rules' @@ -47,3 +48,8 @@ global.localVue.component('validation-provider', ValidationProvider) global.localVue.component('validation-observer', ValidationObserver) global.localVue.directive('click-outside', clickOutside) global.localVue.directive('focus', focus) + +// throw errors for vue warnings to force the programmers to take care about warnings +Vue.config.warnHandler = (w) => { + throw new Error(w) +} From f5915d0ada3123d2b208c42a4221cf9ad5ff4b13 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 28 Sep 2021 09:41:07 +0200 Subject: [PATCH 133/144] setting changed to settings, remove delete rows --- frontend/src/components/LanguageSwitchSelect.vue | 6 +++--- frontend/src/locales/de.json | 6 ++++-- frontend/src/locales/en.json | 6 ++++-- frontend/src/views/Pages/ForgotPassword.spec.js | 4 ++-- frontend/src/views/Pages/ForgotPassword.vue | 6 +++--- frontend/src/views/Pages/Login.spec.js | 2 +- frontend/src/views/Pages/Login.vue | 2 +- frontend/src/views/Pages/ResetPassword.spec.js | 8 ++++---- frontend/src/views/Pages/ResetPassword.vue | 8 ++++---- .../Pages/UserProfile/UserCard_FormUserData.spec.js | 2 +- .../views/Pages/UserProfile/UserCard_FormUserData.vue | 4 ++-- .../UserProfile/UserCard_FormUserPasswort.spec.js | 2 +- .../Pages/UserProfile/UserCard_FormUserPasswort.vue | 2 +- .../Pages/UserProfile/UserCard_FormUsername.spec.js | 2 +- .../views/Pages/UserProfile/UserCard_FormUsername.vue | 2 +- .../src/views/Pages/UserProfile/UserCard_Language.vue | 4 ++-- .../Pages/UserProfile/UserCard_Newsletter.spec.js | 2 +- .../views/Pages/UserProfile/UserCard_Newsletter.vue | 10 +++++----- 18 files changed, 41 insertions(+), 37 deletions(-) diff --git a/frontend/src/components/LanguageSwitchSelect.vue b/frontend/src/components/LanguageSwitchSelect.vue index b53b82a18..c547d9af3 100644 --- a/frontend/src/components/LanguageSwitchSelect.vue +++ b/frontend/src/components/LanguageSwitchSelect.vue @@ -14,9 +14,9 @@ export default { return { selected: null, options: [ - { value: null, text: this.$t('setting.language.select_language') }, - { value: 'de', text: this.$t('setting.language.de') }, - { value: 'en', text: this.$t('setting.language.en') }, + { value: null, text: this.$t('settings.language.select_language') }, + { value: 'de', text: this.$t('settings.language.de') }, + { value: 'en', text: this.$t('settings.language.en') }, ], } }, diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index ac9aa89d4..b43f4b4e5 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -76,7 +76,9 @@ "to1": "an", "validation": { "gddSendAmount": "Das Feld {_field_} muss eine Zahl zwischen {min} und {max} mit höchstens zwei Nachkommastellen sein", - "is-not": "Du kannst dir selbst keine Gradidos überweisen" + "is-not": "Du kannst dir selbst keine Gradidos überweisen", + "usernmae-regex": "Der Username muss mit einem Buchstaben beginnen auf den mindestens zwei alfanumerische Zeichen folgen müssen.", + "usernmae-unique": "Der Username ist bereits vergeben." } }, "gdt": { @@ -102,7 +104,7 @@ "message": "hallo gradido !!", "privacy_policy": "Datenschutzerklärung", "send": "Senden", - "setting": { + "settings": { "language": { "changeLanguage": "Sprache ändern", "de": "Deutsch", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 1967fc124..8dda1dfbe 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -76,7 +76,9 @@ "to1": "to", "validation": { "gddSendAmount": "The {_field_} field must be a number between {min} and {max} with at most two digits", - "is-not": "You cannot send Gradidos to yourself" + "is-not": "You cannot send Gradidos to yourself", + "usernmae-regex": "The username must start with a letter, followed by at least two alphanumeric characters.", + "usernmae-unique": "The username is already taken." } }, "gdt": { @@ -102,7 +104,7 @@ "message": "hello gradido !!", "privacy_policy": "Privacy policy", "send": "Send", - "setting": { + "settings": { "language": { "changeLanguage": "Change language", "de": "Deutsch", diff --git a/frontend/src/views/Pages/ForgotPassword.spec.js b/frontend/src/views/Pages/ForgotPassword.spec.js index 5f0311fcb..91247d8a6 100644 --- a/frontend/src/views/Pages/ForgotPassword.spec.js +++ b/frontend/src/views/Pages/ForgotPassword.spec.js @@ -39,11 +39,11 @@ describe('ForgotPassword', () => { }) it('has a title', () => { - expect(wrapper.find('h1').text()).toEqual('setting.password.reset') + expect(wrapper.find('h1').text()).toEqual('settings.password.reset') }) it('has a subtitle', () => { - expect(wrapper.find('p.text-lead').text()).toEqual('setting.password.subtitle') + expect(wrapper.find('p.text-lead').text()).toEqual('settings.password.subtitle') }) describe('back button', () => { diff --git a/frontend/src/views/Pages/ForgotPassword.vue b/frontend/src/views/Pages/ForgotPassword.vue index c68b94a56..444e94495 100644 --- a/frontend/src/views/Pages/ForgotPassword.vue +++ b/frontend/src/views/Pages/ForgotPassword.vue @@ -5,8 +5,8 @@
-

{{ $t('setting.password.reset') }}

-

{{ $t('setting.password.subtitle') }}

+

{{ $t('settings.password.reset') }}

+

{{ $t('settings.password.subtitle') }}

@@ -22,7 +22,7 @@
- {{ $t('setting.password.send_now') }} + {{ $t('settings.password.send_now') }}
diff --git a/frontend/src/views/Pages/Login.spec.js b/frontend/src/views/Pages/Login.spec.js index 30f6cb4bd..7218384f7 100644 --- a/frontend/src/views/Pages/Login.spec.js +++ b/frontend/src/views/Pages/Login.spec.js @@ -71,7 +71,7 @@ describe('Login', () => { describe('links', () => { it('has a link "Forgot Password?"', () => { expect(wrapper.findAllComponents(RouterLinkStub).at(0).text()).toEqual( - 'setting.password.forgot_pwd', + 'settings.password.forgot_pwd', ) }) diff --git a/frontend/src/views/Pages/Login.vue b/frontend/src/views/Pages/Login.vue index 90fa5eb61..f5c6f025d 100755 --- a/frontend/src/views/Pages/Login.vue +++ b/frontend/src/views/Pages/Login.vue @@ -40,7 +40,7 @@ - {{ $t('setting.password.forgot_pwd') }} + {{ $t('settings.password.forgot_pwd') }} diff --git a/frontend/src/views/Pages/ResetPassword.spec.js b/frontend/src/views/Pages/ResetPassword.spec.js index 2df1cd75e..bd1467524 100644 --- a/frontend/src/views/Pages/ResetPassword.spec.js +++ b/frontend/src/views/Pages/ResetPassword.spec.js @@ -71,9 +71,9 @@ describe('ResetPassword', () => { }) it('has a message suggesting to contact the support', () => { - expect(wrapper.find('div.header').text()).toContain('setting.password.reset') + expect(wrapper.find('div.header').text()).toContain('settings.password.reset') expect(wrapper.find('div.header').text()).toContain( - 'setting.password.reset-password.not-authenticated', + 'settings.password.reset-password.not-authenticated', ) }) }) @@ -101,9 +101,9 @@ describe('ResetPassword', () => { describe('Register header', () => { it('has a welcome message', async () => { - expect(wrapper.find('div.header').text()).toContain('setting.password.reset') + expect(wrapper.find('div.header').text()).toContain('settings.password.reset') expect(wrapper.find('div.header').text()).toContain( - 'setting.password.reset-password.text', + 'settings.password.reset-password.text', ) }) }) diff --git a/frontend/src/views/Pages/ResetPassword.vue b/frontend/src/views/Pages/ResetPassword.vue index f72100600..81b3d7df7 100644 --- a/frontend/src/views/Pages/ResetPassword.vue +++ b/frontend/src/views/Pages/ResetPassword.vue @@ -5,13 +5,13 @@
-

{{ $t('setting.password.reset') }}

+

{{ $t('settings.password.reset') }}

- {{ $t('setting.password.reset-password.text') }} + {{ $t('settings.password.reset-password.text') }} - {{ $t('setting.password.reset-password.not-authenticated') }} + {{ $t('settings.password.reset-password.not-authenticated') }}
@@ -29,7 +29,7 @@
- {{ $t('setting.password.reset') }} + {{ $t('settings.password.reset') }}
diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.spec.js index 0c7cae799..927f1d29d 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.spec.js @@ -139,7 +139,7 @@ describe('UserCard_FormUserData', () => { }) it('toasts a success message', () => { - expect(toastSuccessMock).toBeCalledWith('setting.name.change-success') + expect(toastSuccessMock).toBeCalledWith('settings.name.change-success') }) it('has an edit button again', () => { diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue index 0cd8ba965..b3cee1ef5 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserData.vue @@ -4,7 +4,7 @@ - {{ $t('setting.name.change-name') }} + {{ $t('settings.name.change-name') }} @@ -122,7 +122,7 @@ export default { this.$store.commit('lastName', this.form.lastName) this.$store.commit('description', this.form.description) this.showUserData = true - this.$toasted.success(this.$t('setting.name.change-success')) + this.$toasted.success(this.$t('settings.name.change-success')) }) .catch((error) => { this.$toasted.error(error.message) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js index 048f12ff1..372a1ba1f 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.spec.js @@ -47,7 +47,7 @@ describe('UserCard_FormUserPasswort', () => { }) it('has a change password button with text "form.change-password"', () => { - expect(wrapper.find('a').text()).toEqual('setting.password.change-password') + expect(wrapper.find('a').text()).toEqual('settings.password.change-password') }) it('has a change password button with a pencil icon', () => { diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue index 5095f7b74..1f6c34c26 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUserPasswort.vue @@ -4,7 +4,7 @@ - {{ $t('setting.password.change-password') }} + {{ $t('settings.password.change-password') }} diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.spec.js index 4c667d782..a55c223d7 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.spec.js @@ -125,7 +125,7 @@ describe('UserCard_FormUsername', () => { }) it('toasts an success message', () => { - expect(toastSuccessMock).toBeCalledWith('setting.name.change-success') + expect(toastSuccessMock).toBeCalledWith('settings.name.change-success') }) it('has no edit button anymore', () => { diff --git a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue index eae499c07..f9d46bbba 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_FormUsername.vue @@ -98,7 +98,7 @@ export default { this.$store.commit('username', this.form.username) this.username = this.form.username this.showUsername = true - this.$toasted.success(this.$t('setting.name.change-success')) + this.$toasted.success(this.$t('settings.name.change-success')) }) .catch((error) => { this.$toasted.error(error.message) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue index 0d5872179..8d05620c9 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Language.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_Language.vue @@ -4,7 +4,7 @@ - {{ $t('setting.language.changeLanguage') }} + {{ $t('settings.language.changeLanguage') }} @@ -97,7 +97,7 @@ export default { this.$i18n.locale = this.language localeChanged(this.language) this.cancelEdit() - this.$toasted.success(this.$t('setting.language.success')) + this.$toasted.success(this.$t('settings.language.success')) }) .catch((error) => { this.language = this.$store.state.language diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js index 8f15a855b..3a70840e1 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js +++ b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.spec.js @@ -74,7 +74,7 @@ describe('UserCard_Newsletter', () => { }) it('toasts a success message', () => { - expect(toastSuccessMock).toBeCalledWith('setting.newsletter.newsletterFalse') + expect(toastSuccessMock).toBeCalledWith('settings.newsletter.newsletterFalse') }) }) diff --git a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue index 7b0f124f4..31fd745b2 100644 --- a/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue +++ b/frontend/src/views/Pages/UserProfile/UserCard_Newsletter.vue @@ -4,7 +4,7 @@ - {{ $t('setting.newsletter.newsletter') }} + {{ $t('settings.newsletter.newsletter') }} @@ -17,8 +17,8 @@ > {{ newsletterState - ? $t('setting.newsletter.newsletterTrue') - : $t('setting.newsletter.newsletterFalse') + ? $t('settings.newsletter.newsletterTrue') + : $t('settings.newsletter.newsletterFalse') }} @@ -50,8 +50,8 @@ export default { this.$store.commit('newsletterState', this.newsletterState) this.$toasted.success( this.newsletterState - ? this.$t('setting.newsletter.newsletterTrue') - : this.$t('setting.newsletter.newsletterFalse'), + ? this.$t('settings.newsletter.newsletterTrue') + : this.$t('settings.newsletter.newsletterFalse'), ) }) .catch((error) => { From 1a42aa17e4827da7fcbd7f7efe051d39fc8bc20d Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 28 Sep 2021 12:29:45 +0200 Subject: [PATCH 134/144] register process simplified, reset function removed, submit button replaced with disable function --- frontend/src/views/Pages/Register.spec.js | 62 ++--------------------- frontend/src/views/Pages/Register.vue | 37 +++++--------- 2 files changed, 16 insertions(+), 83 deletions(-) diff --git a/frontend/src/views/Pages/Register.spec.js b/frontend/src/views/Pages/Register.spec.js index 8c00d5bd6..233897243 100644 --- a/frontend/src/views/Pages/Register.spec.js +++ b/frontend/src/views/Pages/Register.spec.js @@ -55,11 +55,11 @@ describe('Register', () => { describe('links', () => { it('has a link "Back"', () => { - expect(wrapper.findAllComponents(RouterLinkStub).at(0).text()).toEqual('back') + expect(wrapper.find('.test-button-back').text()).toEqual('back') }) it('links to /login when clicking "Back"', () => { - expect(wrapper.findAllComponents(RouterLinkStub).at(0).props().to).toBe('/login') + expect(wrapper.find('.test-button-back').props().to).toBe('/login') }) }) @@ -98,8 +98,8 @@ describe('Register', () => { expect(wrapper.find('#registerCheckbox').exists()).toBeTruthy() }) - it('has no submit button when not completely filled', () => { - expect(wrapper.find('button[type="submit"]').exists()).toBe(false) + it('has disabled submit button when not completely filled', () => { + expect(wrapper.find('button[type="submit"]').is('[disabled]')).toBe(true) }) it('displays a message that Email is required', async () => { @@ -127,60 +127,6 @@ describe('Register', () => { }) }) - describe('resetForm', () => { - beforeEach(() => { - wrapper.find('#registerFirstname').setValue('Max') - wrapper.find('#registerLastname').setValue('Mustermann') - wrapper.find('#Email-input-field').setValue('max.mustermann@gradido.net') - wrapper.find('input[name="form.password"]').setValue('Aa123456_') - wrapper.find('input[name="form.passwordRepeat"]').setValue('Aa123456_') - wrapper.find('.language-switch-select').findAll('option').at(1).setSelected() - wrapper.find('input[name="site.signup.agree"]').setChecked(true) - }) - - it('reset selected value language', async () => { - await wrapper.find('button.ml-2').trigger('click') - await flushPromises() - expect(wrapper.find('.language-switch-select').element.value).toBe(undefined) - }) - - it('resets the firstName field after clicking the reset button', async () => { - await wrapper.find('button.ml-2').trigger('click') - await flushPromises() - expect(wrapper.find('#registerFirstname').element.value).toBe('') - }) - - it('resets the lastName field after clicking the reset button', async () => { - await wrapper.find('button.ml-2').trigger('click') - await flushPromises() - expect(wrapper.find('#registerLastname').element.value).toBe('') - }) - - it('resets the email field after clicking the reset button', async () => { - await wrapper.find('button.ml-2').trigger('click') - await flushPromises() - expect(wrapper.find('#Email-input-field').element.value).toBe('') - }) - - it.skip('resets the password field after clicking the reset button', async () => { - await wrapper.find('button.ml-2').trigger('click') - await flushPromises() - expect(wrapper.find('input[name="form.password"]').element.value).toBe('') - }) - - it.skip('resets the passwordRepeat field after clicking the reset button', async () => { - await wrapper.find('button.ml-2').trigger('click') - await flushPromises() - expect(wrapper.find('input[name="form.passwordRepeat"]').element.value).toBe('') - }) - - it('resets the firstName field after clicking the reset button', async () => { - await wrapper.find('button.ml-2').trigger('click') - await flushPromises() - expect(wrapper.find('input[name="site.signup.agree"]').props.checked).not.toBeTruthy() - }) - }) - describe('API calls', () => { beforeEach(() => { wrapper.find('#registerFirstname').setValue('Max') diff --git a/frontend/src/views/Pages/Register.vue b/frontend/src/views/Pages/Register.vue index 1a1b91bbe..89b539922 100755 --- a/frontend/src/views/Pages/Register.vue +++ b/frontend/src/views/Pages/Register.vue @@ -116,13 +116,19 @@ -
+
- {{ $t('form.reset') }} - {{ $t('signup') }} + + {{ $t('back') }} + + + + {{ $t('signup') }} +
@@ -131,9 +137,6 @@ -
- {{ $t('back') }} -
@@ -172,22 +175,6 @@ export default { getValidationState({ dirty, validated, valid = null }) { return dirty || validated ? valid : null }, - resetForm() { - this.form = { - firstname: '', - lastname: '', - email: '', - password: { - password: '', - passwordRepeat: '', - }, - agree: false, - } - this.language = '' - this.$nextTick(() => { - this.$refs.observer.reset() - }) - }, async onSubmit() { this.$apollo .mutate({ From aa2565d294328dc74070d9c3dffdef974b6a259c Mon Sep 17 00:00:00 2001 From: Einhornimmond Date: Tue, 28 Sep 2021 13:11:22 +0200 Subject: [PATCH 135/144] debugging stuff --- backend/src/graphql/resolvers/listTransactions.ts | 11 +++++++++-- backend/src/util/decay.ts | 1 - 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/backend/src/graphql/resolvers/listTransactions.ts b/backend/src/graphql/resolvers/listTransactions.ts index 73ddea150..21516bb87 100644 --- a/backend/src/graphql/resolvers/listTransactions.ts +++ b/backend/src/graphql/resolvers/listTransactions.ts @@ -54,8 +54,8 @@ async function calculateAndAddDecayTransactions( finalTransaction.date = transaction.received.toString() finalTransaction.memo = transaction.memo finalTransaction.totalBalance = roundFloorFrom4(userTransaction.balance) - const prev = i > 0 ? userTransactions[i - 1] : null + if (prev && prev.balance > 0) { const current = userTransaction const decay = await calculateDecayWithInterval( @@ -63,12 +63,17 @@ async function calculateAndAddDecayTransactions( prev.balanceDate, current.balanceDate, ) + console.log("decay: %o for transaction %o", decay, i) const balance = prev.balance - decay.balance + console.log("balance: %o", balance) if (balance) { finalTransaction.decay = decay - finalTransaction.decay.balance = roundFloorFrom4(finalTransaction.decay.balance) + console.log("final transaction decay: %o", decay) + console.log("round balance: %o", balance) finalTransaction.decay.balance = roundFloorFrom4(balance) + console.log("final transaction decay: %o after setting balance", decay) + console.log("rounded: %o", finalTransaction.decay.balance) if ( decayStartTransaction && prev.transactionId < decayStartTransaction.id && @@ -76,6 +81,8 @@ async function calculateAndAddDecayTransactions( ) { finalTransaction.decay.decayStartBlock = decayStartTransaction.received.getTime() } + } else { + console.log("balance isn't true: %o", balance) } } diff --git a/backend/src/util/decay.ts b/backend/src/util/decay.ts index 6b07cb35f..1d92e8cec 100644 --- a/backend/src/util/decay.ts +++ b/backend/src/util/decay.ts @@ -44,7 +44,6 @@ async function calculateDecayWithInterval( // js use timestamp in milliseconds but we calculate with seconds result.decayDuration /= 1000 result.balance = decayFormula(amount, result.decayDuration) - return result } From e1197c5a6cbe68d7b5ed6961443d5ca78e10ce2a Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 28 Sep 2021 13:44:05 +0200 Subject: [PATCH 136/144] removed LOGIN_API_URL & COMMUNITY_API_URL from frontend config --- frontend/src/config/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/src/config/index.js b/frontend/src/config/index.js index 54c2c7aeb..96f7795ce 100644 --- a/frontend/src/config/index.js +++ b/frontend/src/config/index.js @@ -18,8 +18,6 @@ const environment = { } const server = { - LOGIN_API_URL: process.env.LOGIN_API_URL || 'http://localhost/login_api/', - COMMUNITY_API_URL: process.env.COMMUNITY_API_URL || 'http://localhost/api/', GRAPHQL_URI: process.env.GRAPHQL_URI || 'http://localhost:4000/graphql', } From 01abcce931776d98a95074ff14dbf12ae47f319b Mon Sep 17 00:00:00 2001 From: Ulf Gebhardt Date: Tue, 28 Sep 2021 13:44:30 +0200 Subject: [PATCH 137/144] removed LOGIN_API_URL & COMMUNITY_API_URL from .env.dist --- frontend/.env.dist | 2 -- 1 file changed, 2 deletions(-) diff --git a/frontend/.env.dist b/frontend/.env.dist index 1252faf5b..a7d67f970 100644 --- a/frontend/.env.dist +++ b/frontend/.env.dist @@ -1,5 +1,3 @@ -LOGIN_API_URL=http://localhost/login_api/ -COMMUNITY_API_URL=http://localhost/api/ ALLOW_REGISTER=true GRAPHQL_URI=http://localhost:4000/graphql //BUILD_COMMIT=0000000 \ No newline at end of file From a8faa7b51b7bbf56024d07924a79e4c333cb6f12 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 28 Sep 2021 13:47:22 +0200 Subject: [PATCH 138/144] add test - enable disable button on submit register --- frontend/src/views/Pages/Register.spec.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/Pages/Register.spec.js b/frontend/src/views/Pages/Register.spec.js index 233897243..04e59cde6 100644 --- a/frontend/src/views/Pages/Register.spec.js +++ b/frontend/src/views/Pages/Register.spec.js @@ -99,7 +99,7 @@ describe('Register', () => { }) it('has disabled submit button when not completely filled', () => { - expect(wrapper.find('button[type="submit"]').is('[disabled]')).toBe(true) + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe('disabled') }) it('displays a message that Email is required', async () => { @@ -137,6 +137,10 @@ describe('Register', () => { wrapper.find('.language-switch-select').findAll('option').at(1).setSelected() }) + it('has enabled submit button when completely filled', () => { + expect(wrapper.find('button[type="submit"]').attributes('disabled')).toBe('disabled') + }) + describe('server sends back error', () => { beforeEach(async () => { registerUserMutationMock.mockRejectedValue({ message: 'Ouch!' }) From fd2ae0f2429a1cf12435a05412b76d5dca5f90e1 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 28 Sep 2021 14:55:14 +0200 Subject: [PATCH 139/144] remove select 'null' in LanguageSwitchSelect.vue --- frontend/src/components/LanguageSwitchSelect.vue | 1 - frontend/src/locales/de.json | 1 - frontend/src/locales/en.json | 1 - frontend/src/views/Pages/Register.spec.js | 4 ++-- frontend/src/views/Pages/Register.vue | 2 +- 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/LanguageSwitchSelect.vue b/frontend/src/components/LanguageSwitchSelect.vue index 518bcf6cf..3467bdafd 100644 --- a/frontend/src/components/LanguageSwitchSelect.vue +++ b/frontend/src/components/LanguageSwitchSelect.vue @@ -14,7 +14,6 @@ export default { return { selected: null, options: [ - { value: null, text: this.$t('select_language') }, { value: 'de', text: this.$t('languages.de') }, { value: 'en', text: this.$t('languages.en') }, ], diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json index 468c88f85..6dbd06fbd 100644 --- a/frontend/src/locales/de.json +++ b/frontend/src/locales/de.json @@ -122,7 +122,6 @@ "text": "Jetzt kannst du ein neues Passwort speichern, mit dem du dich zukünftig in der Gradido-App anmelden kannst.", "title": "Passwort zurücksetzen" }, - "select_language": "Bitte wähle eine Sprache für die App und Newsletter", "send": "Senden", "setting": { "changeNewsletter": "Newsletter Status ändern", diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json index 05ce82b7b..39578936d 100644 --- a/frontend/src/locales/en.json +++ b/frontend/src/locales/en.json @@ -122,7 +122,6 @@ "text": "Now you can save a new password to login to the Gradido-App in the future.", "title": "Reset Password" }, - "select_language": "Please choose a language for the app and newsletter", "send": "Send", "setting": { "changeNewsletter": "Newsletter status change", diff --git a/frontend/src/views/Pages/Register.spec.js b/frontend/src/views/Pages/Register.spec.js index 04e59cde6..37ee22f78 100644 --- a/frontend/src/views/Pages/Register.spec.js +++ b/frontend/src/views/Pages/Register.spec.js @@ -91,7 +91,7 @@ describe('Register', () => { }) it('selected Language value de', async () => { wrapper.find('.selectedLanguage').findAll('option').at(1).setSelected() - expect(wrapper.find('.selectedLanguage').element.value).toBe('de') + expect(wrapper.find('.selectedLanguage').element.value).toBe('en') }) it('has 1 checkbox input fields', () => { @@ -185,7 +185,7 @@ describe('Register', () => { firstName: 'Max', lastName: 'Mustermann', password: 'Aa123456_', - language: 'de', + language: 'en', }, }), ) diff --git a/frontend/src/views/Pages/Register.vue b/frontend/src/views/Pages/Register.vue index 89b539922..f08ea286e 100755 --- a/frontend/src/views/Pages/Register.vue +++ b/frontend/src/views/Pages/Register.vue @@ -225,7 +225,7 @@ export default { return this.form.email !== '' }, languageFilled() { - return this.language !== null && this.language !== '' + return !!this.language }, }, } From 6883fc37785e994683b756f3011438694d96b988 Mon Sep 17 00:00:00 2001 From: Alexander Friedland Date: Tue, 28 Sep 2021 16:40:47 +0200 Subject: [PATCH 140/144] Update Register.spec.js --- frontend/src/views/Pages/Register.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/views/Pages/Register.spec.js b/frontend/src/views/Pages/Register.spec.js index 37ee22f78..f3f66fca9 100644 --- a/frontend/src/views/Pages/Register.spec.js +++ b/frontend/src/views/Pages/Register.spec.js @@ -25,7 +25,7 @@ describe('Register', () => { $store: { state: { email: 'peter@lustig.de', - language: null, + language: 'en', }, }, } @@ -89,7 +89,7 @@ describe('Register', () => { it('has Language selected field', () => { expect(wrapper.find('.selectedLanguage').exists()).toBeTruthy() }) - it('selected Language value de', async () => { + it('selects Language value en', async () => { wrapper.find('.selectedLanguage').findAll('option').at(1).setSelected() expect(wrapper.find('.selectedLanguage').element.value).toBe('en') }) From ef0db3cb02bde14e33931ba33511392b23ec16e7 Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Tue, 28 Sep 2021 16:56:10 +0200 Subject: [PATCH 141/144] fix linting --- .../src/graphql/resolvers/BalanceResolver.ts | 23 +++++++++++++------ .../graphql/resolvers/TransactionResolver.ts | 14 ++++++----- .../src/graphql/resolvers/listTransactions.ts | 22 ++++++------------ backend/src/typeorm/entity/Balance.ts | 6 ++--- 4 files changed, 33 insertions(+), 32 deletions(-) diff --git a/backend/src/graphql/resolvers/BalanceResolver.ts b/backend/src/graphql/resolvers/BalanceResolver.ts index e7e8d73a3..f31b66371 100644 --- a/backend/src/graphql/resolvers/BalanceResolver.ts +++ b/backend/src/graphql/resolvers/BalanceResolver.ts @@ -22,14 +22,23 @@ export class BalanceResolver { // load user and balance const userEntity = await dbUser.findByPubkeyHex(result.data.user.public_hex) const balanceEntity = await dbBalance.findByUser(userEntity.id) + let balance: Balance const now = new Date() - const balance = new Balance({ - balance: roundFloorFrom4(balanceEntity.amount), - decay: roundFloorFrom4( - await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), - ), - decay_date: now.toString(), - }) + if (balanceEntity) { + balance = new Balance({ + balance: roundFloorFrom4(balanceEntity.amount), + decay: roundFloorFrom4( + await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), + ), + decay_date: now.toString(), + }) + } else { + balance = new Balance({ + balance: 0, + decay: 0, + decay_date: now.toString(), + }) + } return balance } diff --git a/backend/src/graphql/resolvers/TransactionResolver.ts b/backend/src/graphql/resolvers/TransactionResolver.ts index f8cf2db62..3762cccee 100644 --- a/backend/src/graphql/resolvers/TransactionResolver.ts +++ b/backend/src/graphql/resolvers/TransactionResolver.ts @@ -38,12 +38,14 @@ export class TransactionResolver { // get balance const balanceEntity = await dbBalance.findByUser(userEntity.id) - const now = new Date() - transactions.balance = roundFloorFrom4(balanceEntity.amount) - transactions.decay = roundFloorFrom4( - await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), - ) - transactions.decayDate = now.toString() + if (balanceEntity) { + const now = new Date() + transactions.balance = roundFloorFrom4(balanceEntity.amount) + transactions.decay = roundFloorFrom4( + await calculateDecay(balanceEntity.amount, balanceEntity.recordDate, now), + ) + transactions.decayDate = now.toString() + } return transactions } diff --git a/backend/src/graphql/resolvers/listTransactions.ts b/backend/src/graphql/resolvers/listTransactions.ts index 21516bb87..8c4519776 100644 --- a/backend/src/graphql/resolvers/listTransactions.ts +++ b/backend/src/graphql/resolvers/listTransactions.ts @@ -12,7 +12,7 @@ async function calculateAndAddDecayTransactions( decay: boolean, skipFirstTransaction: boolean, ): Promise { - let finalTransactions: Transaction[] = [] + const finalTransactions: Transaction[] = [] const transactionIds: number[] = [] const involvedUserIds: number[] = [] @@ -30,13 +30,13 @@ async function calculateAndAddDecayTransactions( .where('transaction.id IN (:...transactions)', { transactions: transactionIds }) .leftJoinAndSelect( 'transaction.transactionSendCoin', - 'transactionSendCoin' - //'transactionSendCoin.transaction_id = transaction.id', + 'transactionSendCoin', + // 'transactionSendCoin.transaction_id = transaction.id', ) .leftJoinAndSelect( 'transaction.transactionCreation', - 'transactionCreation' - //'transactionSendCoin.transaction_id = transaction.id', + 'transactionCreation', + // 'transactionSendCoin.transaction_id = transaction.id', ) .getMany() @@ -63,17 +63,11 @@ async function calculateAndAddDecayTransactions( prev.balanceDate, current.balanceDate, ) - console.log("decay: %o for transaction %o", decay, i) const balance = prev.balance - decay.balance - console.log("balance: %o", balance) if (balance) { finalTransaction.decay = decay - console.log("final transaction decay: %o", decay) - console.log("round balance: %o", balance) finalTransaction.decay.balance = roundFloorFrom4(balance) - console.log("final transaction decay: %o after setting balance", decay) - console.log("rounded: %o", finalTransaction.decay.balance) if ( decayStartTransaction && prev.transactionId < decayStartTransaction.id && @@ -81,8 +75,6 @@ async function calculateAndAddDecayTransactions( ) { finalTransaction.decay.decayStartBlock = decayStartTransaction.received.getTime() } - } else { - console.log("balance isn't true: %o", balance) } } @@ -124,7 +116,7 @@ async function calculateAndAddDecayTransactions( if (i > 0 || !skipFirstTransaction) { finalTransactions.push(finalTransaction) } - + if (i === userTransactions.length - 1 && decay) { const now = new Date() const decay = await calculateDecayWithInterval( @@ -183,7 +175,7 @@ export default async function listTransactions( user, decay, skipFirstTransaction, - ) + ) if (order === 'DESC') { transactions = transactions.reverse() } diff --git a/backend/src/typeorm/entity/Balance.ts b/backend/src/typeorm/entity/Balance.ts index 1cde6bcc2..23b21de78 100644 --- a/backend/src/typeorm/entity/Balance.ts +++ b/backend/src/typeorm/entity/Balance.ts @@ -17,9 +17,7 @@ export class Balance extends BaseEntity { @Column({ type: 'bigint' }) amount: number - static findByUser(userId: number): Promise { - return this.createQueryBuilder('balance') - .where('balance.userId = :userId', { userId }) - .getOneOrFail() + static findByUser(userId: number): Promise { + return this.createQueryBuilder('balance').where('balance.userId = :userId', { userId }).getOne() } } From dba6a1b8d654fd376ca286cb2726184953841d41 Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Wed, 29 Sep 2021 12:02:16 +0200 Subject: [PATCH 142/144] change datatype for timestamps to string --- backend/package-lock.json | 4712 ----------------- backend/src/graphql/models/Decay.ts | 8 +- backend/src/graphql/models/Transaction.ts | 40 +- .../graphql/resolvers/TransactionResolver.ts | 1 - .../src/graphql/resolvers/listTransactions.ts | 16 +- backend/src/typeorm/entity/UserTransaction.ts | 2 +- backend/src/util/decay.ts | 18 +- 7 files changed, 35 insertions(+), 4762 deletions(-) delete mode 100644 backend/package-lock.json diff --git a/backend/package-lock.json b/backend/package-lock.json deleted file mode 100644 index 44ff1180f..000000000 --- a/backend/package-lock.json +++ /dev/null @@ -1,4712 +0,0 @@ -{ - "name": "gradido-backend", - "version": "1.4.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@apollo/protobufjs": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@apollo/protobufjs/-/protobufjs-1.2.2.tgz", - "integrity": "sha512-vF+zxhPiLtkwxONs6YanSt1EpwpGilThpneExUN5K3tCymuxNnVq2yojTvnpRjv2QfsEIt/n7ozPIIzBLwGIDQ==", - "requires": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", - "long": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" - } - } - }, - "@apollographql/apollo-tools": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@apollographql/apollo-tools/-/apollo-tools-0.5.1.tgz", - "integrity": "sha512-ZII+/xUFfb9ezDU2gad114+zScxVFMVlZ91f8fGApMzlS1kkqoyLnC4AJaQ1Ya/X+b63I20B4Gd+eCL8QuB4sA==" - }, - "@apollographql/graphql-playground-html": { - "version": "1.6.27", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-playground-html/-/graphql-playground-html-1.6.27.tgz", - "integrity": "sha512-tea2LweZvn6y6xFV11K0KC8ETjmm52mQrW+ezgB2O/aTQf8JGyFmMcRPFgUaQZeHbWdm8iisDC6EjOKsXu0nfw==", - "requires": { - "xss": "^1.0.8" - } - }, - "@apollographql/graphql-upload-8-fork": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@apollographql/graphql-upload-8-fork/-/graphql-upload-8-fork-8.1.3.tgz", - "integrity": "sha512-ssOPUT7euLqDXcdVv3Qs4LoL4BPtfermW1IOouaqEmj36TpHYDmYDIbKoSQxikd9vtMumFnP87OybH7sC9fJ6g==", - "requires": { - "@types/express": "*", - "@types/fs-capacitor": "*", - "@types/koa": "*", - "busboy": "^0.3.1", - "fs-capacitor": "^2.0.4", - "http-errors": "^1.7.3", - "object-path": "^0.11.4" - } - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.14.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", - "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", - "dev": true - }, - "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.14.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "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" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - } - } - }, - "@eslint/eslintrc": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz", - "integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "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 - } - } - }, - "@josephg/resolvable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@josephg/resolvable/-/resolvable-1.0.1.tgz", - "integrity": "sha512-CtzORUwWTTOTqfVtHaKRJ0I1kNQd1bpn3sUh8I3nJDVY+5/M/Oe1DnEWzPQvqq/xPIIkzzzIP7mfCoAjFRvDhg==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" - }, - "@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" - }, - "@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" - }, - "@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" - }, - "@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" - }, - "@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" - }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@sqltools/formatter": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.3.tgz", - "integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg==" - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.1.tgz", - "integrity": "sha512-FTgBI767POY/lKNDNbIzgAX6miIDBs6NTCbdlDb8TrWovHsSvaVIZDlTqym29C6UqhzwcJx4CYr+AlrMywA0cA==", - "dev": true - }, - "@types/accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-a6bTJ21vFOGIkwM0kzh9Yr89ziVxq4vYH2fQ6N8AeipEzai/cFK6aGMArIkUeIdRIgpwQa+2bXiLuUJCpSf2Cg==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-0mPF08jn9zYI0n0Q/Pnz7C4kThdSt+6LD4amsrYDDpgBfrVWa3TcCOxKX1zkGgYniGagRv8heN2cbh+CAn+uuQ==" - }, - "@types/cookies": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", - "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", - "requires": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "@types/cors": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", - "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==" - }, - "@types/express": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", - "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.24", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz", - "integrity": "sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "@types/fs-capacitor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/fs-capacitor/-/fs-capacitor-2.0.0.tgz", - "integrity": "sha512-FKVPOCFbhCvZxpVAMhdBdTfVfXUpsh15wFHgqOKxh9N9vzWZVuWCSijZ5T4U34XYNnuj2oduh6xcs1i+LPI+BQ==", - "requires": { - "@types/node": "*" - } - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/http-assert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.1.tgz", - "integrity": "sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==" - }, - "@types/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-e+2rjEwK6KDaNOm5Aa9wNGgyS9oSZU/4pfSMMPYNOfjvFI0WVXm29+ITRFr6aKDvvKo7uU1jV68MW4ScsfDi7Q==" - }, - "@types/json-schema": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz", - "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", - "dev": true - }, - "@types/jsonwebtoken": { - "version": "8.5.2", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-8.5.2.tgz", - "integrity": "sha512-X8BOCkp+WJVNYCYIBugREtVZa4Y09Or9HDx6xqRZem5F8jJV8FuJgNessXyMuv9+U8pjnvdezASwU28uw+1scw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/keygrip": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", - "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" - }, - "@types/koa": { - "version": "2.13.4", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.4.tgz", - "integrity": "sha512-dfHYMfU+z/vKtQB7NUrthdAEiSvnLebvBjwHtfFmpZmB7em2N3WVQdHgnFq+xvyVgxW5jKDmjWfLD3lw4g4uTw==", - "requires": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "@types/koa-compose": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", - "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", - "requires": { - "@types/koa": "*" - } - }, - "@types/long": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", - "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" - }, - "@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" - }, - "@types/node": { - "version": "15.12.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.4.tgz", - "integrity": "sha512-zrNj1+yqYF4WskCMOHwN+w9iuD12+dGm0rQ35HLl9/Ouuq52cEtd0CH9qMgrdNmi5ejC1/V7vKEXYubB+65DkA==" - }, - "@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" - }, - "@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" - }, - "@types/semver": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.6.tgz", - "integrity": "sha512-0caWDWmpCp0uifxFh+FaqK3CuZ2SkRR/ZRxAV5+zNdC3QVUi6wyOJnefhPvtNt8NQWXB5OA93BUvZsXpWat2Xw==" - }, - "@types/serve-static": { - "version": "1.13.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", - "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/validator": { - "version": "13.6.3", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.6.3.tgz", - "integrity": "sha512-fWG42pMJOL4jKsDDZZREnXLjc3UE0R8LOJfARWYg6U966rxDT7TYejYzLnUF5cvSObGg34nd0+H2wHHU5Omdfw==" - }, - "@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "requires": { - "@types/node": "*" - } - }, - "@types/zen-observable": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@types/zen-observable/-/zen-observable-0.8.3.tgz", - "integrity": "sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.28.0.tgz", - "integrity": "sha512-KcF6p3zWhf1f8xO84tuBailV5cN92vhS+VT7UJsPzGBm9VnQqfI9AsiMUFUCYHTYPg1uCCo+HyiDnpDuvkAMfQ==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.28.0", - "@typescript-eslint/scope-manager": "4.28.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "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 - }, - "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" - } - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.0.tgz", - "integrity": "sha512-9XD9s7mt3QWMk82GoyUpc/Ji03vz4T5AYlHF9DcoFNfJ/y3UAclRsfGiE2gLfXtyC+JRA3trR7cR296TEb1oiQ==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.0", - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/typescript-estree": "4.28.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.28.0.tgz", - "integrity": "sha512-7x4D22oPY8fDaOCvkuXtYYTQ6mTMmkivwEzS+7iml9F9VkHGbbZ3x4fHRwxAb5KeuSkLqfnYjs46tGx2Nour4A==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.28.0", - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/typescript-estree": "4.28.0", - "debug": "^4.3.1" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "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 - } - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.0.tgz", - "integrity": "sha512-eCALCeScs5P/EYjwo6se9bdjtrh8ByWjtHzOkC4Tia6QQWtQr3PHovxh3TdYTuFcurkYI4rmFsRFpucADIkseg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0" - } - }, - "@typescript-eslint/types": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.0.tgz", - "integrity": "sha512-p16xMNKKoiJCVZY5PW/AfILw2xe1LfruTcfAKBj3a+wgNYP5I9ZEKNDOItoRt53p4EiPV6iRSICy8EPanG9ZVA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.0.tgz", - "integrity": "sha512-m19UQTRtxMzKAm8QxfKpvh6OwQSXaW1CdZPoCaQuLwAq7VZMNuhJmZR4g5281s2ECt658sldnJfdpSZZaxUGMQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.0", - "@typescript-eslint/visitor-keys": "4.28.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "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 - }, - "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" - } - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.28.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.0.tgz", - "integrity": "sha512-PjJyTWwrlrvM5jazxYF5ZPs/nl0kHDZMVbuIcbpawVXaDPelp3+S9zpOz5RmVUfS/fD5l5+ZXNKnWhNYjPzCvw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.28.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@wry/equality": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/@wry/equality/-/equality-0.1.11.tgz", - "integrity": "sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==", - "requires": { - "tslib": "^1.9.3" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", - "dev": true, - "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } - } - }, - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "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" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" - }, - "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" - } - }, - "apollo-cache-control": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/apollo-cache-control/-/apollo-cache-control-0.14.0.tgz", - "integrity": "sha512-qN4BCq90egQrgNnTRMUHikLZZAprf3gbm8rC5Vwmc6ZdLolQ7bFsa769Hqi6Tq/lS31KLsXBLTOsRbfPHph12w==", - "requires": { - "apollo-server-env": "^3.1.0", - "apollo-server-plugin-base": "^0.13.0" - } - }, - "apollo-datasource": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/apollo-datasource/-/apollo-datasource-0.9.0.tgz", - "integrity": "sha512-y8H99NExU1Sk4TvcaUxTdzfq2SZo6uSj5dyh75XSQvbpH6gdAXIW9MaBcvlNC7n0cVPsidHmOcHOWxJ/pTXGjA==", - "requires": { - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - } - }, - "apollo-graphql": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/apollo-graphql/-/apollo-graphql-0.9.3.tgz", - "integrity": "sha512-rcAl2E841Iko4kSzj4Pt3PRBitmyq1MvoEmpl04TQSpGnoVgl1E/ZXuLBYxMTSnEAm7umn2IsoY+c6Ll9U/10A==", - "requires": { - "core-js-pure": "^3.10.2", - "lodash.sortby": "^4.7.0", - "sha.js": "^2.4.11" - } - }, - "apollo-link": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/apollo-link/-/apollo-link-1.2.14.tgz", - "integrity": "sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==", - "requires": { - "apollo-utilities": "^1.3.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.9.3", - "zen-observable-ts": "^0.8.21" - }, - "dependencies": { - "zen-observable-ts": { - "version": "0.8.21", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz", - "integrity": "sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==", - "requires": { - "tslib": "^1.9.3", - "zen-observable": "^0.8.0" - } - } - } - }, - "apollo-reporting-protobuf": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/apollo-reporting-protobuf/-/apollo-reporting-protobuf-0.8.0.tgz", - "integrity": "sha512-B3XmnkH6Y458iV6OsA7AhfwvTgeZnFq9nPVjbxmLKnvfkEl8hYADtz724uPa0WeBiD7DSFcnLtqg9yGmCkBohg==", - "requires": { - "@apollo/protobufjs": "1.2.2" - } - }, - "apollo-server-caching": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/apollo-server-caching/-/apollo-server-caching-0.7.0.tgz", - "integrity": "sha512-MsVCuf/2FxuTFVhGLK13B+TZH9tBd2qkyoXKKILIiGcZ5CDUEBO14vIV63aNkMkS1xxvK2U4wBcuuNj/VH2Mkw==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "apollo-server-core": { - "version": "2.25.2", - "resolved": "https://registry.npmjs.org/apollo-server-core/-/apollo-server-core-2.25.2.tgz", - "integrity": "sha512-lrohEjde2TmmDTO7FlOs8x5QQbAS0Sd3/t0TaK2TWaodfzi92QAvIsq321Mol6p6oEqmjm8POIDHW1EuJd7XMA==", - "requires": { - "@apollographql/apollo-tools": "^0.5.0", - "@apollographql/graphql-playground-html": "1.6.27", - "@apollographql/graphql-upload-8-fork": "^8.1.3", - "@josephg/resolvable": "^1.0.0", - "@types/ws": "^7.0.0", - "apollo-cache-control": "^0.14.0", - "apollo-datasource": "^0.9.0", - "apollo-graphql": "^0.9.0", - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0", - "apollo-server-errors": "^2.5.0", - "apollo-server-plugin-base": "^0.13.0", - "apollo-server-types": "^0.9.0", - "apollo-tracing": "^0.15.0", - "async-retry": "^1.2.1", - "fast-json-stable-stringify": "^2.0.0", - "graphql-extensions": "^0.15.0", - "graphql-tag": "^2.11.0", - "graphql-tools": "^4.0.8", - "loglevel": "^1.6.7", - "lru-cache": "^6.0.0", - "sha.js": "^2.4.11", - "subscriptions-transport-ws": "^0.9.19", - "uuid": "^8.0.0" - } - }, - "apollo-server-env": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/apollo-server-env/-/apollo-server-env-3.1.0.tgz", - "integrity": "sha512-iGdZgEOAuVop3vb0F2J3+kaBVi4caMoxefHosxmgzAbbSpvWehB8Y1QiSyyMeouYC38XNVk5wnZl+jdGSsWsIQ==", - "requires": { - "node-fetch": "^2.6.1", - "util.promisify": "^1.0.0" - } - }, - "apollo-server-errors": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/apollo-server-errors/-/apollo-server-errors-2.5.0.tgz", - "integrity": "sha512-lO5oTjgiC3vlVg2RKr3RiXIIQ5pGXBFxYGGUkKDhTud3jMIhs+gel8L8zsEjKaKxkjHhCQAA/bcEfYiKkGQIvA==" - }, - "apollo-server-express": { - "version": "2.25.2", - "resolved": "https://registry.npmjs.org/apollo-server-express/-/apollo-server-express-2.25.2.tgz", - "integrity": "sha512-A2gF2e85vvDugPlajbhr0A14cDFDIGX0mteNOJ8P3Z3cIM0D4hwrWxJidI+SzobefDIyIHu1dynFedJVhV0euQ==", - "requires": { - "@apollographql/graphql-playground-html": "1.6.27", - "@types/accepts": "^1.3.5", - "@types/body-parser": "1.19.0", - "@types/cors": "2.8.10", - "@types/express": "^4.17.12", - "@types/express-serve-static-core": "^4.17.21", - "accepts": "^1.3.5", - "apollo-server-core": "^2.25.2", - "apollo-server-types": "^0.9.0", - "body-parser": "^1.18.3", - "cors": "^2.8.5", - "express": "^4.17.1", - "graphql-subscriptions": "^1.0.0", - "graphql-tools": "^4.0.8", - "parseurl": "^1.3.2", - "subscriptions-transport-ws": "^0.9.19", - "type-is": "^1.6.16" - }, - "dependencies": { - "@types/body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.22.tgz", - "integrity": "sha512-WdqmrUsRS4ootGha6tVwk/IVHM1iorU8tGehftQD2NWiPniw/sm7xdJOIlXLwqdInL9wBw/p7oO8vaYEF3NDmA==", - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*" - } - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - } - } - }, - "apollo-server-plugin-base": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/apollo-server-plugin-base/-/apollo-server-plugin-base-0.13.0.tgz", - "integrity": "sha512-L3TMmq2YE6BU6I4Tmgygmd0W55L+6XfD9137k+cWEBFu50vRY4Re+d+fL5WuPkk5xSPKd/PIaqzidu5V/zz8Kg==", - "requires": { - "apollo-server-types": "^0.9.0" - } - }, - "apollo-server-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/apollo-server-types/-/apollo-server-types-0.9.0.tgz", - "integrity": "sha512-qk9tg4Imwpk732JJHBkhW0jzfG0nFsLqK2DY6UhvJf7jLnRePYsPxWfPiNkxni27pLE2tiNlCwoDFSeWqpZyBg==", - "requires": { - "apollo-reporting-protobuf": "^0.8.0", - "apollo-server-caching": "^0.7.0", - "apollo-server-env": "^3.1.0" - } - }, - "apollo-tracing": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/apollo-tracing/-/apollo-tracing-0.15.0.tgz", - "integrity": "sha512-UP0fztFvaZPHDhIB/J+qGuy6hWO4If069MGC98qVs0I8FICIGu4/8ykpX3X3K6RtaQ56EDAWKykCxFv4ScxMeA==", - "requires": { - "apollo-server-env": "^3.1.0", - "apollo-server-plugin-base": "^0.13.0" - } - }, - "apollo-utilities": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/apollo-utilities/-/apollo-utilities-1.3.4.tgz", - "integrity": "sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==", - "requires": { - "@wry/equality": "^0.1.2", - "fast-json-stable-stringify": "^2.0.0", - "ts-invariant": "^0.4.0", - "tslib": "^1.10.0" - } - }, - "app-root-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.0.0.tgz", - "integrity": "sha512-qMcx+Gy2UZynHjOHOIXPNvpf+9cjvk3cWrBBK7zg4gH9+clobJRb9NGzcT7mQTcV/6Gm/1WelUtqxVXnNlrwcw==" - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "array-includes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", - "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.5" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", - "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async-retry": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.1.tgz", - "integrity": "sha512-aiieFW/7h3hY0Bq5d+ktDBejxuwR78vRu9hDUdR8rNhSaQ29VzPL4AoIRG7D/c7tdenwOcKvgPM6tIxB3cB6HA==", - "requires": { - "retry": "0.12.0" - } - }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "requires": { - "follow-redirects": "^1.10.0" - } - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - }, - "dependencies": { - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - } - } - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.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" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "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", - "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "busboy": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", - "requires": { - "dicer": "0.3.0" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.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" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", - "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "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==", - "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" - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "class-validator": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.1.tgz", - "integrity": "sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg==", - "requires": { - "@types/validator": "^13.1.3", - "libphonenumber-js": "^1.9.7", - "validator": "^13.5.2" - } - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cli-highlight": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", - "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", - "requires": { - "chalk": "^4.0.0", - "highlight.js": "^10.7.1", - "mz": "^2.4.0", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.0", - "yargs": "^16.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "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" - } - }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "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==" - }, - "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==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "core-js-pure": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.16.0.tgz", - "integrity": "sha512-wzlhZNepF/QA9yvx3ePDgNGudU5KDB8lu/TRPKelYA/QtSnkS/cLl2W+TIdEX1FAFcBr0YpY7tPDlcmXJ7AyiQ==" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "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" - } - }, - "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 - }, - "cssfilter": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", - "integrity": "sha1-xtJnJjKi5cg+AT5oZKQs6N79IK4=" - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "requires": { - "object-keys": "^1.0.12" - } - }, - "denque": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", - "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==" - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "deprecated-decorator": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz", - "integrity": "sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", - "requires": { - "streamsearch": "0.1.2" - } - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - }, - "dependencies": { - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - } - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "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 - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "end-of-stream": { - "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" - } - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.18.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", - "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.3", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.3", - "is-string": "^1.0.6", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.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", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-82G/JToB9qIy/ArBzIWG9xvvwL3R86AlCjtGw+A29OMZDqhTybz/MByORSukGxeI+YPCR4coYyITKk8BFH9nDA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.2", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.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 - }, - "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" - } - } - } - }, - "eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true - }, - "eslint-config-standard": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.3.tgz", - "integrity": "sha512-x4fmJL5hGqNJKGHSjnLdgA6U6h1YW/G2dW9fA+cyVur4SK6lyue8+UgNKWlZtUDTXvgKDD/Oa3GQjmB5kjtVvg==", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", - "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" - } - }, - "eslint-module-utils": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz", - "integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dev": true, - "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - } - }, - "eslint-plugin-import": { - "version": "2.23.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz", - "integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==", - "dev": true, - "requires": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.4", - "eslint-module-utils": "^2.6.1", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.4.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.3", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.9.0" - } - }, - "eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dev": true, - "requires": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "eslint-plugin-prettier": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz", - "integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-plugin-promise": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-5.1.0.tgz", - "integrity": "sha512-NGmI6BH5L12pl7ScQHbg7tvtk4wPxxj8yPHH47NvSmMtFneC077PSeY3huFj06ZWZvtbfxSPt3RuOQD5XcR4ng==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "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" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fastq": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.1.tgz", - "integrity": "sha512-HOnr8Mc60eNYl1gzwp6r5RoUyAn5/glBolUzP/Ez6IFVPMPirxn/9phgL6zhOtaTy7ISwPvQ+wT+hfcRZh/bzw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figlet": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", - "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==" - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", - "dev": true - }, - "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "fs-capacitor": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/fs-capacitor/-/fs-capacitor-2.0.4.tgz", - "integrity": "sha512-8S4f4WsCryNw2mJJchi46YgB6CR5Ze+4L1h8ewl9tEpL4SJ3ZO+c/bS4BWhB8bK+O3TMqhuZarTitd0S0eh2pA==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "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 - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "generate-function": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", - "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", - "requires": { - "is-property": "^1.0.2" - } - }, - "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==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "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" - } - }, - "glob-parent": { - "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" - } - }, - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - } - }, - "globals": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.10.0.tgz", - "integrity": "sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", - "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" - }, - "dependencies": { - "ignore": { - "version": "5.1.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", - "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", - "dev": true - } - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", - "dev": true - }, - "graphql": { - "version": "15.5.1", - "resolved": "https://registry.npmjs.org/graphql/-/graphql-15.5.1.tgz", - "integrity": "sha512-FeTRX67T3LoE3LWAxxOlW2K3Bz+rMYAC18rRguK4wgXaTZMiJwSUwDmPFo3UadAKbzirKIg5Qy+sNJXbpPRnQw==" - }, - "graphql-extensions": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/graphql-extensions/-/graphql-extensions-0.15.0.tgz", - "integrity": "sha512-bVddVO8YFJPwuACn+3pgmrEg6I8iBuYLuwvxiE+lcQQ7POotVZxm2rgGw0PvVYmWWf3DT7nTVDZ5ROh/ALp8mA==", - "requires": { - "@apollographql/apollo-tools": "^0.5.0", - "apollo-server-env": "^3.1.0", - "apollo-server-types": "^0.9.0" - } - }, - "graphql-query-complexity": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/graphql-query-complexity/-/graphql-query-complexity-0.7.2.tgz", - "integrity": "sha512-+VgmrfxGEjHI3zuojWOR8bsz7Ycz/BZjNjxnlUieTz5DsB92WoIrYCSZdWG7UWZ3rfcA1Gb2Nf+wB80GsaZWuQ==", - "requires": { - "lodash.get": "^4.4.2" - } - }, - "graphql-subscriptions": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/graphql-subscriptions/-/graphql-subscriptions-1.2.1.tgz", - "integrity": "sha512-95yD/tKi24q8xYa7Q9rhQN16AYj5wPbrb8tmHGM3WRc9EBmWrG/0kkMl+tQG8wcEuE9ibR4zyOM31p5Sdr2v4g==", - "requires": { - "iterall": "^1.3.0" - } - }, - "graphql-tag": { - "version": "2.12.5", - "resolved": "https://registry.npmjs.org/graphql-tag/-/graphql-tag-2.12.5.tgz", - "integrity": "sha512-5xNhP4063d16Pz3HBtKprutsPrmHZi5IdUGOWRxA2B6VF7BIRGOHZ5WQvDmJXZuPcBg7rYwaFxvQYjqkSdR3TQ==", - "requires": { - "tslib": "^2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - } - } - }, - "graphql-tools": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/graphql-tools/-/graphql-tools-4.0.8.tgz", - "integrity": "sha512-MW+ioleBrwhRjalKjYaLQbr+920pHBgy9vM/n47sswtns8+96sRn5M/G+J1eu7IMeKWiN/9p6tmwCHU7552VJg==", - "requires": { - "apollo-link": "^1.2.14", - "apollo-utilities": "^1.0.1", - "deprecated-decorator": "^0.1.6", - "iterall": "^1.1.3", - "uuid": "^3.1.0" - }, - "dependencies": { - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" - }, - "hosted-git-info": { - "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==", - "dev": true - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, - "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-bigint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz", - "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==" - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz", - "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-callable": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz", - "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==" - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.5.0.tgz", - "integrity": "sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz", - "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==" - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - } - }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz", - "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==" - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-property": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" - }, - "is-regex": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz", - "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==", - "requires": { - "call-bind": "^1.0.2", - "has-symbols": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz", - "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==" - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "iterall": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/iterall/-/iterall-1.3.0.tgz", - "integrity": "sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "libphonenumber-js": { - "version": "1.9.22", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.22.tgz", - "integrity": "sha512-nE0aF0wrNq09ewF36s9FVqRW73hmpw6cobVDlbexmsu1432LEfuN24BCudNuRx4t2rElSeK/N0JbedzRW/TC4A==" - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", - "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.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", - "dev": true - }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" - }, - "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "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==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" - }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "requires": { - "mime-db": "1.49.0" - } - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "mysql2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.0.tgz", - "integrity": "sha512-0t5Ivps5Tdy5YHk5NdKwQhe/4Qyn2pload+S+UooDBvsqngtzujG1BaTWBihQLfeKO3t3122/GtusBtmHEHqww==", - "requires": { - "denque": "^1.4.1", - "generate-function": "^2.3.1", - "iconv-lite": "^0.6.2", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", - "seq-queue": "^0.0.5", - "sqlstring": "^2.3.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==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", - "requires": { - "lru-cache": "^4.1.3" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" - }, - "nodemon": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", - "integrity": "sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==", - "dev": true, - "requires": { - "chokidar": "^3.2.2", - "debug": "^3.2.6", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.7", - "semver": "^5.7.1", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.3", - "update-notifier": "^4.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "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=" - }, - "object-inspect": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", - "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object-path": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.5.tgz", - "integrity": "sha512-jgSbThcoR/s+XumvGMTMf81QVBmah+/Q7K7YduKeKVWL7N111unR2d6pZZarSk6kY/caeNxUDyxOvMWyzoU2eg==" - }, - "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==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz", - "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.2" - } - }, - "object.values": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", - "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.2" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "parent-require": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parent-require/-/parent-require-1.0.0.tgz", - "integrity": "sha1-dGoWdjgIOoYLDu9nMssn7UbDKXc=" - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "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==", - "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==" - } - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "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 - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "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 - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, - "prettier": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.3.1.tgz", - "integrity": "sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - } - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "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" - } - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "dev": true, - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "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==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "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.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "http-errors": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", - "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - } - } - }, - "seq-queue": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "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 - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", - "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", - "dev": true - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "sqlstring": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", - "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - } - } - }, - "string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "subscriptions-transport-ws": { - "version": "0.9.19", - "resolved": "https://registry.npmjs.org/subscriptions-transport-ws/-/subscriptions-transport-ws-0.9.19.tgz", - "integrity": "sha512-dxdemxFFB0ppCLg10FTtRqH/31FNRL1y1BQv8209MK5I4CwALb7iihQg+7p65lFcIl8MHatINWBLOqpgU4Kyyw==", - "requires": { - "backo2": "^1.0.2", - "eventemitter3": "^3.1.0", - "iterall": "^1.2.1", - "symbol-observable": "^1.0.4", - "ws": "^5.2.0 || ^6.0.0 || ^7.0.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==" - }, - "table": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", - "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.clonedeep": "^4.5.0", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", - "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "requires": { - "nopt": "~1.0.10" - } - }, - "ts-invariant": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/ts-invariant/-/ts-invariant-0.4.4.tgz", - "integrity": "sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==", - "requires": { - "tslib": "^1.9.3" - } - }, - "ts-node": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.0.0.tgz", - "integrity": "sha512-ROWeOIUvfFbPZkoDis0L/55Fk+6gFQNZwwKPLinacRl6tsxstTF1DbAcLKkovwnpKMVvOMHP1TIbnwXwtLg1gg==", - "dev": true, - "requires": { - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - } - }, - "tsconfig-paths": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", - "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.0", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "type-graphql": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/type-graphql/-/type-graphql-1.1.1.tgz", - "integrity": "sha512-iOOWVn0ehCYMukmnXStbkRwFE9dcjt7/oDcBS1JyQZo9CbhlIll4lHHps54HMEk4A4c8bUPd+DjK8w1/ZrxB4A==", - "requires": { - "@types/glob": "^7.1.3", - "@types/node": "*", - "@types/semver": "^7.3.3", - "glob": "^7.1.6", - "graphql-query-complexity": "^0.7.0", - "graphql-subscriptions": "^1.1.0", - "semver": "^7.3.2", - "tslib": "^2.0.1" - }, - "dependencies": { - "@types/node": { - "version": "14.17.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.4.tgz", - "integrity": "sha512-8kQ3+wKGRNN0ghtEn7EGps/B8CzuBz1nXZEIGGLP2GnwbqYn4dbTs7k+VKLTq1HvZLRCIDtN3Snx1Ege8B7L5A==" - }, - "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" - } - }, - "tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - } - } - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typeorm": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.2.37.tgz", - "integrity": "sha512-7rkW0yCgFC24I5T0f3S/twmLSuccPh1SQmxET/oDWn2sSDVzbyWdnItSdKy27CdJGTlKHYtUVeOcMYw5LRsXVw==", - "requires": { - "@sqltools/formatter": "^1.2.2", - "app-root-path": "^3.0.0", - "buffer": "^6.0.3", - "chalk": "^4.1.0", - "cli-highlight": "^2.1.11", - "debug": "^4.3.1", - "dotenv": "^8.2.0", - "glob": "^7.1.6", - "js-yaml": "^4.0.0", - "mkdirp": "^1.0.4", - "reflect-metadata": "^0.1.13", - "sha.js": "^2.4.11", - "tslib": "^2.1.0", - "xml2js": "^0.4.23", - "yargonaut": "^1.1.4", - "yargs": "^17.0.1", - "zen-observable-ts": "^1.0.0" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" - }, - "tslib": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", - "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" - } - } - }, - "typescript": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.4.tgz", - "integrity": "sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "requires": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - } - }, - "undefsafe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", - "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", - "dev": true, - "requires": { - "debug": "^2.2.0" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.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" - } - } - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "util.promisify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", - "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "for-each": "^0.3.3", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.1" - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validator": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.6.0.tgz", - "integrity": "sha512-gVgKbdbHgtxpRyR8K0O6oFZPhhB5tT1jeEHZR0Znr9Svg03U0+r9DXWMrnRAB+HtCStDQKlaIZm42tVsVjqtjg==" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "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" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "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" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.3.tgz", - "integrity": "sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==" - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" - }, - "xss": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.9.tgz", - "integrity": "sha512-2t7FahYnGJys6DpHLhajusId7R0Pm2yTmuL0GV9+mV0ZlaLSnb2toBmppATfg5sWIhZQGlsTLoecSzya+l4EAQ==", - "requires": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - } - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargonaut": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/yargonaut/-/yargonaut-1.1.4.tgz", - "integrity": "sha512-rHgFmbgXAAzl+1nngqOcwEljqHGG9uUZoPjsdZEs1w5JW9RXYzrSvH/u70C1JE5qFi0qjsdhnUX/dJRpWqitSA==", - "requires": { - "chalk": "^1.1.1", - "figlet": "^1.1.1", - "parent-require": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "yargs": { - "version": "17.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.0.tgz", - "integrity": "sha512-UPeZv4h9Xv510ibpt5rdsUNzgD78nMa1rhxxCgvkKiq06hlKCEHJLiJ6Ub8zDg/wR6hedEI6ovnd2vCvJ4nusA==", - "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==" - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "zen-observable": { - "version": "0.8.15", - "resolved": "https://registry.npmjs.org/zen-observable/-/zen-observable-0.8.15.tgz", - "integrity": "sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==" - }, - "zen-observable-ts": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/zen-observable-ts/-/zen-observable-ts-1.1.0.tgz", - "integrity": "sha512-1h4zlLSqI2cRLPJUHJFL8bCWHhkpuXkF+dbGkRaWjgDIG26DmzyshUMrdV/rL3UnR+mhaX4fRq8LPouq0MYYIA==", - "requires": { - "@types/zen-observable": "0.8.3", - "zen-observable": "0.8.15" - } - } - } -} diff --git a/backend/src/graphql/models/Decay.ts b/backend/src/graphql/models/Decay.ts index 9bc89f6ec..17ee8fbac 100644 --- a/backend/src/graphql/models/Decay.ts +++ b/backend/src/graphql/models/Decay.ts @@ -25,17 +25,19 @@ export class Decay { @Field(() => Number) balance: number + // timestamp in seconds @Field(() => Int, { nullable: true }) - decayStart: number + decayStart: string + // timestamp in seconds @Field(() => Int, { nullable: true }) - decayEnd: number + decayEnd: string @Field(() => String, { nullable: true }) decayDuration?: number @Field(() => Int, { nullable: true }) - decayStartBlock?: number + decayStartBlock?: string static decayStartBlockTransaction: Transaction | undefined } diff --git a/backend/src/graphql/models/Transaction.ts b/backend/src/graphql/models/Transaction.ts index c34cac1c5..69956cf9b 100644 --- a/backend/src/graphql/models/Transaction.ts +++ b/backend/src/graphql/models/Transaction.ts @@ -10,22 +10,11 @@ import { Decay } from './Decay' @ObjectType() export class Transaction { - constructor() - constructor(json: any) - constructor(json?: any) { - if (json) { - this.type = json.type - this.balance = Number(json.balance) - this.decayStart = json.decay_start - this.decayEnd = json.decay_end - - this.memo = json.memo - this.transactionId = json.transaction_id - this.name = json.name - this.email = json.email - this.date = json.date - this.decay = json.decay ? new Decay(json.decay) : undefined - } + constructor() { + this.type = '' + this.balance = 0 + this.totalBalance = 0 + this.memo = '' } @Field(() => String) @@ -38,10 +27,10 @@ export class Transaction { totalBalance: number @Field({ nullable: true }) - decayStart?: number + decayStart?: string @Field({ nullable: true }) - decayEnd?: number + decayEnd?: string @Field({ nullable: true }) decayDuration?: number @@ -67,15 +56,12 @@ export class Transaction { @ObjectType() export class TransactionList { - constructor(json: any) { - this.gdtSum = Number(json.gdtSum) - this.count = json.count - this.balance = Number(json.balance) - this.decay = Number(json.decay) - this.decayDate = json.decay_date - this.transactions = json.transactions.map((el: any) => { - return new Transaction(el) - }) + constructor() { + this.gdtSum = 0 + this.count = 0 + this.balance = 0 + this.decay = 0 + this.decayDate = '' } @Field(() => Number) diff --git a/backend/src/graphql/resolvers/TransactionResolver.ts b/backend/src/graphql/resolvers/TransactionResolver.ts index 3762cccee..31aac8e04 100644 --- a/backend/src/graphql/resolvers/TransactionResolver.ts +++ b/backend/src/graphql/resolvers/TransactionResolver.ts @@ -46,7 +46,6 @@ export class TransactionResolver { ) transactions.decayDate = now.toString() } - return transactions } diff --git a/backend/src/graphql/resolvers/listTransactions.ts b/backend/src/graphql/resolvers/listTransactions.ts index 8c4519776..596ccd03e 100644 --- a/backend/src/graphql/resolvers/listTransactions.ts +++ b/backend/src/graphql/resolvers/listTransactions.ts @@ -73,7 +73,9 @@ async function calculateAndAddDecayTransactions( prev.transactionId < decayStartTransaction.id && current.transactionId > decayStartTransaction.id ) { - finalTransaction.decay.decayStartBlock = decayStartTransaction.received.getTime() + finalTransaction.decay.decayStartBlock = ( + decayStartTransaction.received.getTime() / 1000 + ).toString() } } } @@ -181,14 +183,8 @@ export default async function listTransactions( } } - const transactionList = new TransactionList({ - gdtSum: 0, - count: userTransactionsCount, - balance: 0, - decay: 0, - decay_date: '', - transactions: transactions, - }) - + const transactionList = new TransactionList() + transactionList.count = userTransactionsCount + transactionList.transactions = transactions return transactionList } diff --git a/backend/src/typeorm/entity/UserTransaction.ts b/backend/src/typeorm/entity/UserTransaction.ts index 1f32dc454..2f5bd69fc 100644 --- a/backend/src/typeorm/entity/UserTransaction.ts +++ b/backend/src/typeorm/entity/UserTransaction.ts @@ -18,7 +18,7 @@ export class UserTransaction extends BaseEntity { balance: number @Column({ name: 'balance_date', type: 'timestamp' }) - balanceDate: number + balanceDate: Date static findByUserPaged( userId: number, diff --git a/backend/src/util/decay.ts b/backend/src/util/decay.ts index 1d92e8cec..a7c670cc5 100644 --- a/backend/src/util/decay.ts +++ b/backend/src/util/decay.ts @@ -17,29 +17,31 @@ async function calculateDecay(amount: number, from: Date, to: Date): Promise { const decayStartBlock = await Decay.getDecayStartBlock() const result = new Decay(undefined) result.balance = amount - result.decayStart = from - result.decayEnd = from + const fromMillis = typeof from === 'number' ? from : from.getTime() + const toMillis = typeof to === 'number' ? to : to.getTime() + result.decayStart = (fromMillis / 1000).toString() + result.decayEnd = (toMillis / 1000).toString() // (amount, from.getTime(), to.getTime()) // if no decay start block exist or decay startet after end date - if (decayStartBlock === undefined || decayStartBlock.received.getTime() > to) { + if (decayStartBlock === undefined || decayStartBlock.received.getTime() > toMillis) { return result } // if decay start date is before start date we calculate decay for full duration - if (decayStartBlock.received.getTime() < from) { - result.decayDuration = to - from + if (decayStartBlock.received.getTime() < fromMillis) { + result.decayDuration = toMillis - fromMillis } // if decay start in between start date and end date we caculcate decay from decay start time to end date else { - result.decayDuration = to - decayStartBlock.received.getTime() + result.decayDuration = toMillis - decayStartBlock.received.getTime() } // js use timestamp in milliseconds but we calculate with seconds result.decayDuration /= 1000 From bf8bd24abf4f59d4ae0562dd180e4e75472b4ad2 Mon Sep 17 00:00:00 2001 From: einhorn_b Date: Wed, 29 Sep 2021 14:37:26 +0200 Subject: [PATCH 143/144] fixed decay and missing user data bugs --- .../graphql/resolvers/TransactionResolver.ts | 1 + .../src/graphql/resolvers/listTransactions.ts | 20 +++++++++++-------- backend/src/typeorm/entity/User.ts | 4 ++-- backend/src/util/decay.ts | 7 +++++-- 4 files changed, 20 insertions(+), 12 deletions(-) diff --git a/backend/src/graphql/resolvers/TransactionResolver.ts b/backend/src/graphql/resolvers/TransactionResolver.ts index 31aac8e04..3762cccee 100644 --- a/backend/src/graphql/resolvers/TransactionResolver.ts +++ b/backend/src/graphql/resolvers/TransactionResolver.ts @@ -46,6 +46,7 @@ export class TransactionResolver { ) transactions.decayDate = now.toString() } + return transactions } diff --git a/backend/src/graphql/resolvers/listTransactions.ts b/backend/src/graphql/resolvers/listTransactions.ts index 596ccd03e..1de7d7dcc 100644 --- a/backend/src/graphql/resolvers/listTransactions.ts +++ b/backend/src/graphql/resolvers/listTransactions.ts @@ -18,12 +18,7 @@ async function calculateAndAddDecayTransactions( userTransactions.forEach((userTransaction: dbUserTransaction) => { transactionIds.push(userTransaction.transactionId) - involvedUserIds.push(userTransaction.userId) }) - // remove duplicates - // https://stackoverflow.com/questions/1960473/get-all-unique-values-in-a-javascript-array-remove-duplicates - const involvedUsersUnique = involvedUserIds.filter((v, i, a) => a.indexOf(v) === i) - const userIndiced = await dbUser.getUsersIndiced(involvedUsersUnique) const transactions = await dbTransaction .createQueryBuilder('transaction') @@ -43,15 +38,24 @@ async function calculateAndAddDecayTransactions( const transactionIndiced: dbTransaction[] = [] transactions.forEach((transaction: dbTransaction) => { transactionIndiced[transaction.id] = transaction + if (transaction.transactionTypeId === 2) { + involvedUserIds.push(transaction.transactionSendCoin.userId) + involvedUserIds.push(transaction.transactionSendCoin.recipiantUserId) + } }) + // remove duplicates + // https://stackoverflow.com/questions/1960473/get-all-unique-values-in-a-javascript-array-remove-duplicates + const involvedUsersUnique = involvedUserIds.filter((v, i, a) => a.indexOf(v) === i) + const userIndiced = await dbUser.getUsersIndiced(involvedUsersUnique) const decayStartTransaction = await Decay.getDecayStartBlock() - await userTransactions.forEach(async (userTransaction: dbUserTransaction, i: number) => { + for (let i = 0; i < userTransactions.length; i++) { + const userTransaction = userTransactions[i] const transaction = transactionIndiced[userTransaction.transactionId] const finalTransaction = new Transaction() finalTransaction.transactionId = transaction.id - finalTransaction.date = transaction.received.toString() + finalTransaction.date = transaction.received.toISOString() finalTransaction.memo = transaction.memo finalTransaction.totalBalance = roundFloorFrom4(userTransaction.balance) const prev = i > 0 ? userTransactions[i - 1] : null @@ -137,7 +141,7 @@ async function calculateAndAddDecayTransactions( finalTransactions.push(decayTransaction) } } - }) + } return finalTransactions } diff --git a/backend/src/typeorm/entity/User.ts b/backend/src/typeorm/entity/User.ts index e82ba5deb..1cd5b1c4c 100644 --- a/backend/src/typeorm/entity/User.ts +++ b/backend/src/typeorm/entity/User.ts @@ -39,8 +39,8 @@ export class User extends BaseEntity { .where('user.id IN (:...users)', { users: userIds }) .getMany() const usersIndiced: User[] = [] - users.forEach((value, index) => { - usersIndiced[index] = value + users.forEach((value) => { + usersIndiced[value.id] = value }) return usersIndiced } diff --git a/backend/src/util/decay.ts b/backend/src/util/decay.ts index a7c670cc5..dfeca7351 100644 --- a/backend/src/util/decay.ts +++ b/backend/src/util/decay.ts @@ -21,6 +21,7 @@ async function calculateDecayWithInterval( to: number | Date, ): Promise { const decayStartBlock = await Decay.getDecayStartBlock() + const result = new Decay(undefined) result.balance = amount const fromMillis = typeof from === 'number' ? from : from.getTime() @@ -34,14 +35,16 @@ async function calculateDecayWithInterval( if (decayStartBlock === undefined || decayStartBlock.received.getTime() > toMillis) { return result } + const decayStartBlockMillis = decayStartBlock.received.getTime() // if decay start date is before start date we calculate decay for full duration - if (decayStartBlock.received.getTime() < fromMillis) { + if (decayStartBlockMillis < fromMillis) { result.decayDuration = toMillis - fromMillis } // if decay start in between start date and end date we caculcate decay from decay start time to end date else { - result.decayDuration = toMillis - decayStartBlock.received.getTime() + result.decayDuration = toMillis - decayStartBlockMillis + result.decayStart = (decayStartBlockMillis / 1000).toString() } // js use timestamp in milliseconds but we calculate with seconds result.decayDuration /= 1000 From d4d19b78011f02c5ed9dfa0080fa8b8852d5a9a5 Mon Sep 17 00:00:00 2001 From: einhornimmond Date: Thu, 30 Sep 2021 18:52:12 +0200 Subject: [PATCH 144/144] Update backend/src/util/decay.ts Co-authored-by: Ulf Gebhardt --- backend/src/util/decay.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/util/decay.ts b/backend/src/util/decay.ts index dfeca7351..3d39b198f 100644 --- a/backend/src/util/decay.ts +++ b/backend/src/util/decay.ts @@ -32,7 +32,7 @@ async function calculateDecayWithInterval( // (amount, from.getTime(), to.getTime()) // if no decay start block exist or decay startet after end date - if (decayStartBlock === undefined || decayStartBlock.received.getTime() > toMillis) { + if (!decayStartBlock || decayStartBlock.received.getTime() > toMillis) { return result } const decayStartBlockMillis = decayStartBlock.received.getTime()