diff --git a/config/default.yml b/config/default.yml index a050855..41b3e46 100644 --- a/config/default.yml +++ b/config/default.yml @@ -1,5 +1,5 @@ server: - port: 3300 + port: 3500 db: type: 'postgres' port: '5432' diff --git a/package-lock.json b/package-lock.json index 761ede7..69cde4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,8 +16,10 @@ "@nestjs/passport": "^7.1.6", "@nestjs/platform-express": "^7.6.13", "@nestjs/schedule": "^1.0.1", + "@nestjs/serve-static": "^4.0.0", "@nestjs/typeorm": "^7.1.5", "@types/passport-facebook": "^2.1.11", + "archiver": "^5.3.1", "bcrypt": "^5.0.0", "class-transformer": "^0.4.0", "class-validator": "^0.13.1", @@ -1812,6 +1814,147 @@ "@nestjs/core": "^7.0.0" } }, + "node_modules/@nestjs/platform-express/node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@nestjs/platform-express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/@nestjs/platform-express/node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@nestjs/platform-express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/@nestjs/platform-express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/@nestjs/platform-express/node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@nestjs/platform-express/node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/@nestjs/platform-express/node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/@nestjs/schedule": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@nestjs/schedule/-/schedule-1.1.0.tgz", @@ -1932,6 +2075,37 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/@nestjs/serve-static": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-4.0.0.tgz", + "integrity": "sha512-8cTrNV2ngdHIjiLNsXePnw0+KY1ThrZGz/WeyAG5gIvmZNDbnZBOrPoYlKL+MOzlXlQStxR5jKLYmn+nJeoncQ==", + "dependencies": { + "path-to-regexp": "0.2.5" + }, + "peerDependencies": { + "@fastify/static": "^6.5.0", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "express": "^4.18.1", + "fastify": "^4.7.0" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "express": { + "optional": true + }, + "fastify": { + "optional": true + } + } + }, + "node_modules/@nestjs/serve-static/node_modules/path-to-regexp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", + "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" + }, "node_modules/@nestjs/testing": { "version": "7.6.18", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-7.6.18.tgz", @@ -2946,6 +3120,70 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, + "node_modules/archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "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" + } + }, + "node_modules/archiver-utils/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -3074,6 +3312,11 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3404,7 +3647,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -3529,7 +3771,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -3549,6 +3790,14 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, "node_modules/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", @@ -4213,6 +4462,20 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, + "node_modules/compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4293,16 +4556,39 @@ } }, "node_modules/content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "optional": true, + "peer": true, "dependencies": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" }, "engines": { "node": ">= 0.6" } }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "peer": true + }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -4321,9 +4607,11 @@ } }, "node_modules/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "optional": true, + "peer": true, "engines": { "node": ">= 0.6" } @@ -4388,6 +4676,29 @@ "node": ">=8" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -4692,9 +5003,15 @@ } }, "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } }, "node_modules/detect-libc": { "version": "2.0.1", @@ -4925,7 +5242,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "dependencies": { "once": "^1.4.0" } @@ -5564,37 +5880,40 @@ } }, "node_modules/express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "optional": true, + "peer": true, "dependencies": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -5603,23 +5922,184 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "optional": true, + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "peer": true, "dependencies": { "ms": "2.0.0" } }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "optional": true, + "peer": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "optional": true, + "peer": true + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "optional": true, + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "optional": true, + "peer": true + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "optional": true, + "peer": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "optional": true, + "peer": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "peer": true + }, + "node_modules/express/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "optional": true, + "peer": true + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.6" + } }, "node_modules/extend": { "version": "3.0.2", @@ -5841,35 +6321,64 @@ } }, "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "optional": true, + "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "peer": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "optional": true, + "peer": true + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "optional": true, + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -6033,6 +6542,11 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -8348,6 +8862,44 @@ "node": ">=0.10.0" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "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" + } + }, + "node_modules/lazystream/node_modules/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==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -8446,6 +8998,11 @@ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, "node_modules/lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", @@ -8538,6 +9095,11 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -9144,7 +9706,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10397,6 +10958,33 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -11128,23 +11716,25 @@ } }, "node_modules/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "optional": true, + "peer": true, "dependencies": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" @@ -11154,6 +11744,8 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "peer": true, "dependencies": { "ms": "2.0.0" } @@ -11161,12 +11753,83 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "optional": true, + "peer": true + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "optional": true, + "peer": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "optional": true, + "peer": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "optional": true, + "peer": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "optional": true, + "peer": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.6" + } }, "node_modules/serialize-javascript": { "version": "6.0.0", @@ -11178,14 +11841,16 @@ } }, "node_modules/serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "optional": true, + "peer": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -12264,6 +12929,21 @@ "node": ">= 10" } }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tar/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -13949,6 +14629,19 @@ "@types/zen-observable": "0.8.3", "zen-observable": "0.8.15" } + }, + "node_modules/zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "dependencies": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } } }, "dependencies": { @@ -15309,6 +16002,133 @@ "express": "4.17.1", "multer": "1.4.2", "tslib": "2.2.0" + }, + "dependencies": { + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + } } }, "@nestjs/schedule": { @@ -15400,6 +16220,21 @@ } } }, + "@nestjs/serve-static": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-4.0.0.tgz", + "integrity": "sha512-8cTrNV2ngdHIjiLNsXePnw0+KY1ThrZGz/WeyAG5gIvmZNDbnZBOrPoYlKL+MOzlXlQStxR5jKLYmn+nJeoncQ==", + "requires": { + "path-to-regexp": "0.2.5" + }, + "dependencies": { + "path-to-regexp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", + "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" + } + } + }, "@nestjs/testing": { "version": "7.6.18", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-7.6.18.tgz", @@ -16232,6 +17067,66 @@ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" }, + "archiver": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.1.tgz", + "integrity": "sha512-8KyabkmbYrH+9ibcTScQ1xCJC/CGcugdVIwB+53f5sZziXgwUh3iXlAlANMxcZyDEfTHMe6+Z5FofV8nopXP7w==", + "requires": { + "archiver-utils": "^2.1.0", + "async": "^3.2.3", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.0.0", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + } + }, + "archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "requires": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -16330,6 +17225,11 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -16584,7 +17484,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -16686,12 +17585,16 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, "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", @@ -17208,6 +18111,17 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, + "compress-commons": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.1.tgz", + "integrity": "sha512-QLdDLCKNV2dtoTorqgxngQCMA+gWXkM/Nwu7FpeBhk/RdkzimqC3jueb/FDmaZeXh+uby1jkBqE3xArsLBE5wQ==", + "requires": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -17284,11 +18198,22 @@ } }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "optional": true, + "peer": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "5.2.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "optional": true, + "peer": true + } } }, "content-type": { @@ -17306,9 +18231,11 @@ } }, "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "optional": true, + "peer": true }, "cookie-signature": { "version": "1.0.6", @@ -17359,6 +18286,20 @@ "yaml": "^1.7.2" } }, + "crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==" + }, + "crc32-stream": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz", + "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==", + "requires": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -17596,9 +18537,11 @@ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" }, "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "optional": true, + "peer": true }, "detect-libc": { "version": "2.0.1", @@ -17791,7 +18734,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -18269,59 +19211,178 @@ } }, "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "optional": true, + "peer": true, "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.0", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.1.2", + "finalhandler": "1.2.0", "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" }, "dependencies": { + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "optional": true, + "peer": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "optional": true, + "peer": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "peer": true, "requires": { "ms": "2.0.0" } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "optional": true, + "peer": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "optional": true, + "peer": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "optional": true, + "peer": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "optional": true, + "peer": true, + "requires": { + "ee-first": "1.1.1" + } }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "optional": true, + "peer": true + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "optional": true, + "peer": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "optional": true, + "peer": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "optional": true, + "peer": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "optional": true, + "peer": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "optional": true, + "peer": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "optional": true, + "peer": true } } }, @@ -18507,16 +19568,18 @@ } }, "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "optional": true, + "peer": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "~2.3.0", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~1.5.0", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "dependencies": { @@ -18524,6 +19587,8 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "peer": true, "requires": { "ms": "2.0.0" } @@ -18531,7 +19596,26 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "optional": true, + "peer": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "optional": true, + "peer": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "optional": true, + "peer": true } } }, @@ -18648,6 +19732,11 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", @@ -20436,6 +21525,43 @@ "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", "optional": true }, + "lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "requires": { + "readable-stream": "^2.0.5" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -20519,6 +21645,11 @@ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" }, + "lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==" + }, "lodash.filter": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", @@ -20611,6 +21742,11 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==" + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -21098,8 +22234,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "npm-run-path": { "version": "4.0.1", @@ -22074,6 +23209,32 @@ "util-deprecate": "^1.0.1" } }, + "readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "requires": { + "minimatch": "^5.1.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "readdirp": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", @@ -22631,29 +23792,33 @@ } }, "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "optional": true, + "peer": true, "requires": { "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", + "depd": "2.0.0", + "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.7.2", + "http-errors": "2.0.0", "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", + "ms": "2.1.3", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~1.5.0" + "statuses": "2.0.1" }, "dependencies": { "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "optional": true, + "peer": true, "requires": { "ms": "2.0.0" }, @@ -22661,14 +23826,70 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "optional": true, + "peer": true } } }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "optional": true, + "peer": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "optional": true, + "peer": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "optional": true, + "peer": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "optional": true, + "peer": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "optional": true, + "peer": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "optional": true, + "peer": true + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "optional": true, + "peer": true } } }, @@ -22682,14 +23903,16 @@ } }, "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "optional": true, + "peer": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.17.1" + "send": "0.18.0" } }, "set-blocking": { @@ -23530,6 +24753,18 @@ } } }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -24731,6 +25966,16 @@ "@types/zen-observable": "0.8.3", "zen-observable": "0.8.15" } + }, + "zip-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", + "integrity": "sha512-zshzwQW7gG7hjpBlgeQP9RuyPGNxvJdzR8SUM3QhxCnLjWN2E7j3dOvpeDcQoETfHx0urRS7EtmVToql7YpU4A==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^4.1.0", + "readable-stream": "^3.6.0" + } } } } diff --git a/package.json b/package.json index 149b0e8..1374db2 100644 --- a/package.json +++ b/package.json @@ -28,8 +28,10 @@ "@nestjs/passport": "^7.1.6", "@nestjs/platform-express": "^7.6.13", "@nestjs/schedule": "^1.0.1", + "@nestjs/serve-static": "^4.0.0", "@nestjs/typeorm": "^7.1.5", "@types/passport-facebook": "^2.1.11", + "archiver": "^5.3.1", "bcrypt": "^5.0.0", "class-transformer": "^0.4.0", "class-validator": "^0.13.1", diff --git a/src/app.module.ts b/src/app.module.ts index 942de7e..7eefed9 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,13 +5,16 @@ import { typeOrmConfig } from './config/typeorm.config'; import { AuthModule } from './auth/auth.module'; import { FileUploadModule } from './file-upload/file-upload.module'; import { ScheduleModule } from '@nestjs/schedule'; -import { TenderDetailsModule } from './tender-master/tender-details.module'; +import { TenderDetailsModule } from './tables/tender-master/tender-details.module'; import { FormOfContractModule } from './tables/form-of-contract/form-of-contract.module'; import { PaymentModeModule } from './tables/payment-mode/payment-mode.module'; import { TenderTypeModule } from './tables/tender-type/tender-type.module'; import { ProductCategoryModule } from './tables/product-category/product-category.module'; import { TenderCategoryModule } from './tables/tender-category/tender-category.module'; import { EmdFeeTypeModule } from './tables/emd-fee-type/emd-fee-type.module'; +import { TenderModule } from './transactions/tender/tender.module'; +import { TenderDocModule } from './tables/tender-documents/tender-doc.module'; +import { DocumentTypeModule } from './tables/document-type/document-type.module'; @@ -29,6 +32,10 @@ import { EmdFeeTypeModule } from './tables/emd-fee-type/emd-fee-type.module'; ProductCategoryModule, TenderCategoryModule, EmdFeeTypeModule, + TenderModule, + TenderDocModule, + DocumentTypeModule, + ], }) diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 74ff40b..0e1568b 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -48,22 +48,18 @@ export class AuthController { - // @Post('/signup') - // async signUp(@Body(ValidationPipe) signUp: TempSignUpDto): Promise { - // // request.connection.remoteAddress - // console.log("hello"); + @Post('/signup') + async signUp(@Body() pcdUserDto: PcduserDto): Promise { + // request.connection.remoteAddress + console.log("hello"); - // return this.authService.tempSignUp(signUp); - // } + return this.authService.tempSignUp(pcdUserDto); + } @Post('/forgot-password') async forgotPassword( - @Body() body: { pass: string, mobNo: string }, + @Body() body: { pass: string, email: string ,otp:string }, ): Promise { - - console.log("mobile",body.mobNo); - - return await this.authService.forgotPassword(body); } diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 9236c2f..a900dfb 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -9,7 +9,7 @@ import { AuthCreadentialsDto } from './dto/auth-credentials.dto'; import { TokenDto } from './dto/token.dto'; import { JwtPayload } from './jwt-payload.interface'; import { PcduserDto } from 'src/auth/dto/pcd-user.dto'; -import { Connection, createConnection, FindManyOptions, getConnection, getCustomRepository, In, IsNull, Not, QueryRunner } from 'typeorm'; +import { Connection, createConnection, FindManyOptions, getConnection, getCustomRepository, In, IsNull, Like, Not, QueryRunner } from 'typeorm'; import { TempSignUpDto } from './dto/temp-sign-up.dto'; import { PcduserRepository } from './pcduser.repository'; import { InjectRepository } from '@nestjs/typeorm'; @@ -52,15 +52,16 @@ export class AuthService { async getAll() { return await this.pcduserRepository.find(); } - + async userInfo(authCredentialsDto: AuthCreadentialsDto){ - const { username } = authCredentialsDto; - let user = await this.pcduserRepository.findOne({ mobileNumber: (username.trim()).toLocaleLowerCase() }); + const { username ,secuLevel } = authCredentialsDto; + let user = await this.pcduserRepository.findOne({ email: (username.trim()).toLocaleLowerCase() }); if(!user){ throw new BadRequestException('User Details not found') } if(user){ - return {username:user.userName} + // authCredentialsDto.secuLevel = user.secuLevel + return {username:user.userName ,secuLevel:user.secuLevel} } @@ -81,7 +82,7 @@ export class AuthService { async validateUserPassword(authCredentialsDto: AuthCreadentialsDto): Promise { const { username, password} = authCredentialsDto; - let user = await this.pcduserRepository.findOne({ mobileNumber: (username.trim()).toLocaleLowerCase() }); + let user = await this.pcduserRepository.findOne({ email: (username.trim()).toLocaleLowerCase() }); console.log("user=============", user); if (!user) { throw new UnauthorizedException('User not Registered') @@ -96,26 +97,34 @@ export class AuthService { } } - async forgotPassword(body: { pass: string, mobNo: string, }): Promise { - let iuserData: PcduserDto = await this.pcduserRepository.findOne({ where: { mobileNumber: body.mobNo } }); - console.log("iuserdata", iuserData.deviceId); + async forgotPassword(body: { pass: string, email: string, otp:string }): Promise { + let iuserData: PcduserDto = await this.pcduserRepository.findOne({ where: { email: body.email } }); + console.log("iuserdata",iuserData); + + const filter: FindManyOptions = { where: { "refCode": body.email, "status": "I" }, order: { code: "DESC" } }; + const newOtp = await this.pcdotpRepository.find(filter); - + if(body.otp != newOtp[0].otp){ + throw new UnauthorizedException('Unauthorized Access') + } + const salt = await bcrypt.genSalt(); iuserData.salt = salt; - iuserData.pass = await this.pcduserRepository.encryptPassword(body.pass, salt); + iuserData.pass = await bcrypt.hash(body.pass, salt); + console.log("salt",iuserData.salt); + console.log("pass",iuserData.pass); + try { await this.pcduserRepository.save(iuserData); } catch (err) { - throw new BadRequestException("Error in Password creation"); + throw new BadRequestException("Error in Password Reset"); } - - } async sendMail(email: string, data: string, flag: string) { + let content: string; let subject: string = "Login Credentials"; if (flag == 'otp') { @@ -123,16 +132,14 @@ export class AuthService { subject = 'OTP' } - // if (flag == 'pwd') { - // content = `Your New Password for Accurate Application Registration is, ${data}`; - // subject = 'New Password' - // } - // if (flag == 'fpwd') { - // content = `Your one time password(OTP) for Password reset is, ${data}`; - // subject = 'OTP' - // } + + if (flag == 'fpwd') { + content = `Your one time password(OTP) for Password reset is, ${data}`; + subject = 'OTP' + } await this.mailService.sendMail(email, subject, content, content); + } @@ -146,16 +153,20 @@ export class AuthService { console.log("isUserExist",isUserExist); - + if(!isUserExist){ + throw new BadRequestException("User not found"); + } if (flag == 'R' && isUserExist) { throw new BadRequestException("Already registered with this email Id."); }else{ let newOtp = await this.generateOtp(body.email, flag); - - if (body.email && flag == 'R') { await this.sendMail(body.email, newOtp, 'otp'); } + if (body.email && flag == 'F') { + await this.sendMail(body.email, newOtp, 'fpwd'); + } + } } err => { @@ -165,22 +176,45 @@ export class AuthService { } - } - - - // async duplicateCheckingEmail(email: string, flag: string, filter?: FindManyOptions): Promise { - - // const isUserExist = await this.pcduserRepository.findOne({ where: { email: email } }); - // if (isUserExist && flag == 'F') - // return isUserExist; - // if (isUserExist && flag == 'R') - // return isUserExist; - // else if (isUserExist && flag == 'P') - // throw new BadRequestException(`Already registered with this email Id - ${isUserExist.email}`); + + async tempSignUp(pcdUserDto: PcduserDto): Promise { + const filter: FindManyOptions = { where: { "refCode": pcdUserDto.email, "status": "I" }, order: { code: "DESC" } }; + const newOtp = await this.pcdotpRepository.find(filter); + const existingUser = await this.pcduserRepository.findOne({ where: { email: pcdUserDto.email } }); + if (existingUser) { + throw new BadRequestException('User Already Exists'); + } + if (pcdUserDto.otp != newOtp[0].otp) { + throw new UnauthorizedException('Unauthorized Access'); + } + + + //Creating Random User_Id for every user registered + const lastUser: PcduserDto = await this.pcduserRepository.findOne({ + where: {}, + order: { userId: 'DESC' }, + }); + let maxCode = 10000; + if (lastUser && lastUser.userId) { + const lastUserId = parseInt(lastUser.userId); + maxCode = Math.max(maxCode, lastUserId); + } + const newUserId = String(maxCode + 1).padStart(5, '0'); + ///////////////////////////////////////////////////////////// + + pcdUserDto.userId = newUserId; + const salt = await bcrypt.genSalt(); + pcdUserDto.salt = salt; + pcdUserDto.pass = await bcrypt.hash(pcdUserDto.pass, salt); + pcdUserDto.secuLevel = 'U'; + delete pcdUserDto['otp']; + await this.pcduserRepository.save(pcdUserDto); + this.logger.verbose("User created with email:", pcdUserDto.email); + return { data: "Successfully Registered" }; + } - // } async verifyOtp(body: { otp: string, email: string }, flag: string): Promise { @@ -272,77 +306,7 @@ export class AuthService { } - // async updateUser(body: PcduserDto, user: PcduserDto, id: string): Promise { - - // const updatedUser = await this.pcduserRepository.findOne(id); - // if (updatedUser) { - // await this.duplicateCheckingUser(body, 'U'); - // updatedUser.userName = body.userName; - // // updatedUser.email = body.email; - // updatedUser.mobileNumber = body.mobileNumber; - // updatedUser.modifiedBy = user.userId; - // updatedUser.userImagePath = body.userImagePath; - // updatedUser.memberNo = body.memberNo; - // for (let eagerCol of await this.pcduserRepository.getEagerColumns()) { - // delete body[eagerCol]; - // } - - // try { - // delete updatedUser["pass"]; - // delete updatedUser["salt"]; - // delete updatedUser["refreshtoken"]; - // return await this.pcduserRepository.save(updatedUser); - // } catch (error) { - - // console.log("====error====", error); - // throw new BadRequestException(error.message); - // } - // } - // else - // throw new BadRequestException("User does not Exist"); - // } - - // async duplicateCheckingUser(body: PcduserDto, flag: string): Promise { - // let existingUser: PcduserDto; - // if (flag == 'I') { - // let existingIgUser: PcduserDto = await this.pcduserRepository.findOne({ where: { email: body.email } }); - // if (existingIgUser) - // throw new BadRequestException(`User with same Email exist`); - // existingUser = await this.pcduserRepository.findOne({ where: [{ "userId": body.userId }, { "email": body.email }, { "mobileNumber": body.mobileNumber }] }); - // } - // else { - // existingUser = await this.pcduserRepository.findOne({ where: [{ "userId": (body.userId), "email": body.email }, { "userId": Not(body.userId), "mobileNumber": body.mobileNumber }] }); - // } - // if (existingUser) { - // if (flag == 'I' && existingUser.userId == body.userId) - // throw new BadRequestException(`Duplication in UserId ${body.userId}`); - // if (existingUser.email == body.email) - // throw new BadRequestException(`Duplication in Email ${body.email}`); - // } - - // } - - - // async googleSignIn(mediaData: any, ip?: string): Promise { - // const iuser: IuserDto = await this.iuserRepository.findOne({ email: mediaData.email }); - // if (!iuser) { - // throw new UnauthorizedException('User Not registered..'); - // } - - // return await this.generateTokens(iuser, iuser.userName, ip, ""); //specify the module here - // } - - // async getVersion(): Promise<{ versionNo: string }> { - // const result = { versionNo: config.get('version').versionNo }; - // return result; - // } - // async createConnection(bankcode: string) { - // return await connectOraDatabase(bankcode); - // } - // async closeConnection(connection) { - // await closeOraConnection(connection); - // } /* The below method is used for generating the access token and refresh token when login */ async generateTokens(user: PcduserDto, username: string, ip: string, module: string, changePassword?: string): Promise { @@ -359,150 +323,10 @@ export class AuthService { return result; } - // async changePasswordManual(newPassword: ChangePasswordDto, id: string, user: PcduserDto, type?): Promise<{ msg: string, status: string }> { - // let salt = await bcrypt.genSalt(); - // const selectedUser = await this.pcduserRepository.findOne(id); - // console.log('newPassword=====', newPassword); - // console.log('type=====', type); - // if (!newPassword || !newPassword.pass || !newPassword.pass.toString()) - // throw new BadRequestException("Password can't be null"); - // if (type == 'T') { - - // selectedUser.tSalt = salt; - // selectedUser.tPass = await this.hashPassword(newPassword.pass, salt); - // } else if (type == 'A') { - - // selectedUser.tSalt = salt; - // selectedUser.tPass = await this.hashPassword(newPassword.tpass, salt); - // salt = await bcrypt.genSalt(); - // selectedUser.salt = salt; - // selectedUser.pass = await this.hashPassword(newPassword.pass, salt); - // } - // else { - - // selectedUser.salt = salt; - // selectedUser.pass = await this.hashPassword(newPassword.pass, salt); - // } - - // try { - // await this.pcduserRepository.save(selectedUser); - // return { msg: "Your password changed sucessfully.", status: "Y" } - // } catch (error) { - // // if(error.code==23505) not working in orcale - // console.log("====error====", error); - // throw new BadRequestException(error.message); - // } - - // } - - - - - // async changePasswordEmail(id: string, user: PcduserDto, body: PcduserDto): Promise<{ msg: string }> { - // const salt = await bcrypt.genSalt(); - // const selectedUser = await this.pcduserRepository.findOne(id); - // if (!selectedUser) - // throw new BadRequestException("No such user exist"); - // selectedUser.salt = salt; - // const password: string = generate({ length: 10, lowercase: true, numbers: true, uppercase: true }); - // selectedUser.pass = await this.hashPassword(password, salt); - // try { - // await this.iuserRepository.save(selectedUser); - - // await this.sendMail(selectedUser.email, password); - // await this.smsService.sendSms(selectedUser.mobileNumber, "Please check your email for new password"); - // return { msg: "Please check your email for new password" }; - // } catch (error) { - // // if(error.code==23505) not working in orcale - // console.log("====error====", error); - // throw new BadRequestException(error.message); - // } - - // } - - // async changePasswordCurrentUser(passwords: { currentPwd: string, pass: string, deviceId?: string }, id: string, user: PcduserDto): Promise<{ msg: string, status: string }> { - // let authcredentialsDto = new AuthCreadentialsDto(); - - // authcredentialsDto.password = passwords.currentPwd; - // authcredentialsDto.username = user.mobileNumber; - // authcredentialsDto.deviceId = passwords.deviceId; - // const currentUser = await this.validateUserPassword(authcredentialsDto); - // console.log(currentUser); - - // if (currentUser) { - - /* const connection = await this.createConnection(user.bankId); - try { - - let mobCustQuery = `SELECT CUST_ID "cust",mcode||'/'||memno "custId" ,CUST_NAME "custName" ,MOBILE "mobile",decript_pwd(mpin) as "mPin", - decript_pwd(nvl(tpin,mpin)) as "tPin",'001' "bankId" - FROM PACS_MOB_CUST PMC WHERE PMC.MOBILE = '${user.mobileNumber}' AND PMC.ISACTIVE = '1'` - const mobCustData = await connection.execute(mobCustQuery, [], { outFormat: oracledb.OBJECT }); - console.log(mobCustData.rows[0]); - if (mobCustData.rows[0]?.mPin == passwords.pass) { - return { msg: "Generated Password Cannot be same as New Password", status:"N" } - } - - - } - catch (err) { - console.log(err) - } finally { - this.closeConnection(connection) - }*/ - - // return await this.changePasswordManual(passwords, user.userId, user, 'P'); - // } - - // } - - // async changeTransactionPinCurrentUser(passwords: { currentPwd: string, pass: string, deviceId?: string }, id: string, user: PcduserDto): Promise<{ msg: string }> { - // let authcredentialsDto = new AuthCreadentialsDto(); - - // authcredentialsDto.password = passwords.currentPwd; - // authcredentialsDto.username = user.mobileNumber; - // authcredentialsDto.deviceId = passwords.deviceId - // const currentUser = await this.validateTransactionPassword(authcredentialsDto); - - // if (currentUser) { - // return await this.changePasswordManual(passwords, user.userId, user, 'T'); - // } - // } - // async changeTransactionPinMpinCurrentUser(passwords: ChangePasswordDto): Promise<{ msg: string }> { - // let authcredentialsDto = new AuthCreadentialsDto(); - // let user: PcduserDto - // user = await this.pcduserRepository.findOne({ mobileNumber: passwords.mobNo }); - - // console.log("changebothpin"); - - // authcredentialsDto.password = passwords.pass; - // authcredentialsDto.username = user.mobileNumber; - // authcredentialsDto.deviceId = passwords.deviceId; - // // authcredentialsDto.tpassword = passwords.tpass; - // // const currentUser = await this.validateUserPassword(authcredentialsDto); - // // console.log("currentuser", currentUser); - - // if (user) { - - - // return await this.changePasswordManual(passwords, user.userId, user, 'A'); - // } - - // } - + private async hashPassword(password: string, salt: string): Promise { return await bcrypt.hash(password, salt); } - // async googleSignIn(mediaData: any, ip?: string): Promise { - // let pcduser: PcduserDto; - // pcduser = await this.pcduserRepository.findOne({ email: mediaData.email }); - // if (!pcduser) { - // // pcduser = await this.tempSignUp({ email: mediaData.email, username: mediaData.name, password: '' }) - // // throw new UnauthorizedException('User Not registered..'); - // } - - // return await this.generateTokens(pcduser, pcduser.userName, ip, ""); //specify the module here - // } - + } \ No newline at end of file diff --git a/src/auth/dto/auth-credentials.dto.ts b/src/auth/dto/auth-credentials.dto.ts index 454a904..332661d 100644 --- a/src/auth/dto/auth-credentials.dto.ts +++ b/src/auth/dto/auth-credentials.dto.ts @@ -16,4 +16,6 @@ export class AuthCreadentialsDto { email: string; + secuLevel: any; + } \ No newline at end of file diff --git a/src/auth/dto/pcd-user.dto.ts b/src/auth/dto/pcd-user.dto.ts index 2202e77..1b53126 100644 --- a/src/auth/dto/pcd-user.dto.ts +++ b/src/auth/dto/pcd-user.dto.ts @@ -35,4 +35,6 @@ export class PcduserDto { tSalt: string | null; deviceId:string; + + otp?:string; } \ No newline at end of file diff --git a/src/auth/dto/temp-sign-up.dto.ts b/src/auth/dto/temp-sign-up.dto.ts index 66377e8..7a6b189 100644 --- a/src/auth/dto/temp-sign-up.dto.ts +++ b/src/auth/dto/temp-sign-up.dto.ts @@ -19,13 +19,10 @@ export class TempSignUpDto { @IsString() @MinLength(4) @MaxLength(20) - // @Matches(/((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$/, - // { message: 'password is too weak' } - // ) password: string; tpassword?: string; - // @IsIn(["T","C"]) - // userCategory: string; + mobile?:string; + } \ No newline at end of file diff --git a/src/auth/dto/token.dto.ts b/src/auth/dto/token.dto.ts index d959785..fb823b4 100644 --- a/src/auth/dto/token.dto.ts +++ b/src/auth/dto/token.dto.ts @@ -9,4 +9,6 @@ export class TokenDto { module: string; changePassword?:string + + secuLevel?:string } \ No newline at end of file diff --git a/src/auth/pcduser.entity.ts b/src/auth/pcduser.entity.ts index 3a2929d..b4d1efa 100644 --- a/src/auth/pcduser.entity.ts +++ b/src/auth/pcduser.entity.ts @@ -9,7 +9,7 @@ export class Pcduser extends PcdBaseEntity { name: "user_id", primary: true, type: "varchar", - length: 12 + length: 12, }) userId: string; @Column({ @@ -111,7 +111,8 @@ export class Pcduser extends PcdBaseEntity { @Column({ name: "device_id", - type: "varchar" + type: "varchar", + nullable: true, }) deviceId:string; @@ -132,6 +133,7 @@ export class Pcduser extends PcdBaseEntity { }) bankId: string; @Column({ + nullable:true, name: "t_pass", type: "varchar", length: 500 @@ -147,20 +149,15 @@ export class Pcduser extends PcdBaseEntity { }) tSalt: string | null; async validatePassword(password: string,user ): Promise { - if((user.deviceId==='null' || user.deviceId==="" || user.deviceId === undefined) && (user.bankId !='acc1' && user.bankId != 'sims')){ - throw new BadRequestException("Device not Registered.Please Register"); - }else{ const hash = await bcrypt.hash(password, this.salt); return hash === this.pass; - - } } - async validateTransactionPassword(password: string): Promise { - const hash = await bcrypt.hash(password, this.tSalt); - return hash === this.tPass; + // async validateTransactionPassword(password: string): Promise { + // const hash = await bcrypt.hash(password, this.tSalt); + // return hash === this.tPass; - } + // } } \ No newline at end of file diff --git a/src/dto/document-type.dto.ts b/src/dto/document-type.dto.ts new file mode 100644 index 0000000..edb4c90 --- /dev/null +++ b/src/dto/document-type.dto.ts @@ -0,0 +1,5 @@ +export class DocumentTypeDto{ + id:number; + + documentType:string; +} \ No newline at end of file diff --git a/src/dto/tender-document.dto.ts b/src/dto/tender-document.dto.ts new file mode 100644 index 0000000..d8131d2 --- /dev/null +++ b/src/dto/tender-document.dto.ts @@ -0,0 +1,12 @@ +export class TenderDocumentDto{ + + tender_id:string; + + doc_name:string; + + description:string; + + doc_type:string; + + doc_size:number; +} \ No newline at end of file diff --git a/src/file-upload/file-upload.controller.ts b/src/file-upload/file-upload.controller.ts index 7e0b1a1..fa7c609 100644 --- a/src/file-upload/file-upload.controller.ts +++ b/src/file-upload/file-upload.controller.ts @@ -1,12 +1,18 @@ -import { Controller, Get, Param, Post, Req, Res, UploadedFile, UseGuards, UseInterceptors } from '@nestjs/common'; +import { BadRequestException, Controller, Get, Param, Post, Req, Res, UploadedFile, UseGuards, UseInterceptors } from '@nestjs/common'; +import { AuthGuard } from '@nestjs/passport'; import { FileInterceptor } from '@nestjs/platform-express'; import { existsSync, mkdirSync } from 'fs'; import { diskStorage } from 'multer'; import { extname } from 'path'; +import { GetUser } from 'src/auth/dto/get-user.decorator'; import { FileUploadService } from './file-upload.service'; - +import * as fs from 'fs'; +import * as archiver from 'archiver'; +import * as path from 'path'; export function createFolders(filePath: string) { + + const splitPath = filePath.split('/'); splitPath.reduce((path, subPath) => { let currentPath; @@ -27,6 +33,146 @@ export function createFolders(filePath: string) { @Controller('file-upload') + export class FileUploadController { + constructor( + private iservice: FileUploadService + ) { + } + + @Post('user-documents/:id') + @UseInterceptors(FileInterceptor('file', { + storage: diskStorage({ + destination: (req, res, cb) => { + const filePath: string = './uploads/userDocuments/'+req.params.id; + createFolders(filePath); + return cb(null, filePath); + }, + filename: (req, file, cb) => { + console.log('===here===file upload=='); + const randomName = Array(32).fill(null).map(() => (Math.round(Math.random() * 16)).toString(16)).join(''); + return cb(null, `${randomName}${extname(file.originalname)}`); + } + }) + })) + userDoc(@UploadedFile() file) { + return { fileName: file.filename, filePath: file.path }; + } + + + @Post('Bank-documents/:id') + @UseInterceptors(FileInterceptor('file', { + storage: diskStorage({ + // destination: './uploads/cars', + destination: (req, res, cb) => { + // console.log(req); + + const filePath: string = './uploads/BankDocuments/'+req.params.id; + createFolders(filePath); + return cb(null, filePath); + }, + filename: (req, file, cb) => { + console.log('===here===file upload=='); + const randomName = Array(32).fill(null).map(() => (Math.round(Math.random() * 16)).toString(16)).join(''); + return cb(null, `${randomName}${extname(file.originalname)}`); + } + }) + })) + bankDoc(@UploadedFile() file) { + if (!file) { + return { error: 'No file uploaded.' }; + } + //To return the size of the document in kb + const fileSizeKB = Math.ceil(file.size / 1024); + return { fileName: file.filename, filePath: file.path, fileSizeKB }; + } + + + @Get('Bank-Documents/:id/:imgpath') + getBankDocuments( + @Param('imgpath') image: string, + @Param('id') id: string, + @Res() res, + @Req() req, + + ) { + return res.sendFile(image, { root: './uploads/BankDocuments/'+id}, function (err) { + if (err) { + console.log(err.status); + res.status(err.status).end(); + } + }) + } + + @Get('user-Documents/:id/:imgpath') + getUserDocuments( + @Param('imgpath') image: string, + @Param('id') id: string, + @Res() res, + @Req() req, + + ) { + return res.sendFile(image, { root: './uploads/userDocuments/'+id}, function (err) { + if (err) { + console.log(err.status); + res.status(err.status).end(); + } + }) + } + + + + @Get('Bank-Documents-Arc/:id') + async getBankDocumentsAsZip( + @Param('id') id: string, + @Res() res, + @Req() req, + ) { + const folderPath = path.join('./uploads/BankDocuments', id); + if (!fs.existsSync(folderPath)) { + res.status(404).send({ error: 'File not found' }); + return; + } + + const zipFileName = id + '.zip'; + const zipPath = path.join('./uploads/BankDocuments', zipFileName); + + // Create a new archive + const archive = archiver('zip', { + zlib: { level: 9 } // Set compression level (optional) + }); + + // Create a write stream to the zip file + const output = fs.createWriteStream(zipPath); + + // Pipe the archive to the write stream + archive.pipe(output); + + // Add the entire folder to the archive + archive.directory(folderPath, id); + + // Finalize the archive + await archive.finalize(); + + // Set the appropriate headers for downloading the zip file + res.attachment(zipFileName); + res.setHeader('Content-Type', 'application/zip'); + + // Stream the zip file to the response + const readStream = fs.createReadStream(zipPath); + readStream.pipe(res); + + // Remove the temporary zip file once it's streamed + readStream.on('end', () => { + fs.unlinkSync(zipPath); + }); + + // Handle any errors that occur during the archiving process + archive.on('error', function (err) { + console.log(err); + res.status(500).send({ error: 'Failed to create the zip file' }); + }); + } +} \ No newline at end of file diff --git a/src/tables/document-type/document-type.controller.ts b/src/tables/document-type/document-type.controller.ts new file mode 100644 index 0000000..8995b79 --- /dev/null +++ b/src/tables/document-type/document-type.controller.ts @@ -0,0 +1,15 @@ +import { Controller } from '@nestjs/common'; +import { DocumentTypeDto } from 'src/dto/document-type.dto'; +import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; +import { DocumentTypeService } from './document-type.service'; + +@Controller('document-type') +export class DocumentTypeController extends PcdFormGridController{ + + constructor( + private documentTypeService: DocumentTypeService + ) { + super(documentTypeService); + } + +} diff --git a/src/tables/document-type/document-type.entity.ts b/src/tables/document-type/document-type.entity.ts new file mode 100644 index 0000000..11f0715 --- /dev/null +++ b/src/tables/document-type/document-type.entity.ts @@ -0,0 +1,23 @@ +import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; +import { TenderDoc } from "../tender-documents/tender-doc.entity"; + +@Entity('document-type') +export class DocumentType extends PcdBaseEntity{ + @PrimaryGeneratedColumn({ + name:"id" + }) + id:number + + @Column({ + name:"document-type", + type:"varchar", + length:500, + nullable:true + }) + documentType:string + + + @OneToMany(() => TenderDoc, (tenderDoc) => tenderDoc.documentTypeD ) + tenderDoc:TenderDoc[] +} \ No newline at end of file diff --git a/src/tables/document-type/document-type.module.ts b/src/tables/document-type/document-type.module.ts new file mode 100644 index 0000000..af969dc --- /dev/null +++ b/src/tables/document-type/document-type.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { DocumentTypeController } from './document-type.controller'; +import { DocumentTypeService } from './document-type.service'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { DocumentTypeRepository } from './document-type.repository'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([DocumentTypeRepository]) + ], + controllers: [DocumentTypeController], + providers: [DocumentTypeService] +}) +export class DocumentTypeModule {} diff --git a/src/tables/document-type/document-type.repository.ts b/src/tables/document-type/document-type.repository.ts new file mode 100644 index 0000000..16096af --- /dev/null +++ b/src/tables/document-type/document-type.repository.ts @@ -0,0 +1,7 @@ +import { EntityRepository, Repository } from "typeorm"; +import { DocumentType } from "./document-type.entity"; + +@EntityRepository(DocumentType) +export class DocumentTypeRepository extends Repository{ + +} \ No newline at end of file diff --git a/src/tables/document-type/document-type.service.ts b/src/tables/document-type/document-type.service.ts new file mode 100644 index 0000000..f686198 --- /dev/null +++ b/src/tables/document-type/document-type.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { DocumentTypeDto } from 'src/dto/document-type.dto'; +import { PcdFormGridService } from 'src/framework/beans/pcd-form-grid.service'; +import { DocumentTypeRepository } from './document-type.repository'; + +@Injectable() +export class DocumentTypeService extends PcdFormGridService{ + + constructor( + @InjectRepository(DocumentTypeRepository) + private documentTypeRepository: DocumentTypeRepository, + ) { + super(documentTypeRepository); + } + +} \ No newline at end of file diff --git a/src/tables/emd-fee-type/emd-fee-type.entity.ts b/src/tables/emd-fee-type/emd-fee-type.entity.ts index d18fcaf..c279392 100644 --- a/src/tables/emd-fee-type/emd-fee-type.entity.ts +++ b/src/tables/emd-fee-type/emd-fee-type.entity.ts @@ -1,5 +1,5 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { TenderMaster } from "src/tender-master/tender-master.entity"; +import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; @Entity('emd_fee_type') diff --git a/src/tables/emd-fee-type/emd-fee-type.module.ts b/src/tables/emd-fee-type/emd-fee-type.module.ts index d0e3704..0fb1342 100644 --- a/src/tables/emd-fee-type/emd-fee-type.module.ts +++ b/src/tables/emd-fee-type/emd-fee-type.module.ts @@ -4,7 +4,8 @@ import { EmdFeeTypeService } from './emd-fee-type.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { EmdFeeTypeRepository } from './emd-fee-type.repository'; -@Module({ imports: [ +@Module({ + imports: [ TypeOrmModule.forFeature([EmdFeeTypeRepository]) ], controllers: [EmdFeeTypeController], diff --git a/src/tables/form-of-contract/form-of-contract.entity.ts b/src/tables/form-of-contract/form-of-contract.entity.ts index 310b945..8dcb7a5 100644 --- a/src/tables/form-of-contract/form-of-contract.entity.ts +++ b/src/tables/form-of-contract/form-of-contract.entity.ts @@ -1,5 +1,5 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { TenderMaster } from "src/tender-master/tender-master.entity"; +import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { Column, Entity, OneToMany, PrimaryColumn, PrimaryColumnCannotBeNullableError, PrimaryGeneratedColumn } from "typeorm"; @Entity('form_of_contract') diff --git a/src/imp-doc/imp-doc.entity.ts b/src/tables/imp-doc/imp-doc.entity.ts similarity index 93% rename from src/imp-doc/imp-doc.entity.ts rename to src/tables/imp-doc/imp-doc.entity.ts index 486252f..fef8931 100644 --- a/src/imp-doc/imp-doc.entity.ts +++ b/src/tables/imp-doc/imp-doc.entity.ts @@ -1,5 +1,5 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { TenderMaster } from "src/tender-master/tender-master.entity"; +import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm"; @Entity('imp-doc') diff --git a/src/imp-doc/imp-doc.repository.ts b/src/tables/imp-doc/imp-doc.repository.ts similarity index 100% rename from src/imp-doc/imp-doc.repository.ts rename to src/tables/imp-doc/imp-doc.repository.ts diff --git a/src/payment-instrument/payment-ins.entity.ts b/src/tables/payment-instrument/payment-ins.entity.ts similarity index 90% rename from src/payment-instrument/payment-ins.entity.ts rename to src/tables/payment-instrument/payment-ins.entity.ts index d23204e..d1975e1 100644 --- a/src/payment-instrument/payment-ins.entity.ts +++ b/src/tables/payment-instrument/payment-ins.entity.ts @@ -1,5 +1,5 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { TenderMaster } from "src/tender-master/tender-master.entity"; +import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm"; @Entity('payment-instrument') diff --git a/src/payment-instrument/payment-ins.repository.ts b/src/tables/payment-instrument/payment-ins.repository.ts similarity index 100% rename from src/payment-instrument/payment-ins.repository.ts rename to src/tables/payment-instrument/payment-ins.repository.ts diff --git a/src/tables/payment-mode/payment-mode.entity.ts b/src/tables/payment-mode/payment-mode.entity.ts index c4431f3..1410965 100644 --- a/src/tables/payment-mode/payment-mode.entity.ts +++ b/src/tables/payment-mode/payment-mode.entity.ts @@ -1,5 +1,5 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { TenderMaster } from "src/tender-master/tender-master.entity"; +import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm"; @Entity('payment-mode') diff --git a/src/tables/product-category/product-category.entity.ts b/src/tables/product-category/product-category.entity.ts index 27fc9e9..05169fb 100644 --- a/src/tables/product-category/product-category.entity.ts +++ b/src/tables/product-category/product-category.entity.ts @@ -1,5 +1,5 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { TenderMaster } from "src/tender-master/tender-master.entity"; +import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { Column, Entity, OneToMany, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm"; @Entity("product_category") diff --git a/src/tables/tender-category/tender-category.entity.ts b/src/tables/tender-category/tender-category.entity.ts index 8ad480c..b75befa 100644 --- a/src/tables/tender-category/tender-category.entity.ts +++ b/src/tables/tender-category/tender-category.entity.ts @@ -1,5 +1,5 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { TenderMaster } from "src/tender-master/tender-master.entity"; +import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm"; @Entity('tender_category') diff --git a/src/tables/tender-documents/tender-doc.controller.ts b/src/tables/tender-documents/tender-doc.controller.ts new file mode 100644 index 0000000..88318df --- /dev/null +++ b/src/tables/tender-documents/tender-doc.controller.ts @@ -0,0 +1,15 @@ +import { Controller } from '@nestjs/common'; +import { TenderDocumentDto } from 'src/dto/tender-document.dto'; +import { PcdFormGridController } from 'src/framework/beans/pcd-form-grid.controller'; +import { TenderDocService } from './tender-doc.service'; + +@Controller('tender-doc') +export class TenderDocController extends PcdFormGridController{ + + constructor( + private tenderDocService: TenderDocService + ) { + super(tenderDocService); + } + +} diff --git a/src/tender-doc/tender-doc.entity.ts b/src/tables/tender-documents/tender-doc.entity.ts similarity index 60% rename from src/tender-doc/tender-doc.entity.ts rename to src/tables/tender-documents/tender-doc.entity.ts index c2be8d3..53111c4 100644 --- a/src/tender-doc/tender-doc.entity.ts +++ b/src/tables/tender-documents/tender-doc.entity.ts @@ -1,6 +1,7 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { TenderMaster } from "src/tender-master/tender-master.entity"; +import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from "typeorm"; +import { DocumentType } from "../document-type/document-type.entity"; @Entity("tender-doc") export class TenderDoc extends PcdBaseEntity{ @@ -25,7 +26,6 @@ export class TenderDoc extends PcdBaseEntity{ @Column({ name:"doc_type", type:"varchar", - length:500, nullable:true }) docType:string @@ -37,10 +37,21 @@ export class TenderDoc extends PcdBaseEntity{ }) description:string + @Column({ + name:"document_size", + type:"numeric", + nullable:true + }) + documentSize:number; + - @ManyToOne(() => TenderMaster,(tenderMaster)=> tenderMaster.importantDoc) + @ManyToOne(() => TenderMaster,(tenderMaster)=> tenderMaster.TenderDoc) @JoinColumn([{ name: "tender_id", referencedColumnName: "id" }]) tenderIdD:TenderMaster + + @ManyToOne(() => DocumentType,(documentType)=> documentType.tenderDoc,{eager:true}) + @JoinColumn([{ name: "doc_type", referencedColumnName: "id" }]) + documentTypeD:DocumentType } \ No newline at end of file diff --git a/src/tables/tender-documents/tender-doc.module.ts b/src/tables/tender-documents/tender-doc.module.ts new file mode 100644 index 0000000..02c2b05 --- /dev/null +++ b/src/tables/tender-documents/tender-doc.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { TenderDocService } from './tender-doc.service'; +import { TenderDocController } from './tender-doc.controller'; +import { tenderDocRepository } from './tender-doc.repository'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([tenderDocRepository]) + ], + providers: [TenderDocService], + controllers: [TenderDocController] +}) +export class TenderDocModule {} diff --git a/src/tender-doc/tender-doc.repository.ts b/src/tables/tender-documents/tender-doc.repository.ts similarity index 100% rename from src/tender-doc/tender-doc.repository.ts rename to src/tables/tender-documents/tender-doc.repository.ts diff --git a/src/tables/tender-documents/tender-doc.service.ts b/src/tables/tender-documents/tender-doc.service.ts new file mode 100644 index 0000000..ce1f944 --- /dev/null +++ b/src/tables/tender-documents/tender-doc.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { PcdFormGridService } from 'src/framework/beans/pcd-form-grid.service'; +import { tenderDocRepository } from './tender-doc.repository'; +import { InjectRepository } from '@nestjs/typeorm'; +import { TenderDocumentDto } from 'src/dto/tender-document.dto'; + +@Injectable() +export class TenderDocService extends PcdFormGridService{ + + constructor( + @InjectRepository(tenderDocRepository) + private tenderDocRepository: tenderDocRepository, + ) { + super(tenderDocRepository); + } + +} diff --git a/src/tender-master/tender-details.controller.ts b/src/tables/tender-master/tender-details.controller.ts similarity index 100% rename from src/tender-master/tender-details.controller.ts rename to src/tables/tender-master/tender-details.controller.ts diff --git a/src/tender-master/tender-details.module.ts b/src/tables/tender-master/tender-details.module.ts similarity index 100% rename from src/tender-master/tender-details.module.ts rename to src/tables/tender-master/tender-details.module.ts diff --git a/src/tender-master/tender-details.service.ts b/src/tables/tender-master/tender-details.service.ts similarity index 100% rename from src/tender-master/tender-details.service.ts rename to src/tables/tender-master/tender-details.service.ts diff --git a/src/tender-master/tender-master.entity.ts b/src/tables/tender-master/tender-master.entity.ts similarity index 97% rename from src/tender-master/tender-master.entity.ts rename to src/tables/tender-master/tender-master.entity.ts index c089291..3bb91c8 100644 --- a/src/tender-master/tender-master.entity.ts +++ b/src/tables/tender-master/tender-master.entity.ts @@ -1,13 +1,13 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { ImportantDoc } from "src/imp-doc/imp-doc.entity"; -import { paymentInstrument } from "src/payment-instrument/payment-ins.entity"; +import { ImportantDoc } from "src/tables/imp-doc/imp-doc.entity"; +import { paymentInstrument } from "src/tables/payment-instrument/payment-ins.entity"; import { EmdFeeType } from "src/tables/emd-fee-type/emd-fee-type.entity"; import { FormOfContract } from "src/tables/form-of-contract/form-of-contract.entity"; import { PaymentMode } from "src/tables/payment-mode/payment-mode.entity"; import { ProductCategory } from "src/tables/product-category/product-category.entity"; import { TenderCategory } from "src/tables/tender-category/tender-category.entity"; import { TenderType } from "src/tables/tender-type/tender-type.entity"; -import { TenderDoc } from "src/tender-doc/tender-doc.entity"; +import { TenderDoc } from "src/tables/tender-documents/tender-doc.entity"; import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm"; @Entity('tender_master') @@ -357,6 +357,7 @@ export class TenderMaster extends PcdBaseEntity{ }) activeYn:string + @OneToMany(() => ImportantDoc, (importantDoc) => importantDoc.tenderIdD ) importantDoc:ImportantDoc[] diff --git a/src/tender-master/tender-master.repository.ts b/src/tables/tender-master/tender-master.repository.ts similarity index 100% rename from src/tender-master/tender-master.repository.ts rename to src/tables/tender-master/tender-master.repository.ts diff --git a/src/tables/tender-type/tender-type.entity.ts b/src/tables/tender-type/tender-type.entity.ts index a484e89..50ec6f5 100644 --- a/src/tables/tender-type/tender-type.entity.ts +++ b/src/tables/tender-type/tender-type.entity.ts @@ -1,5 +1,5 @@ import { PcdBaseEntity } from "src/framework/custom/pcd-entity.custom"; -import { TenderMaster } from "src/tender-master/tender-master.entity"; +import { TenderMaster } from "src/tables/tender-master/tender-master.entity"; import { Column, Entity, JoinColumn, ManyToOne, OneToMany, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm"; @Entity('tender-type') diff --git a/src/transactions/tender/tender.controller.ts b/src/transactions/tender/tender.controller.ts new file mode 100644 index 0000000..2fda142 --- /dev/null +++ b/src/transactions/tender/tender.controller.ts @@ -0,0 +1,4 @@ +import { Controller } from '@nestjs/common'; + +@Controller('tender') +export class TenderController {} diff --git a/src/transactions/tender/tender.module.ts b/src/transactions/tender/tender.module.ts new file mode 100644 index 0000000..10da83b --- /dev/null +++ b/src/transactions/tender/tender.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { TenderController } from './tender.controller'; +import { TenderService } from './tender.service'; + +@Module({ + controllers: [TenderController], + providers: [TenderService] +}) +export class TenderModule {} diff --git a/src/transactions/tender/tender.service.ts b/src/transactions/tender/tender.service.ts new file mode 100644 index 0000000..096b8cd --- /dev/null +++ b/src/transactions/tender/tender.service.ts @@ -0,0 +1,7 @@ +import { Injectable } from '@nestjs/common'; +import { TenderDetailDto } from 'src/dto/tender-master.dto'; +import { PcdTransactionService } from 'src/framework/beans/pcd-transaction.service'; +import { TransactionDetailDto } from 'src/framework/custom/transaction-detail.dto'; + +@Injectable() +export class TenderService{} diff --git a/uploads/BankDocuments/5/2d15d10a9202e4e61c97dea16ddebccff.pdf b/uploads/BankDocuments/5/2d15d10a9202e4e61c97dea16ddebccff.pdf new file mode 100644 index 0000000..01c7ab3 Binary files /dev/null and b/uploads/BankDocuments/5/2d15d10a9202e4e61c97dea16ddebccff.pdf differ diff --git a/uploads/BankDocuments/5/8a56da596f97523e993f71007c26fcec8.zip b/uploads/BankDocuments/5/8a56da596f97523e993f71007c26fcec8.zip new file mode 100644 index 0000000..a05ebb0 Binary files /dev/null and b/uploads/BankDocuments/5/8a56da596f97523e993f71007c26fcec8.zip differ diff --git a/uploads/BankDocuments/5/de3a5428c2f65e45555e2b8a9468a8a9.zip b/uploads/BankDocuments/5/de3a5428c2f65e45555e2b8a9468a8a9.zip new file mode 100644 index 0000000..bf487c3 Binary files /dev/null and b/uploads/BankDocuments/5/de3a5428c2f65e45555e2b8a9468a8a9.zip differ