From 2890927fe3645ee70bc6e739a084efa970892277 Mon Sep 17 00:00:00 2001 From: imSarthakGautam Date: Tue, 3 Dec 2024 14:12:20 +0545 Subject: [PATCH] controllers added --- backend/.DS_Store | Bin 0 -> 6148 bytes backend/.dockerignore | 15 + backend/.env | 10 + backend/.gitignore | 11 + backend/Dockerfile | 9 + backend/Instructions.md | 198 + backend/README.md | 15 + backend/SarthakResume02.pdf | Bin 0 -> 148711 bytes backend/package-lock.json | 5129 +++++++++++++++++ backend/package.json | 59 + backend/prod.env | 4 + backend/src/app.js | 44 + backend/src/constants.js | 6 + backend/src/consumer.js | 25 + backend/src/controllers/booking.controller.js | 210 + backend/src/controllers/event.controller.js | 141 + backend/src/controllers/stripe.js | 160 + backend/src/controllers/user.controller.js | 83 + backend/src/db/mongooseConnection.js | 19 + backend/src/kafka/Config.js | 11 + backend/src/kafka/Consumer.js | 24 + backend/src/kafka/Producer.js | 23 + backend/src/kafka/kafka.controller.js | 26 + backend/src/middlewares/isAdmin.js | 0 backend/src/middlewares/verfiyAuth.js | 44 + backend/src/models/booking.model.js | 68 + backend/src/models/event.model.js | 66 + backend/src/models/payment.model.js | 0 backend/src/models/ticket.model.js | 66 + backend/src/models/user.model.js | 43 + backend/src/routes/booking.routes.js | 21 + backend/src/routes/event.routes.js | 23 + backend/src/routes/stripe.routes.js | 15 + backend/src/routes/user.routes.js | 14 + backend/src/server.js | 30 + backend/src/utils/ApiError.js | 25 + backend/src/utils/ApiResponse.js | 11 + backend/src/utils/asyncHandler.js | 11 + backend/src/utils/generateToken.js | 17 + backend/src/utils/redisClient.js | 9 + backend/src/utils/stripe.js | 8 + 41 files changed, 6693 insertions(+) create mode 100644 backend/.DS_Store create mode 100644 backend/.dockerignore create mode 100644 backend/.env create mode 100644 backend/.gitignore create mode 100644 backend/Dockerfile create mode 100644 backend/Instructions.md create mode 100644 backend/README.md create mode 100644 backend/SarthakResume02.pdf create mode 100644 backend/package-lock.json create mode 100644 backend/package.json create mode 100644 backend/prod.env create mode 100644 backend/src/app.js create mode 100644 backend/src/constants.js create mode 100644 backend/src/consumer.js create mode 100644 backend/src/controllers/booking.controller.js create mode 100644 backend/src/controllers/event.controller.js create mode 100644 backend/src/controllers/stripe.js create mode 100644 backend/src/controllers/user.controller.js create mode 100644 backend/src/db/mongooseConnection.js create mode 100644 backend/src/kafka/Config.js create mode 100644 backend/src/kafka/Consumer.js create mode 100644 backend/src/kafka/Producer.js create mode 100644 backend/src/kafka/kafka.controller.js create mode 100644 backend/src/middlewares/isAdmin.js create mode 100644 backend/src/middlewares/verfiyAuth.js create mode 100644 backend/src/models/booking.model.js create mode 100644 backend/src/models/event.model.js create mode 100644 backend/src/models/payment.model.js create mode 100644 backend/src/models/ticket.model.js create mode 100644 backend/src/models/user.model.js create mode 100644 backend/src/routes/booking.routes.js create mode 100644 backend/src/routes/event.routes.js create mode 100644 backend/src/routes/stripe.routes.js create mode 100644 backend/src/routes/user.routes.js create mode 100644 backend/src/server.js create mode 100644 backend/src/utils/ApiError.js create mode 100644 backend/src/utils/ApiResponse.js create mode 100644 backend/src/utils/asyncHandler.js create mode 100644 backend/src/utils/generateToken.js create mode 100644 backend/src/utils/redisClient.js create mode 100644 backend/src/utils/stripe.js diff --git a/backend/.DS_Store b/backend/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a6dcbed85ff8a465dd6e16aac3c95fb036ac6580 GIT binary patch literal 6148 zcmeHKJ5Iwu5S>Xaf?NP4k)TNAD2U!&t`H6c=i}wLNBwRlD5{>dpm>JC%=Y)5ts%Q7*x#>LxYZZ$+|kR z3kcq;~aE5?hp;;UX=v1jD##4gb3h&vs~i-74uqXNI7zz0ga BB@6%n literal 0 HcmV?d00001 diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 0000000..02cfe36 --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,15 @@ +node_modules/ +.next +.next/ +out/ +.vscode/ +*.code-workspace + +# macOS files +.DS_Store + +# Windows files +Thumbs.db +build/ +# pnpm lock file +pnpm-lock.yaml \ No newline at end of file diff --git a/backend/.env b/backend/.env new file mode 100644 index 0000000..6e74000 --- /dev/null +++ b/backend/.env @@ -0,0 +1,10 @@ +NODE_ENV=development +PORT=8000 +CORS_ORIGIN=* +CONNECTION_STRING_NEON_DEV= +CONNECTION_STRING_NEON= +JWT_SECRET_KEY='secretkey123' +MONGODB_URI=mongodb+srv://falsemediapunta:sarthak123@cluster0.3iafn.mongodb.net +STRIPE_SECRET_KEY=sk_test_4eC39HqLyjWDarjtT1zdp7dc +STRIPE_PUBLIC_KEY=pk_test_TYooMQauvdEDq54NiTphI7jx +STRIPE_WEBHOOK_SECRET= \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore new file mode 100644 index 0000000..32d3e39 --- /dev/null +++ b/backend/.gitignore @@ -0,0 +1,11 @@ +.idea/ +.vscode/ +node_modules/ +build/ +tmp/ +temp/ +# env/ +# .env +./src/bootstrap/certificate.crt +certificate.crt +uploads/ \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..94a4647 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,9 @@ +FROM node:18.18.0-alpine +WORKDIR '/app' +RUN npm i pnpm -g +COPY ./package.json ./ +RUN pnpm install +COPY . . + +RUN npm run build +CMD ["npm", "run", "start"] \ No newline at end of file diff --git a/backend/Instructions.md b/backend/Instructions.md new file mode 100644 index 0000000..f9d1f80 --- /dev/null +++ b/backend/Instructions.md @@ -0,0 +1,198 @@ + +# **Please do not start before reading Master_Readme.md. and instructions provided below:** + +# **Ticket Booking Platform** + +## **Objective** + +Build a ticket booking backend system that handles: + +1. **Concurrency Management**: Prevent overselling tickets by implementing a locking mechanism. +2. **Stripe Integration**: Process payments securely. For now, use Stripe test mode's Checkout or Payment Intents. You should be able to read through the [Stripe API documentation](https://stripe.com/docs/api) to understand how to integrate it. +3. **Real-Time Updates**: Use Kafka for event-driven updates about ticket availability and payment status. For now, focus on publishing and consuming messages for ticket availability and payment notifications. However, feel free to add any other topics or consumers as needed. + +--- + +## **Key Features** + +### **1. Ticket Booking** + +#### **Booking Tickets** + +- **Endpoint**: `POST /events/:id/book` (or similar that makes sense) +- **Functionality**: + - Lock tickets when a user starts the booking process to prevent overselling. + - Return a Stripe payment session link or client secret for completing the payment. + - Store booking details (user, event, tickets, status) in the database. + +#### **Concurrency Management** + +- Use **Redis** or a similar mechanism to: + - Lock tickets for a user during the booking process. + - Release the lock: + - Immediately if payment fails. + - After a timeout (e.g., 5 minutes) if the user does not complete the payment. + - Prevent other users from booking the same tickets until the lock is released. + +#### **Order Expiration** + +- Pending orders expire automatically after the timeout. +- Expired orders should release their associated tickets. + +--- + +### **2. Payment Processing** + +#### **Stripe Checkout Integration** + +- **Endpoint**: Use Stripe Checkout or Payment Intents for payments. +- **Flow**: + 1. Create a Stripe Checkout session or Payment Intent when the user starts the booking. + 2. Redirect the user to Stripe to complete the payment. + +#### **Webhook Validation** + +- **Endpoint**: `POST /webhook` (or similar) +- **Functionality**: + - Listen for Stripe webhook events: + - `payment_intent.succeeded` or `checkout.session.completed` to confirm successful payments. + - Mark the order as "Confirmed" upon payment success. + - Release ticket locks and mark the order as "Failed" if the payment fails. + - Validate the webhook signature to ensure authenticity. + +--- + +### **3. Ticket Management** + +#### **Event Management** + +- **Endpoint**: `POST /events` +- **Functionality**: + - Admins can create or update events with details like: + - Event name, description, date, venue, ticket price, and total tickets available. + - Store event details in the database. + +#### **Ticket Status** + +- **Endpoint**: `GET /orders/:id` +- **Functionality**: + - Allow users to check the status of their bookings (Pending, Confirmed, Failed). + +#### **Real-Time Ticket Availability** + +- Use **Kafka** to publish messages about ticket availability: + - Notify when tickets are locked, unlocked, or sold. + - Consumers can listen to these updates for real-time UI updates or waitlist processing. + +--- + +### **4. Real-Time Messaging** + +#### **Kafka Topics** + +- **`ticket_availability`**: + - Messages about ticket locks, unlocks, and sales. +- **`payment_notifications`**: + - Messages about payment statuses (success or failure). + +#### **Consumers** + +- **Notification Service**: + - Send booking confirmations via email or SMS when payment succeeds. +- **Waitlist Processor**: + - Notify users on the waitlist when tickets become available. + +--- + +## **Stretch Features** + +1. **Waitlist Management** + + - Add a waitlist feature for sold-out events. + - Notify waitlisted users via Kafka when tickets are unlocked. + +2. **Refund System** + + - Allow users to cancel bookings within a certain timeframe. + - Process refunds through Stripe and release tickets back to inventory. + +3. **Admin Dashboard** + - Add a real-time admin dashboard to display: + - Tickets sold, revenue, and waitlist metrics. + +--- + +## **Database Schema** (Decide based on your implementation, Given below is just a suggestion) + +### Suggested Tables: + +1. **Users** + + - `id`: Unique identifier. + - `name`: User name. + - `email`: User email. + +2. **Events** + + - `id`: Unique identifier. + - `name`: Event name. + - `date`: Event date. + - `venue`: Event venue. + - `price`: Ticket price. + - `total_tickets`: Total tickets available. + +3. **Tickets** + + - `id`: Unique identifier. + - `event_id`: Associated event ID. + - `status`: Ticket status (Available, Locked, Sold). + +4. **Orders** + - `id`: Unique identifier. + - `user_id`: Associated user ID. + - `event_id`: Associated event ID. + - `status`: Order status (Pending, Confirmed, Failed). + - `stripe_session_id`: Stripe session or payment intent ID. + +--- + +## **Evaluation Criteria** + +1. **Concurrency Management** + + - Locks are implemented to prevent ticket overselling. + - Locks are released correctly on payment failure or timeout. + +2. **Stripe Integration** + + - Payments are processed securely in test mode. + - Stripe webhook events are validated and handled properly. + +3. **Real-Time Messaging** + + - Kafka topics and consumers are correctly implemented for ticket updates and notifications. + +4. **Code Quality** + + - Modular and maintainable code. + - Clear documentation for API endpoints and project setup. + +5. **Scalability** + - The system can handle high-concurrency scenarios during ticket sales. + +--- + +## **Project Deliverables** +1. Required stuffs from master readme +2. Fully functional backend system adhering to the requirements. +3. Postman or cURL examples for all API endpoints. (optional but recommended) +4. Documentation explaining: (optional but recommended, but we atleast need the readme.md explaining the project setup and how to run the project) + - Locking mechanism. + - Stripe integration details. + - Kafka messaging implementation. + +--- + + + + diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..64b18e0 --- /dev/null +++ b/backend/README.md @@ -0,0 +1,15 @@ +## Submission + +Sarthak Gautam +sarthakgtm175@gmail.com +9843619330 +[Resume](./SarthakResume02.pdf) +github: https://github.com/imSarthakGautam +linkedIn: https://www.linkedin.com/in/imsarthakgautam/ + +### Timelog: +1st December : Understanding the requirements and Models setup +2nd December : Controllers and Routes setup, Stripe Integration +3rd December : Redis, Kafka integration + + diff --git a/backend/SarthakResume02.pdf b/backend/SarthakResume02.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a2c9fba4b456bb9d8d8255dcdcd148e8f9578979 GIT binary patch literal 148711 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 V>!=8v?75tql!=)e7)&KcdW4V(K>*G57M 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 G{{H~xl|)1U literal 0 HcmV?d00001 diff --git a/backend/package-lock.json b/backend/package-lock.json new file mode 100644 index 0000000..2722c37 --- /dev/null +++ b/backend/package-lock.json @@ -0,0 +1,5129 @@ +{ + "name": "backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "backend", + "version": "1.0.0", + "hasInstallScript": true, + "license": "SimpleCold", + "dependencies": { + "axios": "^1.6.2", + "bcrypt": "^5.1.1", + "body-parser": "^1.20.2", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "csv-parser": "^3.0.0", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "express-rate-limit": "^7.4.1", + "fs": "^0.0.1-security", + "http-status-codes": "^2.3.0", + "ioredis": "^5.4.1", + "jsonwebtoken": "^9.0.2", + "kafkajs": "^2.2.4", + "mongoose": "^8.8.3", + "morgan": "^1.10.0", + "pg": "^8.11.3", + "reflect-metadata": "^0.2.2", + "stripe": "^17.4.0", + "tsc-alias": "^1.8.8", + "typeorm": "^0.3.17", + "unzipper": "^0.10.14", + "xml2js": "^0.6.2", + "yup": "^1.3.2" + }, + "devDependencies": { + "@types/cookie-parser": "^1.4.7", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/morgan": "^1.9.9", + "@types/node": "^20.9.3", + "@types/unzipper": "^0.10.9", + "cross-env": "^7.0.3", + "eslint": "^8.54.0", + "i": "^0.3.7", + "nodemon": "^3.0.1", + "ts-node": "^10.9.1", + "ts-patch": "^3.2.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.3.2", + "typescript-transform-paths": "^3.5.1" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/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==", + "dev": true + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/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==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "devOptional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dependencies": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/@mongodb-js/saslprep": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.9.tgz", + "integrity": "sha512-tVkljjeEaAhCqTzajSdgbQ6gE6f3oneVwa3iXR6csiEwXXOFsiC6Uh9iAjAhXPtqa/XMDHWjjeNH/77m/Yq2dw==", + "dependencies": { + "sparse-bitfield": "^3.0.3" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@sqltools/formatter": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", + "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "devOptional": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "devOptional": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookie-parser": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.8.tgz", + "integrity": "sha512-l37JqFrOJ9yQfRQkljb41l0xVphc7kg5JTjjr+pLRZ0IyZ49V4BQ8vbF4Ut2C2e+WH4al3xD3ZwYwIUfnbT4NQ==", + "dev": true, + "peerDependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", + "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "dev": true + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true + }, + "node_modules/@types/morgan": { + "version": "1.9.9", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz", + "integrity": "sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.17.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.9.tgz", + "integrity": "sha512-0JOXkRyLanfGPE2QRCwgxhzlBAvaRdCNMcvbd7jFfpmD4eEXll7LRwy5ymJmyeZqk7Nh7eD2LeUyQ68BbndmXw==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/qs": { + "version": "6.9.17", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", + "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "dev": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/unzipper": { + "version": "0.10.10", + "resolved": "https://registry.npmjs.org/@types/unzipper/-/unzipper-0.10.10.tgz", + "integrity": "sha512-jKJdNxhmCHTZsaKW5x0qjn6rB+gHk0w5VFbEKsw84i+RJqXZyfTmGnpjDcKqzMpjz7VVLsUBMtO5T3mVidpt0g==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/webidl-conversions": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", + "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" + }, + "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==", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/webidl-conversions": "*" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "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/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "devOptional": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "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==", + "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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/are-we-there-yet/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "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==", + "dev": true + }, + "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/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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/bcrypt": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz", + "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==", + "hasInstallScript": true, + "dependencies": { + "@mapbox/node-pre-gyp": "^1.0.11", + "node-addon-api": "^5.0.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "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.13.0", + "raw-body": "2.5.2", + "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/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bson": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.0.tgz", + "integrity": "sha512-ROchNosXMJD2cbQGm84KoP7vOGPO6/bOAW0veMMbzhXLqoZptcaYRVLitwvuhwhjjpU1qP4YZRWLhgETdgqUQw==", + "engines": { + "node": ">=16.20.1" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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==" + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "engines": { + "node": ">=0.2.0" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/cli-highlight/-/cli-highlight-2.1.11.tgz", + "integrity": "sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==", + "dependencies": { + "chalk": "^4.0.0", + "highlight.js": "^10.7.1", + "mz": "^2.4.0", + "parse5": "^5.1.1", + "parse5-htmlparser2-tree-adapter": "^6.0.0", + "yargs": "^16.0.0" + }, + "bin": { + "highlight": "bin/highlight" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/cli-highlight/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cli-highlight/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cli-highlight/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "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/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "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.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "engines": { + "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==", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csv-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.0.0.tgz", + "integrity": "sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" + }, + "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/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "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/detect-libc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "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==", + "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==" + }, + "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==" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "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==", + "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==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/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==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.10", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "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/express-rate-limit": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.4.1.tgz", + "integrity": "sha512-KS3efpnpIDVIXopMc65EMbWbUht7qvTCdtCR2dD/IZmi9MIkopYESwyRqLgv8Pfu589+KqDqOdzJWW7AHoACeg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": "4 || 5 || ^5.0.0-beta.1" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "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/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==" + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "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/gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/gauge/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.1.0.tgz", + "integrity": "sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "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/http-status-codes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/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/i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "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/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "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/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/ioredis": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.4.1.tgz", + "integrity": "sha512-2YZsvl7jopIa1gaePkeMtd9rAcSjOOjPtpcLlOeusyO+XH2SK5ZcT+UCrElPP+WVIInh2TzeI4XW9ENaSLVVHA==", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, + "node_modules/ioredis/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/ioredis/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/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "optional": true, + "peer": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "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/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "optional": true, + "peer": true + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dependencies": { + "jws": "^3.2.2", + "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/jsonwebtoken/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/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kafkajs": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", + "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/kareem": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", + "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, + "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==" + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "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.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "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/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.6.tgz", + "integrity": "sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mongodb": { + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-5.9.2.tgz", + "integrity": "sha512-H60HecKO4Bc+7dhOv4sJlgvenK4fQNqqUIlXxZYQNbfEWSALGAwGoyJd/0Qwk4TttFXUOHJ2ZJQe/52ScaUwtQ==", + "optional": true, + "peer": true, + "dependencies": { + "bson": "^5.5.0", + "mongodb-connection-string-url": "^2.6.0", + "socks": "^2.7.1" + }, + "engines": { + "node": ">=14.20.1" + }, + "optionalDependencies": { + "@mongodb-js/saslprep": "^1.1.0" + }, + "peerDependencies": { + "@aws-sdk/credential-providers": "^3.188.0", + "@mongodb-js/zstd": "^1.0.0", + "kerberos": "^1.0.0 || ^2.0.0", + "mongodb-client-encryption": ">=2.3.0 <3", + "snappy": "^7.2.2" + }, + "peerDependenciesMeta": { + "@aws-sdk/credential-providers": { + "optional": true + }, + "@mongodb-js/zstd": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "snappy": { + "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==", + "optional": true, + "peer": true, + "dependencies": { + "@types/whatwg-url": "^8.2.1", + "whatwg-url": "^11.0.0" + } + }, + "node_modules/mongodb/node_modules/bson": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/bson/-/bson-5.5.1.tgz", + "integrity": "sha512-ix0EwukN2EpC0SRWIj/7B5+A6uQMQy6KMREI9qQqvgpkV2frH63T0UDVd1SYedL6dNCmDBYB3QtXi4ISk9YT+g==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.20.1" + } + }, + "node_modules/mongoose": { + "version": "8.8.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.8.3.tgz", + "integrity": "sha512-/I4n/DcXqXyIiLRfAmUIiTjj3vXfeISke8dt4U4Y8Wfm074Wa6sXnQrXN49NFOFf2mM1kUdOXryoBvkuCnr+Qw==", + "dependencies": { + "bson": "^6.7.0", + "kareem": "2.6.3", + "mongodb": "~6.10.0", + "mpath": "0.9.0", + "mquery": "5.0.0", + "ms": "2.1.3", + "sift": "17.1.3" + }, + "engines": { + "node": ">=16.20.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mongoose" + } + }, + "node_modules/mongoose/node_modules/@types/whatwg-url": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", + "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", + "dependencies": { + "@types/webidl-conversions": "*" + } + }, + "node_modules/mongoose/node_modules/mongodb": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.10.0.tgz", + "integrity": "sha512-gP9vduuYWb9ZkDM546M+MP2qKVk5ZG2wPF63OvSRuUbqCR+11ZCAE1mOfllhlAG0wcoJY5yDL/rV3OmYEwXIzg==", + "dependencies": { + "@mongodb-js/saslprep": "^1.1.5", + "bson": "^6.7.0", + "mongodb-connection-string-url": "^3.0.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/mongoose/node_modules/mongodb-connection-string-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", + "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", + "dependencies": { + "@types/whatwg-url": "^11.0.2", + "whatwg-url": "^13.0.0" + } + }, + "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/mongoose/node_modules/tr46": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", + "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "dependencies": { + "punycode": "^2.3.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/mongoose/node_modules/whatwg-url": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", + "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", + "dependencies": { + "tr46": "^4.1.1", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "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.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mquery/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/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mylas": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/mylas/-/mylas-2.1.13.tgz", + "integrity": "sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==", + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/raouldeheer" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", + "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/nodemon": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz", + "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.1.2", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "deprecated": "This package is no longer supported.", + "dependencies": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "engines": { + "node": ">= 0.4" + }, + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" + }, + "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==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "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-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pg": { + "version": "8.13.1", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz", + "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==", + "dependencies": { + "pg-connection-string": "^2.7.0", + "pg-pool": "^3.7.0", + "pg-protocol": "^1.7.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz", + "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz", + "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/plimit-lit": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.6.1.tgz", + "integrity": "sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==", + "dependencies": { + "queue-lit": "^1.5.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" + }, + "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/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==" + }, + "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==", + "dev": true + }, + "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.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-lit": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/queue-lit/-/queue-lit-1.5.2.tgz", + "integrity": "sha512-tLc36IOPeMAubu8BkW8YDBV+WyIgKlYU7zUNs0J5Vk9skSZ4JfGlPOqplP0aHdfv7HL0B2Pg6nwiq60Qc6M2Hw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/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.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "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/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/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/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "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/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==" + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "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/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/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.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sift": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", + "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "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==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "optional": true, + "peer": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "optional": true, + "peer": true + }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, + "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/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/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/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==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "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==", + "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==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stripe": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/stripe/-/stripe-17.4.0.tgz", + "integrity": "sha512-sQQGZguPxe7/QYXJKtDpfzT2OAH9F8nyE2SOsVdTU793iiU33/dpaKgWaJEGJm8396Yy/6NvTLblgdHlueGLhA==", + "dependencies": { + "@types/node": ">=8.1.0", + "qs": "^6.11.0" + }, + "engines": { + "node": ">=12.*" + } + }, + "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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "optional": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "engines": { + "node": "*" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "devOptional": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-patch": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ts-patch/-/ts-patch-3.2.1.tgz", + "integrity": "sha512-hlR43v+GUIUy8/ZGFP1DquEqPh7PFKQdDMTAmYt671kCCA6AkDQMoeFaFmZ7ObPLYOmpMgyKUqL1C+coFMf30w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "global-prefix": "^3.0.0", + "minimist": "^1.2.8", + "resolve": "^1.22.2", + "semver": "^7.5.4", + "strip-ansi": "^6.0.1" + }, + "bin": { + "ts-patch": "bin/ts-patch.js", + "tspc": "bin/tspc.js" + } + }, + "node_modules/tsc-alias": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/tsc-alias/-/tsc-alias-1.8.10.tgz", + "integrity": "sha512-Ibv4KAWfFkFdKJxnWfVtdOmB0Zi1RJVxcbPGiCDsFpCQSsmpWyuzHG3rQyI5YkobWwxFPEyQfu1hdo4qLG2zPw==", + "dependencies": { + "chokidar": "^3.5.3", + "commander": "^9.0.0", + "globby": "^11.0.4", + "mylas": "^2.1.9", + "normalize-path": "^3.0.0", + "plimit-lit": "^1.2.6" + }, + "bin": { + "tsc-alias": "dist/bin/index.js" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/typeorm": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.20.tgz", + "integrity": "sha512-sJ0T08dV5eoZroaq9uPKBoNcGslHBR4E4y+EBHs//SiGbblGe7IeduP/IH4ddCcj0qp3PHwDwGnuvqEAnKlq/Q==", + "dependencies": { + "@sqltools/formatter": "^1.2.5", + "app-root-path": "^3.1.0", + "buffer": "^6.0.3", + "chalk": "^4.1.2", + "cli-highlight": "^2.1.11", + "dayjs": "^1.11.9", + "debug": "^4.3.4", + "dotenv": "^16.0.3", + "glob": "^10.3.10", + "mkdirp": "^2.1.3", + "reflect-metadata": "^0.2.1", + "sha.js": "^2.4.11", + "tslib": "^2.5.0", + "uuid": "^9.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "typeorm": "cli.js", + "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", + "typeorm-ts-node-esm": "cli-ts-node-esm.js" + }, + "engines": { + "node": ">=16.13.0" + }, + "funding": { + "url": "https://opencollective.com/typeorm" + }, + "peerDependencies": { + "@google-cloud/spanner": "^5.18.0", + "@sap/hana-client": "^2.12.25", + "better-sqlite3": "^7.1.2 || ^8.0.0 || ^9.0.0", + "hdb-pool": "^0.1.6", + "ioredis": "^5.0.4", + "mongodb": "^5.8.0", + "mssql": "^9.1.1 || ^10.0.1", + "mysql2": "^2.2.5 || ^3.0.1", + "oracledb": "^6.3.0", + "pg": "^8.5.1", + "pg-native": "^3.0.0", + "pg-query-stream": "^4.0.0", + "redis": "^3.1.1 || ^4.0.0", + "sql.js": "^1.4.0", + "sqlite3": "^5.0.3", + "ts-node": "^10.7.0", + "typeorm-aurora-data-api-driver": "^2.0.0" + }, + "peerDependenciesMeta": { + "@google-cloud/spanner": { + "optional": true + }, + "@sap/hana-client": { + "optional": true + }, + "better-sqlite3": { + "optional": true + }, + "hdb-pool": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "mongodb": { + "optional": true + }, + "mssql": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-native": { + "optional": true + }, + "pg-query-stream": { + "optional": true + }, + "redis": { + "optional": true + }, + "sql.js": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "ts-node": { + "optional": true + }, + "typeorm-aurora-data-api-driver": { + "optional": true + } + } + }, + "node_modules/typeorm/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/typeorm/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/typeorm/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typeorm/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/typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-transform-paths": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/typescript-transform-paths/-/typescript-transform-paths-3.5.2.tgz", + "integrity": "sha512-IRDVXfU7oscLwTvLabXprFrFCMUdBJbdUDtxbHFEsau9FlqrrdgS8PfwUltKDAh75vJFkQ8QdXAt/nzIWWp+fA==", + "dev": true, + "dependencies": { + "minimatch": "^9.0.5" + }, + "peerDependencies": { + "typescript": ">=3.6.5" + } + }, + "node_modules/typescript-transform-paths/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==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typescript-transform-paths/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "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/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "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/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "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==", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "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/wrap-ansi-cjs": { + "name": "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==", + "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==" + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "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==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yup": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.4.0.tgz", + "integrity": "sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/backend/package.json b/backend/package.json new file mode 100644 index 0000000..bafd591 --- /dev/null +++ b/backend/package.json @@ -0,0 +1,59 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "Node, TS and Express project boilerplate", + "main": "src/server.js", + "type": "module", + "scripts": { + "preinstall": "npx only-allow pnpm", + "start": "cd build && node src/server.js", + "dev": "cross-env NODE_ENV=development nodemon src/server.js", + "build": "tsc", + "postbuild": "rm -rf ./build/.env && cp prod.env ./build/.env" + }, + "author": "Nishan Thapa", + "license": "SimpleCold", + "devDependencies": { + "@types/cookie-parser": "^1.4.7", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/morgan": "^1.9.9", + "@types/node": "^20.9.3", + "@types/unzipper": "^0.10.9", + "cross-env": "^7.0.3", + "eslint": "^8.54.0", + "i": "^0.3.7", + "nodemon": "^3.0.1", + "ts-node": "^10.9.1", + "ts-patch": "^3.2.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.3.2", + "typescript-transform-paths": "^3.5.1" + }, + "dependencies": { + "axios": "^1.6.2", + "bcrypt": "^5.1.1", + "body-parser": "^1.20.2", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "csv-parser": "^3.0.0", + "dotenv": "^16.3.1", + "express": "^4.18.2", + "express-rate-limit": "^7.4.1", + "fs": "^0.0.1-security", + "http-status-codes": "^2.3.0", + "ioredis": "^5.4.1", + "jsonwebtoken": "^9.0.2", + "kafkajs": "^2.2.4", + "mongoose": "^8.8.3", + "morgan": "^1.10.0", + "pg": "^8.11.3", + "reflect-metadata": "^0.2.2", + "stripe": "^17.4.0", + "tsc-alias": "^1.8.8", + "typeorm": "^0.3.17", + "unzipper": "^0.10.14", + "xml2js": "^0.6.2", + "yup": "^1.3.2" + } +} diff --git a/backend/prod.env b/backend/prod.env new file mode 100644 index 0000000..b4256fa --- /dev/null +++ b/backend/prod.env @@ -0,0 +1,4 @@ +NODE_ENV=production +PORT=8000 +CONNECTION_STRING_NEON_DEV= +CONNECTION_STRING_NEON= diff --git a/backend/src/app.js b/backend/src/app.js new file mode 100644 index 0000000..00319a2 --- /dev/null +++ b/backend/src/app.js @@ -0,0 +1,44 @@ +import express from 'express' +import cors from 'cors' +import cookieParser from 'cookie-parser' + + + +const app = express() + +//middlewares-- +app.use(cors({ + origin: process.env.CORS_ORIGIN, //* + credentials:true +})) +app.use(cookieParser()) + +//limit +app.use(express.json({ + limit:'10mb' +})) + +function rawBodyParser(req, res, next) { + req.rawBody = ''; + req.setEncoding('utf8'); + req.on('data', chunk => { + req.rawBody += chunk; + }); + req.on('end', () => { + next(); + }); + } + +//Route Definition +import userRouter from './routes/user.routes.js' +import eventRouter from './routes/event.routes.js' +import bookingRouter from './routes/booking.routes.js' +import stripeRouter from './routes/stripe.routes.js' + +//Route Declaration +app.use('/api/v1/users', userRouter) +app.use('/api/v1/events', eventRouter) +app.use('/api/v1/bookings', bookingRouter) +app.use('/api/v1/webhook', rawBodyParser, stripeRouter) + +export {app} \ No newline at end of file diff --git a/backend/src/constants.js b/backend/src/constants.js new file mode 100644 index 0000000..a904f4f --- /dev/null +++ b/backend/src/constants.js @@ -0,0 +1,6 @@ +export const DB_NAME='ticketingSystem' +export const TOPIC_NAME = "payment-events" +export const GROUP_ID = "test-group" +export const CLIENT_ID = "nodejs-kafka" +export const BROKERS = ["localhost:9092"] +export const PAYMENT_TOPIC="ticket-booking" \ No newline at end of file diff --git a/backend/src/consumer.js b/backend/src/consumer.js new file mode 100644 index 0000000..d8c24e9 --- /dev/null +++ b/backend/src/consumer.js @@ -0,0 +1,25 @@ +// consumer.js +import KafkaConsumer from "./kafka/Consumer.js"; // Kafka Consumer class +import { PAYMENT_TOPIC } from "./constants.js"; // Define your Kafka topic + +// Set up consumer for payment events (could be payment success or failure) +const paymentEventConsumer = new KafkaConsumer('payment-group'); // Specify a unique consumer group + +// Function to start consuming Kafka events +const consumePaymentEvents = async () => { + await paymentEventConsumer.consume(PAYMENT_TOPIC, async (topic, partition, message) => { + // Process message + console.log(`Received message on topic: ${topic}, partition: ${partition}`); + console.log(`Message: ${message}`); + + // Based on message content, take necessary actions (e.g., update booking, notify users, etc.) + if (message.includes('payment-success')) { + // Handle payment success (e.g., update booking status, notify user) + } else if (message.includes('payment-failure')) { + // Handle payment failure (e.g., update booking status to failed) + } + }); +}; + +// Initialize the consumer on app startup (in main app or a separate service) +export {consumePaymentEvents} diff --git a/backend/src/controllers/booking.controller.js b/backend/src/controllers/booking.controller.js new file mode 100644 index 0000000..26c50c6 --- /dev/null +++ b/backend/src/controllers/booking.controller.js @@ -0,0 +1,210 @@ +//-- importing utilities -------- +import { asyncHandler } from "../utils/asyncHandler.js" +import {ApiError} from '../utils/ApiError.js' +import {ApiResponse} from '../utils/ApiResponse.js' +import mongoose from "mongoose" +import stripe from '../utils/stripe.js'; + +import redis from '../utils/redisClient.js' + + +//-- import Models ---- +import Booking from "../models/booking.model.js" +import Event from "../models/event.model.js" +import Ticket from "../models/ticket.model.js" + + +//-- controllers ----- + +export const bookTicket = asyncHandler(async (req, res) => { + const { eventId } = req.params; + const { selectedSeats } = req.body; + const userId = req.user._id; + + // ----------------Validate required fields + if (!eventId || !userId || !selectedSeats || !Array.isArray(selectedSeats) || selectedSeats.length === 0) { + throw new ApiError(400, 'Event ID, UserId, and selected Seats fields are required'); + } + + //----------------- Create lock keys for each seat + const lockKeys = selectedSeats.map(seat => `lock:seat:${seat}`); + + // -----------------Find the event + const event = await Event.findById(eventId); + if (!event) { + throw new ApiError(404, 'Event not found'); + } + + //-------------- Validate tickets availability + const tickets = await Ticket.find({ + seatNumber: { $in: selectedSeats }, + event: eventId, + status: 'NOT-BOOKED', + }); + if (tickets.length !== selectedSeats.length) { + throw new ApiError(400, 'Some tickets are already booked or invalid.'); + } + + //-------------------- Acquire locks to prevent double booking + const lockPromises = lockKeys.map(lockKey => + redis.set(lockKey, userId, 'NX', 'EX', 180) // Lock expires in 180 seconds + ); + const lockResults = await Promise.all(lockPromises); + + // --------------------If lock not acquired, release any locks acquired and return response + if (lockResults.includes(null)) { + await releaseLocks(lockKeys, lockResults); + return res.status(423).json(new ApiResponse(423, { msg: 'Some Seats are being booked by someone else. Please try again later.' })); + } + + // -----------------------Calculate total price + const totalPrice = tickets.length * event.ticketPrice; + + // ----------------Create Stripe Checkout session + let session; + try { + + session = await stripe.checkout.sessions.create({ + payment_method_types: ['card'], + line_items: [ + { + price_data: { + currency: 'npr', // Currency for your country + product_data: { name: `Ticket Purchase for booking: ${userId}` }, + unit_amount: totalPrice * 100, // Total price in smallest currency unit (cents) + }, + quantity: 1, + }, + ], + mode: 'payment', + success_url: `${process.env.CLIENT_URL}/success?session_id={CHECKOUT_SESSION_ID}`, + cancel_url: `${process.env.CLIENT_URL}/cancel`, + metadata: { userId, totalPrice, selectedSeats }, // Include relevant details for tracking + }); + } catch (error) { + await releaseLocks(lockKeys, lockResults); + throw new ApiError(500, 'Error creating Stripe checkout session'); + } + + //------------------ Create a booking with 'PENDING' status initially + const booking = await Booking.create({ + user: userId, + event: eventId, + numberOfTickets: tickets.length, + totalPrice, + status: 'PENDING', // Booking status remains "PENDING" until payment is confirmed + }); + + // -------------------Update ticket statuses to "BOOKED" + await Ticket.updateMany( + { seatNumber: { $in: selectedSeats }, event: eventId }, + { $set: { status: 'BOOKED', bookedBy: userId, booking: booking._id } } + ); + + //-------------- Release all locks after the session is created and booking is set + await releaseLocks(lockKeys, lockResults); + + // ---------------Send response with Stripe session ID for frontend to complete payment + return res.status(200).json(new ApiResponse(200, { sessionId: session.id, sessionUrl: session.url }, 'Checkout session created successfully.')); +}); + +// --------------------Utility function to release locks +async function releaseLocks(lockKeys, lockResults) { + // Release any locks that were acquired before failure + for (let i = 0; i < lockResults.length; i++) { + if (lockResults[i]) { + await redis.del(lockKeys[i]); + } + } +} + +export const getBookingDetails = asyncHandler(async (req, res) => { + const { bookingId } = req.params; + + // Find booking by ID and populate event and user details + const booking = await Booking.findById(bookingId) + .populate('user', 'name email') + .populate('event', 'name date time venue'); + + if (!booking) { + throw new ApiError(404, 'Booking not found'); + } + + return res.status(200).json(new ApiResponse(200, booking, 'Booking details fetched successfully.')); +}); + + +// cancel Bookings-- +// cancel Booking +export const cancelBooking = asyncHandler(async (req, res) => { + const { bookingId } = req.params; + const userId = req.user._id; // Extracting user ID from middleware + + if (!bookingId) { + throw new ApiError(400, 'Booking ID is required.'); + } + + // Find the booking and populate the event and associated tickets + const booking = await Booking.findById(bookingId).populate('event'); + + if (!booking) { + throw new ApiError(404, 'Booking not found.'); + } + + // Ensure the booking belongs to the current user + if (String(booking.user) !== String(userId)) { + throw new ApiError(403, 'You are not authorized to cancel this booking.'); + } + + // Start a transaction to handle updates atomically + const session = await mongoose.startSession(); + session.startTransaction(); + + try { + // Update ticket statuses for the booking + const updatedTickets = await Ticket.updateMany( + { booking: bookingId }, + { $set: { status: 'NOT-BOOKED', bookedBy: null, booking: null } }, + { session } // Use the session to ensure atomicity + ); + + if (updatedTickets.modifiedCount === 0) { + throw new ApiError(400, 'No tickets were found to cancel.'); + } + + // Update availableTickets count in the Event model + const event = booking.event; + const bookedTicketsCount = await Ticket.countDocuments({ + event: event._id, + status: 'BOOKED', + }); + + // Update the availableTickets field in the Event model + event.availableTickets = event.totalTickets - bookedTicketsCount; + await event.save({ session }); // Save event within the same transaction + + // Remove the booking from the Event bookings array + await Event.updateOne( + { _id: event._id }, + { $pull: { bookings: bookingId } }, + { session } // Use the session to ensure atomicity + ); + + // Delete the booking + await booking.deleteOne({ session }); + + // Commit the transaction + await session.commitTransaction(); + session.endSession(); + + // Return success response + return res.status(200).json(new ApiResponse(200, null, 'Booking and associated tickets removed successfully.')); + } catch (error) { + // Rollback the transaction if something goes wrong + await session.abortTransaction(); + session.endSession(); + throw new ApiError(500, `Failed to cancel booking: ${error.message}`); + } +}); + + diff --git a/backend/src/controllers/event.controller.js b/backend/src/controllers/event.controller.js new file mode 100644 index 0000000..0c1a22d --- /dev/null +++ b/backend/src/controllers/event.controller.js @@ -0,0 +1,141 @@ +//-- importing utilities -------- +import { asyncHandler } from "../utils/asyncHandler.js" +import {ApiError} from '../utils/ApiError.js' +import {ApiResponse} from '../utils/ApiResponse.js' + +//-- import Models ---- +import Event from "../models/event.model.js" +import Ticket from "../models/ticket.model.js" + + +//-- controllers ----- +export const viewAllEvents = asyncHandler( async (req,res)=>{ + + let allEvents = await Event.find() + return res.status(200).json(new ApiResponse(200, allEvents, 'Fetched all events successfully.')); + +}) + +//create event----- +export const createEvent = asyncHandler(async (req, res) => { + const { name, description, date, time, venue, ticketPrice, totalTickets } = req.body; + + // Check if all fields are provided + if (!name || !date || !time || !ticketPrice || !totalTickets) { + throw new ApiError(401, 'All fields are required'); + } + + let newEvent = await Event.create({ + name, + description, + date, + time, + venue, + ticketPrice, + totalTickets, + }); + + const tickets = []; + for (let i = 1; i <= totalTickets; i++) { + tickets.push({ + seatNumber: i, + status: 'NOT-BOOKED', + event: newEvent._id, + }); + } + + await Ticket.insertMany(tickets); + + + + return res.status(201).json(new ApiResponse(201, newEvent, 'Event created successfully.')); +}); + + +export const deleteEvent = asyncHandler(async (req, res) => { + let { eventId } = req.params; + let event = await Event.findById(eventId); + + if (!event) { + throw new ApiError(404, 'Event not found'); + } + + // Delete all tickets associated with the event + await Ticket.deleteMany({ event: eventId }); + + // Delete the event itself + let deletedEvent = await Event.findByIdAndDelete(eventId); + + return res.status(200).json(new ApiResponse(200, deletedEvent, 'Event deleted successfully.')); +}); + + +export const updateEvent = asyncHandler(async (req, res) => { + let { eventId } = req.params; + const { name, description, date, time, venue, ticketPrice, totalTickets } = req.body; + + let updatedEvent = await Event.findByIdAndUpdate(eventId, { + name, + description, + date, + time, + venue, + ticketPrice, + totalTickets, + }, { new: true }); + + if (!updatedEvent) { + throw new ApiError(404, 'Event not found'); + } + + return res.status(200).json(new ApiResponse(200, updatedEvent, 'Event updated successfully.')); +}); + +export const viewBookings = asyncHandler(async (req, res) => { + const { eventId } = req.params; + + + const event = await Event.findById(eventId); + if (!event) { + throw new ApiError(404, 'Event not found'); + } + + + const tickets = await Ticket.find({ event: eventId }); + + // Initialize counters for each ticket status + const bookingsCount = { booked: 0, pending: 0, notBooked: 0 }; + const categorizedTickets = { booked: [], pending: [], notBooked: [] }; + + // Categorize and count the tickets in a single loop + tickets.forEach(ticket => { + + const ticketData = { seatNumber: ticket.seatNumber, status: ticket.status } + + + switch (ticket.status) { + case 'BOOKED': + bookingsCount.booked++; + categorizedTickets.booked.push(ticketData); + break; + case 'PENDING': + bookingsCount.pending++; + categorizedTickets.pending.push(ticketData); + break; + case 'NOT-BOOKED': + bookingsCount.notBooked++; + categorizedTickets.notBooked.push(ticketData); + break; + default: + break; // Handle unknown statuses, if any + } + }); + + // Return the tickets grouped by status and counts + return res.status(200).json(new ApiResponse(200, { + bookingsCount, + categorizedTickets + }, 'Bookings fetched successfully.')); +}); + + diff --git a/backend/src/controllers/stripe.js b/backend/src/controllers/stripe.js new file mode 100644 index 0000000..1326e2c --- /dev/null +++ b/backend/src/controllers/stripe.js @@ -0,0 +1,160 @@ +import { ApiError } from '../utils/ApiError.js'; +//import { ApiResponse } from '../utils/ApiResponse.js'; +import stripe from '../utils/stripe.js'; +import {asyncHandler} from '../utils/asyncHandler.js'; +import KafkaProducer from '../kafka/producer.js'; +import Booking from '../models/booking.model.js'; +import Ticket from '../models/ticket.model.js'; + +export const createCheckoutSession = asyncHandler(async (req, res) => { + + //const { amount, currency, successUrl, cancelUrl } = req.body; + const {bookingId, totalPrice} = req.body + + if (!bookingId || !totalPrice ) { + throw new ApiError(400,'Missing required Parameters') + + } + + const session = await stripe.checkout.sessions.create({ + payment_method_types: ['card'], + line_items: [ + { + price_data: { + currency: 'npr', //currency + product_data: { name: `Ticket Purchase for booking: ${bookingId}` }, + unit_amount: amount*100, + }, + quantity: 1, + }, + ], + mode: 'payment', + success_url: `http://localhost:3000/success?session_id={CHECKOUT_SESSION_ID}`, + cancel_url: `http://localhost:3000/cancel`, + }); + + res.status(200).json({ sessionId: session.id,sessionUrl: session.url }); +}); + + + +export const stripeWebhook = asyncHandler(async (req, res) => { + const sig = req.headers['stripe-signature']; + const payload = req.rawBody; + + let event; + + try { + event = stripe.webhooks.constructEvent(payload, sig, process.env.STRIPE_WEBHOOK_SECRET); + } catch (err) { + console.error('Error verifying webhook signature', err); + return res.status(400).send(`Webhook error: ${err.message}`); + } + + // Handle the event + try { + switch (event.type) { + case 'checkout.session.completed': + const session = event.data.object; + // Handle successful payment + handleSuccessfulPayment(session); + break; + case 'payment_intent.payment_failed': + const failedIntent = event.data.object; + // Handle failed payment + handleFailedPayment(failedIntent); + break; + default: + console.log(`Unhandled event type ${event.type}`); + } + } catch (error){ + console.error('Error processing event:', error); + return res.status(500).send('Internal Server Error'); + } + + res.json({ received: true }); + }); + + + // Function to handle successful payment +async function handleSuccessfulPayment(session) { + const { bookingId, selectedSeats, userId, totalPrice } = session.metadata; + + // Step 1: Retrieve the booking + const booking = await Booking.findById(bookingId); + if (!booking) { + throw new ApiError(404, 'Booking not found'); + } + + // Step 2: Update the booking status to 'CONFIRMED' + booking.status = 'CONFIRMED'; + booking.paymentDetails = { + paymentMethod: session.payment_method_types[0], // 'card' or others + amount: totalPrice, // Convert from cents if necessary (as Stripe typically sends in cents) + paymentIntentId: session.payment_intent, // Attach the Stripe PaymentIntent ID for reference + }; + + // Step 3: Save the updated booking + await booking.save(); + + // Step 4: Update ticket statuses to 'BOOKED' + const updateTicketResult = await Ticket.updateMany( + { seatNumber: { $in: selectedSeats }, event: booking.event }, + { $set: { status: 'BOOKED', bookedBy: userId, booking: booking._id } } + ); + + if (updateTicketResult.modifiedCount !== selectedSeats.length) { + throw new ApiError(400, 'Error booking some of the tickets.'); + } + + // Step 5: Optionally, send email or other notifications (e.g., using a notification service) + console.log(`Booking confirmed for user: ${userId} with bookingId: ${bookingId}`); + + // Return Kafka Message + const kafkaProducer = new KafkaProducer(); + const message = `Booking confirmed for user ${userId} with bookingId: ${bookingId}, totalPrice: ${totalPrice}`; + await kafkaProducer.produce('payment-events', [{ key: 'payment-success', value: message }]); + } + + // Function to handle failed payment + async function handleFailedPayment(failedIntent) { + const { bookingId, selectedSeats, userId } = failedIntent.metadata; + + + + // Step 1: Retrieve the booking + const booking = await Booking.findById(bookingId); + if (!booking) { + throw new ApiError(404, 'Booking not found'); + } + + // Step 2: Update booking status to 'FAILED' (indicating payment failure) + booking.status = 'FAILED'; + booking.paymentDetails = { + paymentMethod: failedIntent.payment_method_types[0], // 'card' or others + error: failedIntent.last_payment_error ? failedIntent.last_payment_error.message : 'Unknown error', + }; + + // Step 3: Save the updated booking + await booking.save(); + + const kafkaProducer = new KafkaProducer(); + const message = `Payment failed for user ${userId} with bookingId: ${bookingId}`; + await kafkaProducer.produce('payment-events', [{ key: 'payment-failure', value: message }]); + + // Step 4: Optionally, update the ticket status to 'AVAILABLE' if the booking failed + const updateTicketResult = await Ticket.updateMany( + { seatNumber: { $in: selectedSeats }, event: booking.event }, + { $set: { status: 'AVAILABLE', bookedBy: null, booking: null } } + ); + + if (updateTicketResult.modifiedCount !== selectedSeats.length) { + throw new ApiError(400, 'Error updating some tickets to AVAILABLE.'); + } + + // Step 5: Notify the user about the failure (optional) + console.log(`Payment failed for user: ${userId}, bookingId: ${bookingId}`); + + // Return any necessary info or just a confirmation message + } + diff --git a/backend/src/controllers/user.controller.js b/backend/src/controllers/user.controller.js new file mode 100644 index 0000000..46527a9 --- /dev/null +++ b/backend/src/controllers/user.controller.js @@ -0,0 +1,83 @@ +import {asyncHandler} from '../utils/asyncHandler.js' +import User from '../models/user.model.js'; +import {ApiError} from '../utils/ApiError.js' +import {ApiResponse} from '../utils/ApiResponse.js' +import generateToken from '../utils/generateToken.js'; + + +export const signupUser = asyncHandler( async (req,res)=>{ + + let {name, email, password} = req.body; + + //empty fields check + let arr = [name, email, password ].some((feild)=>feild?.trim()==='') + if (arr) throw new ApiError(401, 'All feilds are required') + + //pre-existing User Check + let prevUser= await User.findOne({ email}) + if (prevUser) throw new ApiError(409, 'name or email already exists') + + + let createdUser= await User.create({ + email, + password, + name + }) + + if (!createdUser) { + throw new ApiError(500, "Something went wrong while registering the user") + } + + return res.status(201).json( + new ApiResponse(200, createdUser, "User registered Successfully") + ) + + } +) + +export const loginUser = asyncHandler(async (req,res)=>{ + + const { email, password} = req.body; + if (!email) throw new ApiError(400, 'email missing') + + //2. verify credentials + let user = await User.findOne({email}) + if (!user) throw new ApiError(404, 'User does not exist') + + let isValidPassword =await user.isPasswordCorrect(password) + if (!isValidPassword) throw new ApiError(401, 'Invalid user credentials') + + let token = generateToken(user) + res.cookie('token', token, {httpOnly: true}) + + return res.status(201).json(new ApiResponse(200, user, 'Sucessfully logged in')) + +}) + +export const logoutUser = asyncHandler(async (req,res)=>{ + res.clearCookie('token', { httpOnly: true, secure: process.env.NODE_ENV === 'production' }); + + return res.status(200).json( + new ApiResponse(200, null, 'User logged out successfully') + ); + +}) + + +export const createAdmin = asyncHandler( async (req,res)=>{ + + console.log(process.env.NODE_ENV) + if (process.env.NODE_ENV.trim()==='development') { + + let admin = await User.findById(req.user._id) + if (!admin) throw new ApiError(409, 'Not Authorized') + console.log(admin) + admin.role='ADMIN'; + await admin.save(); + + return res.status(200).json( new ApiResponse(200, admin, 'Admin created Successfully')) + } else { + throw new ApiError(403, 'Admin creation is only allowed in development mode'); + } + +}) \ No newline at end of file diff --git a/backend/src/db/mongooseConnection.js b/backend/src/db/mongooseConnection.js new file mode 100644 index 0000000..065314e --- /dev/null +++ b/backend/src/db/mongooseConnection.js @@ -0,0 +1,19 @@ +import mongoose from "mongoose"; +import { DB_NAME } from "../constants.js"; + +const connectDB = async ()=>{ + try{ + const connectionInstance = await mongoose.connect(`${process.env.MONGODB_URI}/${DB_NAME}`) + //console.log(connectionInstance) + + console.log(`\n MongoDB connected !! DB host: ${connectionInstance.connection.host}`) + // To check host server : production, development,etc + + } catch (error){ + console.log('MONGODB connection FAILED', error); + process.exit(1); + } + +} + +export default connectDB; \ No newline at end of file diff --git a/backend/src/kafka/Config.js b/backend/src/kafka/Config.js new file mode 100644 index 0000000..1a157ca --- /dev/null +++ b/backend/src/kafka/Config.js @@ -0,0 +1,11 @@ +import {Kafka} from "kafkajs"; +import {BROKERS, CLIENT_ID} from "../constants.js"; + +const kafkaConfig = { + clientId: CLIENT_ID, + brokers: BROKERS, +}; + +const kafka = new Kafka(kafkaConfig); + +export default kafka; \ No newline at end of file diff --git a/backend/src/kafka/Consumer.js b/backend/src/kafka/Consumer.js new file mode 100644 index 0000000..c433c10 --- /dev/null +++ b/backend/src/kafka/Consumer.js @@ -0,0 +1,24 @@ +import kafka from "./Config.js"; + +class KafkaConsumer { + constructor(groupId) { + this.consumer = kafka.consumer({groupId}); + } + + async consume(topic, callback) { + try { + await this.consumer.connect(); + await this.consumer.subscribe({topic, fromBeginning: true}); + await this.consumer.run({ + eachMessage: async ({topic, partition, message}) => { + const value = message.value.toString(); + callback(topic, partition, value); + }, + }); + } catch (error) { + console.error('Kafka Consumer error',error); + } + } +} + +export default KafkaConsumer; \ No newline at end of file diff --git a/backend/src/kafka/Producer.js b/backend/src/kafka/Producer.js new file mode 100644 index 0000000..93639cc --- /dev/null +++ b/backend/src/kafka/Producer.js @@ -0,0 +1,23 @@ +import kafka from "./Config.js"; + +class KafkaProducer { + constructor() { + this.producer = kafka.producer(); + } + + async produce(topic, messages) { + try { + await this.producer.connect(); + await this.producer.send({ + topic: topic, + messages: messages, + }); + } catch (error) { + console.error('Kafka Producer Error', error); + } finally { + await this.producer.disconnect(); + } + } +} + +export default KafkaProducer; diff --git a/backend/src/kafka/kafka.controller.js b/backend/src/kafka/kafka.controller.js new file mode 100644 index 0000000..0cc46e4 --- /dev/null +++ b/backend/src/kafka/kafka.controller.js @@ -0,0 +1,26 @@ +import KafkaProducer from "./producer.js"; +import {TOPIC_NAME} from "./constants.js"; + +const sendMessageToKafka = async (req, res) => { + try { + const {message} = req.body; + const kafkaProducer = new KafkaProducer(); + const messages = [{key: "key1", value: message}]; + kafkaProducer.produce(TOPIC_NAME, messages); + + res.status(200).json({ + status: "Ok!", + message: "Message successfully send!", + }); + } catch (error) { + console.log("Error sending message to Kafka:", error); + res.status(500).json({ + status: "Error", + message: "Failed to send message to Kafka", + }); + } +}; + +const controllers = {sendMessageToKafka}; + +export default controllers; \ No newline at end of file diff --git a/backend/src/middlewares/isAdmin.js b/backend/src/middlewares/isAdmin.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/src/middlewares/verfiyAuth.js b/backend/src/middlewares/verfiyAuth.js new file mode 100644 index 0000000..f654c4a --- /dev/null +++ b/backend/src/middlewares/verfiyAuth.js @@ -0,0 +1,44 @@ +import { ApiError } from "../utils/ApiError.js"; +import { asyncHandler } from "../utils/asyncHandler.js"; +import jwt from "jsonwebtoken" +import User from "../models/user.model.js"; + +//Verify user from JWT + +/* +1. from Token get userId, +2. from Id, remove password and refresh Token +3. attach user object to request and next() +*/ +const verifyAuth = asyncHandler(async(req,res, next)=>{ + + + try{ + + const token = req.cookies?.token || req.header("Authorization")?.replace("Bearer", "") + //console.log('Token',token) + + if (!token) throw new ApiError(401, 'Unauthorized request') + + const decoded_token = jwt.verify(token, process.env.JWT_SECRET_KEY) + //decoded_token has {_id, email } + console.log('decoded token', decoded_token) + + let user= await User.findById(decoded_token?._id).select('-password') + + if (!user) throw new ApiError(401, "Invalid Access Token") + + req.user= user; + console.log('auth-middleware function completed') + next() + + } catch (error){ + + throw new ApiError(401, error.message || 'Invalid Access Token') + + } + +}) + +export {verifyAuth} + diff --git a/backend/src/models/booking.model.js b/backend/src/models/booking.model.js new file mode 100644 index 0000000..a15b394 --- /dev/null +++ b/backend/src/models/booking.model.js @@ -0,0 +1,68 @@ +import mongoose from "mongoose"; + +const bookingSchema = new mongoose.Schema({ + user: { + type: mongoose.Schema.Types.ObjectId, + ref: 'User' + }, + event: { + type: mongoose.Schema.Types.ObjectId, + ref: 'Event' + }, + numberOfTickets: { + type: Number, + required: true + }, + totalPrice: { + type: Number, + required: true + }, + bookingDate: { + type: Date, + default: Date.now + }, + status :{ + type: String, + enum : ['BOOKED', 'PENDING', 'NOT-BOOKED'], + default :'NOT-BOOKED' + }, + paymentStatus :{ + type: String, + enum : ['PAID', 'PENDING', 'FAILED'], + + } +},{ + timestamps:true +}); + + +//validate bookings: if events is present, if available ticket match bookings, + +bookingSchema.pre('save', async function (next) { + const Event = mongoose.model('Event'); + const Ticket = mongoose.model('Ticket'); + const event = await Event.findById(this.event); + + if (!event) { + return next(new Error('Event not found.')); + } + + const availableTickets = await Ticket.countDocuments({ + event: this.event, + status: 'NOT-BOOKED', + }); + + if (this.numberOfTickets > availableTickets) { + return next( + new Error('Not enough tickets available for the requested booking.') + ); + } + + next(); +}); + + + + +const Booking = mongoose.model('Booking', bookingSchema); +export default Booking; \ No newline at end of file diff --git a/backend/src/models/event.model.js b/backend/src/models/event.model.js new file mode 100644 index 0000000..c3b5574 --- /dev/null +++ b/backend/src/models/event.model.js @@ -0,0 +1,66 @@ +import mongoose, { Mongoose } from "mongoose"; + +const eventSchema = new mongoose.Schema({ + name: { + type: String, + required: true + }, + description: String, + date: { + type: Date, + required: true + }, + time: { + type: String, + required: true + }, + category : { + type:String + }, + orgainzer : { + type:String + }, + venue: String, + ticketPrice: Number, + totalTickets:{ + type:Number + }, + availableTickets:{ + type:Number + }, + + bookings :[{ + type: mongoose.Schema.Types.ObjectId, + ref: 'Booking' + }], + +},{ + timestamps:true +}); + + +//date vaildation middleware +eventSchema.pre('save', function (next) { + const currentDate = new Date(); + + // Ensure the event date is in the future + if (this.date < currentDate) { + const err = new Error('Event date cannot be in the past.'); + return next(err); + } + + // Optional: Validate that the time is provided in the correct format (HH:MM) + const timeRegex = /^([0-1][0-9]|2[0-3]):([0-5][0-9])$/; + if (!timeRegex.test(this.time)) { + const err = new Error('Invalid time format. Use HH:MM (24-hour format).'); + return next(err); + } + + next(); +}); + + + + +const Event = mongoose.model('Event', eventSchema); +export default Event \ No newline at end of file diff --git a/backend/src/models/payment.model.js b/backend/src/models/payment.model.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/src/models/ticket.model.js b/backend/src/models/ticket.model.js new file mode 100644 index 0000000..0391151 --- /dev/null +++ b/backend/src/models/ticket.model.js @@ -0,0 +1,66 @@ +import mongoose from "mongoose"; + +const ticketSchema = mongoose.Schema({ + seatNumber:{ type: String, required: true}, + status: { + type: String, + enum:['BOOKED', 'PENDING', 'NOT-BOOKED'], + default: 'NOT-BOOKED' + + }, + price: Number, + booking :{ + type:mongoose.Schema.Types.ObjectId, + ref:'Booking' + }, + bookedBy : { + type:mongoose.Schema.Types.ObjectId, + ref:'User', + default:null + }, + type :{ + type:String, + enum:['VIP','Standard'], + default:'Standard' + }, + expirationDate : { + + }, + event : { + type:mongoose.Schema.Types.ObjectId, + ref:'Event', + required:true + } + + +}, {timestamps:true} +) + +// Compound index for unique seat number per event +ticketSchema.index({ seatNumber: 1, event: 1 }, { unique: true }); + +//once Ticket's status changes, availableTickets field on Event model also changes: +ticketSchema.pre('save', async function (next) { + if (this.isModified('status')) { + const Event = mongoose.model('Event'); + const event = await Event.findById(this.event); + + if (!event) { + return next(new Error('Event not found for the ticket.')); + } + + const bookedTicketsCount = await mongoose.model('Ticket').countDocuments({ + event: this.event, + status: 'BOOKED', + }); + + event.availableTickets = event.totalTickets - bookedTicketsCount; + await event.save(); + } + + next(); +}); + + +const Ticket = mongoose.model('Ticket', ticketSchema) +export default Ticket diff --git a/backend/src/models/user.model.js b/backend/src/models/user.model.js new file mode 100644 index 0000000..259d2aa --- /dev/null +++ b/backend/src/models/user.model.js @@ -0,0 +1,43 @@ +import mongoose from 'mongoose' +import bcrypt from 'bcrypt' + +const userSchema = mongoose.Schema({ + name: { + type: String, + required: true + }, + email: { + type: String, + required: true, + unique: true + }, + password: { + type: String, + required: true + }, + role : { + type:String, + enum:['ADMIN','USER'], + default:'USER' + } + +}, +{ timestamps: true}) + +//before saving perform some action like middleware +userSchema.pre('save', async function(next){ + + if(!this.isModified('password')) return next(); + //run only when password feild is altered + this.password= await bcrypt.hash(this.password, 10) + next(); +}) + +//-----------custom methods in mongoose--- +userSchema.methods.isPasswordCorrect = async function (password){ + return await bcrypt.compare(password, this.password) + //returns true or false +} + +const User = mongoose.model('User', userSchema) +export default User; \ No newline at end of file diff --git a/backend/src/routes/booking.routes.js b/backend/src/routes/booking.routes.js new file mode 100644 index 0000000..f54bd5c --- /dev/null +++ b/backend/src/routes/booking.routes.js @@ -0,0 +1,21 @@ + +import {Router} from 'express' +const router = Router(); +import { verifyAuth } from '../middlewares/verfiyAuth.js'; + +import { bookTicket, getBookingDetails, cancelBooking } from '../controllers/booking.controller.js'; + +//view all bookings +router.use(verifyAuth) +router.route('/:eventId/new-booking') + .post(bookTicket) + +router.route('/:bookingId') + .get(getBookingDetails) + .delete(cancelBooking) + + + +export default router + + diff --git a/backend/src/routes/event.routes.js b/backend/src/routes/event.routes.js new file mode 100644 index 0000000..55c936f --- /dev/null +++ b/backend/src/routes/event.routes.js @@ -0,0 +1,23 @@ + +import {Router} from 'express' +const router = Router(); +import { viewAllEvents, createEvent, deleteEvent, updateEvent, viewBookings } from '../controllers/event.controller.js'; + +router.route('/') + .get(viewAllEvents) + .post(createEvent) + + +router.route('/:eventId') + .delete(deleteEvent) + .patch(updateEvent) + +router.route('/:eventId/bookings') + .get(viewBookings) +/* +router.route('/logout').get(logoutUser) +router.route('/update').patch(updateUser) +*/ + + +export default router \ No newline at end of file diff --git a/backend/src/routes/stripe.routes.js b/backend/src/routes/stripe.routes.js new file mode 100644 index 0000000..4b9a25b --- /dev/null +++ b/backend/src/routes/stripe.routes.js @@ -0,0 +1,15 @@ +import express from 'express' + +const router = express.Router(); + + +import { verifyAuth } from '../middlewares/verfiyAuth.js'; +import { stripeWebhook} from '../controllers/stripe.js'; + +router.use(verifyAuth) +// router.route('/create-checkout-session') +// .post(createCheckoutSession) + + router.route('/').post(express.json({type: 'application/json'}), stripeWebhook) + + export default router \ No newline at end of file diff --git a/backend/src/routes/user.routes.js b/backend/src/routes/user.routes.js new file mode 100644 index 0000000..b135585 --- /dev/null +++ b/backend/src/routes/user.routes.js @@ -0,0 +1,14 @@ +import {Router} from 'express' +const router = Router(); + +import {verifyAuth} from '../middlewares/verfiyAuth.js' +import { signupUser, loginUser, logoutUser, createAdmin } from '../controllers/user.controller.js'; + + +router.route('/signup').post(signupUser) +router.route('/login').post(loginUser) +router.route('/logout').get(verifyAuth, logoutUser) +router.route('/admin').get(verifyAuth,createAdmin) + + +export default router \ No newline at end of file diff --git a/backend/src/server.js b/backend/src/server.js new file mode 100644 index 0000000..8760494 --- /dev/null +++ b/backend/src/server.js @@ -0,0 +1,30 @@ +import dotenv from 'dotenv' +'' + +dotenv.config({ + path: './.env' +}) + +import connectDB from './db/mongooseConnection.js'; +import { consumePaymentEvents } from "./consumer.js"; + +import { app } from "./app.js"; + +dotenv.config({ + path: './.env' +}) + +let port = process.env.PORT || 8000; + +consumePaymentEvents() +.catch(console.error); + +connectDB() +.then(()=>{ + app.listen(port, ()=>{ + console.log(`Server is running at port ${port}`) + }) +}) +.catch((err)=>{ + console.log('connection failed', err) +}) \ No newline at end of file diff --git a/backend/src/utils/ApiError.js b/backend/src/utils/ApiError.js new file mode 100644 index 0000000..5d432c9 --- /dev/null +++ b/backend/src/utils/ApiError.js @@ -0,0 +1,25 @@ + +// creating a custom error handling class to manage errors in APIs +class ApiError extends Error { + + constructor (statusCode, message = "Something went wrong", errors = [], stack = "" ) + { + super(message); + this.statusCode = statusCode; + this.data = null; + this.message = message; + this.success = false; + this.errors = errors; + + if (stack) { + this.stack = stack; + } else { + Error.captureStackTrace(this, this.constructor); + } + } + + } + + export {ApiError} + + \ No newline at end of file diff --git a/backend/src/utils/ApiResponse.js b/backend/src/utils/ApiResponse.js new file mode 100644 index 0000000..11f4f27 --- /dev/null +++ b/backend/src/utils/ApiResponse.js @@ -0,0 +1,11 @@ +class ApiResponse { + constructor( statusCode, data, message = 'Success') + { + this.statusCode= statusCode + this.data= data + this.message= message + this.success= statusCode < 400 + } +} + +export {ApiResponse} \ No newline at end of file diff --git a/backend/src/utils/asyncHandler.js b/backend/src/utils/asyncHandler.js new file mode 100644 index 0000000..174c6fd --- /dev/null +++ b/backend/src/utils/asyncHandler.js @@ -0,0 +1,11 @@ +const asyncHandler = (requestHandler) => { + + return (req, res, next) => { // Returns a middleware-like function + Promise.resolve(requestHandler(req, res, next)) // Resolves the requestHandler + .catch((err) => { + next(err); // Forwards any errors to the Express error handler + }); + }; +}; + +export {asyncHandler} \ No newline at end of file diff --git a/backend/src/utils/generateToken.js b/backend/src/utils/generateToken.js new file mode 100644 index 0000000..b6cf6c0 --- /dev/null +++ b/backend/src/utils/generateToken.js @@ -0,0 +1,17 @@ +import jwt from 'jsonwebtoken' + +const generateToken = (user)=>{ + + return jwt.sign({ + email: user.email, + _id: user._id + }, + + process.env.JWT_SECRET_KEY, + + {expiresIn: '2d'} + ); + +} + +export default generateToken diff --git a/backend/src/utils/redisClient.js b/backend/src/utils/redisClient.js new file mode 100644 index 0000000..cadfc73 --- /dev/null +++ b/backend/src/utils/redisClient.js @@ -0,0 +1,9 @@ +import Redis from "ioredis"; + +const redis = new Redis({ + host: 'localhost', + port: 6379 , + password :'' , +}) + +export default redis \ No newline at end of file diff --git a/backend/src/utils/stripe.js b/backend/src/utils/stripe.js new file mode 100644 index 0000000..2d08e42 --- /dev/null +++ b/backend/src/utils/stripe.js @@ -0,0 +1,8 @@ +import Stripe from 'stripe'; + +// Using Stripe's test secret key +const stripe = new Stripe('sk_test_4eC39HqLyjWDarjtT1zdp7dc', { + apiVersion: '2024-11-20.acacia', +}); + +export default stripe;