├── react-docker
├── .dockerignore
├── assets
│ ├── icon.png
│ ├── splash.png
│ ├── favicon.png
│ ├── snack-icon.png
│ └── adaptive-icon.png
├── babel.config.js
├── Dockerfile
├── .gitignore
├── package.json
├── app.json
├── components
│ └── AssetExample.js
├── README.md
└── App.js
├── mern-docker
├── .gitignore
├── frontend
│ ├── vite.config.js
│ ├── Dockerfile
│ ├── src
│ │ ├── main.jsx
│ │ ├── index.css
│ │ ├── App.jsx
│ │ ├── pages
│ │ │ ├── Home.jsx
│ │ │ └── Create.jsx
│ │ ├── assets
│ │ │ └── react.svg
│ │ └── App.css
│ ├── .gitignore
│ ├── index.html
│ ├── README.md
│ ├── .eslintrc.cjs
│ ├── .dockerignore
│ ├── package.json
│ └── public
│ │ └── vite.svg
├── backend
│ ├── database
│ │ ├── anim.model.js
│ │ └── connect.js
│ ├── package.json
│ ├── Dockerfile
│ ├── .dockerignore
│ ├── index.js
│ └── package-lock.json
└── compose.yml
├── hello-docker
├── hello.js
└── Dockerfile
└── next-docker
├── .eslintrc.json
├── app
├── globals.css
├── favicon.ico
├── layout.tsx
├── page.tsx
└── create
│ └── page.tsx
├── next.config.js
├── postcss.config.js
├── lib
├── database
│ ├── task.model.ts
│ └── connect.ts
└── action.ts
├── .gitignore
├── tailwind.config.ts
├── public
├── vercel.svg
└── next.svg
├── Dockerfile
├── package.json
├── tsconfig.json
├── .dockerignore
└── compose.yaml
/react-docker/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/mern-docker/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | .env
3 |
--------------------------------------------------------------------------------
/hello-docker/hello.js:
--------------------------------------------------------------------------------
1 | console.log("Hello from Docker 🐳")
--------------------------------------------------------------------------------
/next-docker/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "next/core-web-vitals"
3 | }
4 |
--------------------------------------------------------------------------------
/next-docker/app/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
--------------------------------------------------------------------------------
/next-docker/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mustafa-Hassan2001/Docker-Course/HEAD/next-docker/app/favicon.ico
--------------------------------------------------------------------------------
/react-docker/assets/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mustafa-Hassan2001/Docker-Course/HEAD/react-docker/assets/icon.png
--------------------------------------------------------------------------------
/react-docker/assets/splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mustafa-Hassan2001/Docker-Course/HEAD/react-docker/assets/splash.png
--------------------------------------------------------------------------------
/react-docker/assets/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mustafa-Hassan2001/Docker-Course/HEAD/react-docker/assets/favicon.png
--------------------------------------------------------------------------------
/next-docker/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {}
3 |
4 | module.exports = nextConfig
5 |
--------------------------------------------------------------------------------
/next-docker/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/react-docker/assets/snack-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mustafa-Hassan2001/Docker-Course/HEAD/react-docker/assets/snack-icon.png
--------------------------------------------------------------------------------
/react-docker/assets/adaptive-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Mustafa-Hassan2001/Docker-Course/HEAD/react-docker/assets/adaptive-icon.png
--------------------------------------------------------------------------------
/react-docker/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = function(api) {
2 | api.cache(true);
3 | return {
4 | presets: ['babel-preset-expo'],
5 | };
6 | };
7 |
--------------------------------------------------------------------------------
/mern-docker/frontend/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | })
8 |
--------------------------------------------------------------------------------
/mern-docker/frontend/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:20-alpine3.18
2 |
3 | # RUN addgroup app && adduser -S -G app app
4 |
5 | # USER app
6 |
7 | WORKDIR /app
8 |
9 | COPY package*.json ./
10 |
11 | RUN npm install
12 |
13 | COPY . .
14 |
15 | EXPOSE 5173
16 |
17 | CMD npm run dev
18 |
--------------------------------------------------------------------------------
/next-docker/lib/database/task.model.ts:
--------------------------------------------------------------------------------
1 | import { Schema, model, models } from 'mongoose';
2 |
3 | const TaskSchema = new Schema({
4 | title: String,
5 | description: String,
6 | status: String,
7 | });
8 |
9 | const Task = models.Task || model('Task', TaskSchema);
10 |
11 | export default Task;
--------------------------------------------------------------------------------
/mern-docker/frontend/src/main.jsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import ReactDOM from 'react-dom/client'
3 | import App from './App.jsx'
4 | import './index.css'
5 |
6 | ReactDOM.createRoot(document.getElementById('root')).render(
7 |
8 |
9 | ,
10 | )
11 |
--------------------------------------------------------------------------------
/react-docker/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:20-alpine
2 |
3 | RUN addgroup app && adduser -S -G app app
4 |
5 | USER app
6 |
7 | WORKDIR /app
8 |
9 | COPY package*.json ./
10 |
11 | USER root
12 |
13 | RUN chown -R app:app .
14 |
15 | USER app
16 |
17 | RUN npm install
18 |
19 | COPY . .
20 |
21 | EXPOSE 5173
22 |
23 | CMD npm run dev
--------------------------------------------------------------------------------
/mern-docker/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css?family=Poppins:400,500,600,700,800,900');
2 |
3 | * {
4 | margin: 0;
5 | padding: 0;
6 | box-sizing: border-box;
7 | }
8 |
9 | body {
10 | font-family: 'Poppins', sans-serif;
11 | height: 100vh;
12 | width: 100vw;
13 | background: #fafafa;
14 | }
--------------------------------------------------------------------------------
/next-docker/lib/database/connect.ts:
--------------------------------------------------------------------------------
1 | import mongoose from "mongoose";
2 |
3 | let isConnected = false;
4 |
5 | async function dbConnect() {
6 | if (isConnected) return;
7 |
8 | try {
9 | await mongoose.connect(process.env.DB_URL as string);
10 | isConnected = true;
11 | } catch (err) {
12 | console.log(err);
13 | }
14 | }
15 |
16 | export default dbConnect;
17 |
--------------------------------------------------------------------------------
/mern-docker/frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/mern-docker/backend/database/anim.model.js:
--------------------------------------------------------------------------------
1 | // create a task model
2 | const mongoose = require("mongoose");
3 |
4 | const AnimSchema = new mongoose.Schema({
5 | title: {
6 | type: String,
7 | required: true,
8 | },
9 | link: {
10 | type: String,
11 | },
12 | description: {
13 | type: String,
14 | },
15 | });
16 |
17 | const Anim = mongoose.model("Anim", AnimSchema);
18 |
19 | module.exports = Anim;
20 |
--------------------------------------------------------------------------------
/mern-docker/frontend/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/mern-docker/frontend/README.md:
--------------------------------------------------------------------------------
1 | # React + Vite
2 |
3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4 |
5 | Currently, two official plugins are available:
6 |
7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9 |
--------------------------------------------------------------------------------
/mern-docker/backend/database/connect.js:
--------------------------------------------------------------------------------
1 | // create a connection to our MongoDB database
2 | const mongoose = require("mongoose");
3 |
4 | function connect() {
5 | mongoose
6 | .connect(process.env.DB_URL)
7 | .then(() => {
8 | console.log("Successfully connected to database");
9 | })
10 | .catch((err) => {
11 | console.log("database connection failed. exiting now...");
12 | console.error(err);
13 | process.exit(1);
14 | });
15 | }
16 |
17 | module.exports = connect;
18 |
--------------------------------------------------------------------------------
/mern-docker/backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon index.js",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "colors": "^1.4.0",
14 | "cors": "^2.8.5",
15 | "dotenv": "^16.3.1",
16 | "express": "^4.18.2",
17 | "mongoose": "^8.0.3",
18 | "nodemon": "^3.0.2"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/react-docker/.gitignore:
--------------------------------------------------------------------------------
1 | # Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
2 |
3 | # dependencies
4 | node_modules/
5 |
6 | # Expo
7 | .expo/
8 | dist/
9 | web-build/
10 |
11 | # Native
12 | *.orig.*
13 | *.jks
14 | *.p8
15 | *.p12
16 | *.key
17 | *.mobileprovision
18 |
19 | # Metro
20 | .metro-health-check*
21 |
22 | # debug
23 | npm-debug.*
24 | yarn-debug.*
25 | yarn-error.*
26 |
27 | # macOS
28 | .DS_Store
29 | *.pem
30 |
31 | # local env files
32 | .env*.local
33 |
34 | # typescript
35 | *.tsbuildinfo
36 |
--------------------------------------------------------------------------------
/next-docker/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from 'next'
2 | import { Inter } from 'next/font/google'
3 | import './globals.css'
4 |
5 | const inter = Inter({ subsets: ['latin'] })
6 |
7 | export const metadata: Metadata = {
8 | title: 'Create Next App',
9 | description: 'Generated by create next app',
10 | }
11 |
12 | export default function RootLayout({
13 | children,
14 | }: {
15 | children: React.ReactNode
16 | }) {
17 | return (
18 |
19 | {children}
20 |
21 | )
22 | }
23 |
--------------------------------------------------------------------------------
/react-docker/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "main": "node_modules/expo/AppEntry.js",
3 | "scripts": {
4 | "start": "expo start",
5 | "android": "expo start --android",
6 | "ios": "expo start --ios",
7 | "web": "expo start --web"
8 | },
9 | "dependencies": {
10 | "expo": "~50.0.13",
11 | "expo-status-bar": "~1.11.1",
12 | "react": "18.2.0",
13 | "react-native": "0.73.5",
14 | "react-native-paper": "4.9.2",
15 | "@expo/vector-icons": "^14.0.0"
16 | },
17 | "devDependencies": {
18 | "@babel/core": "^7.20.0"
19 | },
20 | "private": true
21 | }
--------------------------------------------------------------------------------
/next-docker/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 | .yarn/install-state.gz
8 |
9 | # testing
10 | /coverage
11 |
12 | # next.js
13 | /.next/
14 | /out/
15 |
16 | # production
17 | /build
18 |
19 | # misc
20 | .DS_Store
21 | *.pem
22 |
23 | # debug
24 | npm-debug.log*
25 | yarn-debug.log*
26 | yarn-error.log*
27 |
28 | # local env files
29 | .env*.local
30 |
31 | # vercel
32 | .vercel
33 |
34 | # typescript
35 | *.tsbuildinfo
36 | next-env.d.ts
37 |
38 | # env
39 | .env
--------------------------------------------------------------------------------
/next-docker/tailwind.config.ts:
--------------------------------------------------------------------------------
1 | import type { Config } from 'tailwindcss'
2 |
3 | const config: Config = {
4 | content: [
5 | './pages/**/*.{js,ts,jsx,tsx,mdx}',
6 | './components/**/*.{js,ts,jsx,tsx,mdx}',
7 | './app/**/*.{js,ts,jsx,tsx,mdx}',
8 | ],
9 | theme: {
10 | extend: {
11 | backgroundImage: {
12 | 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))',
13 | 'gradient-conic':
14 | 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))',
15 | },
16 | },
17 | },
18 | plugins: [],
19 | }
20 | export default config
21 |
--------------------------------------------------------------------------------
/mern-docker/backend/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:20-alpine3.18
2 |
3 | RUN addgroup app && adduser -S -G app app
4 |
5 | USER app
6 |
7 | WORKDIR /app
8 |
9 | COPY package*.json ./
10 |
11 | # change ownership of the /app directory to the app user
12 | USER root
13 |
14 | # change ownership of the /app directory to the app user
15 | # chown -R :
16 | # chown command changes the user and/or group ownership of for given file.
17 | RUN chown -R app:app .
18 |
19 | # change the user back to the app user
20 | USER app
21 |
22 | RUN npm install
23 |
24 | COPY . .
25 |
26 | EXPOSE 8000
27 |
28 | CMD npm start
--------------------------------------------------------------------------------
/next-docker/public/vercel.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/mern-docker/frontend/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: { browser: true, es2020: true },
4 | extends: [
5 | 'eslint:recommended',
6 | 'plugin:react/recommended',
7 | 'plugin:react/jsx-runtime',
8 | 'plugin:react-hooks/recommended',
9 | ],
10 | ignorePatterns: ['dist', '.eslintrc.cjs'],
11 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
12 | settings: { react: { version: '18.2' } },
13 | plugins: ['react-refresh'],
14 | rules: {
15 | 'react-refresh/only-export-components': [
16 | 'warn',
17 | { allowConstantExport: true },
18 | ],
19 | },
20 | }
21 |
--------------------------------------------------------------------------------
/next-docker/Dockerfile:
--------------------------------------------------------------------------------
1 | # inherit from a existing image to add the functionality
2 | FROM node:20-alpine3.18
3 |
4 | # RUN addgroup app && adduser -S -G app app
5 | # USER app
6 |
7 | # Set the working directory and assign ownership to the non-root user
8 | WORKDIR /app
9 |
10 | # Copy the package.json and package-lock.json files into the image.
11 | COPY package*.json ./
12 |
13 | # Install the dependencies.
14 | RUN npm install
15 |
16 | # Copy the rest of the source files into the image.
17 | COPY . .
18 |
19 | # Expose the port that the application listens on.
20 | EXPOSE 3000
21 |
22 | # Run the application.
23 | CMD npm run dev
24 |
--------------------------------------------------------------------------------
/next-docker/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "next-docker",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "next dev",
7 | "build": "next build",
8 | "start": "next start",
9 | "lint": "next lint"
10 | },
11 | "dependencies": {
12 | "mongoose": "^8.0.3",
13 | "next": "14.0.4",
14 | "react": "^18",
15 | "react-dom": "^18"
16 | },
17 | "devDependencies": {
18 | "@types/node": "^20",
19 | "@types/react": "^18",
20 | "@types/react-dom": "^18",
21 | "autoprefixer": "^10.0.1",
22 | "eslint": "^8",
23 | "eslint-config-next": "14.0.4",
24 | "postcss": "^8",
25 | "tailwindcss": "^3.3.0",
26 | "typescript": "^5"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/next-docker/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./*"]
23 | }
24 | },
25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26 | "exclude": ["node_modules"]
27 | }
28 |
--------------------------------------------------------------------------------
/next-docker/lib/action.ts:
--------------------------------------------------------------------------------
1 | "use server";
2 |
3 | import dbConnect from "./database/connect";
4 | import Task from "./database/task.model";
5 |
6 | export async function getTasks() {
7 | await dbConnect();
8 |
9 | try {
10 | const tasks = await Task.find({});
11 | return tasks;
12 | } catch (err) {
13 | console.log(err);
14 | }
15 | }
16 |
17 | export async function createTask(params: {
18 | task: string;
19 | description: string;
20 | status: string;
21 | }) {
22 | await dbConnect();
23 |
24 | const { task, description, status } = params;
25 |
26 | try {
27 | const newTask = await Task.create({ task, description, status });
28 | return newTask;
29 | } catch (err) {
30 | console.log(err);
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/next-docker/.dockerignore:
--------------------------------------------------------------------------------
1 | # Include any files or directories that you don't want to be copied to your
2 | # container here (e.g., local build artifacts, temporary files, etc.).
3 | #
4 | # For more help, visit the .dockerignore file reference guide at
5 | # https://docs.docker.com/engine/reference/builder/#dockerignore-file
6 |
7 | **/.classpath
8 | **/.dockerignore
9 | **/.env
10 | **/.git
11 | **/.gitignore
12 | **/.project
13 | **/.settings
14 | **/.toolstarget
15 | **/.vs
16 | **/.vscode
17 | **/.next
18 | **/.cache
19 | **/*.*proj.user
20 | **/*.dbmdl
21 | **/*.jfm
22 | **/charts
23 | **/docker-compose*
24 | **/compose*
25 | **/Dockerfile*
26 | **/node_modules
27 | **/npm-debug.log
28 | **/obj
29 | **/secrets.dev.yaml
30 | **/values.dev.yaml
31 | **/build
32 | **/dist
33 | LICENSE
34 | README.md
35 |
--------------------------------------------------------------------------------
/react-docker/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "expo": {
3 | "name": "react-docker",
4 | "slug": "snack-e02e93c5-ac09-4233-9bba-c3af39e2d03c",
5 | "version": "1.0.0",
6 | "orientation": "portrait",
7 | "icon": "./assets/icon.png",
8 | "userInterfaceStyle": "light",
9 | "splash": {
10 | "image": "./assets/splash.png",
11 | "resizeMode": "contain",
12 | "backgroundColor": "#ffffff"
13 | },
14 | "assetBundlePatterns": [
15 | "**/*"
16 | ],
17 | "ios": {
18 | "supportsTablet": true
19 | },
20 | "android": {
21 | "adaptiveIcon": {
22 | "foregroundImage": "./assets/adaptive-icon.png",
23 | "backgroundColor": "#ffffff"
24 | }
25 | },
26 | "web": {
27 | "favicon": "./assets/favicon.png"
28 | }
29 | }
30 | }
--------------------------------------------------------------------------------
/mern-docker/backend/.dockerignore:
--------------------------------------------------------------------------------
1 | # Include any files or directories that you don't want to be copied to your
2 | # container here (e.g., local build artifacts, temporary files, etc.).
3 | #
4 | # For more help, visit the .dockerignore file reference guide at
5 | # https://docs.docker.com/engine/reference/builder/#dockerignore-file
6 |
7 | **/.classpath
8 | **/.dockerignore
9 | **/.env
10 | **/.git
11 | **/.gitignore
12 | **/.project
13 | **/.settings
14 | **/.toolstarget
15 | **/.vs
16 | **/.vscode
17 | **/.next
18 | **/.cache
19 | **/*.*proj.user
20 | **/*.dbmdl
21 | **/*.jfm
22 | **/charts
23 | **/docker-compose*
24 | **/compose*
25 | **/Dockerfile*
26 | **/node_modules
27 | **/npm-debug.log
28 | **/obj
29 | **/secrets.dev.yaml
30 | **/values.dev.yaml
31 | **/build
32 | **/dist
33 | LICENSE
34 | README.md
35 |
--------------------------------------------------------------------------------
/mern-docker/frontend/.dockerignore:
--------------------------------------------------------------------------------
1 | # Include any files or directories that you don't want to be copied to your
2 | # container here (e.g., local build artifacts, temporary files, etc.).
3 | #
4 | # For more help, visit the .dockerignore file reference guide at
5 | # https://docs.docker.com/engine/reference/builder/#dockerignore-file
6 |
7 | **/.classpath
8 | **/.dockerignore
9 | **/.env
10 | **/.git
11 | **/.gitignore
12 | **/.project
13 | **/.settings
14 | **/.toolstarget
15 | **/.vs
16 | **/.vscode
17 | **/.next
18 | **/.cache
19 | **/*.*proj.user
20 | **/*.dbmdl
21 | **/*.jfm
22 | **/charts
23 | **/docker-compose*
24 | **/compose*
25 | **/Dockerfile*
26 | **/node_modules
27 | **/npm-debug.log
28 | **/obj
29 | **/secrets.dev.yaml
30 | **/values.dev.yaml
31 | **/build
32 | **/dist
33 | LICENSE
34 | README.md
35 |
--------------------------------------------------------------------------------
/mern-docker/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite --host",
8 | "build": "vite build",
9 | "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "axios": "^1.6.2",
14 | "react": "^18.2.0",
15 | "react-dom": "^18.2.0",
16 | "react-router-dom": "^6.21.0"
17 | },
18 | "devDependencies": {
19 | "@types/react": "^18.2.43",
20 | "@types/react-dom": "^18.2.17",
21 | "@vitejs/plugin-react": "^4.2.1",
22 | "eslint": "^8.55.0",
23 | "eslint-plugin-react": "^7.33.2",
24 | "eslint-plugin-react-hooks": "^4.6.0",
25 | "eslint-plugin-react-refresh": "^0.4.5",
26 | "vite": "^5.0.8"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/react-docker/components/AssetExample.js:
--------------------------------------------------------------------------------
1 | import { Text, View, StyleSheet, Image } from 'react-native';
2 |
3 | export default function AssetExample() {
4 | return (
5 |
6 |
7 | Local files and assets can be imported by dragging and dropping them into the editor
8 |
9 |
10 |
11 | );
12 | }
13 |
14 | const styles = StyleSheet.create({
15 | container: {
16 | alignItems: 'center',
17 | justifyContent: 'center',
18 | padding: 24,
19 | },
20 | paragraph: {
21 | margin: 24,
22 | marginTop: 0,
23 | fontSize: 14,
24 | fontWeight: 'bold',
25 | textAlign: 'center',
26 | },
27 | logo: {
28 | height: 128,
29 | width: 128,
30 | }
31 | });
32 |
--------------------------------------------------------------------------------
/mern-docker/frontend/src/App.jsx:
--------------------------------------------------------------------------------
1 | import { BrowserRouter as Router, Route, Routes, Link } from "react-router-dom";
2 |
3 | import Home from "./pages/Home";
4 | import Create from "./pages/Create";
5 |
6 | import "./App.css";
7 |
8 | function App() {
9 | return (
10 |
11 |
24 |
25 |
26 | } />
27 | } />
28 |
29 |
30 | );
31 | }
32 |
33 | export default App;
34 |
--------------------------------------------------------------------------------
/react-docker/README.md:
--------------------------------------------------------------------------------
1 | # Sample Snack app
2 |
3 | Open the `App.js` file to start writing some code. You can preview the changes directly on your phone or tablet by scanning the **QR code** or use the iOS or Android emulators. When you're done, click **Save** and share the link!
4 |
5 | When you're ready to see everything that Expo provides (or if you want to use your own editor) you can **Download** your project and use it with [expo cli](https://docs.expo.dev/get-started/installation/#expo-cli)).
6 |
7 | All projects created in Snack are publicly available, so you can easily share the link to this project via link, or embed it on a web page with the `<>` button.
8 |
9 | If you're having problems, you can tweet to us [@expo](https://twitter.com/expo) or ask in our [forums](https://forums.expo.dev/c/expo-dev-tools/61) or [Discord](https://chat.expo.dev/).
10 |
11 | Snack is Open Source. You can find the code on the [GitHub repo](https://github.com/expo/snack).
12 |
--------------------------------------------------------------------------------
/react-docker/App.js:
--------------------------------------------------------------------------------
1 | import { Text, SafeAreaView, StyleSheet } from 'react-native';
2 |
3 | // You can import supported modules from npm
4 | import { Card } from 'react-native-paper';
5 |
6 | // or any files within the Snack
7 | import AssetExample from './components/AssetExample';
8 |
9 | export default function App() {
10 | return (
11 |
12 |
13 | Change code in the editor and watch it change on your phone! Save to get a shareable url.
14 |
15 |
16 |
17 |
18 |
19 | );
20 | }
21 |
22 | const styles = StyleSheet.create({
23 | container: {
24 | flex: 1,
25 | justifyContent: 'center',
26 | backgroundColor: '#ecf0f1',
27 | padding: 8,
28 | },
29 | paragraph: {
30 | margin: 24,
31 | fontSize: 18,
32 | fontWeight: 'bold',
33 | textAlign: 'center',
34 | },
35 | });
36 |
--------------------------------------------------------------------------------
/mern-docker/backend/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const cors = require("cors");
3 | const dotenv = require("dotenv");
4 | const colors = require("colors");
5 |
6 | dotenv.config();
7 | colors.enable();
8 |
9 | const Anim = require("./database/anim.model");
10 | const connect = require("./database/connect");
11 |
12 | const app = express();
13 |
14 | app.use(
15 | cors({
16 | origin: "*",
17 | })
18 | );
19 |
20 | app.use(express.json());
21 |
22 | app.get("/", (req, res) => {
23 | console.log("Hello World!".rainbow);
24 |
25 | res.send("Hello World!");
26 | });
27 |
28 | app.get("/api/anime", async (req, res) => {
29 | const anime = await Anim.find();
30 | res.json(anime);
31 | });
32 |
33 | app.post("/api/anime", async (req, res) => {
34 | const anime = new Anim(req.body);
35 | await anime.save();
36 | res.json(anime);
37 | });
38 |
39 | app.listen(8000, () => {
40 | console.log("server listening on port 8000");
41 |
42 | // connect to the database
43 | connect();
44 | });
45 |
--------------------------------------------------------------------------------
/hello-docker/Dockerfile:
--------------------------------------------------------------------------------
1 | # select the base image to run the app. We want to run a javascript app, so we use the node runtime image from docker hub
2 | # we can use any image from docker hub. We can also use a custom image that we have created
3 | # node:20-alpine -> node is the image name, 20-alpine is the tag
4 | # alpine is a lightweight version of linux
5 | # we can see complete list of node image tags here: https://hub.docker.com/_/node
6 | FROM node:20-alpine
7 |
8 | # set the working directory to /app. This is the directory where the commands will be run. We can use any directory name but /app is a standard convention
9 | WORKDIR /app
10 |
11 | # copy everything from the current directory to the PWD (Present Working Directory) inside the container.
12 | # First `.` is the path to the current directory on the host machine. Second `.` is the path to the current directory inside the container i.e., source and destination
13 | # source - current directory on the host machine
14 | # destination - current directory inside the container (/app)
15 | COPY . .
16 |
17 | # commands to run the app
18 | CMD node hello.js
19 |
20 | # build the image
21 | # docker build -t hello-docker .
22 | # -t -> tag the image with a name
23 | # hello-docker -> name of the image
24 | # . -> path to the Dockerfile
--------------------------------------------------------------------------------
/next-docker/public/next.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/mern-docker/frontend/src/pages/Home.jsx:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 | import { useState, useEffect } from "react";
3 | import { Link } from "react-router-dom";
4 |
5 | function Home() {
6 | const [anime, setAnime] = useState([]);
7 |
8 | useEffect(() => {
9 | axios
10 | .get(`${import.meta.env.VITE_API_URL}/api/anime`)
11 | .then((res) => {
12 | setAnime(res.data);
13 | })
14 | .catch((err) => {
15 | console.log(err);
16 | });
17 | }, []);
18 |
19 | return (
20 |
21 | Explore
22 | List of anime to watch
23 |
24 |
41 |
42 | {anime.length === 0 && (
43 | Oops, No anime available
44 | )}
45 |
46 | );
47 | }
48 |
49 | export default Home;
50 |
--------------------------------------------------------------------------------
/mern-docker/frontend/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/next-docker/compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | frontend:
5 | # uncomment the following line if you want to run a local instance of MongoDB
6 | # depends_on:
7 | # - db
8 | build:
9 | context: .
10 | dockerfile: Dockerfile
11 |
12 | # do port mapping so that we can access the app from the browser
13 | ports:
14 | - 3000:3000
15 |
16 | # use docker compose to watch for changes and rebuild the container
17 | develop:
18 | watch:
19 | - path: ./package.json
20 | action: rebuild
21 | - path: ./next.config.js
22 | action: rebuild
23 | - path: ./package-lock.json
24 | action: rebuild
25 | - path: .
26 | target: /app
27 | action: sync
28 |
29 | # define the environment variables
30 | environment:
31 | # we're using MongoDB atlas so we need to pass in the connection string
32 | DB_URL: mongodb+srv://sujata:rnZzJjIDr3bIDymV@cluster0.hnn88vs.mongodb.net/
33 |
34 | # we're using MongoDB atlas so we don't need to run a local instance of MongoDB
35 | # but if you want to run a local instance, you can do it this way
36 | # db:
37 | # image: mongo
38 | # ports:
39 | # - 27017:27017
40 | # environment:
41 | # - MONGO_INITDB_ROOT_USERNAME=sujata
42 | # - MONGO_INITDB_ROOT_PASSWORD=rnZzJjIDr3bIDymV
43 | # volumes:
44 | # - tasked:/data/db
45 |
46 | volumes:
47 | tasked:
48 |
--------------------------------------------------------------------------------
/next-docker/app/page.tsx:
--------------------------------------------------------------------------------
1 | import Link from "next/link";
2 | import { getTasks } from "@/lib/action";
3 |
4 | async function Home() {
5 | const allTasks = await getTasks();
6 |
7 | if (!allTasks) {
8 | return (
9 |
10 |
11 | Registred Tasks
12 |
13 |
No tasks found.
14 |
15 |
16 |
17 | );
18 | }
19 |
20 | return (
21 |
22 |
23 |
24 |
Registred Tasks
25 |
26 | Create Task
27 |
28 |
29 |
30 |
31 | {allTasks?.length > 0 &&
32 | allTasks.map((task) => (
33 |
38 |
39 |
40 | {task.title}
41 |
42 |
43 | {task.description}
44 |
45 |
46 |
47 |
48 | {task.status}
49 |
50 |
51 |
52 | ))}
53 |
54 |
55 |
56 | );
57 | }
58 |
59 | export default Home;
60 |
--------------------------------------------------------------------------------
/mern-docker/frontend/src/pages/Create.jsx:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 | import { useState } from "react";
3 | import { useNavigate } from "react-router-dom";
4 |
5 | function Create() {
6 | const navigate = useNavigate();
7 |
8 | const [form, setForm] = useState({
9 | title: "",
10 | link: "",
11 | description: "",
12 | });
13 |
14 | const handleChange = (e) => {
15 | setForm((prev) => {
16 | return {
17 | ...prev,
18 | [e.target.id]: e.target.value,
19 | };
20 | });
21 | }
22 |
23 | const handleSubmit = (e) => {
24 | e.preventDefault();
25 |
26 | axios
27 | .post(`${import.meta.env.VITE_API_URL}/api/anime`, form)
28 | .then((res) => console.log(res.data))
29 | .catch((err) => console.log(err));
30 |
31 | setForm({
32 | title: "",
33 | link: "",
34 | description: "",
35 | });
36 |
37 | navigate("/");
38 | };
39 |
40 | return (
41 |
42 |
43 |
Share Anime
44 |
88 |
89 |
90 | );
91 | }
92 |
93 | export default Create;
94 |
--------------------------------------------------------------------------------
/mern-docker/frontend/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/mern-docker/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | .navbar {
2 | display: flex;
3 | align-items: center;
4 | justify-content: space-between;
5 | max-width: 970px;
6 | width: 100%;
7 | padding: 24px;
8 | margin: 0 auto;
9 | }
10 |
11 | .navbar_title {
12 | text-decoration: none;
13 | color: #000;
14 | }
15 |
16 | .navbar_links {
17 | display: flex;
18 | align-items: center;
19 | gap: 20px;
20 | }
21 |
22 | .navbar_link {
23 | color: #000;
24 | font-size: 18px;
25 | text-decoration: none;
26 | transition: background-color 0.3s ease;
27 | }
28 |
29 | .container {
30 | display: flex;
31 | align-items: center;
32 | justify-content: center;
33 | flex-direction: column;
34 | text-align: center;
35 | max-width: 970px;
36 | width: 100%;
37 | margin: 0 auto;
38 | padding: 24px;
39 | }
40 |
41 | .form_area {
42 | display: flex;
43 | justify-content: center;
44 | align-items: center;
45 | flex-direction: column;
46 | background-color: #fff;
47 | height: auto;
48 | width: 100%;
49 | border-radius: 20px;
50 | box-shadow: 5px 7px 2px 1px #000;
51 | max-width: 100%;
52 |
53 | padding: 20px 50px;
54 | }
55 |
56 | .form {
57 | width: 100%;
58 | max-width: 100%;
59 | }
60 |
61 | .heading {
62 | font-weight: 900;
63 | font-size: 1.5em;
64 | margin-top: 20px;
65 | text-align: left;
66 | width: 100%;
67 | }
68 |
69 | .title {
70 | color: #000;
71 | font-weight: 900;
72 | font-size: 1.5em;
73 | margin-top: 20px;
74 | text-align: left;
75 | width: 100%;
76 |
77 | padding: 0 20px;
78 | }
79 |
80 | .sub_heading {
81 | font-weight: 600;
82 | margin: 5px 0;
83 | text-align: left;
84 | font-size: 18px;
85 | width: 100%;
86 | }
87 |
88 | .no_result {
89 | margin: 10px 0;
90 | text-align: left;
91 | font-size: 14px;
92 | width: 100%;
93 | }
94 |
95 | .sub_title {
96 | font-weight: 600;
97 | margin: 5px 0;
98 | }
99 |
100 | .anim_list {
101 | display: flex;
102 | flex-direction: column;
103 | width: 100%;
104 | list-style: none;
105 | gap: 20px;
106 | margin: 20px 0;
107 | }
108 |
109 | .anime_card {
110 | display: flex;
111 | align-items: center;
112 | justify-content: space-between;
113 | outline: none;
114 | border: 2px solid #000;
115 | box-shadow: 3px 4px 0px 1px #000;
116 | padding: 10px 16px;
117 | border-radius: 4px;
118 | font-size: 15px;
119 | width: 100%;
120 | background-color: #fff;
121 | }
122 |
123 | .anime_info {
124 | flex: 1;
125 | display: flex;
126 | flex-direction: column;
127 | align-items: flex-start;
128 | justify-content: flex-start;
129 | }
130 |
131 | .anime_link {
132 | display: flex;
133 | flex-direction: column;
134 | align-items: flex-end;
135 | justify-content: flex-end;
136 | }
137 |
138 | .anime_card h4 {
139 | font-weight: 600;
140 | font-size: 16px;
141 | color: #000;
142 | }
143 |
144 | .anime_card p {
145 | margin: 0;
146 | padding: 0;
147 | font-size: 12px;
148 | text-align: left;
149 | }
150 |
151 | .anime_link a {
152 | font-weight: 600;
153 | font-size: 14px;
154 | }
155 |
156 | .anime_card:hover {
157 | transform: translateY(4px);
158 | box-shadow: 1px 2px 0px 0px #000;
159 | }
160 |
161 | .form_group {
162 | display: flex;
163 | flex-direction: column;
164 | align-items: baseline;
165 | margin: 20px;
166 | width: 100%;
167 | }
168 |
169 | .form_style {
170 | outline: none;
171 | border: 2px solid #000;
172 | box-shadow: 3px 4px 0px 1px #000;
173 | padding: 12px 10px;
174 | border-radius: 4px;
175 | font-size: 15px;
176 | width: 100%;
177 | }
178 |
179 | .form_style:focus,
180 | .btn:focus {
181 | transform: translateY(4px);
182 | box-shadow: 1px 2px 0px 0px #000;
183 | }
184 |
185 | .btn {
186 | padding: 15px;
187 | margin: 30px 0px;
188 | width: 310px;
189 | font-size: 15px;
190 | background: #fff;
191 | border-radius: 30px;
192 | font-weight: 800;
193 | box-shadow: 5px 5px 0px 0px #000;
194 | color: #000;
195 | }
196 |
197 | p {
198 | margin: 20px 0px;
199 | }
200 |
201 | .link {
202 | font-weight: 800;
203 | }
204 |
--------------------------------------------------------------------------------
/next-docker/app/create/page.tsx:
--------------------------------------------------------------------------------
1 | import { createTask } from "@/lib/action";
2 |
3 | function Create() {
4 | async function handleSubmit(formData: FormData) {
5 | "use server";
6 |
7 | const newTask = {
8 | title: formData.get("title") as string,
9 | description: formData.get("description") as string,
10 | status: formData.get("status") as string,
11 | };
12 |
13 | await createTask(newTask);
14 | }
15 |
16 | return (
17 |
18 |
83 |
84 | );
85 | }
86 |
87 | export default Create;
88 |
--------------------------------------------------------------------------------
/mern-docker/compose.yml:
--------------------------------------------------------------------------------
1 | # specify the version of docker-compose
2 | version: "3.8"
3 |
4 | # define the services/containers to be run
5 | services:
6 | # define the frontend service
7 | # we can use any name for the service. A standard naming convention is to use "web" for the frontend
8 | web:
9 | # we use depends_on to specify that service depends on another service
10 | # in this case, we specify that the web depends on the api service
11 | # this means that the api service will be started before the web service
12 | depends_on:
13 | - api
14 | # specify the build context for the web service
15 | # this is the directory where the Dockerfile for the web service is located
16 | build: ./frontend
17 | # specify the ports to expose for the web service
18 | # the first number is the port on the host machine
19 | # the second number is the port inside the container
20 | ports:
21 | - 5173:5173
22 | # specify the environment variables for the web service
23 | # these environment variables will be available inside the container
24 | environment:
25 | VITE_API_URL: http://localhost:8000
26 |
27 | # this is for docker compose watch mode
28 | # anything mentioned under develop will be watched for changes by docker compose watch and it will perform the action mentioned
29 | develop:
30 | # we specify the files to watch for changes
31 | watch:
32 | # it'll watch for changes in package.json and package-lock.json and rebuild the container if there are any changes
33 | - path: ./frontend/package.json
34 | action: rebuild
35 | - path: ./frontend/package-lock.json
36 | action: rebuild
37 | # it'll watch for changes in the frontend directory and sync the changes with the container real time
38 | - path: ./frontend
39 | target: /app
40 | action: sync
41 |
42 | # define the api service/container
43 | api:
44 | # api service depends on the db service so the db service will be started before the api service
45 | depends_on:
46 | - db
47 |
48 | # specify the build context for the api service
49 | build: ./backend
50 |
51 | # specify the ports to expose for the api service
52 | # the first number is the port on the host machine
53 | # the second number is the port inside the container
54 | ports:
55 | - 8000:8000
56 |
57 | # specify environment variables for the api service
58 | # for demo purposes, we're using a local mongodb instance
59 | environment:
60 | DB_URL: mongodb://db/anime
61 |
62 | # establish docker compose watch mode for the api service
63 | develop:
64 | # specify the files to watch for changes
65 | watch:
66 | # it'll watch for changes in package.json and package-lock.json and rebuild the container and image if there are any changes
67 | - path: ./backend/package.json
68 | action: rebuild
69 | - path: ./backend/package-lock.json
70 | action: rebuild
71 |
72 | # it'll watch for changes in the backend directory and sync the changes with the container real time
73 | - path: ./backend
74 | target: /app
75 | action: sync
76 |
77 | # define the db service
78 | db:
79 | # specify the image to use for the db service from docker hub. If we have a custom image, we can specify that in this format
80 | # In the above two services, we're using the build context to build the image for the service from the Dockerfile so we specify the image as "build: ./frontend" or "build: ./backend".
81 | # but for the db service, we're using the image from docker hub so we specify the image as "image: mongo:latest"
82 | # you can find the image name and tag for mongodb from docker hub here: https://hub.docker.com/_/mongo
83 | image: mongo:latest
84 |
85 | # specify the ports to expose for the db service
86 | # generally, we do this in api service using mongodb atlas. But for demo purposes, we're using a local mongodb instance
87 | # usually, mongodb runs on port 27017. So we're exposing the port 27017 on the host machine and mapping it to the port 27017 inside the container
88 | ports:
89 | - 27017:27017
90 |
91 | # specify the volumes to mount for the db service
92 | # we're mounting the volume named "anime" inside the container at /data/db directory
93 | # this is done so that the data inside the mongodb container is persisted even if the container is stopped
94 | volumes:
95 | - anime:/data/db
96 |
97 | # define the volumes to be used by the services
98 | volumes:
99 | anime:
100 |
--------------------------------------------------------------------------------
/mern-docker/backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "backend",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "backend",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "colors": "^1.4.0",
13 | "cors": "^2.8.5",
14 | "dotenv": "^16.3.1",
15 | "express": "^4.18.2",
16 | "mongoose": "^8.0.3",
17 | "nodemon": "^3.0.2"
18 | }
19 | },
20 | "node_modules/@mongodb-js/saslprep": {
21 | "version": "1.1.1",
22 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz",
23 | "integrity": "sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ==",
24 | "dependencies": {
25 | "sparse-bitfield": "^3.0.3"
26 | }
27 | },
28 | "node_modules/@types/node": {
29 | "version": "20.10.5",
30 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz",
31 | "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==",
32 | "dependencies": {
33 | "undici-types": "~5.26.4"
34 | }
35 | },
36 | "node_modules/@types/webidl-conversions": {
37 | "version": "7.0.3",
38 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
39 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA=="
40 | },
41 | "node_modules/@types/whatwg-url": {
42 | "version": "8.2.2",
43 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-8.2.2.tgz",
44 | "integrity": "sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==",
45 | "dependencies": {
46 | "@types/node": "*",
47 | "@types/webidl-conversions": "*"
48 | }
49 | },
50 | "node_modules/abbrev": {
51 | "version": "1.1.1",
52 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
53 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
54 | },
55 | "node_modules/accepts": {
56 | "version": "1.3.8",
57 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
58 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
59 | "dependencies": {
60 | "mime-types": "~2.1.34",
61 | "negotiator": "0.6.3"
62 | },
63 | "engines": {
64 | "node": ">= 0.6"
65 | }
66 | },
67 | "node_modules/anymatch": {
68 | "version": "3.1.3",
69 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
70 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
71 | "dependencies": {
72 | "normalize-path": "^3.0.0",
73 | "picomatch": "^2.0.4"
74 | },
75 | "engines": {
76 | "node": ">= 8"
77 | }
78 | },
79 | "node_modules/array-flatten": {
80 | "version": "1.1.1",
81 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
82 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
83 | },
84 | "node_modules/balanced-match": {
85 | "version": "1.0.2",
86 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
87 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
88 | },
89 | "node_modules/binary-extensions": {
90 | "version": "2.2.0",
91 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
92 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
93 | "engines": {
94 | "node": ">=8"
95 | }
96 | },
97 | "node_modules/body-parser": {
98 | "version": "1.20.1",
99 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
100 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
101 | "dependencies": {
102 | "bytes": "3.1.2",
103 | "content-type": "~1.0.4",
104 | "debug": "2.6.9",
105 | "depd": "2.0.0",
106 | "destroy": "1.2.0",
107 | "http-errors": "2.0.0",
108 | "iconv-lite": "0.4.24",
109 | "on-finished": "2.4.1",
110 | "qs": "6.11.0",
111 | "raw-body": "2.5.1",
112 | "type-is": "~1.6.18",
113 | "unpipe": "1.0.0"
114 | },
115 | "engines": {
116 | "node": ">= 0.8",
117 | "npm": "1.2.8000 || >= 1.4.16"
118 | }
119 | },
120 | "node_modules/brace-expansion": {
121 | "version": "1.1.11",
122 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
123 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
124 | "dependencies": {
125 | "balanced-match": "^1.0.0",
126 | "concat-map": "0.0.1"
127 | }
128 | },
129 | "node_modules/braces": {
130 | "version": "3.0.2",
131 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
132 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
133 | "dependencies": {
134 | "fill-range": "^7.0.1"
135 | },
136 | "engines": {
137 | "node": ">=8"
138 | }
139 | },
140 | "node_modules/bson": {
141 | "version": "6.2.0",
142 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.2.0.tgz",
143 | "integrity": "sha512-ID1cI+7bazPDyL9wYy9GaQ8gEEohWvcUl/Yf0dIdutJxnmInEEyCsb4awy/OiBfall7zBA179Pahi3vCdFze3Q==",
144 | "engines": {
145 | "node": ">=16.20.1"
146 | }
147 | },
148 | "node_modules/bytes": {
149 | "version": "3.1.2",
150 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
151 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
152 | "engines": {
153 | "node": ">= 0.8"
154 | }
155 | },
156 | "node_modules/call-bind": {
157 | "version": "1.0.5",
158 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
159 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
160 | "dependencies": {
161 | "function-bind": "^1.1.2",
162 | "get-intrinsic": "^1.2.1",
163 | "set-function-length": "^1.1.1"
164 | },
165 | "funding": {
166 | "url": "https://github.com/sponsors/ljharb"
167 | }
168 | },
169 | "node_modules/chokidar": {
170 | "version": "3.5.3",
171 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
172 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
173 | "funding": [
174 | {
175 | "type": "individual",
176 | "url": "https://paulmillr.com/funding/"
177 | }
178 | ],
179 | "dependencies": {
180 | "anymatch": "~3.1.2",
181 | "braces": "~3.0.2",
182 | "glob-parent": "~5.1.2",
183 | "is-binary-path": "~2.1.0",
184 | "is-glob": "~4.0.1",
185 | "normalize-path": "~3.0.0",
186 | "readdirp": "~3.6.0"
187 | },
188 | "engines": {
189 | "node": ">= 8.10.0"
190 | },
191 | "optionalDependencies": {
192 | "fsevents": "~2.3.2"
193 | }
194 | },
195 | "node_modules/colors": {
196 | "version": "1.4.0",
197 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
198 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
199 | "engines": {
200 | "node": ">=0.1.90"
201 | }
202 | },
203 | "node_modules/concat-map": {
204 | "version": "0.0.1",
205 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
206 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
207 | },
208 | "node_modules/content-disposition": {
209 | "version": "0.5.4",
210 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
211 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
212 | "dependencies": {
213 | "safe-buffer": "5.2.1"
214 | },
215 | "engines": {
216 | "node": ">= 0.6"
217 | }
218 | },
219 | "node_modules/content-type": {
220 | "version": "1.0.5",
221 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
222 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
223 | "engines": {
224 | "node": ">= 0.6"
225 | }
226 | },
227 | "node_modules/cookie": {
228 | "version": "0.5.0",
229 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
230 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
231 | "engines": {
232 | "node": ">= 0.6"
233 | }
234 | },
235 | "node_modules/cookie-signature": {
236 | "version": "1.0.6",
237 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
238 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
239 | },
240 | "node_modules/cors": {
241 | "version": "2.8.5",
242 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
243 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
244 | "dependencies": {
245 | "object-assign": "^4",
246 | "vary": "^1"
247 | },
248 | "engines": {
249 | "node": ">= 0.10"
250 | }
251 | },
252 | "node_modules/debug": {
253 | "version": "2.6.9",
254 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
255 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
256 | "dependencies": {
257 | "ms": "2.0.0"
258 | }
259 | },
260 | "node_modules/define-data-property": {
261 | "version": "1.1.1",
262 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
263 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
264 | "dependencies": {
265 | "get-intrinsic": "^1.2.1",
266 | "gopd": "^1.0.1",
267 | "has-property-descriptors": "^1.0.0"
268 | },
269 | "engines": {
270 | "node": ">= 0.4"
271 | }
272 | },
273 | "node_modules/depd": {
274 | "version": "2.0.0",
275 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
276 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
277 | "engines": {
278 | "node": ">= 0.8"
279 | }
280 | },
281 | "node_modules/destroy": {
282 | "version": "1.2.0",
283 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
284 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
285 | "engines": {
286 | "node": ">= 0.8",
287 | "npm": "1.2.8000 || >= 1.4.16"
288 | }
289 | },
290 | "node_modules/dotenv": {
291 | "version": "16.3.1",
292 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
293 | "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
294 | "engines": {
295 | "node": ">=12"
296 | },
297 | "funding": {
298 | "url": "https://github.com/motdotla/dotenv?sponsor=1"
299 | }
300 | },
301 | "node_modules/ee-first": {
302 | "version": "1.1.1",
303 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
304 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
305 | },
306 | "node_modules/encodeurl": {
307 | "version": "1.0.2",
308 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
309 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
310 | "engines": {
311 | "node": ">= 0.8"
312 | }
313 | },
314 | "node_modules/escape-html": {
315 | "version": "1.0.3",
316 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
317 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
318 | },
319 | "node_modules/etag": {
320 | "version": "1.8.1",
321 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
322 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
323 | "engines": {
324 | "node": ">= 0.6"
325 | }
326 | },
327 | "node_modules/express": {
328 | "version": "4.18.2",
329 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
330 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
331 | "dependencies": {
332 | "accepts": "~1.3.8",
333 | "array-flatten": "1.1.1",
334 | "body-parser": "1.20.1",
335 | "content-disposition": "0.5.4",
336 | "content-type": "~1.0.4",
337 | "cookie": "0.5.0",
338 | "cookie-signature": "1.0.6",
339 | "debug": "2.6.9",
340 | "depd": "2.0.0",
341 | "encodeurl": "~1.0.2",
342 | "escape-html": "~1.0.3",
343 | "etag": "~1.8.1",
344 | "finalhandler": "1.2.0",
345 | "fresh": "0.5.2",
346 | "http-errors": "2.0.0",
347 | "merge-descriptors": "1.0.1",
348 | "methods": "~1.1.2",
349 | "on-finished": "2.4.1",
350 | "parseurl": "~1.3.3",
351 | "path-to-regexp": "0.1.7",
352 | "proxy-addr": "~2.0.7",
353 | "qs": "6.11.0",
354 | "range-parser": "~1.2.1",
355 | "safe-buffer": "5.2.1",
356 | "send": "0.18.0",
357 | "serve-static": "1.15.0",
358 | "setprototypeof": "1.2.0",
359 | "statuses": "2.0.1",
360 | "type-is": "~1.6.18",
361 | "utils-merge": "1.0.1",
362 | "vary": "~1.1.2"
363 | },
364 | "engines": {
365 | "node": ">= 0.10.0"
366 | }
367 | },
368 | "node_modules/fill-range": {
369 | "version": "7.0.1",
370 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
371 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
372 | "dependencies": {
373 | "to-regex-range": "^5.0.1"
374 | },
375 | "engines": {
376 | "node": ">=8"
377 | }
378 | },
379 | "node_modules/finalhandler": {
380 | "version": "1.2.0",
381 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
382 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
383 | "dependencies": {
384 | "debug": "2.6.9",
385 | "encodeurl": "~1.0.2",
386 | "escape-html": "~1.0.3",
387 | "on-finished": "2.4.1",
388 | "parseurl": "~1.3.3",
389 | "statuses": "2.0.1",
390 | "unpipe": "~1.0.0"
391 | },
392 | "engines": {
393 | "node": ">= 0.8"
394 | }
395 | },
396 | "node_modules/forwarded": {
397 | "version": "0.2.0",
398 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
399 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
400 | "engines": {
401 | "node": ">= 0.6"
402 | }
403 | },
404 | "node_modules/fresh": {
405 | "version": "0.5.2",
406 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
407 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
408 | "engines": {
409 | "node": ">= 0.6"
410 | }
411 | },
412 | "node_modules/fsevents": {
413 | "version": "2.3.3",
414 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
415 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
416 | "hasInstallScript": true,
417 | "optional": true,
418 | "os": [
419 | "darwin"
420 | ],
421 | "engines": {
422 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
423 | }
424 | },
425 | "node_modules/function-bind": {
426 | "version": "1.1.2",
427 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
428 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
429 | "funding": {
430 | "url": "https://github.com/sponsors/ljharb"
431 | }
432 | },
433 | "node_modules/get-intrinsic": {
434 | "version": "1.2.2",
435 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
436 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
437 | "dependencies": {
438 | "function-bind": "^1.1.2",
439 | "has-proto": "^1.0.1",
440 | "has-symbols": "^1.0.3",
441 | "hasown": "^2.0.0"
442 | },
443 | "funding": {
444 | "url": "https://github.com/sponsors/ljharb"
445 | }
446 | },
447 | "node_modules/glob-parent": {
448 | "version": "5.1.2",
449 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
450 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
451 | "dependencies": {
452 | "is-glob": "^4.0.1"
453 | },
454 | "engines": {
455 | "node": ">= 6"
456 | }
457 | },
458 | "node_modules/gopd": {
459 | "version": "1.0.1",
460 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
461 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
462 | "dependencies": {
463 | "get-intrinsic": "^1.1.3"
464 | },
465 | "funding": {
466 | "url": "https://github.com/sponsors/ljharb"
467 | }
468 | },
469 | "node_modules/has-flag": {
470 | "version": "3.0.0",
471 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
472 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
473 | "engines": {
474 | "node": ">=4"
475 | }
476 | },
477 | "node_modules/has-property-descriptors": {
478 | "version": "1.0.1",
479 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
480 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
481 | "dependencies": {
482 | "get-intrinsic": "^1.2.2"
483 | },
484 | "funding": {
485 | "url": "https://github.com/sponsors/ljharb"
486 | }
487 | },
488 | "node_modules/has-proto": {
489 | "version": "1.0.1",
490 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
491 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
492 | "engines": {
493 | "node": ">= 0.4"
494 | },
495 | "funding": {
496 | "url": "https://github.com/sponsors/ljharb"
497 | }
498 | },
499 | "node_modules/has-symbols": {
500 | "version": "1.0.3",
501 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
502 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
503 | "engines": {
504 | "node": ">= 0.4"
505 | },
506 | "funding": {
507 | "url": "https://github.com/sponsors/ljharb"
508 | }
509 | },
510 | "node_modules/hasown": {
511 | "version": "2.0.0",
512 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
513 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
514 | "dependencies": {
515 | "function-bind": "^1.1.2"
516 | },
517 | "engines": {
518 | "node": ">= 0.4"
519 | }
520 | },
521 | "node_modules/http-errors": {
522 | "version": "2.0.0",
523 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
524 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
525 | "dependencies": {
526 | "depd": "2.0.0",
527 | "inherits": "2.0.4",
528 | "setprototypeof": "1.2.0",
529 | "statuses": "2.0.1",
530 | "toidentifier": "1.0.1"
531 | },
532 | "engines": {
533 | "node": ">= 0.8"
534 | }
535 | },
536 | "node_modules/iconv-lite": {
537 | "version": "0.4.24",
538 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
539 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
540 | "dependencies": {
541 | "safer-buffer": ">= 2.1.2 < 3"
542 | },
543 | "engines": {
544 | "node": ">=0.10.0"
545 | }
546 | },
547 | "node_modules/ignore-by-default": {
548 | "version": "1.0.1",
549 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
550 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA=="
551 | },
552 | "node_modules/inherits": {
553 | "version": "2.0.4",
554 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
555 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
556 | },
557 | "node_modules/ipaddr.js": {
558 | "version": "1.9.1",
559 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
560 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
561 | "engines": {
562 | "node": ">= 0.10"
563 | }
564 | },
565 | "node_modules/is-binary-path": {
566 | "version": "2.1.0",
567 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
568 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
569 | "dependencies": {
570 | "binary-extensions": "^2.0.0"
571 | },
572 | "engines": {
573 | "node": ">=8"
574 | }
575 | },
576 | "node_modules/is-extglob": {
577 | "version": "2.1.1",
578 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
579 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
580 | "engines": {
581 | "node": ">=0.10.0"
582 | }
583 | },
584 | "node_modules/is-glob": {
585 | "version": "4.0.3",
586 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
587 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
588 | "dependencies": {
589 | "is-extglob": "^2.1.1"
590 | },
591 | "engines": {
592 | "node": ">=0.10.0"
593 | }
594 | },
595 | "node_modules/is-number": {
596 | "version": "7.0.0",
597 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
598 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
599 | "engines": {
600 | "node": ">=0.12.0"
601 | }
602 | },
603 | "node_modules/kareem": {
604 | "version": "2.5.1",
605 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz",
606 | "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==",
607 | "engines": {
608 | "node": ">=12.0.0"
609 | }
610 | },
611 | "node_modules/lru-cache": {
612 | "version": "6.0.0",
613 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
614 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
615 | "dependencies": {
616 | "yallist": "^4.0.0"
617 | },
618 | "engines": {
619 | "node": ">=10"
620 | }
621 | },
622 | "node_modules/media-typer": {
623 | "version": "0.3.0",
624 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
625 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
626 | "engines": {
627 | "node": ">= 0.6"
628 | }
629 | },
630 | "node_modules/memory-pager": {
631 | "version": "1.5.0",
632 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
633 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg=="
634 | },
635 | "node_modules/merge-descriptors": {
636 | "version": "1.0.1",
637 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
638 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
639 | },
640 | "node_modules/methods": {
641 | "version": "1.1.2",
642 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
643 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
644 | "engines": {
645 | "node": ">= 0.6"
646 | }
647 | },
648 | "node_modules/mime": {
649 | "version": "1.6.0",
650 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
651 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
652 | "bin": {
653 | "mime": "cli.js"
654 | },
655 | "engines": {
656 | "node": ">=4"
657 | }
658 | },
659 | "node_modules/mime-db": {
660 | "version": "1.52.0",
661 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
662 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
663 | "engines": {
664 | "node": ">= 0.6"
665 | }
666 | },
667 | "node_modules/mime-types": {
668 | "version": "2.1.35",
669 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
670 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
671 | "dependencies": {
672 | "mime-db": "1.52.0"
673 | },
674 | "engines": {
675 | "node": ">= 0.6"
676 | }
677 | },
678 | "node_modules/minimatch": {
679 | "version": "3.1.2",
680 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
681 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
682 | "dependencies": {
683 | "brace-expansion": "^1.1.7"
684 | },
685 | "engines": {
686 | "node": "*"
687 | }
688 | },
689 | "node_modules/mongodb": {
690 | "version": "6.2.0",
691 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.2.0.tgz",
692 | "integrity": "sha512-d7OSuGjGWDZ5usZPqfvb36laQ9CPhnWkAGHT61x5P95p/8nMVeH8asloMwW6GcYFeB0Vj4CB/1wOTDG2RA9BFA==",
693 | "dependencies": {
694 | "@mongodb-js/saslprep": "^1.1.0",
695 | "bson": "^6.2.0",
696 | "mongodb-connection-string-url": "^2.6.0"
697 | },
698 | "engines": {
699 | "node": ">=16.20.1"
700 | },
701 | "peerDependencies": {
702 | "@aws-sdk/credential-providers": "^3.188.0",
703 | "@mongodb-js/zstd": "^1.1.0",
704 | "gcp-metadata": "^5.2.0",
705 | "kerberos": "^2.0.1",
706 | "mongodb-client-encryption": ">=6.0.0 <7",
707 | "snappy": "^7.2.2",
708 | "socks": "^2.7.1"
709 | },
710 | "peerDependenciesMeta": {
711 | "@aws-sdk/credential-providers": {
712 | "optional": true
713 | },
714 | "@mongodb-js/zstd": {
715 | "optional": true
716 | },
717 | "gcp-metadata": {
718 | "optional": true
719 | },
720 | "kerberos": {
721 | "optional": true
722 | },
723 | "mongodb-client-encryption": {
724 | "optional": true
725 | },
726 | "snappy": {
727 | "optional": true
728 | },
729 | "socks": {
730 | "optional": true
731 | }
732 | }
733 | },
734 | "node_modules/mongodb-connection-string-url": {
735 | "version": "2.6.0",
736 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz",
737 | "integrity": "sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ==",
738 | "dependencies": {
739 | "@types/whatwg-url": "^8.2.1",
740 | "whatwg-url": "^11.0.0"
741 | }
742 | },
743 | "node_modules/mongoose": {
744 | "version": "8.0.3",
745 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.0.3.tgz",
746 | "integrity": "sha512-LJRT0yP4TW14HT4r2RkxqyvoTylMSzWpl5QOeVHTnRggCLQSpkoBdgbUtORFq/mSL2o9cLCPJz+6uzFj25qbHw==",
747 | "dependencies": {
748 | "bson": "^6.2.0",
749 | "kareem": "2.5.1",
750 | "mongodb": "6.2.0",
751 | "mpath": "0.9.0",
752 | "mquery": "5.0.0",
753 | "ms": "2.1.3",
754 | "sift": "16.0.1"
755 | },
756 | "engines": {
757 | "node": ">=16.20.1"
758 | },
759 | "funding": {
760 | "type": "opencollective",
761 | "url": "https://opencollective.com/mongoose"
762 | }
763 | },
764 | "node_modules/mongoose/node_modules/ms": {
765 | "version": "2.1.3",
766 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
767 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
768 | },
769 | "node_modules/mpath": {
770 | "version": "0.9.0",
771 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
772 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
773 | "engines": {
774 | "node": ">=4.0.0"
775 | }
776 | },
777 | "node_modules/mquery": {
778 | "version": "5.0.0",
779 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
780 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
781 | "dependencies": {
782 | "debug": "4.x"
783 | },
784 | "engines": {
785 | "node": ">=14.0.0"
786 | }
787 | },
788 | "node_modules/mquery/node_modules/debug": {
789 | "version": "4.3.4",
790 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
791 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
792 | "dependencies": {
793 | "ms": "2.1.2"
794 | },
795 | "engines": {
796 | "node": ">=6.0"
797 | },
798 | "peerDependenciesMeta": {
799 | "supports-color": {
800 | "optional": true
801 | }
802 | }
803 | },
804 | "node_modules/mquery/node_modules/ms": {
805 | "version": "2.1.2",
806 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
807 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
808 | },
809 | "node_modules/ms": {
810 | "version": "2.0.0",
811 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
812 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
813 | },
814 | "node_modules/negotiator": {
815 | "version": "0.6.3",
816 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
817 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
818 | "engines": {
819 | "node": ">= 0.6"
820 | }
821 | },
822 | "node_modules/nodemon": {
823 | "version": "3.0.2",
824 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.2.tgz",
825 | "integrity": "sha512-9qIN2LNTrEzpOPBaWHTm4Asy1LxXLSickZStAQ4IZe7zsoIpD/A7LWxhZV3t4Zu352uBcqVnRsDXSMR2Sc3lTA==",
826 | "dependencies": {
827 | "chokidar": "^3.5.2",
828 | "debug": "^4",
829 | "ignore-by-default": "^1.0.1",
830 | "minimatch": "^3.1.2",
831 | "pstree.remy": "^1.1.8",
832 | "semver": "^7.5.3",
833 | "simple-update-notifier": "^2.0.0",
834 | "supports-color": "^5.5.0",
835 | "touch": "^3.1.0",
836 | "undefsafe": "^2.0.5"
837 | },
838 | "bin": {
839 | "nodemon": "bin/nodemon.js"
840 | },
841 | "engines": {
842 | "node": ">=10"
843 | },
844 | "funding": {
845 | "type": "opencollective",
846 | "url": "https://opencollective.com/nodemon"
847 | }
848 | },
849 | "node_modules/nodemon/node_modules/debug": {
850 | "version": "4.3.4",
851 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
852 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
853 | "dependencies": {
854 | "ms": "2.1.2"
855 | },
856 | "engines": {
857 | "node": ">=6.0"
858 | },
859 | "peerDependenciesMeta": {
860 | "supports-color": {
861 | "optional": true
862 | }
863 | }
864 | },
865 | "node_modules/nodemon/node_modules/ms": {
866 | "version": "2.1.2",
867 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
868 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
869 | },
870 | "node_modules/nopt": {
871 | "version": "1.0.10",
872 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
873 | "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
874 | "dependencies": {
875 | "abbrev": "1"
876 | },
877 | "bin": {
878 | "nopt": "bin/nopt.js"
879 | },
880 | "engines": {
881 | "node": "*"
882 | }
883 | },
884 | "node_modules/normalize-path": {
885 | "version": "3.0.0",
886 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
887 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
888 | "engines": {
889 | "node": ">=0.10.0"
890 | }
891 | },
892 | "node_modules/object-assign": {
893 | "version": "4.1.1",
894 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
895 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
896 | "engines": {
897 | "node": ">=0.10.0"
898 | }
899 | },
900 | "node_modules/object-inspect": {
901 | "version": "1.13.1",
902 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
903 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
904 | "funding": {
905 | "url": "https://github.com/sponsors/ljharb"
906 | }
907 | },
908 | "node_modules/on-finished": {
909 | "version": "2.4.1",
910 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
911 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
912 | "dependencies": {
913 | "ee-first": "1.1.1"
914 | },
915 | "engines": {
916 | "node": ">= 0.8"
917 | }
918 | },
919 | "node_modules/parseurl": {
920 | "version": "1.3.3",
921 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
922 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
923 | "engines": {
924 | "node": ">= 0.8"
925 | }
926 | },
927 | "node_modules/path-to-regexp": {
928 | "version": "0.1.7",
929 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
930 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
931 | },
932 | "node_modules/picomatch": {
933 | "version": "2.3.1",
934 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
935 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
936 | "engines": {
937 | "node": ">=8.6"
938 | },
939 | "funding": {
940 | "url": "https://github.com/sponsors/jonschlinkert"
941 | }
942 | },
943 | "node_modules/proxy-addr": {
944 | "version": "2.0.7",
945 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
946 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
947 | "dependencies": {
948 | "forwarded": "0.2.0",
949 | "ipaddr.js": "1.9.1"
950 | },
951 | "engines": {
952 | "node": ">= 0.10"
953 | }
954 | },
955 | "node_modules/pstree.remy": {
956 | "version": "1.1.8",
957 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
958 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w=="
959 | },
960 | "node_modules/punycode": {
961 | "version": "2.3.1",
962 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
963 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
964 | "engines": {
965 | "node": ">=6"
966 | }
967 | },
968 | "node_modules/qs": {
969 | "version": "6.11.0",
970 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
971 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
972 | "dependencies": {
973 | "side-channel": "^1.0.4"
974 | },
975 | "engines": {
976 | "node": ">=0.6"
977 | },
978 | "funding": {
979 | "url": "https://github.com/sponsors/ljharb"
980 | }
981 | },
982 | "node_modules/range-parser": {
983 | "version": "1.2.1",
984 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
985 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
986 | "engines": {
987 | "node": ">= 0.6"
988 | }
989 | },
990 | "node_modules/raw-body": {
991 | "version": "2.5.1",
992 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
993 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
994 | "dependencies": {
995 | "bytes": "3.1.2",
996 | "http-errors": "2.0.0",
997 | "iconv-lite": "0.4.24",
998 | "unpipe": "1.0.0"
999 | },
1000 | "engines": {
1001 | "node": ">= 0.8"
1002 | }
1003 | },
1004 | "node_modules/readdirp": {
1005 | "version": "3.6.0",
1006 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1007 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1008 | "dependencies": {
1009 | "picomatch": "^2.2.1"
1010 | },
1011 | "engines": {
1012 | "node": ">=8.10.0"
1013 | }
1014 | },
1015 | "node_modules/safe-buffer": {
1016 | "version": "5.2.1",
1017 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1018 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1019 | "funding": [
1020 | {
1021 | "type": "github",
1022 | "url": "https://github.com/sponsors/feross"
1023 | },
1024 | {
1025 | "type": "patreon",
1026 | "url": "https://www.patreon.com/feross"
1027 | },
1028 | {
1029 | "type": "consulting",
1030 | "url": "https://feross.org/support"
1031 | }
1032 | ]
1033 | },
1034 | "node_modules/safer-buffer": {
1035 | "version": "2.1.2",
1036 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1037 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1038 | },
1039 | "node_modules/semver": {
1040 | "version": "7.5.4",
1041 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
1042 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
1043 | "dependencies": {
1044 | "lru-cache": "^6.0.0"
1045 | },
1046 | "bin": {
1047 | "semver": "bin/semver.js"
1048 | },
1049 | "engines": {
1050 | "node": ">=10"
1051 | }
1052 | },
1053 | "node_modules/send": {
1054 | "version": "0.18.0",
1055 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1056 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1057 | "dependencies": {
1058 | "debug": "2.6.9",
1059 | "depd": "2.0.0",
1060 | "destroy": "1.2.0",
1061 | "encodeurl": "~1.0.2",
1062 | "escape-html": "~1.0.3",
1063 | "etag": "~1.8.1",
1064 | "fresh": "0.5.2",
1065 | "http-errors": "2.0.0",
1066 | "mime": "1.6.0",
1067 | "ms": "2.1.3",
1068 | "on-finished": "2.4.1",
1069 | "range-parser": "~1.2.1",
1070 | "statuses": "2.0.1"
1071 | },
1072 | "engines": {
1073 | "node": ">= 0.8.0"
1074 | }
1075 | },
1076 | "node_modules/send/node_modules/ms": {
1077 | "version": "2.1.3",
1078 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1079 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1080 | },
1081 | "node_modules/serve-static": {
1082 | "version": "1.15.0",
1083 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1084 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1085 | "dependencies": {
1086 | "encodeurl": "~1.0.2",
1087 | "escape-html": "~1.0.3",
1088 | "parseurl": "~1.3.3",
1089 | "send": "0.18.0"
1090 | },
1091 | "engines": {
1092 | "node": ">= 0.8.0"
1093 | }
1094 | },
1095 | "node_modules/set-function-length": {
1096 | "version": "1.1.1",
1097 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
1098 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
1099 | "dependencies": {
1100 | "define-data-property": "^1.1.1",
1101 | "get-intrinsic": "^1.2.1",
1102 | "gopd": "^1.0.1",
1103 | "has-property-descriptors": "^1.0.0"
1104 | },
1105 | "engines": {
1106 | "node": ">= 0.4"
1107 | }
1108 | },
1109 | "node_modules/setprototypeof": {
1110 | "version": "1.2.0",
1111 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1112 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1113 | },
1114 | "node_modules/side-channel": {
1115 | "version": "1.0.4",
1116 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1117 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1118 | "dependencies": {
1119 | "call-bind": "^1.0.0",
1120 | "get-intrinsic": "^1.0.2",
1121 | "object-inspect": "^1.9.0"
1122 | },
1123 | "funding": {
1124 | "url": "https://github.com/sponsors/ljharb"
1125 | }
1126 | },
1127 | "node_modules/sift": {
1128 | "version": "16.0.1",
1129 | "resolved": "https://registry.npmjs.org/sift/-/sift-16.0.1.tgz",
1130 | "integrity": "sha512-Wv6BjQ5zbhW7VFefWusVP33T/EM0vYikCaQ2qR8yULbsilAT8/wQaXvuQ3ptGLpoKx+lihJE3y2UTgKDyyNHZQ=="
1131 | },
1132 | "node_modules/simple-update-notifier": {
1133 | "version": "2.0.0",
1134 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
1135 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
1136 | "dependencies": {
1137 | "semver": "^7.5.3"
1138 | },
1139 | "engines": {
1140 | "node": ">=10"
1141 | }
1142 | },
1143 | "node_modules/sparse-bitfield": {
1144 | "version": "3.0.3",
1145 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1146 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1147 | "dependencies": {
1148 | "memory-pager": "^1.0.2"
1149 | }
1150 | },
1151 | "node_modules/statuses": {
1152 | "version": "2.0.1",
1153 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1154 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1155 | "engines": {
1156 | "node": ">= 0.8"
1157 | }
1158 | },
1159 | "node_modules/supports-color": {
1160 | "version": "5.5.0",
1161 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1162 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1163 | "dependencies": {
1164 | "has-flag": "^3.0.0"
1165 | },
1166 | "engines": {
1167 | "node": ">=4"
1168 | }
1169 | },
1170 | "node_modules/to-regex-range": {
1171 | "version": "5.0.1",
1172 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1173 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1174 | "dependencies": {
1175 | "is-number": "^7.0.0"
1176 | },
1177 | "engines": {
1178 | "node": ">=8.0"
1179 | }
1180 | },
1181 | "node_modules/toidentifier": {
1182 | "version": "1.0.1",
1183 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1184 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1185 | "engines": {
1186 | "node": ">=0.6"
1187 | }
1188 | },
1189 | "node_modules/touch": {
1190 | "version": "3.1.0",
1191 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1192 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1193 | "dependencies": {
1194 | "nopt": "~1.0.10"
1195 | },
1196 | "bin": {
1197 | "nodetouch": "bin/nodetouch.js"
1198 | }
1199 | },
1200 | "node_modules/tr46": {
1201 | "version": "3.0.0",
1202 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
1203 | "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
1204 | "dependencies": {
1205 | "punycode": "^2.1.1"
1206 | },
1207 | "engines": {
1208 | "node": ">=12"
1209 | }
1210 | },
1211 | "node_modules/type-is": {
1212 | "version": "1.6.18",
1213 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1214 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1215 | "dependencies": {
1216 | "media-typer": "0.3.0",
1217 | "mime-types": "~2.1.24"
1218 | },
1219 | "engines": {
1220 | "node": ">= 0.6"
1221 | }
1222 | },
1223 | "node_modules/undefsafe": {
1224 | "version": "2.0.5",
1225 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1226 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA=="
1227 | },
1228 | "node_modules/undici-types": {
1229 | "version": "5.26.5",
1230 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
1231 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
1232 | },
1233 | "node_modules/unpipe": {
1234 | "version": "1.0.0",
1235 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1236 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1237 | "engines": {
1238 | "node": ">= 0.8"
1239 | }
1240 | },
1241 | "node_modules/utils-merge": {
1242 | "version": "1.0.1",
1243 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1244 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1245 | "engines": {
1246 | "node": ">= 0.4.0"
1247 | }
1248 | },
1249 | "node_modules/vary": {
1250 | "version": "1.1.2",
1251 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1252 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1253 | "engines": {
1254 | "node": ">= 0.8"
1255 | }
1256 | },
1257 | "node_modules/webidl-conversions": {
1258 | "version": "7.0.0",
1259 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
1260 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
1261 | "engines": {
1262 | "node": ">=12"
1263 | }
1264 | },
1265 | "node_modules/whatwg-url": {
1266 | "version": "11.0.0",
1267 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
1268 | "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
1269 | "dependencies": {
1270 | "tr46": "^3.0.0",
1271 | "webidl-conversions": "^7.0.0"
1272 | },
1273 | "engines": {
1274 | "node": ">=12"
1275 | }
1276 | },
1277 | "node_modules/yallist": {
1278 | "version": "4.0.0",
1279 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1280 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
1281 | }
1282 | }
1283 | }
1284 |
--------------------------------------------------------------------------------