├── 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 |
    25 | {anime.length > 0 && 26 | anime.map((anim) => ( 27 |
  • 28 |
    29 |

    {anim.title}

    30 |

    {anim.description}

    31 |
    32 | 33 |
    34 | 35 | Watch 36 | 37 |
    38 |
  • 39 | ))} 40 |
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 |
45 |
46 | 49 | 57 |
58 |
59 | 62 | 70 |
71 |
72 | 75 | 83 |
84 |
85 | 86 |
87 |
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 |
19 |
24 |
25 |

26 | Project Details 27 |

28 |

29 | Enter the details of your new project. 30 |

31 |
32 |
33 |
34 | 40 | 45 |
46 |
47 | 53 | 58 |
59 |
60 | 66 | 71 |
72 |
73 |
74 | 80 |
81 |
82 |
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 | --------------------------------------------------------------------------------