From 0007582ab6112ffed1cbc57fee9b3b9e3b6952d6 Mon Sep 17 00:00:00 2001 From: adelysf <adelysf@outlook.fr> Date: Tue, 7 Nov 2023 21:09:28 +0100 Subject: [PATCH] Add project files. --- Task.js | 16 + app.js | 26 + package-lock.json | 1118 ++++++++++++++++++++++++++++++++++++++++++ package.json | 19 + public/logo.png | Bin 0 -> 18479 bytes routes/index.js | 10 + routes/taskRoutes.js | 38 ++ views/index.ejs | 100 ++++ 8 files changed, 1327 insertions(+) create mode 100644 Task.js create mode 100644 app.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/logo.png create mode 100644 routes/index.js create mode 100644 routes/taskRoutes.js create mode 100644 views/index.ejs diff --git a/Task.js b/Task.js new file mode 100644 index 0000000..dfc015e --- /dev/null +++ b/Task.js @@ -0,0 +1,16 @@ +const mongoose = require("mongoose"); + +const taskSchema = new mongoose.Schema({ + task: { + type:String, + required:true + }, + isCompleted: { + type:String, + required:true, + default:"0" + } + +}); + +module.exports = new mongoose.model("Task", taskSchema); diff --git a/app.js b/app.js new file mode 100644 index 0000000..723eca1 --- /dev/null +++ b/app.js @@ -0,0 +1,26 @@ +//importing modules +const express = require("express"); +const mongoose = require("mongoose"); +const app = express(); + +//connecting to the database +mongoose.connect("mongodb://localhost/taskdb"); + +//gather data from forms +app.use(express.urlencoded({ extended: true })); + +//use public folder for static files (an image here) +app.use(express.static("public")); + +// Logs details with morgan module +const morgan = require("morgan"); +app.use(morgan("dev")); + +//the views is set by an ejs file +app.set("view engine", "ejs"); + +//routes are defining the differents features of the app +app.use(require("./routes/index")) +app.use(require("./routes/taskRoutes")) + +app.listen(3000, () => console.log("Server started listening on port: 3000")); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6cab0d8 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1118 @@ +{ + "name": "tda", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tda", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "ejs": "^3.1.9", + "express": "^4.18.2", + "method-override": "^3.0.0", + "mongoose": "^8.0.0", + "morgan": "^1.10.0" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz", + "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@types/node": { + "version": "20.8.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", + "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.2.tgz", + "integrity": "sha512-uNv6b/uGRLlCVmelat2rA8bcVd3k/42mV2EmjhPh6JLkd35T5bgwR/t6xy7a9MWhd9sixIeBUzhBenvk3NO+DQ==" + }, + "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/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/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "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/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "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/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/bson": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz", + "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==", + "engines": { + "node": ">=16.20.1" + } + }, + "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.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "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", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "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/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/kareem": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", + "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==", + "engines": { + "node": ">=12.0.0" + } + }, + "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/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==" + }, + "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/method-override": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz", + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==", + "dependencies": { + "debug": "3.1.0", + "methods": "~1.1.2", + "parseurl": "~1.3.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/method-override/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "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/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": "6.2.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz", + "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.0", + "bson": "^6.2.0", + "mongodb-connection-string-url": "^2.6.0" + }, + "engines": { + "node": ">=16.20.1" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.1.0", + "gcp-metadata": "^5.2.0", + "kerberos": "^2.0.1", + "mongodb-client-encryption": ">=6.0.0 <7", + "snappy": "^7.2.2", + "socks": "^2.7.1" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "gcp-metadata": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "optional": true + }, + "socks": { + "optional": true + } + } + }, + "node_modules/mongodb-connection-string-url": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz", + "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==", + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongoose": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.0.tgz", + "integrity": "sha512-PzwkLgm1Jhj0NQdgGfnFsu0QP9V1sBFgbavEgh/IPAUzKAagzvEhuaBuAQOQGjczVWnpIU9tBqyd02cOTgsPlA==", + "dependencies": { + "bson": "^6.2.0", + "kareem": "2.5.1", + "mongodb": "6.2.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "16.0.1" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/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/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/mpath": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", + "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", + "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", + "dependencies": { + "debug": "4.x" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/mquery/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "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/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "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/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", + "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/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "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==", + "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/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/sift": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz", + "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ==" + }, + "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==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "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/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=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/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/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/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "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" + } + }, + "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" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3089379 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "tda", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "ejs": "^3.1.9", + "express": "^4.18.2", + "method-override": "^3.0.0", + "mongoose": "^8.0.0", + "morgan": "^1.10.0" + } +} diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..72b7035a850fd1000eb1e6207c0fc0d2b0c866ed GIT binary patch literal 18479 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 zok�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 Srkz{>0000<MNUMnLSTX|e&l2T literal 0 HcmV?d00001 diff --git a/routes/index.js b/routes/index.js new file mode 100644 index 0000000..0430ed0 --- /dev/null +++ b/routes/index.js @@ -0,0 +1,10 @@ +const router = require("express").Router() +const Task = require("../Task"); + +router.get("/", async(req, res) => { + const allTasks = await Task.find(); + res.render("index", {task: allTasks}) +}) + + +module.exports = router; \ No newline at end of file diff --git a/routes/taskRoutes.js b/routes/taskRoutes.js new file mode 100644 index 0000000..fe62447 --- /dev/null +++ b/routes/taskRoutes.js @@ -0,0 +1,38 @@ +// defining a router to organise routes +const router = require("express").Router(); +const Task = require("../Task"); + +// route to add a task +router.post("/add/task", (req, res) => { + const { task } = req.body; + const newTask = new Task({ task }); + + newTask.save().then(() => { + console.log("The task has been added to the list."); + res.redirect("/"); + }) + .catch((err) => console.log(err)); +}) + + +// route to delete a task +router.get("/delete/task/:_id", (req, res) => { + const { _id } = req.params; + Task.deleteOne({ _id }).then(() => { + console.log("The task has been deleted."); + res.redirect("/"); + }) + .catch((err) => console.log(err)); +}) + +//route to update a task +router.get("/update/task/:_id",(req,res)=>{ + const {_id}=req.params; + Task.updateOne({_id}, { isCompleted:"1"}).then(()=>{ + console.log("The task has been completed") + res.redirect('/') + }) + .catch((err)=>console.log(err)); +}); + +module.exports = router; diff --git a/views/index.ejs b/views/index.ejs new file mode 100644 index 0000000..d6d5c13 --- /dev/null +++ b/views/index.ejs @@ -0,0 +1,100 @@ +<!DOCTYPE html> + +<html lang="en"> + + <head> + <meta charset="UTF-8"> + <title>ToDo App</title> + <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> + <style> + .hov:hover { + background-color: rgb(245, 245, 245); + } + .hov-completed:hover{ + background-color: #90EE90; + } + .task-item { + display: flex; + justify-content: space-between; + align-items: center; + } + .completed-task { + background-color: #c0f7c0; + } + .hide-completed { + display: none; + } + </style> + </head> + <body> + <div class="container" style="margin-top: 50px;"> + <h3 style="text-align: center;"><img src="logo.png" width="100" height="100" style="margin-bottom: 10px;"/><br>ToDo App</h3> + <div class="section"> + <p class="lead" style="text-align: center;">Organize your life with our ToDo App and stop forgetting things!</p> + </div> + </div> + <div class="container mt-5"> + <form action="/add/task" class="d-flex" method="POST"> + <input type="text" name="task" class="form-control" placeholder="Type a task to do"> + <button type="submit" class="btn btn-outline-dark sm-">Add</button> + </form> + <ul class="list-group mt-3"> + <% task.forEach(tasks => { %> + <% if (tasks.isCompleted === '0') { %> + <li class="list-group-item hov task-item"> + <%= tasks.task %> + <span> + <a href="/update/task/<%= tasks._id %>" class="btn btn-success btn-sm-">Task completed</a> + <a href="/delete/task/<%= tasks._id %>" class="btn btn-dark btn-sm-">Delete the task</a> + </span> + </li> + <% } %> + <% }) %> + + <% task.forEach(tasks => { %> + <% if (tasks.isCompleted === '1') { %> + <li class="list-group-item hov-completed task-item completed-task"> + <%= tasks.task %> + <span> + <a href="/delete/task/<%= tasks._id %>" class="btn btn-dark btn-sm-">Delete the task</a> + </span> + </li> + <% } %> + <% }) %> + </ul> + + <button id="showCompletedTasks" class="btn btn-outline-success sm- mt-3">Completed tasks</button> + + <script> + document.addEventListener("DOMContentLoaded", function () { + const showCompletedButton = document.getElementById("showCompletedTasks"); + const completedTasks = document.querySelectorAll(".completed-task"); + const hideCompletedClass = "hide-completed"; + + // Initially hide completed tasks + completedTasks.forEach(function (task) { + task.classList.add(hideCompletedClass); + }); + + // Verify if there are completed tasks to show (or not) the button + const hasCompletedTasks = document.querySelector(".completed-task"); + if (!hasCompletedTasks) { + showCompletedButton.style.display = "none"; + } + + showCompletedButton.addEventListener("click", function () { + // Switch the visibility of hidden tasks + completedTasks.forEach(function (task) { + if (task.classList.contains(hideCompletedClass)) { + task.classList.remove(hideCompletedClass); + } else { + task.classList.add(hideCompletedClass); + } + }); + }); + }); + </script> + <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script> + + </body> +</html> -- GitLab