From 1fadec7ab154ad96133563f980e7b92cc0b2b61f Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Sun, 9 Oct 2022 12:39:21 -0400 Subject: [PATCH 01/16] adding some early stuff --- .gitignore | 2 + package-lock.json | 1048 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 14 + public/index.html | 0 server.improved.js | 428 ++++++++++++++++++ 5 files changed, 1492 insertions(+) create mode 100644 .gitignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/index.html create mode 100644 server.improved.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..00f24d258 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.env +node_modules/* diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..3edda5b37 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1048 @@ +{ + "name": "final_project-Ignatiev", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "dependencies": { + "express": "^4.18.2", + "node": "^18.10.0" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "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==", + "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/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "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/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "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.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "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" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node": { + "version": "18.10.0", + "resolved": "https://registry.npmjs.org/node/-/node-18.10.0.tgz", + "integrity": "sha512-MzDb4jEaBYQoXoQQHalG5jOs7V4VUGB39/BJDSpPZo9mkRUO0y1rclJCNm5667YykgKVUHXK3P2zSpr/w4NO8w==", + "hasInstallScript": true, + "dependencies": { + "node-bin-setup": "^1.0.0" + }, + "bin": { + "node": "bin/node" + }, + "engines": { + "npm": ">=5.0.0" + } + }, + "node_modules/node-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==" + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "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/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" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "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": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + } + }, + "dependencies": { + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "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==", + "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==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "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" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "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.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "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" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "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==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "node": { + "version": "18.10.0", + "resolved": "https://registry.npmjs.org/node/-/node-18.10.0.tgz", + "integrity": "sha512-MzDb4jEaBYQoXoQQHalG5jOs7V4VUGB39/BJDSpPZo9mkRUO0y1rclJCNm5667YykgKVUHXK3P2zSpr/w4NO8w==", + "requires": { + "node-bin-setup": "^1.0.0" + } + }, + "node-bin-setup": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", + "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==" + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "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==", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "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==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "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==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "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": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..6b13ecece --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + + "scripts": { + + "start": "node server.js" + + }, + + + "dependencies": { + "express": "^4.18.2", + "node": "^18.10.0" + } +} diff --git a/public/index.html b/public/index.html new file mode 100644 index 000000000..e69de29bb diff --git a/server.improved.js b/server.improved.js new file mode 100644 index 000000000..7261dc21b --- /dev/null +++ b/server.improved.js @@ -0,0 +1,428 @@ +const express = require('express'); +const util = require('util'); +global.TextEncoder = util.TextEncoder; +global.TextDecoder = util.TextDecoder; +const app = express(); +const http = require( 'http' ), + fs = require( 'fs' ), + // IMPORTANT: you must run `npm install` in the directory for this assignment + // to install the mime library used in the following line of code + mime = require( 'mime' ), + dir = 'public/', + port = 3000; +const serveStatic = require('serve-static'); +const bodyParser = require('body-parser'); +const cookie = require( 'cookie-session' ); +const k1 = "kdjkjdakask"; +const k2 = "dsjfjsfrifw"; + +const { MongoClient, ServerApiVersion } = require('mongodb'); +const muri = "mongodb+srv://"+process.env.MONGO_USER+":"+ process.env.MONGO_PASSWORD+"@a3cluster.oip0htf.mongodb.net/?retryWrites=true&w=majority"; +const mClient = new MongoClient(muri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 }); +let collection = null + +mClient.connect() + .then( () => { + // will only create collection if it doesn't exist + return mClient.db( 'a3Accounts' ).collection( 'users' ) + }) + .then( __collection => { + // store reference to collection + collection = __collection + // blank query returns all documents + return collection.find({ }).toArray() + }) + .then( console.log ) + + if( collection !== null ){ + console.log("here") + //collection.find({ }).toArray().then( result => res.json( result ) ) + } + +/* appdata structure example*/ +/* + { 'abc@abc.com': { + 'name': 'John Smith', + 'working': true, + 'password': '', + 'cars': [ + { 'model': 'ford', + 'year': 2000, + 'milage': 205 + } + ] + } + +const appdata = [ + { 'model': 'toyota', 'year': 1999, 'mileage': 205724}, + { 'model': 'dodge', 'year': 2004, 'mileage': 172057 }, + { 'model': 'ford', 'year': 1987, 'mileage': 299690} +]; +*/ +var appdata = {}; +// add url encoding +app.use( express.urlencoded({ extended:true }) ) +// activate cookie handeling: session +app.use( cookie({ + name: 'session', + keys: [process.env.SESSION_k1, process.env.SESSION_k2] +})) +// serve all static pages as we need CSS. etc +app.use(serveStatic(dir, { index: ['login.html', 'login.htm'] })); +// login call before session validation +app.post("/login",(request,response) => handlePostL( request, response )); +app.post('/signup',(request,response,next) => handlePostSignUp( request, response, next )); +// start validation session and cookie data +// we send people to login when they do not have login flag set +// problem we also ned to +app.use( function( req,res,next) { + console.log(req.session) + if( req.session.login === true ){ + console.log(req.session) + next() + } else { + if( 'body' in req ) { + console.log(req.body) + console.log(req.path) + } + console.log("sending ... login.html") + app.get('/signup',(request,response,next) => handleSignUp( request, response, next )); + res.sendFile( __dirname +"/" + dir + '/login.html' ) + } +}) +// update profile goes after cookie validation +app.get('/userupdate',(request,response,next) => sendUpdatePage( request, response, next )); +app.post('/userupdate',(request,response,next) => handlePostUpdate( request, response, next )); +app.get('/userfetch',(request,response,next) => handleGetUserUpdate( request, response, next )); +// signput comes after cookie validation +app.get('/signout',(request,response,next) => handleSignOut( request, response, next )); +app.use(bodyParser.json({type: 'text/plain'})); +app.post('/submit',(request,response) => handlePostJ( request, response )); +app.get('/showuser',(request,response) => handleGetJ( request, response )); + +/* + * + */ + +const handleGet = function( request, response ) { + const filename = dir + request.url.slice( 1 ) + + if( request.url === '/' || request.url === "/?" ) { + sendFile( response, 'public/index.html' ) + }else{ + sendFile( response, filename ) + } +} + +const handlePost = function( request, response ) { + let dataString = '' + + request.on( 'data', function( data ) { + dataString += data + }) + + request.on( 'end', function() { + // ... do something with the data here!!! + var inD = JSON.parse( dataString ); + console.log("getting args ..."); + console.log(inD) + if(inD.action === "add"){ + nC = {model: inD.model, year: inD.year, mileage: inD.mileage} + appdata.push(nC) + } + console.log(appdata) + if(inD.action === "delete"){ + const trashBin = appdata.splice(inD.index, 1) + } + theYear = new Date().getFullYear() + for(k = 0; k Date: Sun, 9 Oct 2022 16:04:48 -0400 Subject: [PATCH 02/16] added a3 --- .gitignore | 2 + js/scripts.js | 3 + package-lock.json | 1178 ++++++++++++++++++++++++++++++++++++++++-- package.json | 22 +- public/css/style.css | 374 ++++++++++++++ public/js/scripts.js | 3 + public/login.html | 59 +++ public/main.html | 184 +++++++ public/robots.txt | 2 + public/signup.html | 62 +++ public/update.html | 86 +++ 11 files changed, 1912 insertions(+), 63 deletions(-) create mode 100644 js/scripts.js create mode 100644 public/css/style.css create mode 100644 public/js/scripts.js create mode 100644 public/login.html create mode 100644 public/main.html create mode 100644 public/robots.txt create mode 100644 public/signup.html create mode 100644 public/update.html diff --git a/.gitignore b/.gitignore index 00f24d258..fd651fda6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .env node_modules/* +.DS_Store +.git diff --git a/js/scripts.js b/js/scripts.js new file mode 100644 index 000000000..de052eae6 --- /dev/null +++ b/js/scripts.js @@ -0,0 +1,3 @@ +// Add some Javascript code here, to run on the front end. + +console.log("Welcome to assignment 2!") \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 3edda5b37..16e73610e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,46 @@ { - "name": "final_project-Ignatiev", + "name": "persistent", "lockfileVersion": 2, "requires": true, "packages": { "": { + "name": "persistent", "dependencies": { - "express": "^4.18.2", - "node": "^18.10.0" + "body-parser": "^1.20.0", + "cookie-session": "^2.0.0", + "dotenv": "^16.0.2", + "express": "^4.18.1", + "mime": "^2.4.4", + "mongodb": "^4.10.0", + "nodemon": "^2.0.20", + "serve-static": "^1.15.0", + "start": "^5.1.0" + } + }, + "node_modules/@types/node": { + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "node_modules/@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" } }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -21,15 +53,59 @@ "node": ">= 0.6" } }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, "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==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -39,7 +115,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.10.3", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -49,6 +125,60 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", + "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "dependencies": { + "buffer": "^5.6.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -69,6 +199,37 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, "node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -96,11 +257,50 @@ "node": ">= 0.6" } }, + "node_modules/cookie-session": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.0.0.tgz", + "integrity": "sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==", + "dependencies": { + "cookies": "0.8.0", + "debug": "3.2.7", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cookie-session/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/cookie-session/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -109,6 +309,14 @@ "ms": "2.0.0" } }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -126,6 +334,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/dotenv": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==", + "engines": { + "node": ">=12" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -153,13 +369,13 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -178,7 +394,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -193,6 +409,17 @@ "node": ">= 0.10.0" } }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -226,6 +453,19 @@ "node": ">= 0.6" } }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -244,6 +484,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -255,6 +506,14 @@ "node": ">= 0.4.0" } }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -292,11 +551,40 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -305,6 +593,55 @@ "node": ">= 0.10" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -313,6 +650,12 @@ "node": ">= 0.6" } }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -327,14 +670,14 @@ } }, "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, "node_modules/mime-db": { @@ -356,6 +699,43 @@ "node": ">= 0.6" } }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mongodb": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.10.0.tgz", + "integrity": "sha512-My2QxLTw0Cc1O9gih0mz4mqo145Jq4rLAQx0Glk/Ha9iYBzYpt4I2QFNRIh35uNFNfe8KFQcdwY1/HKxXBkinw==", + "dependencies": { + "bson": "^4.7.0", + "denque": "^2.1.0", + "mongodb-connection-string-url": "^2.5.3", + "socks": "^2.7.0" + }, + "engines": { + "node": ">=12.9.0" + }, + "optionalDependencies": { + "saslprep": "^1.0.3" + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz", + "integrity": "sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -369,25 +749,67 @@ "node": ">= 0.6" } }, - "node_modules/node": { - "version": "18.10.0", - "resolved": "https://registry.npmjs.org/node/-/node-18.10.0.tgz", - "integrity": "sha512-MzDb4jEaBYQoXoQQHalG5jOs7V4VUGB39/BJDSpPZo9mkRUO0y1rclJCNm5667YykgKVUHXK3P2zSpr/w4NO8w==", - "hasInstallScript": true, + "node_modules/nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "dependencies": { - "node-bin-setup": "^1.0.0" + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" }, "bin": { - "node": "bin/node" + "nodemon": "bin/nodemon.js" }, "engines": { - "npm": ">=5.0.0" + "node": ">=8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" } }, - "node_modules/node-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==" + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/object-inspect": { "version": "1.12.2", @@ -408,6 +830,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -421,6 +851,17 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -433,10 +874,23 @@ "node": ">= 0.10" } }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "dependencies": { "side-channel": "^1.0.4" }, @@ -469,6 +923,17 @@ "node": ">= 0.8" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -493,6 +958,26 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -516,6 +1001,17 @@ "node": ">= 0.8.0" } }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -553,6 +1049,65 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "dependencies": { + "semver": "~7.0.0" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/start": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/start/-/start-5.1.0.tgz", + "integrity": "sha512-lirwWQmvBC65bnxU3HzKx5m7vfZJZTx/FrKyPWbtobcvujGbinQQRrNodtcgkp4mTZ00umzDeg7lraN351l0aA==", + "deprecated": "Deprecated in favor of https://github.com/deepsweet/start", + "engines": { + "node": ">=4" + } + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -561,6 +1116,28 @@ "node": ">= 0.8" } }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -569,6 +1146,36 @@ "node": ">=0.6" } }, + "node_modules/touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dependencies": { + "nopt": "~1.0.10" + }, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -581,6 +1188,11 @@ "node": ">= 0.6" } }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -604,9 +1216,53 @@ "engines": { "node": ">= 0.8" } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } } }, "dependencies": { + "@types/node": { + "version": "18.7.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", + "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==" + }, + "@types/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==" + }, + "@types/whatwg-url": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz", + "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==", + "requires": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -616,15 +1272,39 @@ "negotiator": "0.6.3" } }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, "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==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -634,12 +1314,46 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.10.3", "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "bson": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-4.7.0.tgz", + "integrity": "sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==", + "requires": { + "buffer": "^5.6.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -654,6 +1368,26 @@ "get-intrinsic": "^1.0.2" } }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, "content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -672,11 +1406,46 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, + "cookie-session": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cookie-session/-/cookie-session-2.0.0.tgz", + "integrity": "sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==", + "requires": { + "cookies": "0.8.0", + "debug": "3.2.7", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + } + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -685,6 +1454,11 @@ "ms": "2.0.0" } }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -695,6 +1469,11 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, + "dotenv": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.2.tgz", + "integrity": "sha512-JvpYKUmzQhYoIFgK2MOnF3bciIZoItIIoryihy0rIA+H4Jy0FmgyKYAHCTN98P5ybGSJcIFbh6QKeJdtZd1qhA==" + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -716,13 +1495,13 @@ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" }, "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.0", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -741,7 +1520,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.10.3", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", @@ -753,6 +1532,14 @@ "vary": "~1.1.2" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, "finalhandler": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", @@ -777,6 +1564,12 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -792,6 +1585,14 @@ "has-symbols": "^1.0.3" } }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -800,6 +1601,11 @@ "function-bind": "^1.1.1" } }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -825,21 +1631,76 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, + "memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -851,9 +1712,9 @@ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" }, "mime-db": { "version": "1.52.0", @@ -868,6 +1729,35 @@ "mime-db": "1.52.0" } }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mongodb": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-4.10.0.tgz", + "integrity": "sha512-My2QxLTw0Cc1O9gih0mz4mqo145Jq4rLAQx0Glk/Ha9iYBzYpt4I2QFNRIh35uNFNfe8KFQcdwY1/HKxXBkinw==", + "requires": { + "bson": "^4.7.0", + "denque": "^2.1.0", + "mongodb-connection-string-url": "^2.5.3", + "saslprep": "^1.0.3", + "socks": "^2.7.0" + } + }, + "mongodb-connection-string-url": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.5.3.tgz", + "integrity": "sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==", + "requires": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -878,18 +1768,50 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, - "node": { - "version": "18.10.0", - "resolved": "https://registry.npmjs.org/node/-/node-18.10.0.tgz", - "integrity": "sha512-MzDb4jEaBYQoXoQQHalG5jOs7V4VUGB39/BJDSpPZo9mkRUO0y1rclJCNm5667YykgKVUHXK3P2zSpr/w4NO8w==", + "nodemon": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.20.tgz", + "integrity": "sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw==", "requires": { - "node-bin-setup": "^1.0.0" + "chokidar": "^3.5.2", + "debug": "^3.2.7", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } } }, - "node-bin-setup": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.3.tgz", - "integrity": "sha512-opgw9iSCAzT2+6wJOETCpeRYAQxSopqQ2z+N6BXwIMsQQ7Zj5M8MaafQY8JMlolRR6R1UXg2WmhKp0p9lSOivg==" + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "object-inspect": { "version": "1.12.2", @@ -904,6 +1826,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -914,6 +1841,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -923,10 +1855,20 @@ "ipaddr.js": "1.9.1" } }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", "requires": { "side-channel": "^1.0.4" } @@ -947,6 +1889,14 @@ "unpipe": "1.0.0" } }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -957,6 +1907,20 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "requires": { + "sparse-bitfield": "^3.0.3" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -977,6 +1941,11 @@ "statuses": "2.0.1" }, "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1010,16 +1979,96 @@ "object-inspect": "^1.9.0" } }, + "simple-update-notifier": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.0.7.tgz", + "integrity": "sha512-BBKgR84BJQJm6WjWFMHgLVuo61FBDSj1z/xSFUIozqO6wO7ii0JxCqlIud7Enr/+LhlbNI0whErq96P2qHNWew==", + "requires": { + "semver": "~7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + } + }, + "sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "requires": { + "memory-pager": "^1.0.2" + } + }, + "start": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/start/-/start-5.1.0.tgz", + "integrity": "sha512-lirwWQmvBC65bnxU3HzKx5m7vfZJZTx/FrKyPWbtobcvujGbinQQRrNodtcgkp4mTZ00umzDeg7lraN351l0aA==" + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "requires": { + "nopt": "~1.0.10" + } + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1029,6 +2078,11 @@ "mime-types": "~2.1.24" } }, + "undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -1043,6 +2097,20 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } } } } diff --git a/package.json b/package.json index 6b13ecece..75c25b690 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,20 @@ { - + "name": "persistent", + "version": "", + "description": "", + "author": "", "scripts": { - - "start": "node server.js" - + "start": "node server.improved.js" }, - - "dependencies": { - "express": "^4.18.2", - "node": "^18.10.0" + "body-parser": "^1.20.0", + "cookie-session": "^2.0.0", + "dotenv": "^16.0.2", + "express": "^4.18.1", + "mime": "^2.4.4", + "mongodb": "^4.10.0", + "nodemon": "^2.0.20", + "serve-static": "^1.15.0", + "start": "^5.1.0" } } diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 000000000..bae861c69 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,374 @@ +/*Style your own assignment! This is fun! */ +@import url("https://cdn.jsdelivr.net/npm/purecss@2.1.0/build/pure-min.css"); +html { + min-width: 600px; +} +.container { + display: flex; + margin: auto; + background-color: gainsboro; + font-family: 'Catamaran', sans-serif; + justify-content: left; + flex-direction: column; + width: 1200px; + margin-left: 20px; +} + +.button { + /* font-family: 'Catamaran', sans-serif;*/ + font-size: 1.2rem; + /* border: 1px; */ +} +/* +.button:hover { + color:rgb(219, 21, 90); +} +*/ +.add_div{ + border-radius: 5px; + /*background-color: white;*/ +} +.outT{ + border-radius: 5px; + /*background-color: white;*/ +} +.main{ + border-radius: 5px; + /*background-color: white;*/ +} +.mimg{ + border: 2px + dotted firebrick; + width: 300px; + align-items: center; + @extend pure-img; +} + +div{ + border-radius: 5px; + /*background-color: white;*/ +} +form { + padding: 15px; + border-radius: 5px; + display: flex; + flex-direction: column; +} +input { + height: 30px; + font-family: "Raleway", sans-serif; + font-size: 1rem; + +} +table{ + border-style:dotted; + align-items: center; + border-color: firebrick; + border: 4px; +} +img{ + border: 2px + dotted firebrick; + width: 300px; + align-items: center; + height: 168px; +} +h1{ + color:navy; + font-family: 'Catamaran', sans-serif; + } +h2{ + font-size: smaller; + font-family: 'Catamaran', sans-serif; +} +button{ + font-family: 'Catamaran', sans-serif; + font-size: 1.2rem; + border: 0; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +/* + * -- BASE STYLES -- + * Most of these are inherited from Base, but I want to change a few. + */ +body { + line-height: 1.7em; + color: #7f8c8d; + font-size: 13px; +} + +h1, +h2, +h3, +h4, +h5, +h6, +label { + color: #34495e; +} + +.pure-img-responsive { + max-width: 100%; + height: auto; +} + +/* + * -- LAYOUT STYLES -- + * These are some useful classes which I will need + */ +.l-box { + padding: 1em; +} + +.l-box-lrg { + padding: 2em; + border-bottom: 1px solid rgba(0,0,0,0.1); +} + +.is-center { + text-align: center; +} + + + +/* + * -- PURE FORM STYLES -- + * Style the form inputs and labels + */ +.pure-form label { + margin: 1em 0 0; + font-weight: bold; + font-size: 100%; +} + +.pure-form input[type] { + border: 2px solid #ddd; + box-shadow: none; + font-size: 100%; + width: 100%; + margin-bottom: 1em; +} + +/* + * -- PURE BUTTON STYLES -- + * I want my pure-button elements to look a little different + */ +.pure-button { + background-color: #1f8dd6; + color: white; + padding: 0.5em 2em; + border-radius: 5px; +} + +a.pure-button-primary { + background: white; + color: #1f8dd6; + border-radius: 5px; + font-size: 120%; +} + + +/* + * -- MENU STYLES -- + * I want to customize how my .pure-menu looks at the top of the page + */ + +.home-menu { + padding: 0.5em; + text-align: center; + box-shadow: 0 1px 1px rgba(0,0,0, 0.10); +} +.home-menu { + background: #2d3e50; +} +.pure-menu.pure-menu-fixed { + /* Fixed menus normally have a border at the bottom. */ + border-bottom: none; + /* I need a higher z-index here because of the scroll-over effect. */ + z-index: 4; +} + +.home-menu .pure-menu-heading { + color: white; + font-weight: 400; + font-size: 120%; +} + +.home-menu .pure-menu-selected a { + color: white; +} + +.home-menu a { + color: #6FBEF3; +} +.home-menu li a:hover, +.home-menu li a:focus { + background: none; + border: none; + color: #AECFE5; +} + + +/* + * -- SPLASH STYLES -- + * This is the blue top section that appears on the page. + */ + +.splash-container { + background: #1f8dd6; + z-index: 1; + overflow: hidden; + /* The following styles are required for the "scroll-over" effect */ + width: 100%; + height: 88%; + top: 0; + left: 0; + position: fixed !important; +} + +.splash { + /* absolute center .splash within .splash-container */ + width: 80%; + height: 50%; + margin: auto; + position: absolute; + top: 100px; left: 0; bottom: 0; right: 0; + text-align: center; + text-transform: uppercase; +} + +/* This is the main heading that appears on the blue section */ +.splash-head { + font-size: 20px; + font-weight: bold; + color: white; + border: 3px solid white; + padding: 1em 1.6em; + font-weight: 100; + border-radius: 5px; + line-height: 1em; +} + +/* This is the subheading that appears on the blue section */ +.splash-subhead { + color: white; + letter-spacing: 0.05em; + opacity: 0.8; +} + +/* + * -- CONTENT STYLES -- + * This represents the content area (everything below the blue section) + */ +.content-wrapper { + /* These styles are required for the "scroll-over" effect */ + position: absolute; + top: 87%; + width: 100%; + min-height: 12%; + z-index: 2; + background: white; + +} + +/* We want to give the content area some more padding */ +.content { + padding: 1em 1em 3em; +} + +/* This is the class used for the main content headers (

) */ +.content-head { + font-weight: 400; + text-transform: uppercase; + letter-spacing: 0.1em; + margin: 2em 0 1em; +} + +/* This is a modifier class used when the content-head is inside a ribbon */ +.content-head-ribbon { + color: white; +} + +/* This is the class used for the content sub-headers (

) */ +.content-subhead { + color: #1f8dd6; +} + .content-subhead i { + margin-right: 7px; + } + +/* This is the class used for the dark-background areas. */ +.ribbon { + background: #2d3e50; + color: #aaa; +} + +/* This is the class used for the footer */ +.footer { + background: #111; + position: fixed; + bottom: 0; + width: 100%; +} + +/* + * -- TABLET (AND UP) MEDIA QUERIES -- + * On tablets and other medium-sized devices, we want to customize some + * of the mobile styles. + */ +@media (min-width: 48em) { + + /* We increase the body font size */ + body { + font-size: 16px; + } + + /* We can align the menu header to the left, but float the + menu items to the right. */ + .home-menu { + text-align: left; + } + .home-menu ul { + float: right; + } + + /* We increase the height of the splash-container */ +/* .splash-container { + height: 500px; + }*/ + + /* We decrease the width of the .splash, since we have more width + to work with */ + .splash { + width: 50%; + height: 50%; + } + + .splash-head { + font-size: 250%; + } + + + /* We remove the border-separator assigned to .l-box-lrg */ + .l-box-lrg { + border: none; + } + +} + +/* + * -- DESKTOP (AND UP) MEDIA QUERIES -- + * On desktops and other large devices, we want to over-ride some + * of the mobile and tablet styles. + */ +@media (min-width: 78em) { + /* We increase the header font size even more */ + .splash-head { + font-size: 300%; + } +} \ No newline at end of file diff --git a/public/js/scripts.js b/public/js/scripts.js new file mode 100644 index 000000000..de052eae6 --- /dev/null +++ b/public/js/scripts.js @@ -0,0 +1,3 @@ +// Add some Javascript code here, to run on the front end. + +console.log("Welcome to assignment 2!") \ No newline at end of file diff --git a/public/login.html b/public/login.html new file mode 100644 index 000000000..00021384c --- /dev/null +++ b/public/login.html @@ -0,0 +1,59 @@ + + + + CS4241 Assignment 3 LoginPage + + + + + + + + + + + + +
+
+ Kurtz's Cars + + +
+
+

+

+
+
+ Log in to manage your lineup + + + + +
+ a car +
+
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + diff --git a/public/main.html b/public/main.html new file mode 100644 index 000000000..7849225ce --- /dev/null +++ b/public/main.html @@ -0,0 +1,184 @@ + + + + CS4241 Assignment 3 MainPage + + + + + + + + + + + +

+

+

Kurtz's Cars

+

Dealer Portal

+
+
+ Manage your lineup: + + + + +
+ a car +
+
+
+
+
+ + + + +
+
+
    +
    +
    +
    +
    + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 000000000..6d5a45a0f --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: /css/ \ No newline at end of file diff --git a/public/signup.html b/public/signup.html new file mode 100644 index 000000000..d37182572 --- /dev/null +++ b/public/signup.html @@ -0,0 +1,62 @@ + + + + CS4241 Assignment 3 SignUpPage + + + + + + + + + + + +
    +
    + Kurtz's Cars + + +
    +
    +

    +

    +
    +
    + Sign up to manage your lineup + + + + +
    + a car +
    +
    +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + diff --git a/public/update.html b/public/update.html new file mode 100644 index 000000000..8249681d5 --- /dev/null +++ b/public/update.html @@ -0,0 +1,86 @@ + + + + CS4241 Assignment 3 SignUpPage + + + + + + + + + + + +
    +
    + Kurtz's Cars + + +
    +
    +

    +

    +
    +
    + Sign up to manage your lineup + + + + +
    + a car +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + + From ae21996f4ea3dc8d00bce0b09a4104ef89102a68 Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Sun, 9 Oct 2022 16:14:19 -0400 Subject: [PATCH 03/16] adding .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 00f24d258..fd651fda6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .env node_modules/* +.DS_Store +.git From 4024d49ce20a49a0add3945d5ce1b39cd5a20ca5 Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Sun, 9 Oct 2022 19:05:25 -0400 Subject: [PATCH 04/16] idl --- block.json | 35 ++++++++++ classes.json | 75 +++++++++++++++++++++ mongo.json | 161 +++++++++++++++++++++++++++++++++++++++++++++ public/login.html | 4 +- public/main.html | 1 - server.improved.js | 43 +++++------- teacher.json | 32 +++++++++ 7 files changed, 323 insertions(+), 28 deletions(-) create mode 100644 block.json create mode 100644 classes.json create mode 100644 mongo.json create mode 100644 teacher.json diff --git a/block.json b/block.json new file mode 100644 index 000000000..1aee31a28 --- /dev/null +++ b/block.json @@ -0,0 +1,35 @@ +[ + + + { + "name": "A", + "classes": [] + }, + { + "name": "B", + "classes": [] + }, + { + "name": "C", + "classes": [] + }, + { + "name": "D", + "classes": [] + }, + { + "name": "E", + "classes": [] + }, + { + "name": "F", + "classes": [] + }, +{ + "name": "G", + "classes": [] + } + + + +] \ No newline at end of file diff --git a/classes.json b/classes.json new file mode 100644 index 000000000..18fd76a8e --- /dev/null +++ b/classes.json @@ -0,0 +1,75 @@ +[ + { + "code": "MC1", + "name": "H. Calculus", + "blocks": [] + }, + { + "code": "MC2", + "name": "AP Calculus AB", + "blocks": [] + }, + { + "code": "MC3", + "name": "AP Calculus BC", + "blocks": [] + }, + { + "code": "MC4", + "name": "Calculus", + "blocks": [] + }, + { + "code": "MC5", + "name": "Functions and Operations", + "blocks": [] + }, + { + "code": "MC6", + "name": "Geometry", + "blocks": [] + }, + { + "code": "MC7", + "name": "H. Geometry", + "blocks": [] + }, + { + "code": "MC8", + "name": "H. Algebra 2", + "blocks": [] + }, + { + "code": "MC9", + "name": "Algebra 2", + "blocks": [] + }, + { + "code": "MC10", + "name": "Statistics", + "blocks": [] + }, + { + "code": "MC11", + "name": "H. Statistics", + "blocks": [] + }, + { + "code": "MC12", + "name": "AP Statistics", + "blocks": [] + }, + { + "code": "MC13", + "name": "Pre-Calculus", + "blocks": [] + }, + { + "code": "MC14", + "name": "H. Pre-Calculus", + "blocks": [] + } + + + +] \ No newline at end of file diff --git a/mongo.json b/mongo.json new file mode 100644 index 000000000..0317068d1 --- /dev/null +++ b/mongo.json @@ -0,0 +1,161 @@ +[ + + { + "type": "teacher", + "name": "Joeseph Lentino", + "email": "jlentino@k12.ma.us", + "password": "changeMe", + "classes": [], + "blocks": [] + }, + { + "type": "teacher", + "name": "Colby King", + "email": "crey@k12.ma.us", + "password": "changeMe", + "classes": [], + "blocks": [] + }, + { + "type": "teacher", + "name": "Beth Schiller", + "email": "bschiller@k12.ma.us", + "password": "changeMe", + "classes": [], + "blocks": [] + }, + { + "type": "teacher", + "name": "Ronald Mandavi", + "email": "rsmandavi@k12.ma.us", + "password": "changeMe", + "classes": [], + "blocks": [] + }, + + + + + + { + "type": "class", + "code": "MC1", + "name": "H. Calculus", + "blocks": [] + }, + { + "type": "class", + "code": "MC2", + "name": "AP Calculus AB", + "blocks": [] + }, + { + "type": "class", + "code": "MC3", + "name": "AP Calculus BC", + "blocks": [] + }, + { + "type": "class", + "code": "MC4", + "name": "Calculus", + "blocks": [] + }, + { + "type": "class", + "code": "MC5", + "name": "Functions and Operations", + "blocks": [] + }, + { + "type": "class", + "code": "MC6", + "name": "Geometry", + "blocks": [] + }, + { + "type": "class", + "code": "MC7", + "name": "H. Geometry", + "blocks": [] + }, + { + "type": "class", + "code": "MC8", + "name": "H. Algebra 2", + "blocks": [] + }, + { + "type": "class", + "code": "MC9", + "name": "Algebra 2", + "blocks": [] + }, + { + "type": "class", + "code": "MC10", + "name": "Statistics", + "blocks": [] + }, + { + "type": "class", + "code": "MC11", + "name": "H. Statistics", + "blocks": [] + }, + { + "type": "class", + "code": "MC12", + "name": "AP Statistics", + "blocks": [] + }, + { + "type": "class", + "code": "MC13", + "name": "Pre-Calculus", + "blocks": [] + }, + { + "type": "class", + "code": "MC14", + "name": "H. Pre-Calculus", + "blocks": [] + }, + + { + "type": "block", + "name": "A", + "classes": [] + }, + { + "type": "block", + "name": "B", + "classes": [] + }, + { + "type": "block", + "name": "C", + "classes": [] + }, + { + "type": "block", + "name": "D", + "classes": [] + }, + { + "type": "block", + "name": "E", + "classes": [] + }, + { + "type": "block", + "name": "F", + "classes": [] + }, + { + "type": "block", + "name": "G", + "classes": [] + } + +] \ No newline at end of file diff --git a/public/login.html b/public/login.html index 00021384c..364450bcf 100644 --- a/public/login.html +++ b/public/login.html @@ -16,7 +16,7 @@
    - Kurtz's Cars + Math Department: Educator Portal
    • Home
    • @@ -28,7 +28,7 @@

      - Log in to manage your lineup + Log in to select your classes for the 2023-24 school year
      diff --git a/public/main.html b/public/main.html index 7849225ce..69886352f 100644 --- a/public/main.html +++ b/public/main.html @@ -1,4 +1,3 @@ - CS4241 Assignment 3 MainPage diff --git a/server.improved.js b/server.improved.js index 7261dc21b..7b97a8569 100644 --- a/server.improved.js +++ b/server.improved.js @@ -15,16 +15,19 @@ const bodyParser = require('body-parser'); const cookie = require( 'cookie-session' ); const k1 = "kdjkjdakask"; const k2 = "dsjfjsfrifw"; +require('dotenv').config() const { MongoClient, ServerApiVersion } = require('mongodb'); const muri = "mongodb+srv://"+process.env.MONGO_USER+":"+ process.env.MONGO_PASSWORD+"@a3cluster.oip0htf.mongodb.net/?retryWrites=true&w=majority"; const mClient = new MongoClient(muri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 }); -let collection = null +let collection = null +console.log(muri) mClient.connect() .then( () => { + console.log(muri) // will only create collection if it doesn't exist - return mClient.db( 'a3Accounts' ).collection( 'users' ) + return mClient.db( 'finalProject' ).collection( 'data') }) .then( __collection => { // store reference to collection @@ -39,26 +42,6 @@ mClient.connect() //collection.find({ }).toArray().then( result => res.json( result ) ) } -/* appdata structure example*/ -/* - { 'abc@abc.com': { - 'name': 'John Smith', - 'working': true, - 'password': '', - 'cars': [ - { 'model': 'ford', - 'year': 2000, - 'milage': 205 - } - ] - } - -const appdata = [ - { 'model': 'toyota', 'year': 1999, 'mileage': 205724}, - { 'model': 'dodge', 'year': 2004, 'mileage': 172057 }, - { 'model': 'ford', 'year': 1987, 'mileage': 299690} -]; -*/ var appdata = {}; // add url encoding app.use( express.urlencoded({ extended:true }) ) @@ -76,6 +59,7 @@ app.post('/signup',(request,response,next) => handlePostSignUp( request, respons // we send people to login when they do not have login flag set // problem we also ned to app.use( function( req,res,next) { + console.log("Check Session") console.log(req.session) if( req.session.login === true ){ console.log(req.session) @@ -270,10 +254,12 @@ async function handlePostSignUp( request, response, next ) { async function handleGetUserUpdate( request, response, next ) { console.log("in userupdate ... "); + console.log("testing") console.log( request.session ); if( request.session.login === true ){ // construct Json file to push to the user for rendering var email = request.session.email; + console.log("ahhhhhh") var user = await getUser(email) if( user !== null ){ // I have my my e-mail @@ -300,11 +286,16 @@ const sendUpdatePage = function( request, response, next ) { } // returns user record (if exists) or null async function getUser(email){ - var query = {'email': email} var ret = null; if( collection !== null){ - console.log("getUser: have collection, email: "+email) - ret = await collection.findOne(query) + + console.log("getUser: have, email: "+email) + ret = await collection.findOne( + {$and:[ + {'type': 'teacher'}, + {'email': email} + ]} + ) console.log("getUser return: ",ret); } return ret; @@ -410,6 +401,8 @@ async function handlePostUpdate( request, response, next ) { } } + + async function handleGetJ( request, response ) { console.log("handleGetJ geting args ... ") var email = request.session.email; diff --git a/teacher.json b/teacher.json new file mode 100644 index 000000000..6610b269b --- /dev/null +++ b/teacher.json @@ -0,0 +1,32 @@ +[ + + + { + "name": "Joeseph Lentino", + "email": "jlentino@k12.ma.us", + "password": "changeMe", + "classes": [], + "blocks": [] + }, + { + "name": "Colby King", + "email": "crey@k12.ma.us", + "password": "changeMe", + "classes": [], + "blocks": [] + }, + { + "name": "Beth Schiller", + "email": "bschiller@k12.ma.us", + "password": "changeMe", + "classes": [], + "blocks": [] + }, + { + "name": "Ronald Mandavi", + "email": "rsmandavi@k12.ma.us", + "password": "changeMe", + "classes": [], + "blocks": [] + } +] \ No newline at end of file From f325735e6a96fc83ef9f34ba5511ffb7a577d80f Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Sun, 9 Oct 2022 19:56:44 -0400 Subject: [PATCH 05/16] some updates --- public/login.html | 2 +- public/main.html | 9 +++++---- public/mathsymbols.jpeg | Bin 0 -> 23500 bytes server.improved.js | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) create mode 100644 public/mathsymbols.jpeg diff --git a/public/login.html b/public/login.html index 364450bcf..b695e7ed4 100644 --- a/public/login.html +++ b/public/login.html @@ -32,7 +32,7 @@
      - a car + a car
      diff --git a/public/main.html b/public/main.html index 69886352f..1e7d13ccd 100644 --- a/public/main.html +++ b/public/main.html @@ -15,6 +15,7 @@

      -

      Kurtz's Cars

      -

      Dealer Portal

      +

      Math Department

      +

      Educator Portal

      - Manage your lineup: + Select classes to teach for the upcoming school year:
      - a car + a car
      diff --git a/public/mathsymbols.jpeg b/public/mathsymbols.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..405c99cbf3ce309039962c676fbcf5ab332285a1 GIT binary patch literal 23500 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≦)fV$Lt!ved%}sCAxFQ~wm_0VY(=o<{32)4 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 literal 0 HcmV?d00001 diff --git a/server.improved.js b/server.improved.js index 7b97a8569..db78c5ae2 100644 --- a/server.improved.js +++ b/server.improved.js @@ -48,7 +48,7 @@ app.use( express.urlencoded({ extended:true }) ) // activate cookie handeling: session app.use( cookie({ name: 'session', - keys: [process.env.SESSION_k1, process.env.SESSION_k2] + keys: [process.env.SESSION_K1, process.env.SESSION_K2] })) // serve all static pages as we need CSS. etc app.use(serveStatic(dir, { index: ['login.html', 'login.htm'] })); From 9fa78f8bb471ca1f7f3f3eabf890b32c5100916f Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Sun, 9 Oct 2022 20:02:34 -0400 Subject: [PATCH 06/16] html tune up --- public/main.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/main.html b/public/main.html index 1e7d13ccd..5e62b87a2 100644 --- a/public/main.html +++ b/public/main.html @@ -13,7 +13,7 @@
      - Kurtz's Cars + High School
      • View Schedule
      • Home
      • From bee6506286d9e58a79c8297bac6627a0d5044243 Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Sun, 9 Oct 2022 22:46:55 -0400 Subject: [PATCH 07/16] server is updated --- server.improved.js | 103 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 97 insertions(+), 6 deletions(-) diff --git a/server.improved.js b/server.improved.js index db78c5ae2..85fbd7486 100644 --- a/server.improved.js +++ b/server.improved.js @@ -10,12 +10,10 @@ const http = require( 'http' ), mime = require( 'mime' ), dir = 'public/', port = 3000; +require('dotenv').config() const serveStatic = require('serve-static'); const bodyParser = require('body-parser'); const cookie = require( 'cookie-session' ); -const k1 = "kdjkjdakask"; -const k2 = "dsjfjsfrifw"; -require('dotenv').config() const { MongoClient, ServerApiVersion } = require('mongodb'); const muri = "mongodb+srv://"+process.env.MONGO_USER+":"+ process.env.MONGO_PASSWORD+"@a3cluster.oip0htf.mongodb.net/?retryWrites=true&w=majority"; @@ -78,6 +76,8 @@ app.use( function( req,res,next) { app.get('/userupdate',(request,response,next) => sendUpdatePage( request, response, next )); app.post('/userupdate',(request,response,next) => handlePostUpdate( request, response, next )); app.get('/userfetch',(request,response,next) => handleGetUserUpdate( request, response, next )); +app.get('/classesfetch',(request,response,next) => handleGetClasses( request, response, next )); +app.get('/blocksfetch',(request,response,next) => handleGetBlocks( request, response, next )); // signput comes after cookie validation app.get('/signout',(request,response,next) => handleSignOut( request, response, next )); app.use(bodyParser.json({type: 'text/plain'})); @@ -178,8 +178,12 @@ async function handlePostL( request, response ) { if( user.password === request.body.password ){ // we are good // set cookie + console.log("login is good") request.session.login = true; request.session.email = request.body.email; + console.log(request.session) + console.log("sending redirect"); + //response.sendFile( __dirname +"/" + dir + 'main.html' ); response.redirect( 'main.html' ) } } @@ -274,6 +278,43 @@ async function handleGetUserUpdate( request, response, next ) { } } +async function handleGetClasses( request, response, next ) { + console.log("handleGetClasses: ... "); + console.log( request.session ); + if( request.session.login === true ){ + // construct Json file to push to the user for rendering + var classes = await getClasses() + if( classes !== null ){ + // I have my my e-mail + console.log(classes) + var rb = JSON.stringify(classes) + response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }) + response.end(rb) + } + } else { + // clean up session + next(); + } +} +async function handleGetBlocks( request, response, next ) { + console.log("handleGetBlocks: ... "); + console.log( request.session ); + if( request.session.login === true ){ + // construct Json file to push to the user for rendering + var blocks = await getBlocks() + if( blocks !== null ){ + // I have my my e-mail + console.log(blocks) + var rb = JSON.stringify(blocks) + response.writeHead( 200, "OK", {'Content-Type': 'text/plain' }) + response.end(rb) + } + } else { + // clean up session + next(); + } +} + const sendUpdatePage = function( request, response, next ) { console.log("in sendUpdatePage ... "); console.log( request.session ); @@ -300,6 +341,58 @@ async function getUser(email){ } return ret; } +// returns all classes data +async function getClasses(){ + var ret = null; + if( collection !== null){ + console.log("getClasses:") + ret = await collection.find( + {'type': 'class'} + ).toArray() + console.log("getClasses returns: ",ret); + } + return ret; +} +async function getClass(code){ + var ret = null; + if( collection !== null){ + console.log("getClass: calss code: "+code) + ret = await collection.findOne( + {$and:[ + {'type': 'class'}, + {'code': code} + ]} + ) + console.log("getClass returns: ",ret); + } + return ret.toArray(); +} +// returns all blocks data +async function getBlocks(){ + var ret = null; + if( collection !== null){ + console.log("getBlocks:") + ret = await collection.find( + {'type': 'block'} + ).toArray() + console.log("getBlocks return: ",ret); + } + return ret; +} +async function getBlock(name){ + var ret = null; + if( collection !== null){ + console.log("getBlock: block name: "+name) + ret = await collection.findOne( + {$and:[ + {'type': 'block'}, + {'name': name} + ]} + ) + console.log("getBlock returns: ",ret); + } + return ret; +} // json object for a user async function addUser(user){ if( collection !== null){ @@ -401,8 +494,6 @@ async function handlePostUpdate( request, response, next ) { } } - - async function handleGetJ( request, response ) { console.log("handleGetJ geting args ... ") var email = request.session.email; @@ -418,4 +509,4 @@ async function handleGetJ( request, response ) { } // start app -app.listen(port || process.env.PORT) \ No newline at end of file +app.listen(port || process.env.PORT) From a4013953b9aa6beb3ed559321c460d450c7428a4 Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Tue, 11 Oct 2022 19:53:24 -0400 Subject: [PATCH 08/16] some stuff --- public/main.html | 153 ++++++++++++++++++++++++++++++++++++++++++++- server.improved.js | 150 +++++++++++++++++++++----------------------- 2 files changed, 222 insertions(+), 81 deletions(-) diff --git a/public/main.html b/public/main.html index 5e62b87a2..9be6ac4a9 100644 --- a/public/main.html +++ b/public/main.html @@ -48,10 +48,136 @@

        Educator Portal

          +
          + Block A: +
          + +
          +

          + Block B: +
          + +
          +

          + Block C: +
          + +
          +

          + Block D: +
          + +
          +

          + Block E: +
          + +
          +

          + Block F: +
          + +
          +

          + Block G: +
          + +
          +

          + + +
        diff --git a/server.improved.js b/server.improved.js index 85fbd7486..0fc8e17e0 100644 --- a/server.improved.js +++ b/server.improved.js @@ -10,10 +10,12 @@ const http = require( 'http' ), mime = require( 'mime' ), dir = 'public/', port = 3000; -require('dotenv').config() const serveStatic = require('serve-static'); const bodyParser = require('body-parser'); const cookie = require( 'cookie-session' ); +const k1 = "kdjkjdakask"; +const k2 = "dsjfjsfrifw"; +require('dotenv').config() const { MongoClient, ServerApiVersion } = require('mongodb'); const muri = "mongodb+srv://"+process.env.MONGO_USER+":"+ process.env.MONGO_PASSWORD+"@a3cluster.oip0htf.mongodb.net/?retryWrites=true&w=majority"; @@ -76,14 +78,13 @@ app.use( function( req,res,next) { app.get('/userupdate',(request,response,next) => sendUpdatePage( request, response, next )); app.post('/userupdate',(request,response,next) => handlePostUpdate( request, response, next )); app.get('/userfetch',(request,response,next) => handleGetUserUpdate( request, response, next )); -app.get('/classesfetch',(request,response,next) => handleGetClasses( request, response, next )); -app.get('/blocksfetch',(request,response,next) => handleGetBlocks( request, response, next )); // signput comes after cookie validation app.get('/signout',(request,response,next) => handleSignOut( request, response, next )); app.use(bodyParser.json({type: 'text/plain'})); app.post('/submit',(request,response) => handlePostJ( request, response )); app.get('/showuser',(request,response) => handleGetJ( request, response )); + /* * */ @@ -98,6 +99,7 @@ const handleGet = function( request, response ) { } } + const handlePost = function( request, response ) { let dataString = '' @@ -164,6 +166,48 @@ async function handlePostJ( request, response ) { } } + +async function handlePostJa( request, response ) { + var inD = request.body; + console.log("handlePostJ geting args ... ") + console.log(inD) + var email = request.session.email; + console.log(email) + // do we have user + + var user = await getUser(email); + if(user !== null){ + if( inD.action === "add" ){ + // create new car + var nC = {model: inD.model, year: inD.year, mileage: inD.mileage} + // add car to cars array of user + user['cars'].push(nC) + } + console.log(user) + if(inD.action === "delete"){ + const trashBin = user['cars'].splice(inD.index, 1) + } + // copy of the user + userCopy = user; + theYear = new Date().getFullYear() + for(k = 0; k Date: Wed, 12 Oct 2022 21:45:50 -0400 Subject: [PATCH 09/16] some final changes --- server.improved.js | 322 ++++++++++++++++++++++----------------------- 1 file changed, 159 insertions(+), 163 deletions(-) diff --git a/server.improved.js b/server.improved.js index 0fc8e17e0..2917add6f 100644 --- a/server.improved.js +++ b/server.improved.js @@ -2,7 +2,9 @@ const express = require('express'); const util = require('util'); global.TextEncoder = util.TextEncoder; global.TextDecoder = util.TextDecoder; +// activate express const app = express(); +// main rewuired modules const http = require( 'http' ), fs = require( 'fs' ), // IMPORTANT: you must run `npm install` in the directory for this assignment @@ -10,19 +12,23 @@ const http = require( 'http' ), mime = require( 'mime' ), dir = 'public/', port = 3000; +// proecess .env file +require('dotenv').config() +// add static serving components const serveStatic = require('serve-static'); +// body parser needs for json const bodyParser = require('body-parser'); +// session handler const cookie = require( 'cookie-session' ); -const k1 = "kdjkjdakask"; -const k2 = "dsjfjsfrifw"; -require('dotenv').config() - +// mongodb driver const { MongoClient, ServerApiVersion } = require('mongodb'); +// construct mongo related vars const muri = "mongodb+srv://"+process.env.MONGO_USER+":"+ process.env.MONGO_PASSWORD+"@a3cluster.oip0htf.mongodb.net/?retryWrites=true&w=majority"; const mClient = new MongoClient(muri, { useNewUrlParser: true, useUnifiedTopology: true, serverApi: ServerApiVersion.v1 }); - let collection = null +// show what we got console.log(muri) +// connect to mongodb mClient.connect() .then( () => { console.log(muri) @@ -41,7 +47,7 @@ mClient.connect() console.log("here") //collection.find({ }).toArray().then( result => res.json( result ) ) } - +// not needed var appdata = {}; // add url encoding app.use( express.urlencoded({ extended:true }) ) @@ -75,138 +81,29 @@ app.use( function( req,res,next) { } }) // update profile goes after cookie validation +// userupdate GET route (to serve initial html page) app.get('/userupdate',(request,response,next) => sendUpdatePage( request, response, next )); +// userupdate POST route app.post('/userupdate',(request,response,next) => handlePostUpdate( request, response, next )); +// sends user data (per session object) as json to the client +app.get('/pasteschedule',(request,response,next) => sendSchedule( request, response, next )); app.get('/userfetch',(request,response,next) => handleGetUserUpdate( request, response, next )); +// sends classes to the client +app.get('/classesfetch',(request,response,next) => handleGetClasses( request, response, next )); +// sends blocks to the client +app.get('/blocksfetch',(request,response,next) => handleGetBlocks( request, response, next )); // signput comes after cookie validation app.get('/signout',(request,response,next) => handleSignOut( request, response, next )); +// deal with json data app.use(bodyParser.json({type: 'text/plain'})); +// handle /submit (not needed yet) app.post('/submit',(request,response) => handlePostJ( request, response )); +// shows user data app.get('/showuser',(request,response) => handleGetJ( request, response )); +// updates class selection calls +app.post('/classSelection',(request,response) => userClassesUpdate( request, response )); - -/* - * - */ - -const handleGet = function( request, response ) { - const filename = dir + request.url.slice( 1 ) - - if( request.url === '/' || request.url === "/?" ) { - sendFile( response, 'public/index.html' ) - }else{ - sendFile( response, filename ) - } -} - - -const handlePost = function( request, response ) { - let dataString = '' - - request.on( 'data', function( data ) { - dataString += data - }) - - request.on( 'end', function() { - // ... do something with the data here!!! - var inD = JSON.parse( dataString ); - console.log("getting args ..."); - console.log(inD) - if(inD.action === "add"){ - nC = {model: inD.model, year: inD.year, mileage: inD.mileage} - appdata.push(nC) - } - console.log(appdata) - if(inD.action === "delete"){ - const trashBin = appdata.splice(inD.index, 1) - } - theYear = new Date().getFullYear() - for(k = 0; k Date: Wed, 12 Oct 2022 21:46:07 -0400 Subject: [PATCH 10/16] dkf --- README.md | 28 ++- public/login.html | 3 +- public/main.html | 408 ++++++++++++++++++------------------------- public/schedule.html | 229 ++++++++++++++++++++++++ public/signup.html | 6 +- 5 files changed, 432 insertions(+), 242 deletions(-) create mode 100644 public/schedule.html diff --git a/README.md b/README.md index 9b56c216f..c458c9d39 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ The outline should have enough detail so that staff can determine if it meets th There are no other scheduled checkpoints for your project. -#### Turning in Your Project +## Turning in Your Project Submit a second PR on the final project repo to turn in your app and code. Again, only one pull request per team. Deploy your app, in the form of a webpage, to Glitch/Heroku/Digital Ocean or some other service; it is critical that the application functions correctly wherever you post it. @@ -42,7 +42,31 @@ The README for your second pull request doesn’t need to be a formal report, bu 5. What each group member was responsible for designing / developing. 6. A link to your project video. -Think of 1,3, and 4 in particular in a similar vein to the design / tech achievements for A1—A4… make a case for why what you did was challenging and why your implementation deserves a grade of 100%. + + +### The project of: + +## Andrei Ignatiev +alignatiev@wpi.edu +Glitch link: + +I created a webpage similar to the one from A3. In fact, website navigation logic, a lot of the express framework, and CSS style sheets all carry over from that assignment. Thematically, this project acts as a portal for teachers working at a hypothetical high school. An educator with established credentials can log on to the site and use a dropdown menu to select the classes they wish to teach for the upcoming school year. Other functionalities include, the ability to alter core account data like the name and password, and viewing a color-coded mock schedule based on selected classes. To keep things simple, I have confined the user-base to teachers within the math department. It is also assumed that the teachers have had accounts created for them at an earlier date. Therefore, graders will need the account of a teacher to access the site: + +email: crey@k12.ma.us (Mr. Colby King) +password: changeMe + +For the schedule, I drew inspiration from my high school's somewhat complex yet interesting class structure. At this high school, a student's, or in this case a teacher's, courseload consists of seven classes. Each class is assigned to a block (A through G). On any particular full day of school, students attend five of the seven classes in letter order, an example would be d-e-f-g-a. To construct the schedule for the following day, one needs to simply drop the final two blocks from the preceding day, shift the surviving blocks forward, and add the two blocks that were absent from the schedule into the front of the day, so b-c-d-e-f. A new 'day' is proclaimed until the rotation returns to the first five day ordering. Thus, there are seven unique 'days' of school, with Day 1 being the five-class order that begins with block A. Finally, when constructing a schedule, please note that teachers are allowed to have two of the seven blocks off. These are referred to as 'prep blocks' by the webpage. + +In terms of my body of work on the assignment, most of my choices boil down to the fact that I am doing this project individualy. Although I tried to make my product as complex and unique as possible, constraints that naturally arise from not having partners forced me to simplify several aspects of my project. + +Technoligies used: +-MongoDB +-Express +-HTML/CSS/JS +*svelte/react to sharpen UI elements would be something I would have looked into if I had an extra day or two* + +One challenge involved handling the interplay between the dropdown menus and the server. Every time a user selects a new class, the server must fetch and/or alter the necessary fields inside of mongoDB. That, in tandem with conventional server-client interactions made for a lot of work. Another challenge was producing the visual representation of the schedule. The realization of the convuluted seven block, five class scheme added some algorithmic flair to my code that I'm fairly proud of. + ## FAQs diff --git a/public/login.html b/public/login.html index b695e7ed4..a8a5dc411 100644 --- a/public/login.html +++ b/public/login.html @@ -1,7 +1,7 @@ - CS4241 Assignment 3 LoginPage + CS4241 Final Project LoginPage @@ -20,7 +20,6 @@
        diff --git a/public/main.html b/public/main.html index 9be6ac4a9..293ebc94e 100644 --- a/public/main.html +++ b/public/main.html @@ -1,6 +1,6 @@ - CS4241 Assignment 3 MainPage + CS4241 Final Project MainPage @@ -13,9 +13,9 @@
        - High School + My Portal
        -
        - - - - -
          -
          - Block A: -
          - -
          -

          - Block B: -
          - -
          -

          - Block C: -
          - -
          -

          - Block D: -
          - -
          -

          - Block E: -
          - -
          -

          - Block F: -
          - -
          -

          - Block G: -
          - -
          -

          - - -
          - diff --git a/public/schedule.html b/public/schedule.html new file mode 100644 index 000000000..8aaee2030 --- /dev/null +++ b/public/schedule.html @@ -0,0 +1,229 @@ + + + + CS4241 Final Project VisualAid + + + + + + + + + + + + +
          +
          + High School: My Portal + +
          +
          +

          +

          +
          +
          +

          Your schedule for the year:

          +
          +
          +

          +

          +

          +

          + + + + +
          + a car +
          +
          +
          +

          + + + + Color Key: +
          +
          + A +

          +
          +
          + B +
          + +
          + C +
          + +
          + D +
          +
          + E +
          +
          + F +
          +
          + G +
          +
          + refer to other HS resources for bell times +
          +
          +

          + + + + + + + + + + + + + + + + +
          + Day 1 + + Day 2 + + Day 3 + + Day 4 + + Day 5 + + Day 6 + + Day 7 +
          + + + \ No newline at end of file diff --git a/public/signup.html b/public/signup.html index d37182572..7b4ce7847 100644 --- a/public/signup.html +++ b/public/signup.html @@ -1,7 +1,7 @@ - CS4241 Assignment 3 SignUpPage + CS4241 Final Project SignUpPage @@ -15,7 +15,7 @@
          - Kurtz's Cars + Math Department
          • Home
          • @@ -27,7 +27,7 @@

            - Sign up to manage your lineup + Sign up if you are employed by this school district
            From 5525f5ccb462bc1ab271ef84aac72642d6c9358f Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Wed, 12 Oct 2022 21:49:02 -0400 Subject: [PATCH 11/16] readme tuneup --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c458c9d39..0f1a13fb8 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,9 @@ For the schedule, I drew inspiration from my high school's somewhat complex yet In terms of my body of work on the assignment, most of my choices boil down to the fact that I am doing this project individualy. Although I tried to make my product as complex and unique as possible, constraints that naturally arise from not having partners forced me to simplify several aspects of my project. -Technoligies used: --MongoDB --Express +Technoligies used: // +-MongoDB // +-Express // -HTML/CSS/JS *svelte/react to sharpen UI elements would be something I would have looked into if I had an extra day or two* From 9ba6dbaa4c92c862e9917667da4a58bc138a121e Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Wed, 12 Oct 2022 21:50:22 -0400 Subject: [PATCH 12/16] readme change --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0f1a13fb8..b8fa7723e 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,9 @@ For the schedule, I drew inspiration from my high school's somewhat complex yet In terms of my body of work on the assignment, most of my choices boil down to the fact that I am doing this project individualy. Although I tried to make my product as complex and unique as possible, constraints that naturally arise from not having partners forced me to simplify several aspects of my project. -Technoligies used: // --MongoDB // --Express // +Technoligies used: \ +-MongoDB \ +-Express \ -HTML/CSS/JS *svelte/react to sharpen UI elements would be something I would have looked into if I had an extra day or two* From 711c2ca24b2b8d81e8131d3b930a4b54fa74b9bc Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Wed, 12 Oct 2022 21:51:07 -0400 Subject: [PATCH 13/16] readme part 3 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b8fa7723e..10d9bbf6f 100644 --- a/README.md +++ b/README.md @@ -61,8 +61,8 @@ In terms of my body of work on the assignment, most of my choices boil down to t Technoligies used: \ -MongoDB \ --Express \ --HTML/CSS/JS +-Express\ +-HTML/CSS/JS\ *svelte/react to sharpen UI elements would be something I would have looked into if I had an extra day or two* One challenge involved handling the interplay between the dropdown menus and the server. Every time a user selects a new class, the server must fetch and/or alter the necessary fields inside of mongoDB. That, in tandem with conventional server-client interactions made for a lot of work. Another challenge was producing the visual representation of the schedule. The realization of the convuluted seven block, five class scheme added some algorithmic flair to my code that I'm fairly proud of. From 2cb50e5a2061b2548f581a1ed2fa0a5f50a8020a Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Wed, 12 Oct 2022 21:51:44 -0400 Subject: [PATCH 14/16] readme deletes --- README.md | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/README.md b/README.md index 10d9bbf6f..308216289 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,6 @@ # Final Project *Due October 13th (final day of the term)* -For your final project, you'll implement a web application that exhibits understanding of the course materials. -This project should provide an opportunity to both be creative and to pursue individual research and learning goals. - -## General description -Your project should consist of a complete Web application, exhibiting facets of the three main sections of the course material: - -- Static web page content and design. You should have a project that is accessible, easily navigable, and features significant content. -- Dynamic behavior implemented with JavaScript (TypeScript is also allowed if your group wants to explore it). -- Server-side programming *using Node.js*. Typically this will take the form of some sort of persistent data (database), authentication, and possibly server-side computation. -- A video (less than five minutes) where each group member explains some aspect of the project. An easy way to produce this video is for you all the groups members to join a Zoom call that is recorded; each member can share their screen when they discuss the project or one member can "drive" the interface while other members narrate (this second option will probably work better.) The video should be posted on YouTube or some other accessible video hosting service. Make sure your video is less than five minutes, but long enough to successfully explain your project and show it in action. There is no minimum video length. - -## Project ideation -Excellent projects typically serve someone/some group; for this assignment you need to define your users and stakeholders. I encourage you to identify projects that will have impact, either artistically, politically, or in terms of productivity. - -### Deliverables - -#### Form Team (due 9/25) -Students are will work in teams of 3-5 students for the project; teams of two can be approved with the permission of the instructor. Working in teams should help enable you to build a good project in a limited amount of time. Use the `#project-logistics` channel in Discord to pitch ideas for final projects and/or find fellow team members as needed. - -Teams must be in place by end of day on Sunday, September 25th. If you have not identified a team at this point, you will be assigned a team. You will be given some class time on Monday to work on your proposal, but please plan on reserving additional time outside of class as needed. - -#### Proposal (due 9/27) -Provide an outline of your project direction and the names of associated team members. -The outline should have enough detail so that staff can determine if it meets the minimum expectations, or if it goes too far to be reasonable by the deadline. Please include a general description of a project, and list of key technologies/libraries you plan on using (e.g. React, Three.js, Svelte, TypeScript etc.). Two to four paragraps should provide enough level of detail. Name the file proposal.md and submit a pull request by Tuesday, September 27th at 11:59 PM (end of day). Only one pull request is required per team. - -There are no other scheduled checkpoints for your project. - ## Turning in Your Project Submit a second PR on the final project repo to turn in your app and code. Again, only one pull request per team. From 2678f883b585d6e79084b361d221ffae949760a6 Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Wed, 12 Oct 2022 21:56:44 -0400 Subject: [PATCH 15/16] added glitch link --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 308216289..84f28f8d3 100644 --- a/README.md +++ b/README.md @@ -21,13 +21,16 @@ The README for your second pull request doesn’t need to be a formal report, bu ## Andrei Ignatiev alignatiev@wpi.edu -Glitch link: +Glitch link: https://glitch.com/~finalproject-alignatiev I created a webpage similar to the one from A3. In fact, website navigation logic, a lot of the express framework, and CSS style sheets all carry over from that assignment. Thematically, this project acts as a portal for teachers working at a hypothetical high school. An educator with established credentials can log on to the site and use a dropdown menu to select the classes they wish to teach for the upcoming school year. Other functionalities include, the ability to alter core account data like the name and password, and viewing a color-coded mock schedule based on selected classes. To keep things simple, I have confined the user-base to teachers within the math department. It is also assumed that the teachers have had accounts created for them at an earlier date. Therefore, graders will need the account of a teacher to access the site: email: crey@k12.ma.us (Mr. Colby King) password: changeMe +email: jlentino@k12.ma.us +password: bcRox1 + For the schedule, I drew inspiration from my high school's somewhat complex yet interesting class structure. At this high school, a student's, or in this case a teacher's, courseload consists of seven classes. Each class is assigned to a block (A through G). On any particular full day of school, students attend five of the seven classes in letter order, an example would be d-e-f-g-a. To construct the schedule for the following day, one needs to simply drop the final two blocks from the preceding day, shift the surviving blocks forward, and add the two blocks that were absent from the schedule into the front of the day, so b-c-d-e-f. A new 'day' is proclaimed until the rotation returns to the first five day ordering. Thus, there are seven unique 'days' of school, with Day 1 being the five-class order that begins with block A. Finally, when constructing a schedule, please note that teachers are allowed to have two of the seven blocks off. These are referred to as 'prep blocks' by the webpage. In terms of my body of work on the assignment, most of my choices boil down to the fact that I am doing this project individualy. Although I tried to make my product as complex and unique as possible, constraints that naturally arise from not having partners forced me to simplify several aspects of my project. From 55bdd7d11355feb171bfcb3c267ea2e9499e9e1d Mon Sep 17 00:00:00 2001 From: Andrei Ignatiev Date: Thu, 13 Oct 2022 11:46:03 -0400 Subject: [PATCH 16/16] added youtube --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 84f28f8d3..1c550482d 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,11 @@ The README for your second pull request doesn’t need to be a formal report, bu ## Andrei Ignatiev alignatiev@wpi.edu -Glitch link: https://glitch.com/~finalproject-alignatiev +Glitch link: https://glitch.com/~finalproject-alignatiev \ +Youtube video Link: https://www.youtube.com/watch?v=tt_XXqfLwu4 + + + I created a webpage similar to the one from A3. In fact, website navigation logic, a lot of the express framework, and CSS style sheets all carry over from that assignment. Thematically, this project acts as a portal for teachers working at a hypothetical high school. An educator with established credentials can log on to the site and use a dropdown menu to select the classes they wish to teach for the upcoming school year. Other functionalities include, the ability to alter core account data like the name and password, and viewing a color-coded mock schedule based on selected classes. To keep things simple, I have confined the user-base to teachers within the math department. It is also assumed that the teachers have had accounts created for them at an earlier date. Therefore, graders will need the account of a teacher to access the site: @@ -31,6 +35,9 @@ password: changeMe email: jlentino@k12.ma.us password: bcRox1 + + + For the schedule, I drew inspiration from my high school's somewhat complex yet interesting class structure. At this high school, a student's, or in this case a teacher's, courseload consists of seven classes. Each class is assigned to a block (A through G). On any particular full day of school, students attend five of the seven classes in letter order, an example would be d-e-f-g-a. To construct the schedule for the following day, one needs to simply drop the final two blocks from the preceding day, shift the surviving blocks forward, and add the two blocks that were absent from the schedule into the front of the day, so b-c-d-e-f. A new 'day' is proclaimed until the rotation returns to the first five day ordering. Thus, there are seven unique 'days' of school, with Day 1 being the five-class order that begins with block A. Finally, when constructing a schedule, please note that teachers are allowed to have two of the seven blocks off. These are referred to as 'prep blocks' by the webpage. In terms of my body of work on the assignment, most of my choices boil down to the fact that I am doing this project individualy. Although I tried to make my product as complex and unique as possible, constraints that naturally arise from not having partners forced me to simplify several aspects of my project.