From 551e04da139b20d4183a820cc10260876254e1af Mon Sep 17 00:00:00 2001 From: JasterV Date: Sun, 25 Jul 2021 16:15:39 +0200 Subject: [PATCH] test setup done --- jest.json | 4 +- package-lock.json | 959 +++++++++++++++++++++++++-- package.json | 3 + src/components/sentences/router.ts | 21 +- src/components/translation/router.ts | 12 +- src/server.ts | 13 +- test/app.test.ts | 29 +- test/mock/axios.ts | 9 + test/mock/config.ts | 9 + test/mock/firebase.ts | 11 + test/mock/sentences.ts | 4 + test/setup/app.ts | 27 + 12 files changed, 1035 insertions(+), 66 deletions(-) create mode 100644 test/mock/axios.ts create mode 100644 test/mock/config.ts create mode 100644 test/mock/firebase.ts create mode 100644 test/mock/sentences.ts create mode 100644 test/setup/app.ts diff --git a/jest.json b/jest.json index 998a123..9c39b03 100644 --- a/jest.json +++ b/jest.json @@ -7,7 +7,5 @@ ], "testMatch": [ "/**/*.test.ts" - ], - "resetMocks": true, - "clearMocks": true + ] } diff --git a/package-lock.json b/package-lock.json index 91d99dc..12716d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "@types/express": "^4.17.13", "@types/jest": "^26.0.24", "@types/node": "^16.3.3", + "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^4.28.4", "@typescript-eslint/parser": "^4.28.4", "eslint": "^7.31.0", @@ -27,6 +28,8 @@ "eslint-plugin-import": "^2.23.4", "husky": "^7.0.0", "jest": "^27.0.6", + "mock-firebase-ts": "^2.6.2", + "supertest": "^6.1.4", "ts-jest": "^27.0.3", "ts-node-dev": "^1.1.8", "typescript": "^4.3.5" @@ -698,11 +701,46 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/@firebase/app": { + "version": "0.6.28", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.28.tgz", + "integrity": "sha512-ZsR5372bNDfY9aGMg+0zgoxwUg/Upf8Mq1M82XCByCVdn6krnPwGr486UssiYFCVANweiOR1Mrhrg2y5O01RRw==", + "dev": true, + "peer": true, + "dependencies": { + "@firebase/app-types": "0.6.2", + "@firebase/component": "0.5.4", + "@firebase/logger": "0.2.6", + "@firebase/util": "1.1.0", + "dom-storage": "2.1.0", + "tslib": "^2.1.0", + "xmlhttprequest": "1.8.0" + } + }, "node_modules/@firebase/app-types": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.2.tgz", "integrity": "sha512-2VXvq/K+n8XMdM4L2xy5bYp2ZXMawJXluUIDzUBvMthVR+lhxK4pfFiqr1mmDbv9ydXvEAuFsD+6DpcZuJcSSw==" }, + "node_modules/@firebase/app/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true, + "peer": true + }, + "node_modules/@firebase/auth": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.14.4.tgz", + "integrity": "sha512-cjYdSZQZ73jiI8De8Vw4L4LooXanc7HaYu4pEbq81Aag8fNy3oitfi0qTcrGLB7a/VLEAt1RtWo+lWotwCU2Ow==", + "dev": true, + "dependencies": { + "@firebase/auth-types": "0.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, "node_modules/@firebase/auth-interop-types": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", @@ -712,6 +750,33 @@ "@firebase/util": "1.x" } }, + "node_modules/@firebase/auth/node_modules/@firebase/auth-types": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.0.tgz", + "integrity": "sha512-VuW7c+RAk3AYPU0Hxmun3RzXn7fbJDdjQbxvvpRMnQ9zrhk8mH42cY466M0n4e/UGQ+0smlx5BqZII8aYQ5XPg==", + "dev": true, + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "0.x" + } + }, + "node_modules/@firebase/auth/node_modules/@firebase/util": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.4.1.tgz", + "integrity": "sha512-XhYCOwq4AH+YeQBEnDQvigz50WiiBU4LnJh2+//VMt4J2Ybsk0eTgUHNngUzXsmp80EJrwal3ItODg55q1ajWg==", + "dev": true, + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/auth/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true, + "peer": true + }, "node_modules/@firebase/component": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.4.tgz", @@ -753,11 +818,179 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, + "node_modules/@firebase/firestore": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.17.1.tgz", + "integrity": "sha512-FJlNmFIBr9wrkA5g9JBPJWPmxYIzUhBDfsJGHNTUCxMbwm12pz/1Y6CW56kvZOgl6l+iPNlF911iduUDFzNUqw==", + "dev": true, + "dependencies": { + "@firebase/component": "0.1.19", + "@firebase/firestore-types": "1.13.0", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.2", + "@firebase/webchannel-wrapper": "0.3.0", + "@grpc/grpc-js": "^1.0.0", + "@grpc/proto-loader": "^0.5.0", + "node-fetch": "2.6.1", + "tslib": "^1.11.1" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.13.0.tgz", + "integrity": "sha512-QF5CAuYOHE6Zbsn1uEg6wkl836iP+i6C0C/Zs3kF60eebxZvTWp8JSZk19Ar+jj4w+ye8/7H5olu5CqDNjWpEA==", + "dev": true, + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/firestore/node_modules/@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dev": true, + "dependencies": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/firestore/node_modules/@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dev": true, + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@firebase/firestore/node_modules/@grpc/proto-loader": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.6.tgz", + "integrity": "sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==", + "dev": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@firebase/installations": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.8.tgz", + "integrity": "sha512-J3tyKCdZ07LR0Bw3rs4CIsWia5exGt77fdbvqnhYa6K8YfIUPFLzsGRvlFJkoIhOMXfujfnC3O/DakROOgOltg==", + "dev": true, + "dependencies": { + "@firebase/component": "0.1.10", + "@firebase/installations-types": "0.3.3", + "@firebase/util": "0.2.45", + "idb": "3.0.2", + "tslib": "1.11.1" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.3.tgz", + "integrity": "sha512-XvWhPPAGeZlc+CfCA8jTt2pv19Jovi/nUV73u30QbjBbk5xci9bp5I29aBZukHsR6YNBjFCLSkLPbno4m/bLUg==", + "dev": true, + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/installations/node_modules/@firebase/component": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.10.tgz", + "integrity": "sha512-Iy1+f8wp6mROz19oxWUd31NxMlGxtW1IInGHITnVa6eZtXOg0lxcbgYeLp9W3PKzvvNfshHU0obDkcMY97zRAw==", + "dev": true, + "dependencies": { + "@firebase/util": "0.2.45", + "tslib": "1.11.1" + } + }, + "node_modules/@firebase/installations/node_modules/@firebase/util": { + "version": "0.2.45", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.45.tgz", + "integrity": "sha512-k3IqXaIgwlPg7m5lXmMUtkqA/p+LMFkFQIqBuDtdT0iyWB6kQDokyjw2Sgd3GoTybs6tWqUKFZupZpV6r73UHw==", + "dev": true, + "dependencies": { + "tslib": "1.11.1" + } + }, + "node_modules/@firebase/installations/node_modules/tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, "node_modules/@firebase/logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" }, + "node_modules/@firebase/messaging": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.6.14.tgz", + "integrity": "sha512-OuXbSGrNxhWYuHTGAjM55uTUMwsxd+S+fxj6OOyY26ezBOGj0tdPAHnAq+9wFwaItgAx8RUMjJF98Cc08PQqPA==", + "dev": true, + "dependencies": { + "@firebase/component": "0.1.10", + "@firebase/installations": "0.4.8", + "@firebase/messaging-types": "0.4.4", + "@firebase/util": "0.2.45", + "idb": "3.0.2", + "tslib": "1.11.1" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/messaging-types": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.4.4.tgz", + "integrity": "sha512-JGtkr+1A1Dw7+yCqQigqBfGKtq0gTCruFScBD4MVjqZHiqGIYpnQisWnpGbkzPR6aOt6iQxgwxUhHG1ulUQGeg==", + "dev": true, + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/messaging/node_modules/@firebase/component": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.10.tgz", + "integrity": "sha512-Iy1+f8wp6mROz19oxWUd31NxMlGxtW1IInGHITnVa6eZtXOg0lxcbgYeLp9W3PKzvvNfshHU0obDkcMY97zRAw==", + "dev": true, + "dependencies": { + "@firebase/util": "0.2.45", + "tslib": "1.11.1" + } + }, + "node_modules/@firebase/messaging/node_modules/@firebase/util": { + "version": "0.2.45", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.45.tgz", + "integrity": "sha512-k3IqXaIgwlPg7m5lXmMUtkqA/p+LMFkFQIqBuDtdT0iyWB6kQDokyjw2Sgd3GoTybs6tWqUKFZupZpV6r73UHw==", + "dev": true, + "dependencies": { + "tslib": "1.11.1" + } + }, + "node_modules/@firebase/messaging/node_modules/tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, "node_modules/@firebase/util": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.1.0.tgz", @@ -771,6 +1004,12 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.3.0.tgz", + "integrity": "sha512-VniCGPIgSGNEgOkh5phb3iKmSGIzcwrccy3IomMFRWPCMiCk2y98UQNJEoDs1yIHtZMstVjYWKYxnunIGzC5UQ==", + "dev": true + }, "node_modules/@google-cloud/common": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.7.0.tgz", @@ -899,7 +1138,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.6.tgz", "integrity": "sha512-v7+LQFbqZKmd/Tvf5/j1Xlbq6jXL/4d+gUtm2TNX4QiEC3ELWADmGr2dGlUyLl6aKTuYfsN72vAsO5zmavYkEg==", - "optional": true, + "devOptional": true, "dependencies": { "@types/node": ">=12.12.47" }, @@ -1337,31 +1576,31 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "optional": true + "devOptional": true }, "node_modules/@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 + "devOptional": true }, "node_modules/@protobufjs/codegen": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "optional": true + "devOptional": true }, "node_modules/@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "optional": true + "devOptional": true }, "node_modules/@protobufjs/fetch": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", - "optional": true, + "devOptional": true, "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -1371,31 +1610,31 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "optional": true + "devOptional": true }, "node_modules/@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "optional": true + "devOptional": true }, "node_modules/@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "optional": true + "devOptional": true }, "node_modules/@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 + "devOptional": true }, "node_modules/@protobufjs/utf8": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=", - "optional": true + "devOptional": true }, "node_modules/@sinonjs/commons": { "version": "1.8.3", @@ -1482,6 +1721,12 @@ "@types/node": "*" } }, + "node_modules/@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -1573,7 +1818,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", - "optional": true + "devOptional": true }, "node_modules/@types/mime": { "version": "1.3.2", @@ -1628,6 +1873,25 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "node_modules/@types/superagent": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.12.tgz", + "integrity": "sha512-1GQvD6sySQPD6p9EopDFI3f5OogdICl1sU/2ij3Esobz/RtL9fWZZDPmsuv7eiy5ya+XNiPAxUcI3HIUTJa+3A==", + "dev": true, + "dependencies": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "node_modules/@types/supertest": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz", + "integrity": "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==", + "dev": true, + "dependencies": { + "@types/superagent": "*" + } + }, "node_modules/@types/yargs": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", @@ -1957,6 +2221,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/antlr4": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.2.tgz", + "integrity": "sha512-vZA1xYufXLe3LX+ja9rIVxjRmILb1x3k7KYZHltRbfJtXjJ1DlFIqt+CbPYmghx0EuzY9DajiDw+MdyEt1qAsQ==", + "dev": true + }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -2501,6 +2771,12 @@ "node": ">= 0.8" } }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -2582,6 +2858,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "node_modules/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -2794,6 +3076,16 @@ "node": ">=6.0.0" } }, + "node_modules/dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==", + "dev": true, + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -3615,6 +3907,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fast-safe-stringify": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", + "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==", + "dev": true + }, "node_modules/fast-text-encoding": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", @@ -3750,6 +4048,25 @@ "@google-cloud/storage": "^5.3.0" } }, + "node_modules/firebase-rules-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/firebase-rules-parser/-/firebase-rules-parser-2.0.1.tgz", + "integrity": "sha512-d3bUOmc7CkgSVcrpIoOdQGgcqffQJF2alJv0A7BwIsILgGNCORZKciqh0gj/oT8+kAoEan3+qkUocwB3E0oiQw==", + "dev": true, + "dependencies": { + "antlr4": "4.7.2", + "deepmerge": "3.2.0" + } + }, + "node_modules/firebase-rules-parser/node_modules/deepmerge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", + "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -3802,6 +4119,15 @@ "node": ">= 6" } }, + "node_modules/formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "dev": true, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -4269,6 +4595,12 @@ "node": ">=0.10.0" } }, + "node_modules/idb": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", + "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==", + "dev": true + }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -6068,7 +6400,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "optional": true + "devOptional": true }, "node_modules/lodash.clonedeep": { "version": "4.5.0", @@ -6126,7 +6458,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "optional": true + "devOptional": true }, "node_modules/lru-cache": { "version": "6.0.0", @@ -6319,6 +6651,53 @@ "node": ">=10" } }, + "node_modules/mock-firebase-ts": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/mock-firebase-ts/-/mock-firebase-ts-2.6.2.tgz", + "integrity": "sha512-Edv/70nehsCAPtLVHQgjpMhQbbHV73eXuJ1TyWi6G2dVxnihT/qaXwFAVSQNJEwzP2fJOACsJIK+hiDSBJ8YKA==", + "dev": true, + "dependencies": { + "@firebase/app-types": "0.6.0", + "@firebase/auth": "0.14.4", + "@firebase/firestore": "1.17.1", + "@firebase/firestore-types": "1.13.0", + "@firebase/messaging": "0.6.14", + "@firebase/util": "0.2.45", + "antlr4": "4.7.2", + "firebase-rules-parser": "2.0.1", + "uuid": "8.0.0" + } + }, + "node_modules/mock-firebase-ts/node_modules/@firebase/app-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.0.tgz", + "integrity": "sha512-ld6rzjXk/SUauHiQZJkeuSJpxIZ5wdnWuF5fWBFQNPaxsaJ9kyYg9GqEvwZ1z2e6JP5cU9gwRBlfW1WkGtGDYA==", + "dev": true + }, + "node_modules/mock-firebase-ts/node_modules/@firebase/util": { + "version": "0.2.45", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.45.tgz", + "integrity": "sha512-k3IqXaIgwlPg7m5lXmMUtkqA/p+LMFkFQIqBuDtdT0iyWB6kQDokyjw2Sgd3GoTybs6tWqUKFZupZpV6r73UHw==", + "dev": true, + "dependencies": { + "tslib": "1.11.1" + } + }, + "node_modules/mock-firebase-ts/node_modules/tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, + "node_modules/mock-firebase-ts/node_modules/uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -6342,7 +6721,7 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "optional": true, + "devOptional": true, "engines": { "node": "4.x || >=6.0.0" } @@ -6815,8 +7194,8 @@ "version": "6.11.2", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", + "devOptional": true, "hasInstallScript": true, - "optional": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -6989,7 +7368,7 @@ "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, + "devOptional": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -7272,6 +7651,20 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -7429,7 +7822,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, + "devOptional": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -7438,6 +7831,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "devOptional": true, "funding": [ { "type": "github", @@ -7451,8 +7845,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "optional": true + ] }, "node_modules/string-length": { "version": "4.0.2", @@ -7555,6 +7948,68 @@ "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", "optional": true }, + "node_modules/superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "dev": true, + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/supertest": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.4.tgz", + "integrity": "sha512-giC9Zm+Bf1CZP09ciPdUyl+XlMAu6rbch79KYiYKOGcbK2R1wH8h+APul1i/3wN6RF1XfWOIF+8X1ga+7SBrug==", + "dev": true, + "dependencies": { + "methods": "^1.1.2", + "superagent": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8048,7 +8503,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true + "devOptional": true }, "node_modules/utils-merge": { "version": "1.0.1", @@ -8320,6 +8775,16 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -8906,11 +9371,71 @@ "strip-json-comments": "^3.1.1" } }, + "@firebase/app": { + "version": "0.6.28", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.6.28.tgz", + "integrity": "sha512-ZsR5372bNDfY9aGMg+0zgoxwUg/Upf8Mq1M82XCByCVdn6krnPwGr486UssiYFCVANweiOR1Mrhrg2y5O01RRw==", + "dev": true, + "peer": true, + "requires": { + "@firebase/app-types": "0.6.2", + "@firebase/component": "0.5.4", + "@firebase/logger": "0.2.6", + "@firebase/util": "1.1.0", + "dom-storage": "2.1.0", + "tslib": "^2.1.0", + "xmlhttprequest": "1.8.0" + }, + "dependencies": { + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true, + "peer": true + } + } + }, "@firebase/app-types": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.2.tgz", "integrity": "sha512-2VXvq/K+n8XMdM4L2xy5bYp2ZXMawJXluUIDzUBvMthVR+lhxK4pfFiqr1mmDbv9ydXvEAuFsD+6DpcZuJcSSw==" }, + "@firebase/auth": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.14.4.tgz", + "integrity": "sha512-cjYdSZQZ73jiI8De8Vw4L4LooXanc7HaYu4pEbq81Aag8fNy3oitfi0qTcrGLB7a/VLEAt1RtWo+lWotwCU2Ow==", + "dev": true, + "requires": { + "@firebase/auth-types": "0.10.0" + }, + "dependencies": { + "@firebase/auth-types": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.10.0.tgz", + "integrity": "sha512-VuW7c+RAk3AYPU0Hxmun3RzXn7fbJDdjQbxvvpRMnQ9zrhk8mH42cY466M0n4e/UGQ+0smlx5BqZII8aYQ5XPg==", + "dev": true, + "requires": {} + }, + "@firebase/util": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.4.1.tgz", + "integrity": "sha512-XhYCOwq4AH+YeQBEnDQvigz50WiiBU4LnJh2+//VMt4J2Ybsk0eTgUHNngUzXsmp80EJrwal3ItODg55q1ajWg==", + "dev": true, + "peer": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "dev": true, + "peer": true + } + } + }, "@firebase/auth-interop-types": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.6.tgz", @@ -8962,11 +9487,161 @@ "@firebase/app-types": "0.6.2" } }, + "@firebase/firestore": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-1.17.1.tgz", + "integrity": "sha512-FJlNmFIBr9wrkA5g9JBPJWPmxYIzUhBDfsJGHNTUCxMbwm12pz/1Y6CW56kvZOgl6l+iPNlF911iduUDFzNUqw==", + "dev": true, + "requires": { + "@firebase/component": "0.1.19", + "@firebase/firestore-types": "1.13.0", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.2", + "@firebase/webchannel-wrapper": "0.3.0", + "@grpc/grpc-js": "^1.0.0", + "@grpc/proto-loader": "^0.5.0", + "node-fetch": "2.6.1", + "tslib": "^1.11.1" + }, + "dependencies": { + "@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", + "dev": true, + "requires": { + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + } + }, + "@firebase/util": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", + "dev": true, + "requires": { + "tslib": "^1.11.1" + } + }, + "@grpc/proto-loader": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.6.tgz", + "integrity": "sha512-DT14xgw3PSzPxwS13auTEwxhMMOoz33DPUKNtmYK/QYbBSpLXJy78FGGs5yVoxVobEqPm4iW9MOIoz0A3bLTRQ==", + "dev": true, + "requires": { + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + } + } + } + }, + "@firebase/firestore-types": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-1.13.0.tgz", + "integrity": "sha512-QF5CAuYOHE6Zbsn1uEg6wkl836iP+i6C0C/Zs3kF60eebxZvTWp8JSZk19Ar+jj4w+ye8/7H5olu5CqDNjWpEA==", + "dev": true, + "requires": {} + }, + "@firebase/installations": { + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.4.8.tgz", + "integrity": "sha512-J3tyKCdZ07LR0Bw3rs4CIsWia5exGt77fdbvqnhYa6K8YfIUPFLzsGRvlFJkoIhOMXfujfnC3O/DakROOgOltg==", + "dev": true, + "requires": { + "@firebase/component": "0.1.10", + "@firebase/installations-types": "0.3.3", + "@firebase/util": "0.2.45", + "idb": "3.0.2", + "tslib": "1.11.1" + }, + "dependencies": { + "@firebase/component": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.10.tgz", + "integrity": "sha512-Iy1+f8wp6mROz19oxWUd31NxMlGxtW1IInGHITnVa6eZtXOg0lxcbgYeLp9W3PKzvvNfshHU0obDkcMY97zRAw==", + "dev": true, + "requires": { + "@firebase/util": "0.2.45", + "tslib": "1.11.1" + } + }, + "@firebase/util": { + "version": "0.2.45", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.45.tgz", + "integrity": "sha512-k3IqXaIgwlPg7m5lXmMUtkqA/p+LMFkFQIqBuDtdT0iyWB6kQDokyjw2Sgd3GoTybs6tWqUKFZupZpV6r73UHw==", + "dev": true, + "requires": { + "tslib": "1.11.1" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + } + } + }, + "@firebase/installations-types": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.3.3.tgz", + "integrity": "sha512-XvWhPPAGeZlc+CfCA8jTt2pv19Jovi/nUV73u30QbjBbk5xci9bp5I29aBZukHsR6YNBjFCLSkLPbno4m/bLUg==", + "dev": true, + "requires": {} + }, "@firebase/logger": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" }, + "@firebase/messaging": { + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.6.14.tgz", + "integrity": "sha512-OuXbSGrNxhWYuHTGAjM55uTUMwsxd+S+fxj6OOyY26ezBOGj0tdPAHnAq+9wFwaItgAx8RUMjJF98Cc08PQqPA==", + "dev": true, + "requires": { + "@firebase/component": "0.1.10", + "@firebase/installations": "0.4.8", + "@firebase/messaging-types": "0.4.4", + "@firebase/util": "0.2.45", + "idb": "3.0.2", + "tslib": "1.11.1" + }, + "dependencies": { + "@firebase/component": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.10.tgz", + "integrity": "sha512-Iy1+f8wp6mROz19oxWUd31NxMlGxtW1IInGHITnVa6eZtXOg0lxcbgYeLp9W3PKzvvNfshHU0obDkcMY97zRAw==", + "dev": true, + "requires": { + "@firebase/util": "0.2.45", + "tslib": "1.11.1" + } + }, + "@firebase/util": { + "version": "0.2.45", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.45.tgz", + "integrity": "sha512-k3IqXaIgwlPg7m5lXmMUtkqA/p+LMFkFQIqBuDtdT0iyWB6kQDokyjw2Sgd3GoTybs6tWqUKFZupZpV6r73UHw==", + "dev": true, + "requires": { + "tslib": "1.11.1" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + } + } + }, + "@firebase/messaging-types": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@firebase/messaging-types/-/messaging-types-0.4.4.tgz", + "integrity": "sha512-JGtkr+1A1Dw7+yCqQigqBfGKtq0gTCruFScBD4MVjqZHiqGIYpnQisWnpGbkzPR6aOt6iQxgwxUhHG1ulUQGeg==", + "dev": true, + "requires": {} + }, "@firebase/util": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.1.0.tgz", @@ -8982,6 +9657,12 @@ } } }, + "@firebase/webchannel-wrapper": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.3.0.tgz", + "integrity": "sha512-VniCGPIgSGNEgOkh5phb3iKmSGIzcwrccy3IomMFRWPCMiCk2y98UQNJEoDs1yIHtZMstVjYWKYxnunIGzC5UQ==", + "dev": true + }, "@google-cloud/common": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.7.0.tgz", @@ -9082,7 +9763,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.3.6.tgz", "integrity": "sha512-v7+LQFbqZKmd/Tvf5/j1Xlbq6jXL/4d+gUtm2TNX4QiEC3ELWADmGr2dGlUyLl6aKTuYfsN72vAsO5zmavYkEg==", - "optional": true, + "devOptional": true, "requires": { "@types/node": ">=12.12.47" } @@ -9419,31 +10100,31 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=", - "optional": true + "devOptional": 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 + "devOptional": 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 + "devOptional": true }, "@protobufjs/eventemitter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=", - "optional": true + "devOptional": 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, + "devOptional": true, "requires": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" @@ -9453,31 +10134,31 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=", - "optional": true + "devOptional": true }, "@protobufjs/inquire": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=", - "optional": true + "devOptional": true }, "@protobufjs/path": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=", - "optional": true + "devOptional": 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 + "devOptional": 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 + "devOptional": true }, "@sinonjs/commons": { "version": "1.8.3", @@ -9561,6 +10242,12 @@ "@types/node": "*" } }, + "@types/cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==", + "dev": true + }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -9652,7 +10339,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", - "optional": true + "devOptional": true }, "@types/mime": { "version": "1.3.2", @@ -9707,6 +10394,25 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "dev": true }, + "@types/superagent": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.12.tgz", + "integrity": "sha512-1GQvD6sySQPD6p9EopDFI3f5OogdICl1sU/2ij3Esobz/RtL9fWZZDPmsuv7eiy5ya+XNiPAxUcI3HIUTJa+3A==", + "dev": true, + "requires": { + "@types/cookiejar": "*", + "@types/node": "*" + } + }, + "@types/supertest": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.11.tgz", + "integrity": "sha512-uci4Esokrw9qGb9bvhhSVEjd6rkny/dk5PK/Qz4yxKiyppEI+dOPlNrZBahE3i+PoKFYyDxChVXZ/ysS/nrm1Q==", + "dev": true, + "requires": { + "@types/superagent": "*" + } + }, "@types/yargs": { "version": "16.0.4", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz", @@ -9916,6 +10622,12 @@ "color-convert": "^2.0.1" } }, + "antlr4": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.7.2.tgz", + "integrity": "sha512-vZA1xYufXLe3LX+ja9rIVxjRmILb1x3k7KYZHltRbfJtXjJ1DlFIqt+CbPYmghx0EuzY9DajiDw+MdyEt1qAsQ==", + "dev": true + }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -10338,6 +11050,12 @@ "delayed-stream": "~1.0.0" } }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -10404,6 +11122,12 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -10568,6 +11292,13 @@ "esutils": "^2.0.2" } }, + "dom-storage": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", + "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==", + "dev": true, + "peer": true + }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -11225,6 +11956,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-safe-stringify": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.8.tgz", + "integrity": "sha512-lXatBjf3WPjmWD6DpIZxkeSsCOwqI0maYMpgDlx8g4U2qi4lbjA9oH/HD2a87G+KfsUmo5WbJFmqBZlPxtptag==", + "dev": true + }, "fast-text-encoding": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", @@ -11342,6 +12079,24 @@ "node-forge": "^0.10.0" } }, + "firebase-rules-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/firebase-rules-parser/-/firebase-rules-parser-2.0.1.tgz", + "integrity": "sha512-d3bUOmc7CkgSVcrpIoOdQGgcqffQJF2alJv0A7BwIsILgGNCORZKciqh0gj/oT8+kAoEan3+qkUocwB3E0oiQw==", + "dev": true, + "requires": { + "antlr4": "4.7.2", + "deepmerge": "3.2.0" + }, + "dependencies": { + "deepmerge": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.2.0.tgz", + "integrity": "sha512-6+LuZGU7QCNUnAJyX8cIrlzoEgggTM6B7mm+znKOX4t5ltluT9KLjN6g61ECMS0LTsLW7yDpNoxhix5FZcrIow==", + "dev": true + } + } + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -11374,6 +12129,12 @@ "mime-types": "^2.1.12" } }, + "formidable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", + "dev": true + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -11718,6 +12479,12 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "idb": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-3.0.2.tgz", + "integrity": "sha512-+FLa/0sTXqyux0o6C+i2lOR0VoS60LU/jzUo5xjfY6+7sEEgy4Gz1O7yFBXvjd7N0NyIGWIRg8DcQSLEG+VSPw==", + "dev": true + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -13083,7 +13850,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", - "optional": true + "devOptional": true }, "lodash.clonedeep": { "version": "4.5.0", @@ -13141,7 +13908,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", - "optional": true + "devOptional": true }, "lru-cache": { "version": "6.0.0", @@ -13290,6 +14057,52 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, + "mock-firebase-ts": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/mock-firebase-ts/-/mock-firebase-ts-2.6.2.tgz", + "integrity": "sha512-Edv/70nehsCAPtLVHQgjpMhQbbHV73eXuJ1TyWi6G2dVxnihT/qaXwFAVSQNJEwzP2fJOACsJIK+hiDSBJ8YKA==", + "dev": true, + "requires": { + "@firebase/app-types": "0.6.0", + "@firebase/auth": "0.14.4", + "@firebase/firestore": "1.17.1", + "@firebase/firestore-types": "1.13.0", + "@firebase/messaging": "0.6.14", + "@firebase/util": "0.2.45", + "antlr4": "4.7.2", + "firebase-rules-parser": "2.0.1", + "uuid": "8.0.0" + }, + "dependencies": { + "@firebase/app-types": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.0.tgz", + "integrity": "sha512-ld6rzjXk/SUauHiQZJkeuSJpxIZ5wdnWuF5fWBFQNPaxsaJ9kyYg9GqEvwZ1z2e6JP5cU9gwRBlfW1WkGtGDYA==", + "dev": true + }, + "@firebase/util": { + "version": "0.2.45", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.45.tgz", + "integrity": "sha512-k3IqXaIgwlPg7m5lXmMUtkqA/p+LMFkFQIqBuDtdT0iyWB6kQDokyjw2Sgd3GoTybs6tWqUKFZupZpV6r73UHw==", + "dev": true, + "requires": { + "tslib": "1.11.1" + } + }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==", + "dev": true + }, + "uuid": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz", + "integrity": "sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==", + "dev": true + } + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -13310,7 +14123,7 @@ "version": "2.6.1", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", - "optional": true + "devOptional": true }, "node-forge": { "version": "0.10.0", @@ -13664,7 +14477,7 @@ "version": "6.11.2", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.2.tgz", "integrity": "sha512-4BQJoPooKJl2G9j3XftkIXjoC9C0Av2NOrWmbLWT1vH32GcSUHjM0Arra6UfTsVyfMAuFzaLucXn1sadxJydAw==", - "optional": true, + "devOptional": true, "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -13797,7 +14610,7 @@ "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, + "devOptional": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14005,6 +14818,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -14140,7 +14964,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "optional": true, + "devOptional": true, "requires": { "safe-buffer": "~5.2.0" }, @@ -14149,7 +14973,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "optional": true + "devOptional": true } } }, @@ -14227,6 +15051,52 @@ "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=", "optional": true }, + "superagent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", + "dev": true, + "requires": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "dev": true + }, + "qs": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.1.tgz", + "integrity": "sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "supertest": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.1.4.tgz", + "integrity": "sha512-giC9Zm+Bf1CZP09ciPdUyl+XlMAu6rbch79KYiYKOGcbK2R1wH8h+APul1i/3wN6RF1XfWOIF+8X1ga+7SBrug==", + "dev": true, + "requires": { + "methods": "^1.1.2", + "superagent": "^6.1.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14595,7 +15465,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "optional": true + "devOptional": true }, "utils-merge": { "version": "1.0.1", @@ -14804,6 +15674,13 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=", + "dev": true, + "peer": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 0b88bd0..119f833 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@types/express": "^4.17.13", "@types/jest": "^26.0.24", "@types/node": "^16.3.3", + "@types/supertest": "^2.0.11", "@typescript-eslint/eslint-plugin": "^4.28.4", "@typescript-eslint/parser": "^4.28.4", "eslint": "^7.31.0", @@ -31,6 +32,8 @@ "eslint-plugin-import": "^2.23.4", "husky": "^7.0.0", "jest": "^27.0.6", + "mock-firebase-ts": "^2.6.2", + "supertest": "^6.1.4", "ts-jest": "^27.0.3", "ts-node-dev": "^1.1.8", "typescript": "^4.3.5" diff --git a/src/components/sentences/router.ts b/src/components/sentences/router.ts index 17be6ef..9e7e735 100644 --- a/src/components/sentences/router.ts +++ b/src/components/sentences/router.ts @@ -2,7 +2,6 @@ import { bodySchemaValidator } from '../../common/middlewares/bodySchemaValidato import { querySchemaValidator } from '../../common/middlewares/querySchemaValidator' import { createSchema, listSchema, updateSchema } from './schemas' import validator from '../../common/services/validatorService' -import { sentenceModel } from './sentenceModel' import { Router } from 'express' import { createSentenceController, @@ -11,16 +10,18 @@ import { listSentencesController, getSentenceController } from './controllers' -import db from '../../db' +import { CrudModel } from './interfaces/crudModel' +import { Sentence } from './interfaces/sentence' -const router = Router() -const model = sentenceModel(db) - -router.get('/:id', getSentenceController(model)) -router.get('/', querySchemaValidator(listSchema, validator), listSentencesController(model)) -router.post('/', bodySchemaValidator(createSchema, validator), createSentenceController(model)) -router.put('/:id', bodySchemaValidator(updateSchema, validator), updateSentenceController(model)) -router.delete('/:id', deleteSentenceController(model)) +const router = (model: CrudModel) => { + const router = Router() + router.get('/:id', getSentenceController(model)) + router.get('/', querySchemaValidator(listSchema, validator), listSentencesController(model)) + router.post('/', bodySchemaValidator(createSchema, validator), createSentenceController(model)) + router.put('/:id', bodySchemaValidator(updateSchema, validator), updateSentenceController(model)) + router.delete('/:id', deleteSentenceController(model)) + return router +} export default router diff --git a/src/components/translation/router.ts b/src/components/translation/router.ts index 2228f1c..5f6b0f2 100644 --- a/src/components/translation/router.ts +++ b/src/components/translation/router.ts @@ -1,16 +1,16 @@ import { bodySchemaValidator } from '../../common/middlewares/bodySchemaValidator' import { translationController } from './translationController' -import { translationModel } from './translationModel' import validator from '../../common/services/validatorService' import { translateBody } from './schemas' import { Router } from 'express' -import config from '../../config' -import axios from 'axios' +import { TranslationModel } from './interfaces/translationModel' -const router = Router() -const model = translationModel(axios, { key: config.deepl.key, url: config.deepl.url }) +const router = (model: TranslationModel) => { + const router = Router() + router.post('/', bodySchemaValidator(translateBody, validator), translationController(model)); + return router +} -router.post('/', bodySchemaValidator(translateBody, validator), translationController(model)); export default router diff --git a/src/server.ts b/src/server.ts index 775d8a8..9f169a4 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,24 +1,31 @@ +import { translationModel } from './components/translation/translationModel' +import { sentenceModel } from './components/sentences/sentenceModel' import express, { NextFunction, Request, Response } from 'express' import authMiddleware from './common/middlewares/authMiddleware' +import translationRouter from './components/translation/router' import { errorService } from './common/services/errorService' import sentenceRouter from './components/sentences/router' -import translationRouter from './components/translation/router' import viewsRouter from './components/view/router' import config from './config' +import axios from 'axios' +import db from './db' const { handle } = errorService() const app = express() + app.set('view engine', 'ejs') app.set('views', process.cwd() + '/src/views') app.use(express.json()) app.use(express.urlencoded({ extended: false })) // translation api -app.use('/api/v1/translate', authMiddleware(config.secret), translationRouter) +const trModel = translationModel(axios, { key: config.deepl.key, url: config.deepl.url }) +app.use('/api/v1/translate', authMiddleware(config.secret), translationRouter(trModel)) // sentences api -app.use('/api/v1/sentences', authMiddleware(config.secret), sentenceRouter) +const sModel = sentenceModel(db) +app.use('/api/v1/sentences', authMiddleware(config.secret), sentenceRouter(sModel)) // Public views app.use('/public', viewsRouter) // Redirect to home page diff --git a/test/app.test.ts b/test/app.test.ts index 39fc589..5dde70b 100644 --- a/test/app.test.ts +++ b/test/app.test.ts @@ -1,5 +1,28 @@ -describe('Dummy tests', () => { - it('1 + 1 equals 2', () => { - expect(1 + 1).toBe(2); +import sentencesData from './mock/sentences' +import supertest from 'supertest' +import app from './setup/app' +import { mockDb } from './mock/firebase' +import { mockConfig } from './mock/config' + +const request = supertest(app) + +beforeAll(() => { + // Create a fake Firestore with sentences + mockDb.mocker.loadCollection('sentences', sentencesData) +}) + +describe('Test sentences api', () => { + + it('can get sentence by Id', async () => { + expect.assertions(1) + const sentence = sentencesData['abc123'] + const result = await request + .get('/api/v1/sentences/abc123') + .set('Authorization', `Bearer ${mockConfig.secret}`) + expect(result.body).toMatchObject({ + success: true, + data: expect.objectContaining(sentence) + }) }); + }); diff --git a/test/mock/axios.ts b/test/mock/axios.ts new file mode 100644 index 0000000..99619ff --- /dev/null +++ b/test/mock/axios.ts @@ -0,0 +1,9 @@ +jest.mock('axios') + +import axios from 'axios' + +const mockAxios = axios as jest.Mocked + +mockAxios.create.mockReturnThis() + +export { mockAxios } \ No newline at end of file diff --git a/test/mock/config.ts b/test/mock/config.ts new file mode 100644 index 0000000..1979a38 --- /dev/null +++ b/test/mock/config.ts @@ -0,0 +1,9 @@ +const mockConfig = { + deepl: { + key: 'mockKey', + url: 'mockUrl' + }, + secret: 'patata' +} + +export { mockConfig } \ No newline at end of file diff --git a/test/mock/firebase.ts b/test/mock/firebase.ts new file mode 100644 index 0000000..b82ce9d --- /dev/null +++ b/test/mock/firebase.ts @@ -0,0 +1,11 @@ +import admin from 'firebase-admin'; + +import { mockFirebaseAdmin } from 'mock-firebase-ts'; + +const firebaseAdmin = mockFirebaseAdmin(); + +const app = firebaseAdmin.initializeApp({}) + +export const mockDb = app.firestore() + + diff --git a/test/mock/sentences.ts b/test/mock/sentences.ts new file mode 100644 index 0000000..cc2dc99 --- /dev/null +++ b/test/mock/sentences.ts @@ -0,0 +1,4 @@ +export default { + 'abc123': { text: 'Homer Simpson', category: 'humor' }, + 'abc456': { text: 'Lisa Simpson', category: 'humor' }, +} \ No newline at end of file diff --git a/test/setup/app.ts b/test/setup/app.ts new file mode 100644 index 0000000..4283cb9 --- /dev/null +++ b/test/setup/app.ts @@ -0,0 +1,27 @@ +import { translationModel } from '../../src/components/translation/translationModel' +import { sentenceModel } from '../../src/components/sentences/sentenceModel' +import authMiddleware from '../../src/common/middlewares/authMiddleware' +import translationRouter from '../../src/components/translation/router' +import { errorService } from '../../src/common/services/errorService' +import sentenceRouter from '../../src/components/sentences/router' +import express, { Request, Response, NextFunction } from 'express' +import { mockConfig } from '../mock/config' +import { mockAxios } from '../mock/axios' +import { mockDb } from '../mock/firebase' + +const { handle } = errorService() + +const app = express() + +app.use(express.json()) + +// translation api +const trModel = translationModel(mockAxios, { key: mockConfig.deepl.key, url: mockConfig.deepl.url }) +app.use('/api/v1/translate', authMiddleware('patata'), translationRouter(trModel)) +// sentences api +const sModel = sentenceModel(mockDb as any) +app.use('/api/v1/sentences', authMiddleware(mockConfig.secret), sentenceRouter(sModel)) +// Api error handling +app.use('/api/v1', (err: Error, _req: Request, res: Response, _next: NextFunction) => handle(err, res)) + +export default app \ No newline at end of file