diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000..9317db1
Binary files /dev/null and b/.DS_Store differ
diff --git a/.eslintrc.js b/.eslintrc.js
index 10e4410..db20f17 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -1,19 +1,25 @@
module.exports = {
env: {
- browser: true,
+ commonjs: true,
es6: true,
- node: true
+ node: true,
},
extends: ['airbnb-base'],
globals: {
Atomics: 'readonly',
- SharedArrayBuffer: 'readonly'
+ SharedArrayBuffer: 'readonly',
},
parserOptions: {
ecmaVersion: 2018,
- sourceType: 'module'
},
rules: {
- 'eslint-disable-next-line': false
- }
+ 'arrow-parens': [0],
+ 'implicit-arrow-linebreak': [0],
+ 'function-paren-newline': [0],
+ 'import/no-dynamic-require': [0],
+ 'global-require': [0],
+ 'operator-linebreak': [0],
+ 'object-curly-newline': [0],
+ 'no-plusplus': [0],
+ },
};
diff --git a/.gitignore b/.gitignore
index 6704566..1c6d10c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -102,3 +102,5 @@ dist
# TernJS port file
.tern-port
+
+src/config/firebaseKey.json
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
index 544138b..5d44d71 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,3 +1,5 @@
{
- "singleQuote": true
+ "singleQuote": true,
+ "trailingComma": "all",
+ "bracketSpacing": true
}
diff --git a/package-lock.json b/package-lock.json
index a0f9538..d135a8f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -24,6 +24,277 @@
"js-tokens": "^4.0.0"
}
},
+ "@firebase/app-types": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.5.2.tgz",
+ "integrity": "sha512-k3zRi9gXyWrymu8OL6DA1Pz7eo+sKVBopX5ouOjQwozAZ55WhelifPC99WHmLWo8sAokNM0XDyzM7loOA5yliQ=="
+ },
+ "@firebase/auth-interop-types": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.3.tgz",
+ "integrity": "sha512-Fd0MJ8hHw/MasNTJz7vl5jnMMs71X6pY/VqN0V6lqdP5HKTuyPVnffJ1d2Vb6uCLZ1D7nXAer4YWj9cOrNLPAQ=="
+ },
+ "@firebase/component": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.6.tgz",
+ "integrity": "sha512-dm5pVhm+sU8ag1M3hY6vleA/H7Ed8sKRxbm4TAKhtjGHDejPXxnK0meTNydJ3MwisHWlwzGuzIEhb223K7FFxA==",
+ "requires": {
+ "@firebase/util": "0.2.41",
+ "tslib": "1.10.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+ }
+ }
+ },
+ "@firebase/database": {
+ "version": "0.5.22",
+ "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.5.22.tgz",
+ "integrity": "sha512-3CVsmLFscFIAFOjjVhlT6HzFOhS0TKVbjhixp64oVZMOshp9qPHtHIytf6QXRAypbtZMPFAMGnhNu0pmPW/vtg==",
+ "requires": {
+ "@firebase/auth-interop-types": "0.1.3",
+ "@firebase/component": "0.1.6",
+ "@firebase/database-types": "0.4.12",
+ "@firebase/logger": "0.1.36",
+ "@firebase/util": "0.2.41",
+ "faye-websocket": "0.11.3",
+ "tslib": "1.10.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+ }
+ }
+ },
+ "@firebase/database-types": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.4.12.tgz",
+ "integrity": "sha512-PVCTQRG9fnN1cam3Qr91+WzsCf9tO+lmUcPEb0uvafSFVhvx2U9OZOlYDdM5hS0MMHTNXI7Ywmc33EheIlLmMw==",
+ "requires": {
+ "@firebase/app-types": "0.5.2"
+ }
+ },
+ "@firebase/logger": {
+ "version": "0.1.36",
+ "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.36.tgz",
+ "integrity": "sha512-5Z0ryTtzRk7kjUb0/18r10oXYu8mSPAjgdbLowRBP6HdSJB7BDiUIRS7iATSmUBZLTArdroSiFJ29m7YDfm/cw=="
+ },
+ "@firebase/util": {
+ "version": "0.2.41",
+ "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.41.tgz",
+ "integrity": "sha512-QRu3wjU5I0ZBWrf4wgrEBYu5K5tkHjETMDPMY8WYCeekKB13k2MuJzHBjQVuStEOU7j6ygTAA0B8vXI/6B5D0g==",
+ "requires": {
+ "tslib": "1.10.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
+ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+ }
+ }
+ },
+ "@google-cloud/common": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.4.0.tgz",
+ "integrity": "sha512-zWFjBS35eI9leAHhjfeOYlK5Plcuj/77EzstnrJIZbKgF/nkqjcQuGiMCpzCwOfPyUbz8ZaEOYgbHa759AKbjg==",
+ "optional": true,
+ "requires": {
+ "@google-cloud/projectify": "^1.0.0",
+ "@google-cloud/promisify": "^1.0.0",
+ "arrify": "^2.0.0",
+ "duplexify": "^3.6.0",
+ "ent": "^2.2.0",
+ "extend": "^3.0.2",
+ "google-auth-library": "^5.5.0",
+ "retry-request": "^4.0.0",
+ "teeny-request": "^6.0.0"
+ }
+ },
+ "@google-cloud/firestore": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-3.6.0.tgz",
+ "integrity": "sha512-mAT3aEkKNsSGLApZZIUw3XMW5RUf+Y1MsoD7T5M72fDlGnAvIUHXA93wGVHpI+UPxu3XTntJ0BDSJwjlOaWM3w==",
+ "optional": true,
+ "requires": {
+ "deep-equal": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "google-gax": "^1.13.0",
+ "readable-stream": "^3.4.0",
+ "through2": "^3.0.0"
+ }
+ },
+ "@google-cloud/paginator": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz",
+ "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==",
+ "optional": true,
+ "requires": {
+ "arrify": "^2.0.0",
+ "extend": "^3.0.2"
+ }
+ },
+ "@google-cloud/projectify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz",
+ "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==",
+ "optional": true
+ },
+ "@google-cloud/promisify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz",
+ "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==",
+ "optional": true
+ },
+ "@google-cloud/storage": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.5.0.tgz",
+ "integrity": "sha512-ZLFcR6CiP1AnYBA9eTtASF9Dy3wjYmGx+HZiy/LsIPN41wyBTn9yAjIOxRHiteqzX3uQzZ+VJNCB/DmTU33CeQ==",
+ "optional": true,
+ "requires": {
+ "@google-cloud/common": "^2.1.1",
+ "@google-cloud/paginator": "^2.0.0",
+ "@google-cloud/promisify": "^1.0.0",
+ "arrify": "^2.0.0",
+ "compressible": "^2.0.12",
+ "concat-stream": "^2.0.0",
+ "date-and-time": "^0.12.0",
+ "duplexify": "^3.5.0",
+ "extend": "^3.0.2",
+ "gaxios": "^2.0.1",
+ "gcs-resumable-upload": "^2.2.4",
+ "hash-stream-validation": "^0.2.2",
+ "mime": "^2.2.0",
+ "mime-types": "^2.0.8",
+ "onetime": "^5.1.0",
+ "p-limit": "^2.2.0",
+ "pumpify": "^2.0.0",
+ "readable-stream": "^3.4.0",
+ "snakeize": "^0.1.0",
+ "stream-events": "^1.0.1",
+ "through2": "^3.0.0",
+ "xdg-basedir": "^4.0.0"
+ },
+ "dependencies": {
+ "p-limit": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
+ "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
+ "optional": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "optional": true
+ },
+ "xdg-basedir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+ "optional": true
+ }
+ }
+ },
+ "@grpc/grpc-js": {
+ "version": "0.6.18",
+ "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.6.18.tgz",
+ "integrity": "sha512-uAzv/tM8qpbf1vpx1xPMfcUMzbfdqJtdCYAqY/LsLeQQlnTb4vApylojr+wlCyr7bZeg3AFfHvtihnNOQQt/nA==",
+ "optional": true,
+ "requires": {
+ "semver": "^6.2.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "optional": true
+ }
+ }
+ },
+ "@grpc/proto-loader": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.3.tgz",
+ "integrity": "sha512-8qvUtGg77G2ZT2HqdqYoM/OY97gQd/0crSG34xNmZ4ZOsv3aQT/FQV9QfZPazTGna6MIoyUd+u6AxsoZjJ/VMQ==",
+ "optional": true,
+ "requires": {
+ "lodash.camelcase": "^4.3.0",
+ "protobufjs": "^6.8.6"
+ }
+ },
+ "@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz",
+ "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=",
+ "optional": true
+ },
+ "@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz",
+ "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==",
+ "optional": true
+ },
+ "@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz",
+ "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==",
+ "optional": true
+ },
+ "@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz",
+ "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=",
+ "optional": true
+ },
+ "@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz",
+ "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+ "optional": true,
+ "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=",
+ "optional": true
+ },
+ "@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz",
+ "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=",
+ "optional": true
+ },
+ "@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz",
+ "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=",
+ "optional": true
+ },
+ "@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz",
+ "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=",
+ "optional": true
+ },
+ "@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz",
+ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=",
+ "optional": true
+ },
"@sindresorhus/is": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-2.1.0.tgz",
@@ -37,6 +308,12 @@
"defer-to-connect": "^2.0.0"
}
},
+ "@tootallnate/once": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.0.0.tgz",
+ "integrity": "sha512-KYyTT/T6ALPkIRd2Ge080X/BsXvy9O0hcWTtMWkPvwAwF99+vn6Dv4GzrFT/Nn1LePr+FFDbRXXlqmsy9lw2zA==",
+ "optional": true
+ },
"@types/cacheable-request": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz",
@@ -48,6 +325,21 @@
"@types/responselike": "*"
}
},
+ "@types/color-name": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
+ "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==",
+ "optional": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
"@types/http-cache-semantics": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz",
@@ -61,6 +353,12 @@
"@types/node": "*"
}
},
+ "@types/long": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz",
+ "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==",
+ "optional": true
+ },
"@types/node": {
"version": "13.7.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.6.tgz",
@@ -80,10 +378,19 @@
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
+ "abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "optional": true,
+ "requires": {
+ "event-target-shim": "^5.0.0"
+ }
+ },
"acorn": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz",
- "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
+ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
"dev": true
},
"acorn-jsx": {
@@ -92,6 +399,15 @@
"integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
"dev": true
},
+ "agent-base": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz",
+ "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==",
+ "optional": true,
+ "requires": {
+ "debug": "4"
+ }
+ },
"ajv": {
"version": "6.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz",
@@ -114,18 +430,18 @@
}
},
"ansi-escapes": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz",
- "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+ "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
"dev": true,
"requires": {
- "type-fest": "^0.8.1"
+ "type-fest": "^0.11.0"
},
"dependencies": {
"type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
+ "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
"dev": true
}
}
@@ -185,6 +501,12 @@
"es-abstract": "^1.17.0-next.1"
}
},
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "optional": true
+ },
"astral-regex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
@@ -225,6 +547,12 @@
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
"integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
},
+ "bignumber.js": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz",
+ "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==",
+ "optional": true
+ },
"binary-extensions": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
@@ -275,6 +603,17 @@
"isarray": "^1.0.0"
}
},
+ "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.1",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "optional": true
+ },
"cacheable-lookup": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-2.0.0.tgz",
@@ -415,12 +754,33 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
+ "compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "optional": true,
+ "requires": {
+ "mime-db": ">= 1.43.0 < 2"
+ }
+ },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
+ "concat-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
+ "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
+ "optional": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.0.2",
+ "typedarray": "^0.0.6"
+ }
+ },
"configstore": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
@@ -447,6 +807,12 @@
"integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
"dev": true
},
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+ "optional": true
+ },
"create-error-class": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
@@ -473,6 +839,17 @@
"integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
"dev": true
},
+ "date-and-time": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.12.0.tgz",
+ "integrity": "sha512-n2RJIAp93AucgF/U/Rz5WRS2Hjg5Z+QxscaaMCi6pVZT1JpJKRH+C08vyH/lRR1kxNXnPxgo3lWfd+jCb/UcuQ==",
+ "optional": true
+ },
+ "date-format": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz",
+ "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w=="
+ },
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
@@ -489,6 +866,34 @@
"mimic-response": "^2.0.0"
}
},
+ "deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.0.1.tgz",
+ "integrity": "sha512-7Et6r6XfNW61CPPCIYfm1YPGSmh6+CliYeL4km7GWJcpX5LTAflGF8drLLR+MZX+2P3NZfAfSduutBbSWqER4g==",
+ "optional": true,
+ "requires": {
+ "es-abstract": "^1.16.3",
+ "es-get-iterator": "^1.0.1",
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "isarray": "^2.0.5",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0",
+ "side-channel": "^1.0.1",
+ "which-boxed-primitive": "^1.0.1",
+ "which-collection": "^1.0.0"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "optional": true
+ }
+ }
+ },
"deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -510,11 +915,18 @@
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
"requires": {
"object-keys": "^1.0.12"
}
},
+ "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"
+ }
+ },
"doctrine": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -543,6 +955,49 @@
"resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
"integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
},
+ "duplexify": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
+ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+ "optional": true,
+ "requires": {
+ "end-of-stream": "^1.0.0",
+ "inherits": "^2.0.1",
+ "readable-stream": "^2.0.0",
+ "stream-shift": "^1.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "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==",
+ "optional": 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"
+ }
+ },
"emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -557,6 +1012,12 @@
"once": "^1.4.0"
}
},
+ "ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=",
+ "optional": true
+ },
"error-ex": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
@@ -570,7 +1031,6 @@
"version": "1.17.4",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
"integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
- "dev": true,
"requires": {
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
@@ -585,11 +1045,33 @@
"string.prototype.trimright": "^2.1.1"
}
},
+ "es-get-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz",
+ "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==",
+ "optional": true,
+ "requires": {
+ "es-abstract": "^1.17.4",
+ "has-symbols": "^1.0.1",
+ "is-arguments": "^1.0.4",
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-string": "^1.0.5",
+ "isarray": "^2.0.5"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "optional": true
+ }
+ }
+ },
"es-to-primitive": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
"requires": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
@@ -853,13 +1335,13 @@
"dev": true
},
"espree": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz",
- "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.0.tgz",
+ "integrity": "sha512-Xs8airJ7RQolnDIbLtRutmfvSsAe0xqMMAantCN/GMoqf81TFbeI1T7Jpd56qYu1uuh32dOG5W/X9uO+ghPXzA==",
"dev": true,
"requires": {
"acorn": "^7.1.0",
- "acorn-jsx": "^5.1.0",
+ "acorn-jsx": "^5.2.0",
"eslint-visitor-keys": "^1.1.0"
}
},
@@ -899,6 +1381,12 @@
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
+ "event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "optional": true
+ },
"events": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
@@ -919,6 +1407,12 @@
"strip-eof": "^1.0.0"
}
},
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "optional": true
+ },
"external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -954,6 +1448,20 @@
"integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
"dev": true
},
+ "fast-text-encoding": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.1.tgz",
+ "integrity": "sha512-x4FEgaz3zNRtJfLFqJmHWxkMDDvXVtaznj2V9jiP8ACUJrUgist4bP9FmDL2Vew2Y9mEQI/tG4GqabaitYp9CQ==",
+ "optional": true
+ },
+ "faye-websocket": {
+ "version": "0.11.3",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz",
+ "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+ "requires": {
+ "websocket-driver": ">=0.5.1"
+ }
+ },
"figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -990,6 +1498,27 @@
"locate-path": "^2.0.0"
}
},
+ "firebase-admin": {
+ "version": "8.9.2",
+ "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-8.9.2.tgz",
+ "integrity": "sha512-ix4qcx+hHnr3mnc41Z8EzQa9Mr+2nhogLEv6ktkOCCpdKJ+9HxW9vikRCElSbC8ICHLD0KIH0GVOIZK80vbvqw==",
+ "requires": {
+ "@firebase/database": "^0.5.17",
+ "@google-cloud/firestore": "^3.0.0",
+ "@google-cloud/storage": "^4.1.2",
+ "@types/node": "^8.10.59",
+ "dicer": "^0.3.0",
+ "jsonwebtoken": "8.1.0",
+ "node-forge": "0.7.4"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "8.10.59",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz",
+ "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ=="
+ }
+ }
+ },
"flat-cache": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
@@ -1004,8 +1533,17 @@
"flatted": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz",
- "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==",
- "dev": true
+ "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg=="
+ },
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
},
"fs.realpath": {
"version": "1.0.0",
@@ -1023,14 +1561,136 @@
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
+ "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
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+ },
+ "gaxios": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.2.tgz",
+ "integrity": "sha512-K/+py7UvKRDaEwEKlLiRKrFr+wjGjsMz5qH7Vs549QJS7cpSCOT/BbWL7pzqECflc46FcNPipjSfB+V1m8PAhw==",
+ "optional": true,
+ "requires": {
+ "abort-controller": "^3.0.0",
+ "extend": "^3.0.2",
+ "https-proxy-agent": "^5.0.0",
+ "is-stream": "^2.0.0",
+ "node-fetch": "^2.3.0"
+ },
+ "dependencies": {
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "optional": true
+ }
+ }
+ },
+ "gcp-metadata": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz",
+ "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==",
+ "optional": true,
+ "requires": {
+ "gaxios": "^2.1.0",
+ "json-bigint": "^0.3.0"
+ }
+ },
+ "gcs-resumable-upload": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.2.tgz",
+ "integrity": "sha512-OPS0iAmPCV+r7PziOIhyxmQOzsazFCy76yYDOS/Z80O/7cuny1KMfqDQa2T0jLaL8EreTU7EMZG5pUuqBKgzHA==",
+ "optional": true,
+ "requires": {
+ "abort-controller": "^3.0.0",
+ "configstore": "^5.0.0",
+ "gaxios": "^2.0.0",
+ "google-auth-library": "^5.0.0",
+ "pumpify": "^2.0.0",
+ "stream-events": "^1.0.4"
+ },
+ "dependencies": {
+ "configstore": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+ "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+ "optional": 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"
+ }
+ },
+ "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==",
+ "optional": true
+ },
+ "dot-prop": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
+ "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
+ "optional": true,
+ "requires": {
+ "is-obj": "^2.0.0"
+ }
+ },
+ "is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "optional": true
+ },
+ "make-dir": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz",
+ "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==",
+ "optional": true,
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "optional": true
+ },
+ "unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "optional": true,
+ "requires": {
+ "crypto-random-string": "^2.0.0"
+ }
+ },
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "optional": true,
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "xdg-basedir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+ "optional": true
+ }
+ }
},
"get-stdin": {
"version": "6.0.0",
@@ -1077,9 +1737,9 @@
}
},
"globals": {
- "version": "12.3.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz",
- "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==",
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
"dev": true,
"requires": {
"type-fest": "^0.8.1"
@@ -1093,6 +1753,88 @@
}
}
},
+ "google-auth-library": {
+ "version": "5.10.1",
+ "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz",
+ "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==",
+ "optional": true,
+ "requires": {
+ "arrify": "^2.0.0",
+ "base64-js": "^1.3.0",
+ "ecdsa-sig-formatter": "^1.0.11",
+ "fast-text-encoding": "^1.0.0",
+ "gaxios": "^2.1.0",
+ "gcp-metadata": "^3.4.0",
+ "gtoken": "^4.1.0",
+ "jws": "^4.0.0",
+ "lru-cache": "^5.0.0"
+ },
+ "dependencies": {
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "optional": true,
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "optional": true
+ }
+ }
+ },
+ "google-gax": {
+ "version": "1.14.2",
+ "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.14.2.tgz",
+ "integrity": "sha512-Nde+FdqALbV3QgMA4KlkxOHfrj9busnZ3EECwy/1gDJm9vhKGwDLWzErqRU5g80OoGSAMgyY7DWIfqz7ina4Jw==",
+ "optional": true,
+ "requires": {
+ "@grpc/grpc-js": "^0.6.18",
+ "@grpc/proto-loader": "^0.5.1",
+ "@types/fs-extra": "^8.0.1",
+ "@types/long": "^4.0.0",
+ "abort-controller": "^3.0.0",
+ "duplexify": "^3.6.0",
+ "google-auth-library": "^5.0.0",
+ "is-stream-ended": "^0.1.4",
+ "lodash.at": "^4.6.0",
+ "lodash.has": "^4.5.2",
+ "node-fetch": "^2.6.0",
+ "protobufjs": "^6.8.8",
+ "retry-request": "^4.0.0",
+ "semver": "^6.0.0",
+ "walkdir": "^0.4.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "optional": true
+ }
+ }
+ },
+ "google-p12-pem": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz",
+ "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==",
+ "optional": true,
+ "requires": {
+ "node-forge": "^0.9.0"
+ },
+ "dependencies": {
+ "node-forge": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz",
+ "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==",
+ "optional": true
+ }
+ }
+ },
"got": {
"version": "10.6.0",
"resolved": "https://registry.npmjs.org/got/-/got-10.6.0.tgz",
@@ -1128,14 +1870,24 @@
"graceful-fs": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
- "dev": true
+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
+ },
+ "gtoken": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz",
+ "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==",
+ "optional": true,
+ "requires": {
+ "gaxios": "^2.1.0",
+ "google-p12-pem": "^2.0.0",
+ "jws": "^4.0.0",
+ "mime": "^2.2.0"
+ }
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
"requires": {
"function-bind": "^1.1.1"
}
@@ -1149,13 +1901,54 @@
"has-symbols": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg=="
+ },
+ "hash-stream-validation": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.2.tgz",
+ "integrity": "sha512-cMlva5CxWZOrlS/cY0C+9qAzesn5srhFA8IT1VPiHc9bWWBLkJfEUIZr7MWoi89oOOGmpg8ymchaOjiArsGu5A==",
+ "optional": true,
+ "requires": {
+ "through2": "^2.0.0"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "optional": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "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==",
+ "optional": true
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "optional": true,
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ }
+ }
},
"hosted-git-info": {
- "version": "2.8.7",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.7.tgz",
- "integrity": "sha512-ChkjQtKJ3GI6SsI4O5jwr8q8EPrWCnxuc4Tbx+vRI5x6mDOpjKKltNo1lRlszw3xwgTOSns1ZRBiMmmwpcvLxg==",
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+ "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
"dev": true
},
"http-cache-semantics": {
@@ -1163,6 +1956,32 @@
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
"integrity": "sha512-Z2EICWNJou7Tr9Bd2M2UqDJq3A9F2ePG9w3lIpjoyuSyXFP9QbniJVu3XQYytuw5ebmG7dXSXO9PgAjJG8DDKA=="
},
+ "http-parser-js": {
+ "version": "0.4.10",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
+ "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q="
+ },
+ "http-proxy-agent": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
+ "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "optional": true,
+ "requires": {
+ "@tootallnate/once": "1",
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "optional": true,
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -1208,8 +2027,7 @@
"imurmurhash": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
},
"inflight": {
"version": "1.0.6",
@@ -1224,8 +2042,7 @@
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
"ini": {
"version": "1.3.5",
@@ -1234,23 +2051,23 @@
"dev": true
},
"inquirer": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz",
- "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz",
+ "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==",
"dev": true,
"requires": {
"ansi-escapes": "^4.2.1",
- "chalk": "^2.4.2",
+ "chalk": "^3.0.0",
"cli-cursor": "^3.1.0",
"cli-width": "^2.0.0",
"external-editor": "^3.0.3",
"figures": "^3.0.0",
"lodash": "^4.17.15",
"mute-stream": "0.0.8",
- "run-async": "^2.2.0",
+ "run-async": "^2.4.0",
"rxjs": "^6.5.3",
"string-width": "^4.1.0",
- "strip-ansi": "^5.1.0",
+ "strip-ansi": "^6.0.0",
"through": "^2.3.6"
},
"dependencies": {
@@ -1260,6 +2077,47 @@
"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
+ "ansi-styles": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
+ "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+ "dev": true,
+ "requires": {
+ "@types/color-name": "^1.1.1",
+ "color-convert": "^2.0.1"
+ }
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
"is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -1275,44 +2133,46 @@
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.0"
- }
- }
}
},
"strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
- "ansi-regex": "^4.1.0"
- },
- "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
- }
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
+ "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
}
}
}
},
+ "is-arguments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+ "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+ "optional": true
+ },
"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.0",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.0.tgz",
+ "integrity": "sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g==",
+ "optional": true
+ },
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -1322,11 +2182,16 @@
"binary-extensions": "^2.0.0"
}
},
+ "is-boolean-object": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.0.1.tgz",
+ "integrity": "sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ==",
+ "optional": true
+ },
"is-callable": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
- "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
- "dev": true
+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q=="
},
"is-ci": {
"version": "1.2.1",
@@ -1340,8 +2205,7 @@
"is-date-object": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
- "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
- "dev": true
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
},
"is-extglob": {
"version": "2.1.1",
@@ -1374,6 +2238,12 @@
"is-path-inside": "^1.0.0"
}
},
+ "is-map": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
+ "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==",
+ "optional": true
+ },
"is-npm": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
@@ -1386,6 +2256,12 @@
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
+ "is-number-object": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
+ "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
+ "optional": true
+ },
"is-obj": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
@@ -1417,7 +2293,6 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
"integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
- "dev": true,
"requires": {
"has": "^1.0.3"
}
@@ -1428,27 +2303,55 @@
"integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==",
"dev": true
},
+ "is-set": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz",
+ "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==",
+ "optional": true
+ },
"is-stream": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
"integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
"dev": true
},
+ "is-stream-ended": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz",
+ "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==",
+ "optional": true
+ },
"is-string": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
- "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
- "dev": true
+ "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
},
"is-symbol": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
"integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
- "dev": true,
"requires": {
"has-symbols": "^1.0.1"
}
},
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "optional": true
+ },
+ "is-weakmap": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
+ "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "optional": true
+ },
+ "is-weakset": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.1.tgz",
+ "integrity": "sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==",
+ "optional": true
+ },
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -1481,6 +2384,15 @@
"esprima": "^4.0.0"
}
},
+ "json-bigint": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz",
+ "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=",
+ "optional": true,
+ "requires": {
+ "bignumber.js": "^7.0.0"
+ }
+ },
"json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -1498,6 +2410,73 @@
"integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
"dev": true
},
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "jsonwebtoken": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz",
+ "integrity": "sha1-xjl80uX9WD1lwAeoPce7eOaYK4M=",
+ "requires": {
+ "jws": "^3.1.4",
+ "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.0.0",
+ "xtend": "^4.0.1"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "jwa": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz",
+ "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==",
+ "optional": true,
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz",
+ "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==",
+ "optional": true,
+ "requires": {
+ "jwa": "^2.0.0",
+ "safe-buffer": "^5.0.1"
+ }
+ },
"keyv": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.0.tgz",
@@ -1558,8 +2537,78 @@
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
- "dev": true
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
+ },
+ "lodash.at": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz",
+ "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=",
+ "optional": true
+ },
+ "lodash.camelcase": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
+ "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
+ "optional": true
+ },
+ "lodash.has": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz",
+ "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=",
+ "optional": true
+ },
+ "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.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+ },
+ "log4js": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.1.2.tgz",
+ "integrity": "sha512-knS4Y30pC1e0n7rfx3VxcLOdBCsEo0o6/C7PVTGxdVK+5b1TYOSGQPn9FDcrhkoQBV29qwmA2mtkznPAQKnxQg==",
+ "requires": {
+ "date-format": "^3.0.0",
+ "debug": "^4.1.1",
+ "flatted": "^2.0.1",
+ "rfdc": "^1.1.4",
+ "streamroller": "^2.2.3"
+ }
+ },
+ "long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
+ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==",
+ "optional": true
},
"lowercase-keys": {
"version": "2.0.0",
@@ -1585,11 +2634,31 @@
"pify": "^3.0.0"
}
},
+ "mime": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
+ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==",
+ "optional": true
+ },
+ "mime-db": {
+ "version": "1.43.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
+ "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
+ "optional": true
+ },
+ "mime-types": {
+ "version": "2.1.26",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
+ "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
+ "optional": true,
+ "requires": {
+ "mime-db": "1.43.0"
+ }
+ },
"mimic-fn": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
- "dev": true
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
},
"mimic-response": {
"version": "2.1.0",
@@ -1660,6 +2729,11 @@
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
},
+ "node-forge": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz",
+ "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA=="
+ },
"nodemon": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.2.tgz",
@@ -1733,20 +2807,23 @@
"object-inspect": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
- "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
- "dev": true
+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw=="
+ },
+ "object-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.2.tgz",
+ "integrity": "sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ==",
+ "optional": true
},
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
},
"object.assign": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
"integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dev": true,
"requires": {
"define-properties": "^1.1.2",
"function-bind": "^1.1.1",
@@ -1790,7 +2867,6 @@
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
"integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
- "dev": true,
"requires": {
"mimic-fn": "^2.1.0"
}
@@ -2017,12 +3093,47 @@
"fast-diff": "^1.1.2"
}
},
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "optional": true
+ },
"progress": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
"integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
"dev": true
},
+ "protobufjs": {
+ "version": "6.8.8",
+ "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz",
+ "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==",
+ "optional": true,
+ "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.17",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.17.tgz",
+ "integrity": "sha512-gpNnRnZP3VWzzj5k3qrpRC6Rk3H/uclhAVo1aIvwzK5p5cOrs9yEyQ8H/HBsBY0u5rrWxXEiVPQ0dEB6pkjE8Q==",
+ "optional": true
+ }
+ }
+ },
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
@@ -2044,6 +3155,31 @@
"once": "^1.3.1"
}
},
+ "pumpify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz",
+ "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==",
+ "optional": true,
+ "requires": {
+ "duplexify": "^4.1.1",
+ "inherits": "^2.0.3",
+ "pump": "^3.0.0"
+ },
+ "dependencies": {
+ "duplexify": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz",
+ "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==",
+ "optional": true,
+ "requires": {
+ "end-of-stream": "^1.4.1",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1",
+ "stream-shift": "^1.0.0"
+ }
+ }
+ }
+ },
"punycode": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
@@ -2087,6 +3223,17 @@
"read-pkg": "^2.0.0"
}
},
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "optional": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
"readdirp": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
@@ -2096,6 +3243,16 @@
"picomatch": "^2.0.7"
}
},
+ "regexp.prototype.flags": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+ "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+ "optional": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ }
+ },
"regexpp": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
@@ -2154,6 +3311,21 @@
"signal-exit": "^3.0.2"
}
},
+ "retry-request": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz",
+ "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==",
+ "optional": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "through2": "^3.0.1"
+ }
+ },
+ "rfdc": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz",
+ "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug=="
+ },
"rimraf": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
@@ -2184,8 +3356,7 @@
"safe-buffer": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
- "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
- "dev": true
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
},
"safer-buffer": {
"version": "2.1.2",
@@ -2233,11 +3404,20 @@
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true
},
+ "side-channel": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.2.tgz",
+ "integrity": "sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==",
+ "optional": true,
+ "requires": {
+ "es-abstract": "^1.17.0-next.1",
+ "object-inspect": "^1.7.0"
+ }
+ },
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
- "dev": true
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
},
"slice-ansi": {
"version": "2.1.0",
@@ -2250,6 +3430,12 @@
"is-fullwidth-code-point": "^2.0.0"
}
},
+ "snakeize": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz",
+ "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=",
+ "optional": true
+ },
"spdx-correct": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
@@ -2288,6 +3474,43 @@
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
"dev": true
},
+ "stream-events": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz",
+ "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==",
+ "optional": true,
+ "requires": {
+ "stubs": "^3.0.0"
+ }
+ },
+ "stream-shift": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
+ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+ "optional": true
+ },
+ "streamroller": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.3.tgz",
+ "integrity": "sha512-AegmvQsscTRhHVO46PhCDerjIpxi7E+d2GxgUDu+nzw/HuLnUdxHWr6WQ+mVn/4iJgMKKFFdiUwFcFRDvcjCtw==",
+ "requires": {
+ "date-format": "^2.1.0",
+ "debug": "^4.1.1",
+ "fs-extra": "^8.1.0"
+ },
+ "dependencies": {
+ "date-format": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz",
+ "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA=="
+ }
+ }
+ },
+ "streamsearch": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
+ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
+ },
"string-width": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
@@ -2302,7 +3525,6 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
"integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
- "dev": true,
"requires": {
"define-properties": "^1.1.3",
"function-bind": "^1.1.1"
@@ -2312,12 +3534,28 @@
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
"integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
- "dev": true,
"requires": {
"define-properties": "^1.1.3",
"function-bind": "^1.1.1"
}
},
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "optional": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "optional": true
+ }
+ }
+ },
"strip-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
@@ -2345,6 +3583,12 @@
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true
},
+ "stubs": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz",
+ "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=",
+ "optional": true
+ },
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -2400,6 +3644,27 @@
}
}
},
+ "teeny-request": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-6.0.2.tgz",
+ "integrity": "sha512-B6fxA0fSnY/bul06NggdN1nywtr5U5Uvt96pHfTi8pi4MNe6++VUWcAAFBrcMeha94s+gULwA5WvagoSZ+AcYg==",
+ "optional": true,
+ "requires": {
+ "http-proxy-agent": "^4.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "node-fetch": "^2.2.0",
+ "stream-events": "^1.0.5",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "optional": true
+ }
+ }
+ },
"telegraf": {
"version": "3.36.0",
"resolved": "https://registry.npmjs.org/telegraf/-/telegraf-3.36.0.tgz",
@@ -2414,6 +3679,11 @@
"telegram-typings": "^3.6.0"
}
},
+ "telegraf-inline-menu": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/telegraf-inline-menu/-/telegraf-inline-menu-4.0.0.tgz",
+ "integrity": "sha512-1tEL9+xfq9/HA8pD0XebfQeqKg6+aqqtlBck/GGXxK/BrA1L15Ou8z7mXnAI9lVdrFWuMVguG2sZpiwpAviFYw=="
+ },
"telegram-typings": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/telegram-typings/-/telegram-typings-3.6.1.tgz",
@@ -2440,6 +3710,15 @@
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true
},
+ "through2": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz",
+ "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==",
+ "optional": true,
+ "requires": {
+ "readable-stream": "2 || 3"
+ }
+ },
"timed-out": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
@@ -2498,6 +3777,21 @@
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.10.0.tgz",
"integrity": "sha512-EUV9jo4sffrwlg8s0zDhP0T2WD3pru5Xi0+HTE3zTUmBaZNhfkite9PdSJwdXLwPVW0jnAHT56pZHIOYckPEiw=="
},
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "optional": true
+ },
+ "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==",
+ "optional": true,
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
"undefsafe": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz",
@@ -2533,6 +3827,11 @@
"crypto-random-string": "^1.0.0"
}
},
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
+ },
"unzip-response": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
@@ -2592,6 +3891,12 @@
"prepend-http": "^1.0.1"
}
},
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "optional": true
+ },
"uuid": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.2.tgz",
@@ -2613,6 +3918,27 @@
"spdx-expression-parse": "^3.0.0"
}
},
+ "walkdir": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz",
+ "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==",
+ "optional": true
+ },
+ "websocket-driver": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
+ "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
+ "requires": {
+ "http-parser-js": ">=0.4.0 <0.4.11",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ }
+ },
+ "websocket-extensions": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz",
+ "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg=="
+ },
"which": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
@@ -2622,6 +3948,31 @@
"isexe": "^2.0.0"
}
},
+ "which-boxed-primitive": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz",
+ "integrity": "sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ==",
+ "optional": true,
+ "requires": {
+ "is-bigint": "^1.0.0",
+ "is-boolean-object": "^1.0.0",
+ "is-number-object": "^1.0.3",
+ "is-string": "^1.0.4",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "which-collection": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
+ "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "optional": true,
+ "requires": {
+ "is-map": "^2.0.1",
+ "is-set": "^2.0.1",
+ "is-weakmap": "^2.0.1",
+ "is-weakset": "^2.0.1"
+ }
+ },
"widest-line": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
@@ -2682,6 +4033,11 @@
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
"integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
},
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
diff --git a/package.json b/package.json
index 131efd3..043251f 100644
--- a/package.json
+++ b/package.json
@@ -22,17 +22,21 @@
"dependencies": {
"aws-sdk": "^2.628.0",
"dotenv": "^8.2.0",
+ "firebase-admin": "^8.9.2",
"got": "^10.6.0",
+ "lodash": "^4.17.15",
+ "log4js": "^6.1.2",
"telegraf": "^3.36.0",
+ "telegraf-inline-menu": "^4.0.0",
"uuid": "^7.0.2"
},
"devDependencies": {
- "nodemon": "^2.0.2",
- "eslint": "^6.6.0",
+ "eslint": "^6.8.0",
"eslint-config-airbnb-base": "^14.0.0",
"eslint-config-prettier": "^6.5.0",
- "eslint-plugin-import": "^2.18.2",
+ "eslint-plugin-import": "^2.20.1",
"eslint-plugin-prettier": "^3.1.1",
+ "nodemon": "^2.0.2",
"prettier": "1.19.1"
}
}
diff --git a/src/.DS_Store b/src/.DS_Store
new file mode 100644
index 0000000..4aadbaf
Binary files /dev/null and b/src/.DS_Store differ
diff --git a/src/api/FinanceApi.js b/src/api/FinanceApi.js
index 1a3220a..df38702 100644
--- a/src/api/FinanceApi.js
+++ b/src/api/FinanceApi.js
@@ -1,41 +1,9 @@
const Http = require('../utils/http');
+const { FINANCE_API } = require('../constants/api');
class FinanceApi {
- generateMessageTemplate() {
- const banks = ['ПриватБанк', 'Укрсиббанк'];
- const currencyIgnore = ['RUB'];
-
- const findedBanks = this.data.organizations.reduce((acc, val) => {
- if (banks.includes(val.title)) {
- return [...acc, val];
- }
- return [...acc];
- }, []);
-
- return findedBanks
- .map(bank => {
- const firstLine = `${bank.title}: \n`;
- const nextLines = Object.keys(bank.currencies).reduce((acc, key) => {
- const currency = bank.currencies[key];
- if (currencyIgnore.includes(key)) {
- return [...acc];
- }
- return [
- ...acc,
- `${key}: ${parseInt(currency.ask).toFixed(2)}/${parseInt(
- currency.bid
- ).toFixed(2)}`
- ];
- }, []);
- return firstLine + nextLines.join('\n');
- })
- .join('\n\n');
- }
-
async getData() {
- this.data = await Http.get(
- 'http://resources.finance.ua/ru/public/currency-cash.json'
- );
+ this.data = await Http.get(FINANCE_API);
return this.data;
}
}
diff --git a/src/api/MinfinApi.js b/src/api/MinfinApi.js
index 488278a..830e11b 100644
--- a/src/api/MinfinApi.js
+++ b/src/api/MinfinApi.js
@@ -1,7 +1,11 @@
const Http = require('../utils/http');
+const { MINFIN_KEY } = require('../config/env');
class MinfinApi {
- static async get() {
- return Http.get('http://resources.finance.ua/ru/public/currency-cash.json');
+ async getData() {
+ this.data = Http.get(`http://api.minfin.com.ua/mb/${MINFIN_KEY}/`);
+ return this.data;
}
}
+
+module.exports = MinfinApi;
diff --git a/src/bot.js b/src/bot.js
deleted file mode 100644
index 881ccc4..0000000
--- a/src/bot.js
+++ /dev/null
@@ -1,85 +0,0 @@
-const Telegraf = require('telegraf');
-const Telegram = require('telegraf/telegram');
-const session = require('telegraf/session');
-const Extra = require('telegraf/extra');
-const Markup = require('telegraf/markup');
-const { TOKEN } = require('./config/env');
-const DynamoDatabase = require('./utils/aws/dynamo');
-const FinanceApi = require('./api/FinanceApi');
-//251408559 user
-//978534005 bot
-
-class TelegramExecutor extends DynamoDatabase {
- async execute() {
- const bot = new Telegraf(TOKEN);
- // console.log(await this.putItem());
- console.log('Started!');
-
- // bot.use(session());
- // bot.use(Telegraf.log());
- // bot.use((ctx, next) => {
- // ctx.state.text = ctx.message.text;
- // return next();
- // });
- bot.start(async ctx => {
- ctx.reply('Welcome to exchange bot!');
- });
- bot.help(ctx => ctx.reply('Send me a sticker'));
- bot.on('sticker', ctx => ctx.reply('👍'));
- bot.command('showratesfinance', async ctx => {
- const financeApi = new FinanceApi();
- await financeApi.getData();
- const template = financeApi.generateMessageTemplate();
- // console.log(ctx.state);
- ctx.session.counter = ctx.session.counter || 0;
- ctx.session.counter++;
- console.log(ctx.session.counter);
- // return ctx.reply(
- // template,
- // );
- // return ctx.reply(
- // template,
- // Markup.keyboard([
- // 'Every 6 hours',
- // 'Every 12 hours',
- // 'Every day',
- // 'Every 2 days'
- // ])
- // .oneTime()
- // .resize()
- // .extra()
- // );
- return ctx.reply(template);
- });
- bot.command('showratesminfin', async ctx => {
- console.log(ctx.message);
- const data = {
- ...ctx.message.from,
- chatId: ctx.message.chat.id,
- date: ctx.message.date,
- text: ctx.message.text
- };
- await this.putItem(data);
-
- // ctx.state = { A: 2 };
- // console.log(ctx.state);
- // console.log(123123);
- console.log(ctx.session);
-
- return ctx.reply('Rates from minfin');
- });
- bot.on('text', async ctx => {
- const data = {
- ...ctx.message.from,
- chatId: ctx.message.chat.id,
- date: ctx.message.date,
- text: ctx.message.text
- };
- await this.putItem(data);
- return ctx.reply(ctx.message.text);
- });
- bot.launch();
- }
-}
-
-module.exports = TelegramExecutor;
diff --git a/src/bot/bot.js b/src/bot/bot.js
new file mode 100644
index 0000000..f5affb9
--- /dev/null
+++ b/src/bot/bot.js
@@ -0,0 +1,86 @@
+const Telegraf = require('telegraf');
+const Markup = require('telegraf/markup');
+const { get, isEmpty } = require('lodash');
+const { TOKEN } = require('../config/env');
+const UsersModel = require('../models/Users');
+const addMenus = require('./utils/addMenus');
+const addMainCommands = require('./commands/main');
+const applyMiddlewares = require('./utils/middlewares');
+const UserModel = require('../models/Users');
+
+const execute = () => {
+ const bot = new Telegraf(TOKEN);
+ applyMiddlewares(bot);
+
+ bot.start(async ctx => {
+ const usersModel = new UsersModel();
+ const model = {
+ ...ctx.message.from,
+ message_id: ctx.message.message_id,
+ date: ctx.message.date,
+ };
+ await usersModel.save(`${ctx.message.from.id}`, model);
+ return ctx.reply(
+ 'Welcome to exchange rates bot!',
+ Markup.keyboard([
+ ['🗄 Providers', '🏦 Banks', '⏰ Schedule time', '💸 Rates'],
+ ['⚙️ Setting', '💸 Wallet', '🤑 Donation'],
+ ])
+ .oneTime()
+ .resize()
+ .extra(),
+ );
+ });
+
+ addMenus(bot);
+ addMainCommands(bot);
+
+ bot.hears(/\d+/, async ctx => {
+ const textMessage = +ctx.message.text;
+ let templateCallbackMessage;
+
+ if (!isEmpty(ctx.session.triggers)) {
+ const userModel = new UserModel();
+ const user = await userModel.get(ctx.state.userId);
+ const { balance } = user.wallet;
+ if (ctx.session.triggers.topup) {
+ const result = balance + textMessage;
+ await userModel.update(ctx.state.userId, {
+ wallet: { balance: result },
+ });
+ templateCallbackMessage = `Your balance topped up by ${textMessage}$\nCurrent balance: ${result}$`;
+ }
+ if (ctx.session.triggers.topdown) {
+ const result = balance - textMessage;
+ await userModel.update(ctx.state.userId, {
+ wallet: { balance: result },
+ });
+ templateCallbackMessage = `Your balance topped down by ${textMessage}$\nCurrent balance: ${result}$`;
+ }
+ ctx.session.triggers = {};
+ return ctx.replyWithHTML(templateCallbackMessage);
+ }
+ return ctx.reply('Some wrong action! Please write something else.');
+ });
+
+ bot.help(ctx =>
+ ctx.reply(
+ 'Welcome to exchange rates bot!',
+ Markup.keyboard([
+ ['⏰ Schedule', '🏦 Banks'],
+ ['⚙️ Setting', '💸 Wallet'],
+ ['⭐️ Rate us', '🤑 Donation'],
+ ])
+ .oneTime()
+ .resize()
+ .extra(),
+ ),
+ );
+
+ bot.on('text', async ctx =>
+ ctx.reply('Some wrong action! Please write something else.'),
+ );
+ bot.launch();
+};
+
+module.exports = { execute };
diff --git a/src/bot/commands/main.js b/src/bot/commands/main.js
new file mode 100644
index 0000000..2447729
--- /dev/null
+++ b/src/bot/commands/main.js
@@ -0,0 +1,19 @@
+const FinanceApi = require('../../api/FinanceApi');
+const FinanceModel = require('../../models/Finance');
+const { generateMessageTemplate } = require('../processor/finance');
+
+const mainCommands = bot => {
+ bot.command('showratesfinance', async ctx => {
+ const financeApi = new FinanceApi();
+ const data = await financeApi.getData();
+ const financeModel = new FinanceModel();
+ await financeModel.save(data);
+ const template = generateMessageTemplate(data.organizations);
+ return ctx.reply(template);
+ });
+
+ bot.command('showratesminfin', async ctx =>
+ ctx.reply('Rates from minfin currently unavailable'),
+ );
+};
+module.exports = mainCommands;
diff --git a/src/bot/menu/banks.js b/src/bot/menu/banks.js
new file mode 100644
index 0000000..c314eba
--- /dev/null
+++ b/src/bot/menu/banks.js
@@ -0,0 +1,145 @@
+const Markup = require('telegraf/markup');
+const { capitalize } = require('lodash');
+const {
+ createArray,
+ getPattern,
+ getCallbackUserId,
+} = require('../utils/common');
+const { transformBankData } = require('../utils/data');
+const UserModel = require('../../models/Users');
+const FinanceModel = require('../../models/Finance');
+const { chooseExistedProviders } = require('../processor/providers');
+
+module.exports = bot => {
+ const templateCallbackMessage =
+ 'Which one provider do you want to chose banks inside?\n';
+ const financeModel = new FinanceModel();
+ const userModel = new UserModel();
+
+ bot.hears(/(🏦 Banks)|(\/banks)/, async ctx =>
+ chooseExistedProviders(ctx, templateCallbackMessage, 'provider:banks'),
+ );
+
+ const renderColumnButton = (
+ data,
+ provider,
+ index,
+ columns,
+ menuPrefix = 'banks',
+ customPrefix = 'bank_name',
+ ) =>
+ data
+ .slice(index * columns, index * columns + columns)
+ .map(({ title, id, enabled }) =>
+ Markup.callbackButton(
+ `${capitalize(title)}${enabled ? ' ✅' : ''}`,
+ `${id}:${provider}:${menuPrefix}:${customPrefix}`,
+ ),
+ );
+
+ const createInlineButtonsColumns = (
+ bankData,
+ provider = 'finance',
+ page = 1,
+ pageNumMaxElem = 20,
+ columns = 2,
+ ) => {
+ if (pageNumMaxElem > 20) {
+ throw new Error('Too much elements in list');
+ }
+ const pagesQuantity = Math.ceil(bankData.length / pageNumMaxElem);
+ const correctLength = Math.ceil(pageNumMaxElem / columns);
+ const realPage = page - 1;
+ return createArray(correctLength).reduce((acc, value, index, array) => {
+ const realBankData = bankData.slice(
+ realPage * pageNumMaxElem,
+ realPage * pageNumMaxElem + pageNumMaxElem,
+ );
+ if (index === 0 && page > 1) {
+ acc.push([
+ Markup.callbackButton('Prev ⬅️', `prev:${provider}:provider:banks`),
+ ]);
+ }
+ if (index + 1 === array.length && pagesQuantity !== page) {
+ return [
+ ...acc,
+ renderColumnButton(realBankData, provider, index, columns),
+ [Markup.callbackButton('Next ➡️', `next:${provider}:provider:banks`)],
+ ];
+ }
+
+ return [
+ ...acc,
+ renderColumnButton(realBankData, provider, index, columns),
+ ];
+ }, []);
+ };
+
+ bot.action('finance:provider:banks', async ctx => {
+ const finance = await financeModel.getLatest();
+ const [provider] = ctx.match.split(':');
+ const user = await userModel.get(getCallbackUserId(ctx));
+ const bankData = transformBankData(finance.organizations, user, provider);
+ await ctx.answerCbQuery('Checked!');
+ ctx.session.bankPage = 1;
+ await ctx.editMessageText(`Please choose banks for ${provider} provider!`);
+ return ctx.editMessageReplyMarkup(
+ Markup.inlineKeyboard(createInlineButtonsColumns(bankData, provider)),
+ );
+ });
+
+ bot.action(/(next|prev):[a-zA-Z]+:provider:banks/, async ctx => {
+ const finance = await financeModel.getLatest();
+ const pattern = getPattern(ctx);
+ const actionPattern = pattern[0];
+ const provider = pattern[1];
+ const user = await userModel.get(getCallbackUserId(ctx));
+ const bankData = transformBankData(finance.organizations, user, provider);
+ const makeCalc = action => {
+ switch (action) {
+ case 'prev':
+ ctx.session.bankPage--;
+ return ctx.session.bankPage;
+ case 'next':
+ ctx.session.bankPage++;
+ return ctx.session.bankPage;
+ default:
+ ctx.session.bankPage++;
+ return ctx.session.bankPage;
+ }
+ };
+ const page = makeCalc(actionPattern);
+ await ctx.answerCbQuery(`Going to the ${actionPattern} page!`);
+ return ctx.editMessageReplyMarkup(
+ Markup.inlineKeyboard(
+ createInlineButtonsColumns(bankData, provider, page),
+ ),
+ );
+ });
+
+ bot.action(/:banks:bank_name/, async ctx => {
+ const [bankId, provider] = getPattern(ctx);
+ const user = await userModel.get(getCallbackUserId(ctx));
+ const finance = await financeModel.getLatest();
+
+ if (!user.subscriptions[provider].banks.includes(bankId)) {
+ user.subscriptions[provider].banks.push(bankId);
+ } else {
+ const index = user.subscriptions[provider].banks.findIndex(
+ id => id === bankId,
+ );
+ user.subscriptions[provider].banks.splice(index, 1);
+ }
+ await userModel.update(getCallbackUserId(ctx), {
+ subscriptions: user.subscriptions,
+ });
+ const bankData = transformBankData(finance.organizations, user, provider);
+
+ await ctx.answerCbQuery('Checked!');
+ return ctx.editMessageReplyMarkup(
+ Markup.inlineKeyboard(
+ createInlineButtonsColumns(bankData, provider, ctx.session.bankPage),
+ ),
+ );
+ });
+};
diff --git a/src/bot/menu/providers.js b/src/bot/menu/providers.js
new file mode 100644
index 0000000..9bd61bd
--- /dev/null
+++ b/src/bot/menu/providers.js
@@ -0,0 +1,60 @@
+const Extra = require('telegraf/extra');
+const Markup = require('telegraf/markup');
+const { getCallbackUserId } = require('../utils/common');
+const UserModel = require('../../models/Users');
+
+module.exports = bot => {
+ const templateCallbackMessage =
+ 'Which one provider do you want to have subscriptions?\nPlease check provider for schedule!';
+
+ const backButtons = ({ minfin, finance }) =>
+ Extra.HTML().markup(
+ Markup.inlineKeyboard([
+ Markup.callbackButton(
+ minfin.enabled ? 'Minfin ✅' : 'Minfin',
+ 'minfin:provider',
+ ),
+ Markup.callbackButton(
+ finance.enabled ? 'Finance ✅' : 'Finance',
+ 'finance:provider',
+ ),
+ ]),
+ );
+
+ bot.hears(/(🗄 Providers)|(\/providers)/, async ctx => {
+ const userModel = new UserModel();
+ const user = await userModel.get(ctx.update.message.from.id);
+ return ctx.replyWithHTML(
+ templateCallbackMessage,
+ backButtons(user.subscriptions),
+ );
+ });
+
+ bot.action('minfin:provider', async ctx => {
+ const userModel = new UserModel();
+ const user = await userModel.get(getCallbackUserId(ctx));
+ user.subscriptions.minfin.enabled = !user.subscriptions.minfin.enabled;
+ await userModel.update(getCallbackUserId(ctx), {
+ subscriptions: user.subscriptions,
+ });
+ await ctx.answerCbQuery('Checked!');
+ return ctx.editMessageText(
+ templateCallbackMessage,
+ backButtons(user.subscriptions),
+ );
+ });
+
+ bot.action('finance:provider', async ctx => {
+ const userModel = new UserModel();
+ const user = await userModel.get(getCallbackUserId(ctx));
+ user.subscriptions.finance.enabled = !user.subscriptions.finance.enabled;
+ await userModel.update(getCallbackUserId(ctx), {
+ subscriptions: user.subscriptions,
+ });
+ await ctx.answerCbQuery('Checked!');
+ return ctx.editMessageText(
+ templateCallbackMessage,
+ backButtons(user.subscriptions),
+ );
+ });
+};
diff --git a/src/bot/menu/rates.js b/src/bot/menu/rates.js
new file mode 100644
index 0000000..030d440
--- /dev/null
+++ b/src/bot/menu/rates.js
@@ -0,0 +1,30 @@
+const { chooseExistedProviders } = require('../processor/providers');
+const { generateMessageTemplate } = require('../processor/finance');
+const FinanceModel = require('../../models/Finance');
+const UserModel = require('../../models/Users');
+const { getCallbackUserId } = require('../utils/common');
+
+module.exports = bot => {
+ const financeModel = new FinanceModel();
+ const userModel = new UserModel();
+
+ bot.hears('💸 Rates', async ctx =>
+ chooseExistedProviders(ctx, 'Choose what rates you need?', 'rates'),
+ );
+ bot.action('finance:rates', async ctx => {
+ const finance = await financeModel.getLatest();
+ const user = await userModel.get(getCallbackUserId(ctx));
+ const financeSubscriptionBanks = user.subscriptions.finance.banks;
+ if (financeSubscriptionBanks.length) {
+ const template = generateMessageTemplate(
+ finance.organizations,
+ financeSubscriptionBanks,
+ );
+ return ctx.reply(template);
+ }
+ return ctx.reply(
+ 'Please choose any banks in "Banks" in current "Finance" provider to show any banks!',
+ );
+ });
+ bot.action('minfin:rates', ctx => {});
+};
diff --git a/src/bot/menu/user.js b/src/bot/menu/user.js
new file mode 100644
index 0000000..d37426f
--- /dev/null
+++ b/src/bot/menu/user.js
@@ -0,0 +1 @@
+module.exports = bot => {};
diff --git a/src/bot/menu/wallet.js b/src/bot/menu/wallet.js
new file mode 100644
index 0000000..7744f86
--- /dev/null
+++ b/src/bot/menu/wallet.js
@@ -0,0 +1,30 @@
+const Extra = require('telegraf/extra');
+const Markup = require('telegraf/markup');
+const UserModel = require('../../models/Users');
+
+module.exports = bot => {
+ bot.hears('💸 Wallet', async ctx => {
+ const userModel = new UserModel();
+ const user = await userModel.get(ctx.state.userId);
+ return ctx.replyWithHTML(
+ `Your balance: \nUSD: ${user.wallet.balance}\nPlease choose action!`,
+ Extra.HTML().markup(
+ Markup.inlineKeyboard([
+ Markup.callbackButton('Top up', 'topup:wallet'),
+ Markup.callbackButton('Top down', 'topdown:wallet'),
+ ]),
+ ),
+ );
+ });
+ bot.action('topup:wallet', async ctx => {
+ await ctx.answerCbQuery();
+ ctx.session.triggers = { topup: true };
+ return ctx.reply('Please type on which count you want to top up!');
+ });
+
+ bot.action('topdown:wallet', async ctx => {
+ await ctx.answerCbQuery();
+ ctx.session.triggers = { topdown: true };
+ return ctx.reply('Please type on which count you want to top down!');
+ });
+};
diff --git a/src/bot/processor/finance.js b/src/bot/processor/finance.js
new file mode 100644
index 0000000..cf0a644
--- /dev/null
+++ b/src/bot/processor/finance.js
@@ -0,0 +1,42 @@
+const FinanceApi = require('../../api/FinanceApi');
+const FinanceModel = require('../../models/Finance');
+const { prepareRate } = require('../../utils/data');
+const { RUB } = require('../../constants/rates');
+
+const generateMessageTemplate = (
+ organizations,
+ chosedBanks,
+ ignoreRates = [RUB],
+) => {
+ const findedBanks = organizations.reduce((acc, val) => {
+ if (chosedBanks.includes(val.id)) {
+ return [...acc, val];
+ }
+ return [...acc];
+ }, []);
+ const preparedTemplate = findedBanks
+ .map(bank => {
+ const firstLine = `${bank.title}: \n`;
+ const nextLines = Object.keys(bank.currencies).reduce((acc, key) => {
+ const currency = bank.currencies[key];
+ if (ignoreRates.includes(key)) {
+ return [...acc];
+ }
+ return [
+ ...acc,
+ `${key}: ${prepareRate(currency.ask)}/${prepareRate(currency.bid)}`,
+ ];
+ }, []);
+ return firstLine + nextLines.join('\n');
+ })
+ .join('\n\n');
+ return preparedTemplate.length ? preparedTemplate : 'No one banks found!';
+};
+
+const getAndSaveFinanceData = async () => {
+ const financeApi = new FinanceApi();
+ const data = await financeApi.getData();
+ await FinanceModel.save(data);
+};
+
+module.exports = { getAndSaveFinanceData, generateMessageTemplate };
diff --git a/src/bot/processor/providers.js b/src/bot/processor/providers.js
new file mode 100644
index 0000000..3eee0c0
--- /dev/null
+++ b/src/bot/processor/providers.js
@@ -0,0 +1,25 @@
+const Markup = require('telegraf/markup');
+const { capitalize } = require('lodash');
+const UserModel = require('../../models/Users');
+
+const chooseExistedProviders = async (ctx, callbackMessage, prefix) => {
+ const userModel = new UserModel();
+ const user = await userModel.get(ctx.update.message.from.id);
+ const existedSubscriptions = Object.keys(user.subscriptions).filter(
+ key => user.subscriptions[key].enabled,
+ );
+ if (existedSubscriptions.length) {
+ return ctx.reply(
+ callbackMessage,
+ Markup.inlineKeyboard([
+ existedSubscriptions.map(value =>
+ Markup.callbackButton(capitalize(value), `${value}:${prefix}`),
+ ),
+ ]).extra(),
+ );
+ }
+ return ctx.reply(
+ 'You did not chose any providers! Please go to "🗄 Providers" menu or /providers',
+ );
+};
+module.exports = { chooseExistedProviders };
diff --git a/src/bot/utils/addMenus.js b/src/bot/utils/addMenus.js
new file mode 100644
index 0000000..a063da0
--- /dev/null
+++ b/src/bot/utils/addMenus.js
@@ -0,0 +1,16 @@
+const fs = require('fs');
+const path = require('path');
+
+const MENUS_DIR = path.resolve(__dirname, '../menu');
+
+module.exports = async bot => {
+ const data = fs.readdirSync(MENUS_DIR);
+ data.forEach(file => {
+ try {
+ const menu = require(path.resolve(MENUS_DIR, file));
+ menu(bot);
+ } catch (e) {
+ console.error(e);
+ }
+ });
+};
diff --git a/src/bot/utils/common.js b/src/bot/utils/common.js
new file mode 100644
index 0000000..02ad356
--- /dev/null
+++ b/src/bot/utils/common.js
@@ -0,0 +1,11 @@
+const { get } = require('lodash');
+
+const getUserId = ctx => get(ctx, 'message.id');
+
+const getCallbackUserId = ctx => get(ctx, 'update.callback_query.from.id');
+
+const getPattern = ctx => get(ctx, 'match.input', '').split(':');
+
+const createArray = num => new Array(num).fill(null);
+
+module.exports = { getUserId, getCallbackUserId, createArray, getPattern };
diff --git a/src/bot/utils/data.js b/src/bot/utils/data.js
new file mode 100644
index 0000000..58ca1d9
--- /dev/null
+++ b/src/bot/utils/data.js
@@ -0,0 +1,9 @@
+const transformBankData = (bankData, user, provider) => {
+ return Object.values(bankData).map(value => ({
+ title: value.title,
+ id: value.id,
+ enabled: user.subscriptions[provider].banks.includes(value.id),
+ }));
+};
+
+module.exports = { transformBankData };
diff --git a/src/bot/utils/inline.js b/src/bot/utils/inline.js
new file mode 100644
index 0000000..e69de29
diff --git a/src/bot/utils/middlewares/index.js b/src/bot/utils/middlewares/index.js
new file mode 100644
index 0000000..cc0d32b
--- /dev/null
+++ b/src/bot/utils/middlewares/index.js
@@ -0,0 +1,19 @@
+const session = require('telegraf/session');
+const { get } = require('lodash');
+const logger = require('./logger/tlogger');
+
+module.exports = bot => {
+ // bot.use(logger());
+ bot.use(session());
+ bot.use(async (ctx, next) => {
+ if (get(ctx, 'message.from.id')) {
+ ctx.state.userId = ctx.message.from.id;
+ }
+ ctx.session.triggers = ctx.session.triggers || {};
+ ctx.session.bankPage = ctx.session.bankPage || 1;
+ await next();
+ });
+ bot.catch(ctx => {
+ console.error(ctx);
+ });
+};
diff --git a/src/bot/utils/middlewares/logger/log4js.js b/src/bot/utils/middlewares/logger/log4js.js
new file mode 100644
index 0000000..5e0756e
--- /dev/null
+++ b/src/bot/utils/middlewares/logger/log4js.js
@@ -0,0 +1,10 @@
+const { configure, getLogger } = require('log4js');
+
+configure({
+ appenders: { cheese: { type: 'file', filename: 'cheese.log' } },
+ categories: { default: { appenders: ['cheese'], level: 'error' } },
+});
+
+const logger = getLogger('Exchange rate');
+
+module.exports = { logger };
diff --git a/src/bot/utils/middlewares/logger/tlogger.js b/src/bot/utils/middlewares/logger/tlogger.js
new file mode 100644
index 0000000..e747d63
--- /dev/null
+++ b/src/bot/utils/middlewares/logger/tlogger.js
@@ -0,0 +1,3 @@
+const Telegraf = require('telegraf');
+
+module.exports = () => Telegraf.log();
diff --git a/src/config/env.js b/src/config/env.js
index 76d04c1..9abe5b9 100644
--- a/src/config/env.js
+++ b/src/config/env.js
@@ -1,5 +1,7 @@
-require("dotenv").config();
+require('dotenv').config();
module.exports = {
- TOKEN: process.env.TOKEN
+ DEBUG: process.env.DEBUG,
+ TOKEN: process.env.TOKEN,
+ MINFIN_KEY: process.env.MINFIN_KEY,
};
diff --git a/src/config/firebaseKey.example.json b/src/config/firebaseKey.example.json
new file mode 100644
index 0000000..ce5348c
--- /dev/null
+++ b/src/config/firebaseKey.example.json
@@ -0,0 +1,12 @@
+{
+ "type": "service_account",
+ "project_id": "exchange-bot-babd5",
+ "private_key_id": "private_key_id",
+ "private_key": "privateKey",
+ "client_email": "firebase-adminsdk-rkydu@exchange-bot-babd5.iam.gserviceaccount.com",
+ "client_id": "client_id",
+ "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+ "token_uri": "https://oauth2.googleapis.com/token",
+ "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
+ "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/firebase-adminsdk-rkydu%40exchange-bot-babd5.iam.gserviceaccount.com"
+}
diff --git a/src/constants/api.js b/src/constants/api.js
new file mode 100644
index 0000000..cc8c07a
--- /dev/null
+++ b/src/constants/api.js
@@ -0,0 +1,3 @@
+const FINANCE_API = 'http://resources.finance.ua/ru/public/currency-cash.json';
+
+module.exports = { FINANCE_API };
diff --git a/src/constants/models.js b/src/constants/models.js
new file mode 100644
index 0000000..b171c34
--- /dev/null
+++ b/src/constants/models.js
@@ -0,0 +1,9 @@
+const USERS = 'users';
+const EXCHANGE_RATES_MINFIN = 'exchange-rates-minfin';
+const EXCHANGE_RATES_FINANCE_UA = 'exchange-rates-finance-ua';
+
+module.exports = {
+ USERS,
+ EXCHANGE_RATES_MINFIN,
+ EXCHANGE_RATES_FINANCE_UA,
+};
diff --git a/src/constants/rates.js b/src/constants/rates.js
new file mode 100644
index 0000000..ef62fe4
--- /dev/null
+++ b/src/constants/rates.js
@@ -0,0 +1,5 @@
+const USD = 'USD';
+const RUB = 'RUB';
+const UAH = 'UAH';
+
+module.exports = { USD, RUB, UAH };
diff --git a/src/constants/timer.js b/src/constants/timer.js
new file mode 100644
index 0000000..cffcf13
--- /dev/null
+++ b/src/constants/timer.js
@@ -0,0 +1,4 @@
+const DAY = 86400000;
+const HALF_DAY = 43200000;
+
+module.exports = { DAY, HALF_DAY };
diff --git a/src/index.js b/src/index.js
index f55c678..cdf64b2 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,8 +1,13 @@
-const got = require('got');
-const AWS = require('aws-sdk');
-const TelegramExecutor = require('./bot');
+const { execute } = require('./bot/bot');
+const RatesScheduller = require('./utils/scheduler/RatesScheduler');
-(async () => {
- const botInstance = new TelegramExecutor();
- await botInstance.execute();
-})();
+const start = async () => {
+ execute();
+ RatesScheduller.scheduleFinanceJob();
+ // RatesScheduller.scheduleMinfinJob();
+};
+start()
+ .then(() => console.log('Telegram bot started!'))
+ .catch(e => {
+ // console.error(e);
+ });
diff --git a/src/models/Base.js b/src/models/Base.js
new file mode 100644
index 0000000..d49de35
--- /dev/null
+++ b/src/models/Base.js
@@ -0,0 +1,50 @@
+const { v4: uuid } = require('uuid');
+const firestore = require('../utils/firestore');
+
+class BaseModel {
+ constructor({ name }) {
+ this.name = name;
+ this.collection = firestore.collection(this.name);
+ }
+
+ async getLatestBankById(id) {
+ const latest = await this.getLatest();
+ return latest.organizations.find(bank => bank.id === id);
+ }
+
+ async getLatest() {
+ const data = await this.collection
+ .limit(1)
+ .orderBy('date', 'desc')
+ .get();
+ if (!data.size) {
+ throw new Error('No such document!');
+ } else {
+ const result = [];
+ data.forEach(value => result.push(value.data()));
+ return result[0];
+ }
+ }
+
+ async getAll() {
+ return this.collection.get();
+ }
+
+ async get(id) {
+ const doc = await this.collection.doc(`${id}`).get();
+ if (!doc.exists) {
+ throw new Error('No such document!');
+ } else {
+ return doc.data();
+ }
+ }
+
+ async update(id, data) {
+ return this.collection.doc(`${id}`).update(data);
+ }
+
+ async save(data) {
+ return this.collection.doc(uuid()).set(data);
+ }
+}
+module.exports = BaseModel;
diff --git a/src/models/Finance.js b/src/models/Finance.js
new file mode 100644
index 0000000..5456c52
--- /dev/null
+++ b/src/models/Finance.js
@@ -0,0 +1,9 @@
+const BaseModel = require('./Base');
+const { EXCHANGE_RATES_FINANCE_UA } = require('../constants/models');
+
+class FinanceModel extends BaseModel {
+ constructor() {
+ super({ name: EXCHANGE_RATES_FINANCE_UA });
+ }
+}
+module.exports = FinanceModel;
diff --git a/src/models/Minfin.js b/src/models/Minfin.js
new file mode 100644
index 0000000..1d3610e
--- /dev/null
+++ b/src/models/Minfin.js
@@ -0,0 +1,13 @@
+const BaseModel = require('./Base');
+const { EXCHANGE_RATES_MINFIN } = require('../constants/models');
+
+class MinfinModel extends BaseModel {
+ constructor() {
+ super({ name: EXCHANGE_RATES_MINFIN });
+ }
+
+ async save(data) {
+ this.save({ rates: data });
+ }
+}
+module.exports = MinfinModel;
diff --git a/src/models/Users.js b/src/models/Users.js
new file mode 100644
index 0000000..60a1eae
--- /dev/null
+++ b/src/models/Users.js
@@ -0,0 +1,23 @@
+const BaseModel = require('./Base');
+const { USERS } = require('../constants/models');
+
+class UsersModel extends BaseModel {
+ constructor() {
+ super({ name: USERS });
+ }
+
+ async save(id, data) {
+ const modData = {
+ ...data,
+ subscriptions: {
+ minfin: { enabled: false, banks: [] },
+ finance: { enabled: false, banks: [] },
+ },
+ wallet: {
+ balance: 0,
+ },
+ };
+ return this.collection.doc(id).set(modData);
+ }
+}
+module.exports = UsersModel;
diff --git a/src/utils/aws/dynamo.js b/src/utils/aws/dynamo.js
index 0a7b6e2..8ddc6b0 100644
--- a/src/utils/aws/dynamo.js
+++ b/src/utils/aws/dynamo.js
@@ -7,61 +7,61 @@ class DynamoDatabase {
constructor() {
this.dynamodb = new AWS.DynamoDB({
region: 'us-east-2',
- apiVersion: '2012-08-10'
+ apiVersion: '2012-08-10',
});
}
- async listTables() {
- return this.dynamodb.listTables({}).promise();
- }
- async scan() {
- var params = {
- TableName: tableName
- };
- this.dynamodb.scan(params, function(err, data) {
- if (err) {
- console.log('Error', err);
- } else {
- console.log('Success', data.Items);
- }
- });
- }
+ // async listTables() {
+ // return this.dynamodb.listTables({}).promise();
+ // }
- async get() {
- var params = {
- TableName: tableName,
- KeyConditionExpression: 'CUSTOMER_ID = :i'
- // ExpressionAttributeValues: [(':i': ['2'])]
- };
- this.dynamodb.query(params, function(err, data) {
- if (err) {
- console.log('Error', err);
- } else {
- console.log('Success', data.Items);
- }
- });
- }
+ // async scan() {
+ // var params = {
+ // TableName: tableName,
+ // };
+ // this.dynamodb.scan(params, function(err, data) {
+ // if (err) {
+ // console.log('Error', err);
+ // } else {
+ // console.log('Success', data.Items);
+ // }
+ // });
+ // }
- async getItem() {
- var params = {
- TableName: tableName,
- Key: {
- 123: {}
- },
- ProjectionExpression: 'integer'
- };
- this.dynamodb.getItem(params, function(err, data) {
- if (err) {
- console.log('Error', err);
- } else {
- console.log('Success', data.Item);
- }
- });
- }
+ // async get() {
+ // var params = {
+ // TableName: tableName,
+ // KeyConditionExpression: 'CUSTOMER_ID = :i',
+ // // ExpressionAttributeValues: [(':i': ['2'])]
+ // };
+ // this.dynamodb.query(params, function(err, data) {
+ // if (err) {
+ // console.log('Error', err);
+ // } else {
+ // console.log('Success', data.Items);
+ // }
+ // });
+ // }
+
+ // async getItem() {
+ // var params = {
+ // TableName: tableName,
+ // Key: {
+ // 123: {},
+ // },
+ // ProjectionExpression: 'integer',
+ // };
+ // this.dynamodb.getItem(params, function(err, data) {
+ // if (err) {
+ // console.log('Error', err);
+ // } else {
+ // console.log('Success', data.Item);
+ // }
+ // });
+ // }
async putItem(data) {
const getType = type => {
- // console.log(type);
switch (type) {
case 'string':
return 'S';
@@ -77,66 +77,64 @@ class DynamoDatabase {
const preparedData = Object.keys(data).reduce((acc, key) => {
return {
...acc,
- [key]: { [getType(typeof data[key])]: String(data[key]) }
+ [key]: { [getType(typeof data[key])]: String(data[key]) },
};
}, {});
- console.log(preparedData);
const params = {
TableName: tableName,
Item: {
'exchane-rates-ukraine-bot-primary-key': { S: uuid() },
- ...preparedData
+ ...preparedData,
},
- ReturnValues: 'NONE'
+ ReturnValues: 'NONE',
};
try {
- const data = await this.dynamodb.putItem(params).promise();
- console.log(data);
+ await this.dynamodb.putItem(params).promise();
} catch (e) {
throw new Error(e);
}
}
- async deleteItem() {
- var params = {
- TableName: tableName,
- Key: {
- KEY_NAME: { N: 'VALUE' }
- }
- };
- this.dynamodb.deleteItem(params, function(err, data) {
- if (err) {
- console.log('Error', err);
- } else {
- console.log('Success', data);
- }
- });
- }
- async batchGetItem() {
- var params = {
- RequestItems: {
- TABLE_NAME: {
- Keys: [
- { KEY_NAME: { N: 'KEY_VALUE_1' } },
- { KEY_NAME: { N: 'KEY_VALUE_2' } },
- { KEY_NAME: { N: 'KEY_VALUE_3' } }
- ],
- ProjectionExpression: 'KEY_NAME, ATTRIBUTE'
- }
- }
- };
+ // async deleteItem() {
+ // var params = {
+ // TableName: tableName,
+ // Key: {
+ // KEY_NAME: { N: 'VALUE' },
+ // },
+ // };
+ // this.dynamodb.deleteItem(params, function(err, data) {
+ // if (err) {
+ // console.log('Error', err);
+ // } else {
+ // console.log('Success', data);
+ // }
+ // });
+ // }
+ // async batchGetItem() {
+ // const params = {
+ // RequestItems: {
+ // TABLE_NAME: {
+ // Keys: [
+ // { KEY_NAME: { N: 'KEY_VALUE_1' } },
+ // { KEY_NAME: { N: 'KEY_VALUE_2' } },
+ // { KEY_NAME: { N: 'KEY_VALUE_3' } },
+ // ],
+ // ProjectionExpression: 'KEY_NAME, ATTRIBUTE',
+ // },
+ // },
+ // };
- this.dynamodb.batchGetItem(params, function(err, data) {
- if (err) {
- console.log('Error', err);
- } else {
- data.Responses.TABLE_NAME.forEach(function(element, index, array) {
- console.log(element);
- });
- }
- });
- }
+ // this.dynamodb.batchGetItem(params, (err, data) => {
+ // if (err) {
+ // console.log('Error', err);
+ // } else {
+ // data.Responses.TABLE_NAME.forEach(function(element, index, array) {
+ // console.log(element);
+ // });
+ // }
+ // });
+ // }
}
module.exports = DynamoDatabase;
diff --git a/src/utils/data.js b/src/utils/data.js
new file mode 100644
index 0000000..48a8f5c
--- /dev/null
+++ b/src/utils/data.js
@@ -0,0 +1,2 @@
+const prepareRate = rate => parseInt(rate, 10).toFixed(2);
+module.exports = { prepareRate };
diff --git a/src/utils/firestore.js b/src/utils/firestore.js
new file mode 100644
index 0000000..5191f6c
--- /dev/null
+++ b/src/utils/firestore.js
@@ -0,0 +1,11 @@
+const admin = require('firebase-admin');
+
+const serviceAccount = require('../config/firebaseKey.json');
+
+admin.initializeApp({
+ credential: admin.credential.cert(serviceAccount),
+});
+
+const db = admin.firestore();
+
+module.exports = db;
diff --git a/src/utils/scheduler/RatesScheduler.js b/src/utils/scheduler/RatesScheduler.js
new file mode 100644
index 0000000..be84fac
--- /dev/null
+++ b/src/utils/scheduler/RatesScheduler.js
@@ -0,0 +1,28 @@
+const MinfinApi = require('../../api/MinfinApi');
+const FinanceApi = require('../../api/FinanceApi');
+const MinfinModel = require('../../models/Minfin');
+const FinanceModel = require('../../models/Finance');
+const { logger } = require('../../bot/utils/middlewares/logger/log4js');
+const { HALF_DAY, DAY } = require('../../constants/timer');
+
+class RatesScheduller {
+ static scheduleFinanceJob() {
+ setInterval(async () => {
+ logger.info('Saving finance data');
+ const financeInstance = new FinanceApi();
+ const data = await financeInstance.getData();
+ await FinanceModel.save(data);
+ }, HALF_DAY);
+ }
+
+ static scheduleMinfinJob() {
+ setInterval(async () => {
+ logger.info('Saving minfin data');
+ const minfinApi = new MinfinApi();
+ const data = await minfinApi.getData();
+ await MinfinModel.save(data);
+ }, DAY);
+ }
+}
+
+module.exports = RatesScheduller;