diff --git a/Backend/.env b/Backend/.env deleted file mode 100644 index 1c59e98..0000000 --- a/Backend/.env +++ /dev/null @@ -1,2 +0,0 @@ -MONGO_URI=mongodb://localhost:27017/AutoPaper -PORT=3000 \ No newline at end of file diff --git a/Backend/.gitignore b/Backend/.gitignore index 3c3629e..1dcef2d 100644 --- a/Backend/.gitignore +++ b/Backend/.gitignore @@ -1 +1,2 @@ node_modules +.env \ No newline at end of file diff --git a/Backend/Config/db.js b/Backend/Config/db.js deleted file mode 100644 index fe3fae8..0000000 --- a/Backend/Config/db.js +++ /dev/null @@ -1,8 +0,0 @@ -const mongoose = require('mongoose') - -const connectDB = async () => { - await mongoose.connect(process.env.MONGO_URI) - console.log('MongoDB Connected') -} - -module.exports = connectDB \ No newline at end of file diff --git a/Backend/app.js b/Backend/app.js deleted file mode 100644 index f1dca05..0000000 --- a/Backend/app.js +++ /dev/null @@ -1,134 +0,0 @@ -const express = require('express') -const Question = require('./modles/Questions') -const app = express() -app.use(express.json()) - - -app.get('/', (req, res) => { - res.json({ - message: 'AutoPaper API is running', - routes: { - questions: { - get: "/api/questions", //gets questions all or specific coz it has filteration - post: "/api/addQuestion", //adds a single question - post: "/api/addQuestions", //adds multiple questions - } - } - }) -}) - -app.get('/api/questions', async (req, res) => { - - try { - const { subject, chapter, questionType, difficulty, grade } = req.query - - const page = parseInt(req.query.page) || 1 - const limit = parseInt(req.query.limit) || 10 - - const skip = (page - 1) * limit; - - const filters = {} - - if (subject) filters.subject = subject - if (chapter) filters.chapter = chapter - if (questionType) filters.questionType = questionType - if (difficulty) filters.difficulty = difficulty - if (grade) filters.grade = parseInt(grade) - - const questions = await Question.find(filters).skip(skip).limit(limit) - res.status(200).json({ - success: true, - count: questions.length, - data: questions, - }) - - } - catch (error) { - res.status(500).json({ - success: false, - message: 'Failed to fetch questions', - error: error.message, - }) - } -}) - -app.post('/api/addQuestion', async (req, res) => { - try { - const { questionText, questionType, options, answer, subject, chapter, grade, difficulty, marks } = req.body - - const question = new Question({ questionText, questionType, options, answer, subject, chapter, grade, difficulty, marks }) - - await question.save() - res.status(201).json(question) - } catch (error) { - res.status(500).json({ - success: false, - message: 'Failed to create question', - error: error.message, - }) - } -}) - -app.post('/api/addQuestions', async (req, res) => { - try { - - await Question.insertMany(req.body) - res.status(201).json({ - success: true, - message: 'Questions added successfully', - data: req.body, - }) - } catch (error) { - res.status(500).json({ - success: false, - message: 'Failed to create question', - error: error.message, - }) - } -}) - -app.put('/api/updateQuestion/:id', async (req, res) => { - try { - const { id } = req.params - - const { questionText, questionType, options, answer, subject, chapter, grade, difficulty, marks } = req.body - - const filters = {} - - if (questionText) filters.questionText = questionText - if (questionType) filters.questionType = questionType - if (options) filters.options = options - if (answer) filters.answer = answer - if (subject) filters.subject = subject - if (chapter) filters.chapter = chapter - if (grade) filters.grade = parseInt(grade) - if (difficulty) filters.difficulty = difficulty - if (marks) filters.marks = parseInt(marks) - - const question = await Question.findByIdAndUpdate(id, filters, { returnDocument: 'after' }) - res.status(200).json(question) - } catch (error) { - res.status(500).json({ - success: false, - message: 'Failed to update question', - error: error.message, - }) - } -}) - -app.delete('/api/deleteQuestion/:id', async (req, res) => { - try { - const { id } = req.params - - const question = await Question.findByIdAndDelete(id) - res.status(200).json(question) - } catch (error) { - res.status(500).json({ - success: false, - message: 'Failed to delete question', - error: error.message, - }) - } -}) - -module.exports = app diff --git a/Backend/functions/call.js b/Backend/functions/call.js new file mode 100644 index 0000000..6d6f7b7 --- /dev/null +++ b/Backend/functions/call.js @@ -0,0 +1,17 @@ +let pickQuestions = require('./questionPicker'); +let quota=require("../quota/quota.js") + +async function call(question, number , name ){ + let l=question.length; + let qp =[]; + + let limit = quota(); + + for(let i=0;i{ + console.log("connected") +}).catch((err)=>{ + console.log(err) +}) + +async function main() { + await mongoose.connect('mongodb://127.0.0.1:27017/autopaper'); +} + +app.use("/", home); +app.use("/about", about); +app.use("/contact", contact); + +let cqp = []; + +app.get("/paper",async (req,res)=>{ + let qp = await generateqp() + cqp = qp; + res.render("index.ejs", { question: qp }) +}) + +app.get("/download", async (req, res)=>{ + let qp = cqp; + res.render("download.ejs", { question: qp }); +}) + +app.listen(8080,()=>{ + console.log("done") +}) \ No newline at end of file diff --git a/Backend/init/init.js b/Backend/init/init.js new file mode 100644 index 0000000..a6f88c5 --- /dev/null +++ b/Backend/init/init.js @@ -0,0 +1,29 @@ +const mongoose = require('mongoose'); +const fs = require('fs'); +const Question = require('../modles/Questions'); + +const data = JSON.parse(fs.readFileSync('../unit4_apm.json', 'utf-8')); + +main().then(()=>{ + console.log('Connected to MongoDB'); +}).catch((err)=>{ + console.log(err); +}) + +async function main() { + await mongoose.disconnect(); + await mongoose.connect('mongodb://localhost:27017/autopap'); +} + +async function enterdata() { + try { + // await Question.deleteMany({}); + await Question.insertMany(data); + + console.log(` ${data.length} questions inserted successfully!`); + + } catch (err) { + console.error(err); + } +} +enterdata(); \ No newline at end of file diff --git a/Backend/modles/Questions.js b/Backend/modles/Questions.js index 71a80eb..80778a3 100644 --- a/Backend/modles/Questions.js +++ b/Backend/modles/Questions.js @@ -2,18 +2,23 @@ const mongoose = require('mongoose') const questionSchema = new mongoose.Schema({ questionText: { type: String, required: true }, - questionType: { type: String, enum: ['MCQ', 'short', 'long', 'numerical'], required: true }, + questionType: { type: String, enum: ['MCQ','obj', 'gr','1m', '2m', '3m','5m'], required: true }, options: [String], // only filled for MCQ - answer: { type: String }, subject: { type: String, required: true }, - chapter: { type: String }, + chapter: { type: Number, required: true }, grade: { type: Number, required: true }, difficulty: { type: String, enum: ['easy', 'medium', 'hard'], required: true }, marks: { type: Number, required: true }, + category:{type:Number}, createdBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, institutionId: { type: mongoose.Schema.Types.ObjectId, ref: 'Institution' }, + hasImage : {type: String, required: true}, + image:{type: String}, }, { timestamps: true, }) -module.exports = mongoose.model('Question', questionSchema) +module.exports = mongoose.model('Question', questionSchema, 'questions'); + + + diff --git a/Backend/package-lock.json b/Backend/package-lock.json index 6f920be..4082370 100644 --- a/Backend/package-lock.json +++ b/Backend/package-lock.json @@ -1,13 +1,47 @@ { - "name": "modles", + "name": "backend", "lockfileVersion": 3, "requires": true, "packages": { "": { "dependencies": { + "cookie-parser": "^1.4.7", + "dotenv": "^17.3.1", + "ejs": "^5.0.1", + "ejs-mate": "^3.0.0", "express": "^5.2.1", - "mongoose": "^9.3.0", - "nodemon": "^3.1.14" + "jsonwebtoken": "^9.0.3", + "mongodb": "^7.1.1", + "mongoose": "^9.3.1", + "nodemon": "^3.1.14", + "passport": "^0.7.0", + "passport-local": "^1.0.0", + "passport-local-mongoose": "^9.0.1", + "puppeteer": "^24.40.0", + "puppeteer-core": "^24.40.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, "node_modules/@mongodb-js/saslprep": { @@ -19,6 +53,43 @@ "sparse-bitfield": "^3.0.3" } }, + "node_modules/@puppeteer/browsers": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.0.tgz", + "integrity": "sha512-46BZJYJjc/WwmKjsvDFykHtXrtomsCIrwYQPOP7VfMJoZY2bsDF9oROBABR3paDjDcmkUye1Pb1BqdcdiipaWA==", + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.3", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.4", + "tar-fs": "^3.1.1", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~7.18.0" + } + }, "node_modules/@types/webidl-conversions": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", @@ -34,6 +105,16 @@ "@types/webidl-conversions": "*" } }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -47,6 +128,39 @@ "node": ">= 0.6" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -60,6 +174,38 @@ "node": ">= 8" } }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/b4a": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.0.tgz", + "integrity": "sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==", + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", @@ -69,6 +215,102 @@ "node": "18 || 20 || >=22" } }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.6.tgz", + "integrity": "sha512-1QovqDrR80Pmt5HPAsMsXTCFcDYr+NSUKW6nd6WO5v0JBmnItc/irNRzm2KOQ5oZ69P37y+AMujNyNtG+1Rggw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.0.tgz", + "integrity": "sha512-Dc9/SlwfxkXIGYhvMQNUtKaXCaGkZYGcd1vuNUUADVqzu4/vQfvnMkYYOUnt2VwQ2AqKr/8qAVFRtwETljgeFg==", + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.10.0.tgz", + "integrity": "sha512-DOPZF/DDcDruKDA43cOw6e9Quq5daua7ygcAwJE/pKJsRWhgSSemi7qVNGE5kyDIxIeN1533G/zfbvWX7Wcb9w==", + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.0.tgz", + "integrity": "sha512-NSTU5WN+fy/L0DDenfE8SXQna4voXuW0FHM7wH8i3/q9khUSchfPbPezO4zSFMnDGIf9YE+mt/RWhZgNRKRIXA==", + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, + "node_modules/basic-ftp": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", + "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -106,9 +348,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" @@ -138,6 +380,21 @@ "node": ">=20.19.0" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -176,6 +433,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -200,6 +466,51 @@ "fsevents": "~2.3.2" } }, + "node_modules/chromium-bidi": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-14.0.0.tgz", + "integrity": "sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "license": "MIT", + "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==", + "license": "MIT" + }, "node_modules/content-disposition": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", @@ -231,6 +542,25 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, "node_modules/cookie-signature": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", @@ -240,6 +570,41 @@ "node": ">=6.6.0" } }, + "node_modules/cosmiconfig": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -257,6 +622,20 @@ } } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -266,6 +645,24 @@ "node": ">= 0.8" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1581282", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1581282.tgz", + "integrity": "sha512-nv7iKtNZQshSW2hKzYNr46nM/Cfh5SEvE2oV0/SEGgc9XupIY5ggf84Cz8eJIkBce7S3bmTAauFD6aysMpnqsQ==", + "license": "BSD-3-Clause" + }, + "node_modules/dotenv": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.3.1.tgz", + "integrity": "sha512-IO8C/dzEb6O3F9/twg6ZLXz164a2fhTnEWb95H23Dm4OuN+92NmEAlTrupP9VW6Jm3sO26tQlqyvyi4CsnY9GA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -280,12 +677,61 @@ "node": ">= 0.4" } }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "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==", "license": "MIT" }, + "node_modules/ejs": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-5.0.1.tgz", + "integrity": "sha512-COqBPFMxuPTPspXl2DkVYaDS3HtrD1GpzOGkNTJ1IYkifq/r9h8SVEFrjA3D9/VJGOEoMQcrlhpntcSUrM8k6A==", + "license": "Apache-2.0", + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.12.18" + } + }, + "node_modules/ejs-mate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ejs-mate/-/ejs-mate-3.0.0.tgz", + "integrity": "sha512-9dw3DkvHsUDm9ZcWveQYzIDCOCVpTtaQ7KXE+0/fmxZVtef1q2J00f4qPQvH7I12BQUza0S+5AqZAHh3M96zXA==", + "license": "MIT", + "dependencies": { + "ejs": "^2.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ejs-mate/node_modules/ejs": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", + "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -295,6 +741,33 @@ "node": ">= 0.8" } }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -325,12 +798,73 @@ "node": ">= 0.4" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "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==", "license": "MIT" }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -340,6 +874,15 @@ "node": ">= 0.6" } }, + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } + }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", @@ -383,6 +926,41 @@ "url": "https://opencollective.com/express" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -457,6 +1035,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -494,6 +1081,35 @@ "node": ">= 0.4" } }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-uri": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz", + "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", @@ -571,6 +1187,32 @@ "url": "https://opencollective.com/express" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/iconv-lite": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", @@ -593,12 +1235,37 @@ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", "license": "ISC" }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -608,6 +1275,12 @@ "node": ">= 0.10" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -629,6 +1302,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -656,13 +1338,137 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, - "node_modules/kareem": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.2.0.tgz", - "integrity": "sha512-VS8MWZz/cT+SqBCpVfNN4zoVz5VskR3N4+sTmUXme55e9avQHntpwpNq0yjnosISXqwJ3AQVjlbI4Dyzv//JtA==", - "license": "Apache-2.0", + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kareem": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.2.0.tgz", + "integrity": "sha512-VS8MWZz/cT+SqBCpVfNN4zoVz5VskR3N4+sTmUXme55e9avQHntpwpNq0yjnosISXqwJ3AQVjlbI4Dyzv//JtA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", "engines": { - "node": ">=18.0.0" + "node": ">=12" } }, "node_modules/math-intrinsics": { @@ -741,10 +1547,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/mongodb": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.1.0.tgz", - "integrity": "sha512-kMfnKunbolQYwCIyrkxNJFB4Ypy91pYqua5NargS/f8ODNSJxT03ZU3n1JqL4mCzbSih8tvmMEMLpKTT7x5gCg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.1.1.tgz", + "integrity": "sha512-067DXiMjcpYQl6bGjWQoTUEE9UoRViTtKFcoqX7z08I+iDZv/emH1g8XEFiO3qiDfXAheT5ozl1VffDTKhIW/w==", "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.3.0", @@ -801,9 +1613,9 @@ } }, "node_modules/mongoose": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.3.0.tgz", - "integrity": "sha512-Tv2p3DLBkftoGFp+VM/19k0t0RYPAAYjGIbCVGlV6Tf5Dnq6TICfYyeKeYvwQ06nK9sRDvymP3B+tjGHnUlaxw==", + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.3.1.tgz", + "integrity": "sha512-58DuQti+LlRS74/UfWN4F3wZsC0Yr1dgTWZ2Wd3/TuSvm6rIdyAjDWbx2xGyuBooqJYdAWotVv4mQgVdivh+3Q==", "license": "MIT", "dependencies": { "kareem": "3.2.0", @@ -854,6 +1666,15 @@ "node": ">= 0.6" } }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/nodemon": { "version": "3.1.14", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", @@ -924,6 +1745,68 @@ "wrappy": "1" } }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", + "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -933,6 +1816,56 @@ "node": ">= 0.8" } }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "license": "MIT", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-local/-/passport-local-1.0.0.tgz", + "integrity": "sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-local-mongoose": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/passport-local-mongoose/-/passport-local-mongoose-9.0.1.tgz", + "integrity": "sha512-DiAoFiNBUNcxJd/ZC09mK2p2zclIi3RGtdnynO27Wf38V16R4d1iYTYjSPbCWhbpJvVD5X1d0HkAPDGQTSbEnw==", + "license": "MIT", + "dependencies": { + "passport-local": "^1.0.0", + "scmp": "^2.1.0" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/path-to-regexp": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", @@ -943,10 +1876,27 @@ "url": "https://opencollective.com/express" } }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -955,6 +1905,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -968,12 +1927,47 @@ "node": ">= 0.10" } }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "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==", "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -983,6 +1977,45 @@ "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "24.40.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.40.0.tgz", + "integrity": "sha512-IxQbDq93XHVVLWHrAkFP7F7iHvb9o0mgfsSIMlhHb+JM+JjM1V4v4MNSQfcRWJopx9dsNOr9adYv0U5fm9BJBQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.13.0", + "chromium-bidi": "14.0.0", + "cosmiconfig": "^9.0.0", + "devtools-protocol": "0.0.1581282", + "puppeteer-core": "24.40.0", + "typed-query-selector": "^2.12.1" + }, + "bin": { + "puppeteer": "lib/cjs/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "24.40.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.40.0.tgz", + "integrity": "sha512-MWL3XbUCfVgGR0gRsidzT6oKJT2QydPLhMITU6HoVWiiv4gkb6gJi3pcdAa8q4HwjBTbqISOWVP4aJiiyUJvag==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.13.0", + "chromium-bidi": "14.0.0", + "debug": "^4.4.3", + "devtools-protocol": "0.0.1581282", + "typed-query-selector": "^2.12.1", + "webdriver-bidi-protocol": "0.4.1", + "ws": "^8.19.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/qs": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", @@ -1034,6 +2067,24 @@ "node": ">=8.10.0" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -1050,12 +2101,39 @@ "node": ">= 18" } }, + "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" + } + ], + "license": "MIT" + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/scmp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.1.0.tgz", + "integrity": "sha512-o/mRQGk9Rcer/jEEw/yw4mwo3EU/NvYvp577/Btqrym9Qy5/MdWGBqipbALgd2lrdWTJ5/gqDusxfnQBxOxT2Q==", + "deprecated": "Just use Node.js's crypto.timingSafeEqual()", + "license": "BSD-3-Clause" + }, "node_modules/semver": { "version": "7.7.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", @@ -1209,6 +2287,54 @@ "node": ">=10" } }, + "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==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -1227,6 +2353,43 @@ "node": ">= 0.8" } }, + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -1239,6 +2402,50 @@ "node": ">=4" } }, + "node_modules/tar-fs": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.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", @@ -1281,6 +2488,12 @@ "node": ">=18" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -1295,12 +2508,25 @@ "node": ">= 0.6" } }, + "node_modules/typed-query-selector": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.1.tgz", + "integrity": "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==", + "license": "MIT" + }, "node_modules/undefsafe": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "license": "MIT" }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "license": "MIT", + "optional": true + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -1310,6 +2536,15 @@ "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==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -1319,6 +2554,12 @@ "node": ">= 0.8" } }, + "node_modules/webdriver-bidi-protocol": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz", + "integrity": "sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==", + "license": "Apache-2.0" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -1341,11 +2582,104 @@ "node": ">=18" } }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "license": "ISC" + }, + "node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/Backend/package.json b/Backend/package.json index c9bc07d..474f85a 100644 --- a/Backend/package.json +++ b/Backend/package.json @@ -1,7 +1,18 @@ { "dependencies": { + "cookie-parser": "^1.4.7", + "dotenv": "^17.3.1", + "ejs": "^5.0.1", + "ejs-mate": "^3.0.0", "express": "^5.2.1", - "mongoose": "^9.3.0", - "nodemon": "^3.1.14" + "jsonwebtoken": "^9.0.3", + "mongodb": "^7.1.1", + "mongoose": "^9.3.1", + "nodemon": "^3.1.14", + "passport": "^0.7.0", + "passport-local": "^1.0.0", + "passport-local-mongoose": "^9.0.1", + "puppeteer": "^24.40.0", + "puppeteer-core": "^24.40.0" } } diff --git a/Backend/paper_pattern/sc1_ssc.js b/Backend/paper_pattern/sc1_ssc.js new file mode 100644 index 0000000..9d140bf --- /dev/null +++ b/Backend/paper_pattern/sc1_ssc.js @@ -0,0 +1,16 @@ +const Question = require('../modles/questions'); +let pickQuestions = require('./questionPicker'); +const call =require("./call.js") + +async function generateqp() { + + let question=['5m','3m','2m','gr','obj','MCQ']; + let number = [2,8,5,4,5,5]; + let name = ["Answer The Following","Answer The Following","Answer The Following","GIVE REASON", "OBJ","MCQ"]; + +let qp = await call(question,number,name); + +return qp; +} + +module.exports = generateqp; \ No newline at end of file diff --git a/Backend/public/paper.css b/Backend/public/paper.css new file mode 100644 index 0000000..c6fb01d --- /dev/null +++ b/Backend/public/paper.css @@ -0,0 +1,36 @@ +h1 { + text-align: center; +} +img{ + text-align: center; +} +.center{ + display: block; + height: 250px; + width: auto; + margin-left: 30vw; +} +.pap-head{ + height: 100px; + width: 98vw; + display: flex; + align-items: center; + justify-content: center; + border: 5px solid black; + border-radius: 30px;} + +.ff-ff{ + margin-top: 10px; +} +.logo{ + height: 50px; + width: auto; + margin-right: 30px; +} + +h3{ + font-weight:initial ; +} +p{ + margin-left: 10px; +} \ No newline at end of file diff --git a/Backend/public/script.js b/Backend/public/script.js new file mode 100644 index 0000000..e3c7a0e --- /dev/null +++ b/Backend/public/script.js @@ -0,0 +1,86 @@ + +const programForm = document.getElementById("programForm"); +const contactForm = document.getElementById("contactForm"); + +const dropdownContainers = document.querySelectorAll(".custom-dropdown-container"); + +dropdownContainers.forEach(container => { + const dropdownHeader = container.querySelector(".dropdown-header"); + const dropdownList = container.querySelector(".dropdown-list"); + const dropdownTitle = container.querySelector(".dropdown-title"); + const checkboxes = container.querySelectorAll(".custom-checkbox"); + const defaultText = container.getAttribute("data-placeholder") || "Select Options"; + + if (dropdownHeader && dropdownList) { + dropdownHeader.addEventListener("click", () => { + const isShowing = dropdownList.classList.contains("show"); + + // Close all dropdowns + document.querySelectorAll(".dropdown-list").forEach(list => list.classList.remove("show")); + document.querySelectorAll(".dropdown-header").forEach(header => header.classList.remove("active")); + + // If wasn't showing, show this one + if (!isShowing) { + dropdownList.classList.add("show"); + dropdownHeader.classList.add("active"); + } + }); + + checkboxes.forEach(checkbox => { + checkbox.addEventListener("change", () => { + const selected = Array.from(checkboxes) + .filter(cb => cb.checked) + .map(cb => cb.value); + + if (selected.length === 0) { + dropdownTitle.textContent = defaultText; + } else if (selected.length === 1) { + dropdownTitle.textContent = selected[0]; + } else if (selected.length === checkboxes.length) { + dropdownTitle.textContent = "All Selected"; + } else { + dropdownTitle.textContent = `${selected.length} Selected`; + } + + // Auto close if it's a single select radio + if (checkbox.type === "radio") { + dropdownList.classList.remove("show"); + dropdownHeader.classList.remove("active"); + } + }); + }); + } +}); + +// Close when clicking outside +document.addEventListener("click", (e) => { + dropdownContainers.forEach(container => { + const header = container.querySelector(".dropdown-header"); + const list = container.querySelector(".dropdown-list"); + if (header && list && !header.contains(e.target) && !list.contains(e.target)) { + list.classList.remove("show"); + header.classList.remove("active"); + } + }); +}); + +if (programForm) { + programForm.addEventListener("submit", (event) => { + // event.preventDefault(); + const message = document.getElementById("formMessage"); + if (message) { + message.textContent = "Your selections are ready. A learning advisor can guide you next."; + } + }); +} + +if (contactForm) { + contactForm.addEventListener("submit", (event) => { + event.preventDefault(); + const message = document.getElementById("contactMessage"); + if (message) { + message.textContent = "Message sent successfully. Our team will respond soon."; + } + contactForm.reset(); + }); +} diff --git a/Backend/public/style.css b/Backend/public/style.css new file mode 100644 index 0000000..c0fb80c --- /dev/null +++ b/Backend/public/style.css @@ -0,0 +1,739 @@ +:root { + --bg: #f6f4ff; + --surface: #ffffff; + --surface-alt: #f1eeff; + --primary: #5f22ff; + --primary-dark: #2f0d99; + --text: #16142a; + --muted: #69657f; + --line: rgba(95, 34, 255, 0.12); + --shadow: 0 22px 60px rgba(67, 28, 167, 0.18); +} + +* { + box-sizing: border-box; +} + +body { + margin: 5px; + font-family: "Manrope", sans-serif; + color: var(--text); + background: + radial-gradient(circle at top left, rgba(120, 72, 255, 0.24), transparent 28%), + linear-gradient(135deg, #fcfbff 0%, #f4efff 45%, #f7f5ff 100%); + min-height: 100vh; +} + +a { + color: inherit; + text-decoration: none; +} + +img { + display: block; + width: 100%; +} + +.page-shell { + width: min(1180px, calc(100% - 32px)); + margin: 0 auto; + padding: 24px 0 56px; +} + +.site-header { + display: flex; + justify-content: space-between; + align-items: center; + gap: 24px; + padding: 18px 22px; + background: rgba(255, 255, 255, 0.8); + backdrop-filter: blur(14px); + border: 1px solid rgba(255, 255, 255, 0.7); + border-radius: 24px; + box-shadow: var(--shadow); + position: sticky; + top: 16px; + z-index: 10; +} + +.brand { + display: flex; + align-items: center; + gap: 12px; + font-family: "Space Grotesk", sans-serif; + font-weight: 700; +} + +.brand-mark { + width: 42px; + height: 42px; + display: grid; + place-items: center; + border-radius: 14px; + color: #fff; + background: linear-gradient(135deg, #7c4dff, #4f12e7); + box-shadow: 0 12px 24px rgba(95, 34, 255, 0.28); +} + +.site-nav { + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +.site-nav a { + padding: 10px 16px; + border-radius: 999px; + color: var(--muted); + font-weight: 600; + transition: 0.25s ease; +} + +.site-nav a.active, +.site-nav a:hover { + background: var(--surface-alt); + color: var(--primary-dark); +} + +.eyebrow { + display: inline-block; + margin-bottom: 18px; + text-transform: uppercase; + letter-spacing: 0.12em; + font-size: 0.75rem; + font-weight: 700; + color: rgba(255, 255, 255, 0.78); +} + +.page-hero h1 { + margin: 0; + font-family: "Space Grotesk", sans-serif; + font-size: clamp(2.7rem, 5vw, 4.8rem); + line-height: 0.98; +} + +.page-hero p { + margin: 20px 0 0; + max-width: 580px; + font-size: 1.08rem; + line-height: 1.75; + color: rgba(255, 255, 255, 0.78); +} + +.panel-card { + position: relative; + z-index: 1; + border-radius: 34px; + background: rgba(255, 255, 255, 0.92); + padding: 42px 34px; + border: 1px solid rgba(255, 255, 255, 0.9); + box-shadow: var(--shadow); +} + +.panel-kicker, +.page-hero .eyebrow { + color: var(--primary); +} + +.panel-card h2 { + margin: 10px 0 8px; + font-family: "Space Grotesk", sans-serif; + font-size: 2rem; +} + +.panel-card p { + margin: 0; + color: var(--muted); + line-height: 1.7; +} + +.dropdown-form, +.contact-form { + margin-top: 28px; +} + +.input-grid { + display: grid; + gap: 18px; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.centered-grid { + justify-items: center; + align-items: center; +} + +.centered-grid label, +.centered-grid .custom-dropdown-container { + width: 100%; + max-width: 240px; +} + +.expanded-grid { + grid-template-columns: repeat(2, minmax(280px, 1fr)); + gap: 24px 28px; +} + +.expanded-grid label, +.expanded-grid .custom-dropdown-container { + max-width: none; +} + +.home-form-only { + min-height: calc(100vh - 170px); + display: grid; + place-items: center; + padding: 32px 0; +} + +.solo-form { + width: min(880px, 100%); + margin-top: 0; + padding: 40px 34px; + border-radius: 34px; + background: rgba(255, 255, 255, 0.92); + border: 1px solid rgba(255, 255, 255, 0.9); + box-shadow: var(--shadow); +} + +label span, +.custom-dropdown-container > span { + display: block; + margin-bottom: 10px; + font-size: 0.92rem; + font-weight: 700; + color: var(--text); +} + +.custom-dropdown-container { + position: relative; + display: flex; + flex-direction: column; +} + +.dropdown-header { + display: flex; + justify-content: space-between; + align-items: center; + width: 100%; + border: 1px solid var(--line); + border-radius: 16px; + background: #fff; + padding: 15px 16px; + font: inherit; + color: var(--text); + outline: none; + cursor: pointer; + transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.25s ease; +} + +.dropdown-header:focus, +.dropdown-header.active { + border-color: rgba(95, 34, 255, 0.5); + box-shadow: 0 0 0 5px rgba(95, 34, 255, 0.09); + transform: translateY(-1px); +} + +.dropdown-arrow { + transition: transform 0.3s ease; + color: var(--muted); +} + +.dropdown-header.active .dropdown-arrow { + transform: rotate(180deg); +} + +.dropdown-list { + display: none; + position: relative; + width: 100%; + margin-top: 12px; + background: #fff; + border: 1px solid var(--line); + border-radius: 20px; + box-shadow: 0 16px 40px rgba(67, 28, 167, 0.15); + z-index: 100; + padding: 12px 0; + max-height: 40vh; + overflow-y: auto; + animation: fadeIn 0.2s ease; +} + +@keyframes fadeIn { + from { opacity: 0; transform: translateY(-5px); } + to { opacity: 1; transform: translateY(0); } +} + +.dropdown-list.show { + display: block; +} + +.dropdown-list .checkbox-label { + display: flex !important; + align-items: center !important; + padding: 12px 18px !important; + cursor: pointer !important; + transition: background 0.2s !important; + font-size: 0.95rem !important; + font-weight: 500 !important; + max-width: none !important; + width: 100% !important; + margin-bottom: 0 !important; +} + +.dropdown-list .checkbox-label:hover { + background: var(--surface-alt) !important; +} + +.dropdown-list .checkbox-label input[type="checkbox"], +.dropdown-list .checkbox-label input[type="radio"] { + width: 18px !important; + height: 18px !important; + margin: 0 14px 0 0 !important; + padding: 0 !important; + accent-color: var(--primary) !important; + transform: none !important; + box-shadow: none !important; + border-radius: 4px !important; +} + +.hidden-input { + display: none !important; +} + +.form-input { + width: 100%; + border: 1px solid var(--line); + border-radius: 16px; + background: #fff; + padding: 15px 16px; + font: inherit; + color: var(--text); + outline: none; + transition: border-color 0.25s ease, box-shadow 0.25s ease, transform 0.25s ease; +} + +.form-input:focus { + border-color: rgba(95, 34, 255, 0.5); + box-shadow: 0 0 0 5px rgba(95, 34, 255, 0.09); + transform: translateY(-1px); +} + +.form-actions { + margin-top: 24px; +} + +.center-actions { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; +} + +.primary-btn { + border: 0; + border-radius: 18px; + padding: 16px 30px; + background: linear-gradient(90deg, #5a23ef, #7a45ff); + color: #fff; + font: inherit; + font-weight: 700; + cursor: pointer; + box-shadow: 0 16px 30px rgba(95, 34, 255, 0.25); + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.primary-btn:hover { + transform: translateY(-2px); + box-shadow: 0 22px 34px rgba(95, 34, 255, 0.32); +} + +.form-message { + min-height: 24px; + margin: 14px 0 0; + color: var(--primary-dark); + font-weight: 600; +} + +.founders-section, +.contact-layout { + margin-top: 44px; +} + +.section-heading { + display: flex; + justify-content: space-between; + align-items: end; + gap: 20px; + margin-bottom: 22px; +} + +.section-heading h2 { + margin: 0; + font-family: "Space Grotesk", sans-serif; + font-size: clamp(1.9rem, 4vw, 3rem); +} + +.info-card, +.contact-form, +.founder-card { + background: rgba(255, 255, 255, 0.9); + border: 1px solid rgba(255, 255, 255, 0.85); + box-shadow: var(--shadow); +} + +.info-card { + padding: 24px; + border-radius: 28px; + width: 90vw; + margin-left: 5vw; +} +.card-con{ + text-align: center; +} + +.info-card h2 { + margin: 0 0 10px; + font-family: "Space Grotesk", sans-serif; +} + +.info-card p, +.founder-content p { + margin: 0; + color: var(--muted); + line-height: 1.75; +} + +.inner-page { + padding-top: 42px; +} + +.about-page { + padding-top: 20px; +} + +.about-story { + margin-top: 14px; +} + +.page-hero { + padding: 32px 36px; + border-radius: 30px; + background: linear-gradient(140deg, rgba(106, 53, 255, 0.95), rgba(46, 16, 145, 0.98)); + box-shadow: 0 24px 60px rgba(67, 28, 167, 0.28); + color: #fff; +} + +.home-hero, .about-hero { + padding: 60px 48px 110px; + position: relative; + text-align: center; +} + +.hero-content { + max-width: 800px; + margin: 0 auto; +} + +.hero-content h1 { + font-size: clamp(3rem, 6vw, 5.2rem); + margin-top: 16px; + letter-spacing: -0.02em; +} + +.hero-content p { + font-size: 1.15rem; + margin: 24px auto 0; +} + +.home-form-section { + position: relative; + z-index: 10; + display: flex; + justify-content: center; + padding: 0 24px; +} + +.overlap-form { + margin-top: -64px !important; + max-width: 1080px; +} + +.features-section { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 28px; + padding: 80px 24px 20px; + max-width: 1180px; + margin: 0 auto; +} + +.feature-card { + background: rgba(255, 255, 255, 0.8); + border: 1px solid rgba(255, 255, 255, 0.9); + padding: 40px 32px; + border-radius: 28px; + text-align: center; + box-shadow: 0 14px 40px rgba(67, 28, 167, 0.08); + transition: transform 0.3s ease, box-shadow 0.3s ease; +} + +.feature-card:hover { + transform: translateY(-8px); + box-shadow: 0 24px 50px rgba(67, 28, 167, 0.12); +} + +.feature-icon { + font-size: 3rem; + margin-bottom: 20px; +} + +.feature-card h3 { + font-family: "Space Grotesk", sans-serif; + font-size: 1.4rem; + margin-bottom: 12px; + color: var(--primary-dark); +} + +.feature-card p { + color: var(--muted); + line-height: 1.6; +} + +.banner-heading { + align-items: center; + text-align: center; + justify-content: center; + flex-direction: column; + margin-top: 20px; + margin-bottom: 40px; +} + +.banner-heading p { + color: var(--muted); + font-size: 1.1rem; +} + +.stats-section { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 24px; + margin-top: 64px; + padding: 48px; + background: linear-gradient(135deg, rgba(95, 34, 255, 0.05), rgba(95, 34, 255, 0.12)); + border-radius: 34px; + text-align: center; +} + +.stat-card { + display: flex; + flex-direction: column; + gap: 8px; +} + +.stat-num { + font-family: "Space Grotesk", sans-serif; + font-size: 3.5rem; + font-weight: 700; + background: linear-gradient(135deg, #7c4dff, #4f12e7); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.stat-label { + font-weight: 600; + color: var(--text); + font-size: 1.05rem; +} + +.page-hero.compact h1 { + font-size: clamp(2.2rem, 4vw, 3.4rem); +} + +.founders-section { + display: grid; + gap: 24px; + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.founder-card { + border-radius: 30px; + overflow: hidden; +} + +.founder-card img { + height: 460px; + object-fit: cover; +} + +.founder-content { + padding: 24px; +} + +.founder-content h2 { + margin: 0 0 6px; + font-family: "Space Grotesk", sans-serif; +} + +.founder-content span { + display: block; + margin-bottom: 12px; + color: var(--primary); + font-weight: 700; +} + +.contact-layout { + display: grid; + gap: 24px; + grid-template-columns: 0.9fr 1.1fr; +} + +.contact-info { + display: grid; + gap: 18px; +} + +.contact-form { + padding: 28px; + border-radius: 28px; +} + +.contact-form textarea { + resize: vertical; +} + +@media (max-width: 980px) { + .contact-layout, + .founders-section, + .features-section, + .stats-section { + grid-template-columns: 1fr; + } + + .home-hero, .about-hero { + padding: 40px 24px 80px; + } +} + +@media (max-width: 720px) { + .page-shell { + width: min(100% - 20px, 1180px); + padding-top: 14px; + } + + .site-header { + flex-direction: column; + align-items: flex-start; + } + + .solo-form, + .page-hero { + padding: 26px 22px; + } + + .input-grid { + grid-template-columns: 1fr; + } + + .centered-grid label, + .centered-grid .custom-dropdown-container { + max-width: none; + } +} + +.site-footer { + margin-top: 72px; + background: var(--surface-alt); + border-radius: 34px 34px 0 0; + padding: 56px 40px 24px; + color: var(--text); +} + +.footer-grid { + display: grid; + gap: 40px; + grid-template-columns: 2fr 1fr 1fr; + margin-bottom: 48px; +} + +.footer-brand { + display: flex; + flex-direction: column; + align-items: flex-start; +} + +.brand-mark-small { + width: 36px; + height: 36px; + display: grid; + place-items: center; + border-radius: 12px; + color: #fff; + font-family: inherit; + font-weight: 700; + background: linear-gradient(135deg, #7c4dff, #4f12e7); + box-shadow: 0 8px 16px rgba(95, 34, 255, 0.2); + margin-bottom: 16px; +} + +.footer-brand-name { + font-family: "Space Grotesk", sans-serif; + font-weight: 700; + font-size: 1.25rem; + margin-bottom: 12px; +} + +.footer-desc { + margin: 0; + color: var(--muted); + line-height: 1.6; + max-width: 320px; +} + +.footer-links, .footer-social { + display: flex; + flex-direction: column; + gap: 12px; +} + +.footer-links h4, .footer-social h4 { + margin: 0 0 8px; + font-size: 1.05rem; + font-family: "Space Grotesk", sans-serif; + color: var(--primary-dark); +} + +.footer-links a, .footer-social a { + color: var(--muted); + font-weight: 500; + transition: color 0.2s; +} + +.footer-links a:hover, .footer-social a:hover { + color: var(--primary); +} + +.footer-bottom { + text-align: center; + padding-top: 24px; + border-top: 1px solid rgba(95, 34, 255, 0.1); + color: var(--muted); + font-size: 0.95rem; +} + +@media (max-width: 720px) { + .footer-grid { + grid-template-columns: 1fr; + gap: 32px; + } +} + +/* .card-text h4{ + color: #5f22ff; +} */ + +.logo{ + height: 50px; + width: auto; +} \ No newline at end of file diff --git a/Backend/quota/quota.js b/Backend/quota/quota.js new file mode 100644 index 0000000..685888b --- /dev/null +++ b/Backend/quota/quota.js @@ -0,0 +1,7 @@ +let sci_1 = [5,6,6,7,5,7,6,6,7,5]; + +function quota(){ + return sci_1; +} + +module.exports=quota; \ No newline at end of file diff --git a/Backend/routes/about.js b/Backend/routes/about.js new file mode 100644 index 0000000..777e46e --- /dev/null +++ b/Backend/routes/about.js @@ -0,0 +1,8 @@ +const express = require('express') +const router = express.Router(); +const app = express(); + +router.get("/",(req,res)=>{ + res.render("about.ejs", { currTab: "about" }); +}) +module.exports= router; \ No newline at end of file diff --git a/Backend/routes/contact.js b/Backend/routes/contact.js new file mode 100644 index 0000000..60e6781 --- /dev/null +++ b/Backend/routes/contact.js @@ -0,0 +1,7 @@ +const express = require('express') +const router = express.Router(); + +router.get("/",(req,res)=>{ + res.render("contact.ejs", { currTab: "contact" }); +}) +module.exports= router; \ No newline at end of file diff --git a/Backend/routes/home.js b/Backend/routes/home.js new file mode 100644 index 0000000..0ca5f53 --- /dev/null +++ b/Backend/routes/home.js @@ -0,0 +1,9 @@ +const express = require('express') +const router = express.Router(); +const ejs= require("ejs") + +router.get("/",(req,res)=>{ + res.render("home.ejs", { currTab: "home" }); +}) +module.exports= router; + diff --git a/Backend/server.js b/Backend/server.js deleted file mode 100644 index 9f49794..0000000 --- a/Backend/server.js +++ /dev/null @@ -1,54 +0,0 @@ -const fs = require('fs') -const path = require('path') - -const app = require('./app') -const connectDB = require('./Config/db') - -const loadEnvFile = () => { - const envPath = path.join(__dirname, '.env') - - if (!fs.existsSync(envPath)) { - return - } - - const envFile = fs.readFileSync(envPath, 'utf8') - - for (const line of envFile.split(/\r?\n/)) { - const trimmedLine = line.trim() - - if (!trimmedLine || trimmedLine.startsWith('#')) { - continue - } - - const separatorIndex = trimmedLine.indexOf('=') - - if (separatorIndex === -1) { - continue - } - - const key = trimmedLine.slice(0, separatorIndex).trim() - const value = trimmedLine.slice(separatorIndex + 1).trim() - - if (!process.env[key]) { - process.env[key] = value - } - } -} - -const startServer = async () => { - try { - loadEnvFile() - await connectDB() - - const port = process.env.PORT || 3000 - - app.listen(port, () => { - console.log(`Server is running on port ${port}`) - }) - } catch (error) { - console.error('Failed to start server', error) - process.exit(1) - } -} - -startServer() diff --git a/Backend/views/ejs/about.ejs b/Backend/views/ejs/about.ejs new file mode 100644 index 0000000..4681056 --- /dev/null +++ b/Backend/views/ejs/about.ejs @@ -0,0 +1,35 @@ +<% layout("../layout/boilerplate.ejs") -%> + +
+
+ + +
+
+
+

Ritesh Gabale

+ Co-Founder & Technology Lead +

Ritesh focuses on clean digital tools that help institutions present academic options with zero friction.

+
+
+ +
+
+

Gururaj Lande

+ Co-Founder & Learning Strategist +

Gururaj shapes curriculum experiences that help students move from confusion to structured progress smoothly.

+
+
+
+
+ +
+

“Autopaper is a startup focused on simplifying exam preparation by creating structured, reliable, and ready-to-use question papers for schools, colleges, and coaching institutes.”

+

“Autopaper is committed to delivering reliable exam papers that support schools, colleges, and coaching centers in assessing knowledge effectively.”

+

“We specialize in crafting question papers that save teachers time and help students prepare with clarity and confidence.”

+ +
+
\ No newline at end of file diff --git a/Backend/views/ejs/contact.ejs b/Backend/views/ejs/contact.ejs new file mode 100644 index 0000000..abd8017 --- /dev/null +++ b/Backend/views/ejs/contact.ejs @@ -0,0 +1,37 @@ + <% layout("../layout/boilerplate.ejs") -%> + +
+
+ Contact us +

Talk to our team about admissions, programs, or learning support.

+

Use the contact details below or send a message through the form.

+
+ +
+
+
+
+

Reach us

+

Email:gururajsureshlande@gmail.com

+

Email:riteshworking247@gmail.com

+

+ + +
+ + + + +

+
+
+
diff --git a/Backend/views/ejs/download.ejs b/Backend/views/ejs/download.ejs new file mode 100644 index 0000000..a2cd7c1 --- /dev/null +++ b/Backend/views/ejs/download.ejs @@ -0,0 +1,45 @@ + + + + + + EduSpark + + + +
+
+

EduSpark

+ +<%let i = 0%> +<%for(let q of question){%> + <%if(typeof q === 'string'){i=0%> +
<%= q %>
+ <%}else{%> + <%if(q.questionType === "MCQ"){i=i+1;%> +

(<%=i%>)<%=q.questionText%>

+

(A)<%=q.options[0]%>

+

(B)<%=q.options[1]%>

+

(C)<%=q.options[2]%>

+

(D)<%=q.options[3]%>


+ + <%}else{%> + <% if(q.hasImage == "yes"){i=i+1;%> +

(<%=i%>)<%=q.questionText%>

+ question image
+ <%}else{%> + <%i=i+1;%> +

(<%=i%>)<%=q.questionText%>


+ <%}%> +<%}}}%> + + + + \ No newline at end of file diff --git a/Backend/views/ejs/home.ejs b/Backend/views/ejs/home.ejs new file mode 100644 index 0000000..ef0e4b7 --- /dev/null +++ b/Backend/views/ejs/home.ejs @@ -0,0 +1,105 @@ +<% layout("../layout/boilerplate.ejs") -%> + +
+
+ +
+
+ diff --git a/Backend/views/ejs/index.ejs b/Backend/views/ejs/index.ejs new file mode 100644 index 0000000..59107c7 --- /dev/null +++ b/Backend/views/ejs/index.ejs @@ -0,0 +1,46 @@ + + + + + + EduSpark + + + + + +
+ +

+ +

EduSpark

+ +<%let i = 0%> +<%for(let q of question){%> + + <%if(typeof q === 'string'){i=0%> +
<%= q %>
+ <%}else{%> + <%if(q.questionType === "MCQ"){i=i+1;%> +

(<%=i%>) <%=q.questionText%>

+

(A) <%=q.options[0]%>

+

(B) <%=q.options[1]%>

+

(C) <%=q.options[2]%>

+

(D) <%=q.options[3]%>


+ + <%}else{%> + <% if(q.hasImage == "yes"){i=i+1;%> +

(<%=i%>) <%=q.questionText%>

+ question image
+ <%}else{%> + <%i=i+1;%> +

(<%=i%>) <%=q.questionText%>


+ <%}%> + +<%}}}%> + + + + + diff --git a/Backend/views/includes/footer.ejs b/Backend/views/includes/footer.ejs new file mode 100644 index 0000000..461cb30 --- /dev/null +++ b/Backend/views/includes/footer.ejs @@ -0,0 +1,27 @@ + + + + \ No newline at end of file diff --git a/Backend/views/includes/logo.jpeg b/Backend/views/includes/logo.jpeg new file mode 100644 index 0000000..dc19127 Binary files /dev/null and b/Backend/views/includes/logo.jpeg differ diff --git a/Backend/views/includes/navbar.ejs b/Backend/views/includes/navbar.ejs new file mode 100644 index 0000000..ade7e98 --- /dev/null +++ b/Backend/views/includes/navbar.ejs @@ -0,0 +1,16 @@ + +
+ +
diff --git a/Backend/views/layout/boilerplate.ejs b/Backend/views/layout/boilerplate.ejs new file mode 100644 index 0000000..8a03a19 --- /dev/null +++ b/Backend/views/layout/boilerplate.ejs @@ -0,0 +1,22 @@ + + + + + + EduSpark Academy + + + + + + + +
+ <%- include("../includes/navbar") %> + <%- body -%> + <%- include("../includes/footer.ejs") %> + + +
+ + \ No newline at end of file