├── Containerize Node Application ├── .dockerignore ├── .gitignore ├── Dockerfile ├── package.json ├── server.js └── package-lock.json ├── Containerize React Application ├── .dockerignore ├── src │ ├── vite-env.d.ts │ ├── main.tsx │ ├── App.css │ ├── App.tsx │ ├── index.css │ └── assets │ │ └── react.svg ├── vite.config.ts ├── tsconfig.json ├── .gitignore ├── tsconfig.node.json ├── index.html ├── Dockerfile ├── .eslintrc.cjs ├── tsconfig.app.json ├── package.json ├── README.md └── public │ └── vite.svg ├── Containerize MERN Application ├── .gitignore ├── client │ ├── public │ │ ├── robots.txt │ │ ├── favicon.ico │ │ ├── logo192.png │ │ ├── logo512.png │ │ ├── manifest.json │ │ └── index.html │ ├── .dockerignore │ ├── Dockerfile │ ├── src │ │ ├── setupTests.js │ │ ├── App.test.js │ │ ├── index.css │ │ ├── reportWebVitals.js │ │ ├── index.js │ │ ├── App.css │ │ ├── App.js │ │ └── logo.svg │ ├── .gitignore │ ├── package.json │ └── README.md ├── api │ ├── .dockerignore │ ├── Dockerfile │ ├── User.js │ ├── package.json │ ├── .gitignore │ ├── index.js │ └── package-lock.json └── docker-compose.yml ├── Containerize Simple JavaScript Application ├── index.js ├── Dockerfile ├── package.json └── package-lock.json ├── Containerize React Vite App ├── Dockerfile ├── src │ ├── App.jsx │ ├── main.jsx │ ├── App.css │ ├── index.css │ ├── components │ │ └── AppNotes.jsx │ └── assets │ │ └── react.svg ├── .gitignore ├── vite.config.js ├── index.html ├── README.md ├── package.json ├── eslint.config.js └── public │ └── vite.svg └── README.md /Containerize Node Application/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /Containerize Node Application/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env -------------------------------------------------------------------------------- /Containerize React Application/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log -------------------------------------------------------------------------------- /Containerize MERN Application/.gitignore: -------------------------------------------------------------------------------- 1 | /api/node_modules 2 | /client/node_modules -------------------------------------------------------------------------------- /Containerize React Application/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /Containerize Simple JavaScript Application/index.js: -------------------------------------------------------------------------------- 1 | const a = 40; 2 | const b = 200; 3 | 4 | const sum = a + b; 5 | console.log("The Sum of a and b is: " + sum); 6 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/.dockerignore: -------------------------------------------------------------------------------- 1 | # This is a sample .gitignore file for a React project. And this will ignore the following files 2 | package-lock.json -------------------------------------------------------------------------------- /Containerize MERN Application/client/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HGSChandeepa/Docker-Full-Tutorial-Codes-and-Notes/HEAD/Containerize MERN Application/client/public/favicon.ico -------------------------------------------------------------------------------- /Containerize MERN Application/client/public/logo192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HGSChandeepa/Docker-Full-Tutorial-Codes-and-Notes/HEAD/Containerize MERN Application/client/public/logo192.png -------------------------------------------------------------------------------- /Containerize MERN Application/client/public/logo512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HGSChandeepa/Docker-Full-Tutorial-Codes-and-Notes/HEAD/Containerize MERN Application/client/public/logo512.png -------------------------------------------------------------------------------- /Containerize MERN Application/api/.dockerignore: -------------------------------------------------------------------------------- 1 | # This is a sample .gitignore file for a Node.js project. And this will ignore the following files and directories: 2 | node_modules 3 | package-lock.json -------------------------------------------------------------------------------- /Containerize React Application/vite.config.ts: -------------------------------------------------------------------------------- 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 | -------------------------------------------------------------------------------- /Containerize React Application/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.app.json" 6 | }, 7 | { 8 | "path": "./tsconfig.node.json" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile for the client 2 | FROM node:20.14.0 3 | 4 | WORKDIR /app 5 | 6 | COPY package.json . 7 | 8 | COPY . . 9 | 10 | RUN npm install 11 | 12 | EXPOSE 3000 13 | 14 | CMD ["npm","run" ,"start"] -------------------------------------------------------------------------------- /Containerize MERN Application/api/Dockerfile: -------------------------------------------------------------------------------- 1 | # Dockerfile for the API service 2 | FROM node:20.14.0 3 | 4 | RUN npm install -g nodemon 5 | 6 | WORKDIR /app 7 | 8 | COPY . . 9 | 10 | RUN npm install 11 | 12 | EXPOSE 5000 13 | 14 | CMD ["npm","run" ,"start"] 15 | 16 | -------------------------------------------------------------------------------- /Containerize React Vite App/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:20-alpine 2 | 3 | WORKDIR /frontend 4 | 5 | COPY package.json . 6 | 7 | RUN npm install 8 | 9 | RUN npm i -g serve 10 | 11 | COPY . . 12 | 13 | RUN npm run build 14 | 15 | EXPOSE 3000 16 | 17 | CMD [ "serve", "-s", "dist" ] -------------------------------------------------------------------------------- /Containerize React Vite App/src/App.jsx: -------------------------------------------------------------------------------- 1 | import "./App.css"; 2 | 3 | import AppNotes from "./components/AppNotes"; 4 | 5 | function App() { 6 | return ( 7 | <> 8 |
9 | 10 |
11 | 12 | ); 13 | } 14 | 15 | export default App; 16 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /Containerize React Vite App/src/main.jsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from 'react' 2 | import { createRoot } from 'react-dom/client' 3 | import './index.css' 4 | import App from './App.jsx' 5 | 6 | createRoot(document.getElementById('root')).render( 7 | 8 | 9 | , 10 | ) 11 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/src/App.test.js: -------------------------------------------------------------------------------- 1 | import { render, screen } from '@testing-library/react'; 2 | import App from './App'; 3 | 4 | test('renders learn react link', () => { 5 | render(); 6 | const linkElement = screen.getByText(/learn react/i); 7 | expect(linkElement).toBeInTheDocument(); 8 | }); 9 | -------------------------------------------------------------------------------- /Containerize React Application/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom/client' 3 | import App from './App.tsx' 4 | import './index.css' 5 | 6 | ReactDOM.createRoot(document.getElementById('root')!).render( 7 | 8 | 9 | , 10 | ) 11 | -------------------------------------------------------------------------------- /Containerize Simple JavaScript Application/Dockerfile: -------------------------------------------------------------------------------- 1 | # base image 2 | FROM node:20-alpine 3 | 4 | # working directory 5 | WORKDIR /app 6 | 7 | # copy the package.json file 8 | COPY package.json . 9 | 10 | # install the dependencies 11 | RUN npm install 12 | 13 | # copy the files 14 | COPY . . 15 | 16 | # run the app 17 | CMD [ "npm" , "start"] -------------------------------------------------------------------------------- /Containerize React Vite App/.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 | -------------------------------------------------------------------------------- /Containerize React Application/.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 | -------------------------------------------------------------------------------- /Containerize Node Application/Dockerfile: -------------------------------------------------------------------------------- 1 | # Get the base image 2 | FROM node:20-alpine 3 | 4 | # Set the working directory 5 | WORKDIR /app 6 | 7 | # copy the package.json file 8 | COPY package*.json ./ 9 | 10 | # Install the dependencies 11 | RUN npm install 12 | 13 | # Copy the source code 14 | COPY . . 15 | 16 | # Expose the port 17 | EXPOSE 5000 18 | 19 | # Start the application 20 | CMD [ "npm" ,"start" ] -------------------------------------------------------------------------------- /Containerize MERN Application/api/User.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | 3 | const UserSchema = new mongoose.Schema({ 4 | name: { 5 | type: String, 6 | required: true, 7 | }, 8 | age: { 9 | type: Number, 10 | required: true, 11 | }, 12 | createdAt: { 13 | type: Date, 14 | default: Date.now, 15 | }, 16 | }); 17 | 18 | module.exports = mongoose.model("User", UserSchema); 19 | -------------------------------------------------------------------------------- /Containerize React Application/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", 5 | "skipLibCheck": true, 6 | "module": "ESNext", 7 | "moduleResolution": "bundler", 8 | "allowSyntheticDefaultImports": true, 9 | "strict": true, 10 | "noEmit": true 11 | }, 12 | "include": ["vite.config.ts"] 13 | } 14 | -------------------------------------------------------------------------------- /Containerize React Vite App/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | export default defineConfig({ 5 | base: "/", 6 | plugins: [react()], 7 | preview: { 8 | port: 3000, 9 | strictPort: true, 10 | }, 11 | server: { 12 | port: 3000, 13 | strictPort: true, 14 | host: true, 15 | origin: "http://0.0.0.0:3000", 16 | }, 17 | }); 18 | -------------------------------------------------------------------------------- /Containerize Simple JavaScript Application/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sample-node-app", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1", 7 | "start": "nodemon -L index.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "description": "", 13 | "dependencies": { 14 | "nodemon": "^3.1.4" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Containerize MERN Application/api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "start": "nodemon -L index.js" 7 | }, 8 | "keywords": [], 9 | "author": "", 10 | "license": "ISC", 11 | "description": "", 12 | "dependencies": { 13 | "cors": "^2.8.5", 14 | "dotenv": "^16.4.5", 15 | "express": "^4.19.2", 16 | "mongoose": "^8.4.3" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Containerize React Vite App/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Containerize MERN Application/api/.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 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/.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 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /Containerize React Application/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite + React + TS 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/src/reportWebVitals.js: -------------------------------------------------------------------------------- 1 | const reportWebVitals = onPerfEntry => { 2 | if (onPerfEntry && onPerfEntry instanceof Function) { 3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { 4 | getCLS(onPerfEntry); 5 | getFID(onPerfEntry); 6 | getFCP(onPerfEntry); 7 | getLCP(onPerfEntry); 8 | getTTFB(onPerfEntry); 9 | }); 10 | } 11 | }; 12 | 13 | export default reportWebVitals; 14 | -------------------------------------------------------------------------------- /Containerize Node Application/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docker_node_tutorial", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1", 7 | "start": "nodemon -L server.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "description": "", 13 | "dependencies": { 14 | "dotenv": "^16.4.5", 15 | "express": "^4.19.2", 16 | "nodemon": "^3.1.4" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Containerize React Application/Dockerfile: -------------------------------------------------------------------------------- 1 | # Use the base image from Docker Hub 2 | FROM node:20-alpine 3 | 4 | # Set the working directory 5 | WORKDIR /app 6 | 7 | # Copy the package.json and package-lock.json files 8 | COPY package*.json ./ 9 | 10 | # Install the dependencies 11 | RUN npm install 12 | 13 | # Copy the rest of the application files 14 | COPY . . 15 | 16 | # Expose the port your app will run on 17 | EXPOSE 5173 18 | 19 | # Start the application 20 | CMD [ "npm" , "run" , "dev" ] -------------------------------------------------------------------------------- /Containerize React Vite App/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 | -------------------------------------------------------------------------------- /Containerize React Application/.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { browser: true, es2020: true }, 4 | extends: [ 5 | 'eslint:recommended', 6 | 'plugin:@typescript-eslint/recommended', 7 | 'plugin:react-hooks/recommended', 8 | ], 9 | ignorePatterns: ['dist', '.eslintrc.cjs'], 10 | parser: '@typescript-eslint/parser', 11 | plugins: ['react-refresh'], 12 | rules: { 13 | 'react-refresh/only-export-components': [ 14 | 'warn', 15 | { allowConstantExport: true }, 16 | ], 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom/client'; 3 | import './index.css'; 4 | import App from './App'; 5 | import reportWebVitals from './reportWebVitals'; 6 | 7 | const root = ReactDOM.createRoot(document.getElementById('root')); 8 | root.render( 9 | 10 | 11 | 12 | ); 13 | 14 | // If you want to start measuring performance in your app, pass a function 15 | // to log results (for example: reportWebVitals(console.log)) 16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals 17 | reportWebVitals(); 18 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "React App", 3 | "name": "Create React App Sample", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | }, 10 | { 11 | "src": "logo192.png", 12 | "type": "image/png", 13 | "sizes": "192x192" 14 | }, 15 | { 16 | "src": "logo512.png", 17 | "type": "image/png", 18 | "sizes": "512x512" 19 | } 20 | ], 21 | "start_url": ".", 22 | "display": "standalone", 23 | "theme_color": "#000000", 24 | "background_color": "#ffffff" 25 | } 26 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Containerize React Vite App/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint .", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "react": "^18.3.1", 14 | "react-dom": "^18.3.1" 15 | }, 16 | "devDependencies": { 17 | "@eslint/js": "^9.17.0", 18 | "@types/react": "^18.3.18", 19 | "@types/react-dom": "^18.3.5", 20 | "@vitejs/plugin-react": "^4.3.4", 21 | "eslint": "^9.17.0", 22 | "eslint-plugin-react": "^7.37.2", 23 | "eslint-plugin-react-hooks": "^5.0.0", 24 | "eslint-plugin-react-refresh": "^0.4.16", 25 | "globals": "^15.14.0", 26 | "vite": "^6.0.5" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Containerize React Vite App/src/App.css: -------------------------------------------------------------------------------- 1 | #root { 2 | max-width: 1280px; 3 | margin: 0 auto; 4 | padding: 2rem; 5 | text-align: center; 6 | } 7 | 8 | .logo { 9 | height: 6em; 10 | padding: 1.5em; 11 | will-change: filter; 12 | transition: filter 300ms; 13 | } 14 | .logo:hover { 15 | filter: drop-shadow(0 0 2em #646cffaa); 16 | } 17 | .logo.react:hover { 18 | filter: drop-shadow(0 0 2em #61dafbaa); 19 | } 20 | 21 | @keyframes logo-spin { 22 | from { 23 | transform: rotate(0deg); 24 | } 25 | to { 26 | transform: rotate(360deg); 27 | } 28 | } 29 | 30 | @media (prefers-reduced-motion: no-preference) { 31 | a:nth-of-type(2) .logo { 32 | animation: logo-spin infinite 20s linear; 33 | } 34 | } 35 | 36 | .card { 37 | padding: 2em; 38 | } 39 | 40 | .read-the-docs { 41 | color: #888; 42 | } 43 | -------------------------------------------------------------------------------- /Containerize React Application/src/App.css: -------------------------------------------------------------------------------- 1 | #root { 2 | max-width: 1280px; 3 | margin: 0 auto; 4 | padding: 2rem; 5 | text-align: center; 6 | } 7 | 8 | .logo { 9 | height: 6em; 10 | padding: 1.5em; 11 | will-change: filter; 12 | transition: filter 300ms; 13 | } 14 | .logo:hover { 15 | filter: drop-shadow(0 0 2em #646cffaa); 16 | } 17 | .logo.react:hover { 18 | filter: drop-shadow(0 0 2em #61dafbaa); 19 | } 20 | 21 | @keyframes logo-spin { 22 | from { 23 | transform: rotate(0deg); 24 | } 25 | to { 26 | transform: rotate(360deg); 27 | } 28 | } 29 | 30 | @media (prefers-reduced-motion: no-preference) { 31 | a:nth-of-type(2) .logo { 32 | animation: logo-spin infinite 20s linear; 33 | } 34 | } 35 | 36 | .card { 37 | padding: 2em; 38 | } 39 | 40 | .read-the-docs { 41 | color: #888; 42 | } 43 | -------------------------------------------------------------------------------- /Containerize React Application/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", 5 | "target": "ES2020", 6 | "useDefineForClassFields": true, 7 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 8 | "module": "ESNext", 9 | "skipLibCheck": true, 10 | 11 | /* Bundler mode */ 12 | "moduleResolution": "bundler", 13 | "allowImportingTsExtensions": true, 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "moduleDetection": "force", 17 | "noEmit": true, 18 | "jsx": "react-jsx", 19 | 20 | /* Linting */ 21 | "strict": true, 22 | "noUnusedLocals": true, 23 | "noUnusedParameters": true, 24 | "noFallthroughCasesInSwitch": true 25 | }, 26 | "include": ["src"] 27 | } 28 | -------------------------------------------------------------------------------- /Containerize React Application/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | 3 | export interface Post { 4 | id: number; 5 | title: String; 6 | body: String; 7 | } 8 | function App() { 9 | const [posts, setPosts] = useState([]); 10 | 11 | useEffect(() => { 12 | fetch("https://jsonplaceholder.typicode.com/posts?_limit=10") 13 | .then((responce) => responce.json()) 14 | .then((data) => setPosts(data)); 15 | }, []); 16 | 17 | return ( 18 | <> 19 |

Vite and React and Docker after adding docker volumes

20 |
21 |

Posts

22 |
    23 | {posts.map((post: Post) => ( 24 |
  • 25 |

    {post.title}

    26 |

    {post.body}

    27 |
  • 28 | ))} 29 |
30 |
31 | 32 | ); 33 | } 34 | 35 | export default App; 36 | -------------------------------------------------------------------------------- /Containerize React Application/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react_docker_tutorial", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite --host 0.0.0.0", 8 | "build": "tsc -b && vite build", 9 | "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", 10 | "preview": "vite preview" 11 | }, 12 | "dependencies": { 13 | "react": "^18.3.1", 14 | "react-dom": "^18.3.1" 15 | }, 16 | "devDependencies": { 17 | "@types/react": "^18.3.3", 18 | "@types/react-dom": "^18.3.0", 19 | "@typescript-eslint/eslint-plugin": "^7.13.1", 20 | "@typescript-eslint/parser": "^7.13.1", 21 | "@vitejs/plugin-react": "^4.3.1", 22 | "eslint": "^8.57.0", 23 | "eslint-plugin-react-hooks": "^4.6.2", 24 | "eslint-plugin-react-refresh": "^0.4.7", 25 | "typescript": "^5.2.2", 26 | "vite": "^5.3.1" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Containerize MERN Application/docker-compose.yml: -------------------------------------------------------------------------------- 1 | # This file is used to define the services that will be used in the application. 2 | services: 3 | mongo: 4 | image: mongo:latest 5 | container_name: mongo_container 6 | volumes: 7 | - mongo_data:/data/db 8 | ports: 9 | - "27017:27017" 10 | 11 | api: 12 | build: ./api 13 | container_name: api_container 14 | ports: 15 | - "5000:5000" 16 | depends_on: 17 | - mongo 18 | volumes: 19 | - ./api:/app 20 | - /app/node_modules 21 | environment: 22 | - MONGO_URL=mongodb://mongo:27017/test-users 23 | 24 | client: 25 | build: ./client 26 | container_name: client_container 27 | ports: 28 | - "3000:3000" 29 | depends_on: 30 | - api 31 | stdin_open: true 32 | tty: true 33 | volumes: 34 | - ./client:/app 35 | - /client/node_modules 36 | 37 | volumes: 38 | mongo_data: 39 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "dependencies": { 6 | "@testing-library/jest-dom": "^5.17.0", 7 | "@testing-library/react": "^13.4.0", 8 | "@testing-library/user-event": "^13.5.0", 9 | "axios": "^1.7.2", 10 | "react": "^18.3.1", 11 | "react-dom": "^18.3.1", 12 | "react-scripts": "5.0.1", 13 | "web-vitals": "^2.1.4" 14 | }, 15 | "scripts": { 16 | "start": "react-scripts start", 17 | "build": "react-scripts build", 18 | "test": "react-scripts test", 19 | "eject": "react-scripts eject" 20 | }, 21 | "eslintConfig": { 22 | "extends": [ 23 | "react-app", 24 | "react-app/jest" 25 | ] 26 | }, 27 | "browserslist": { 28 | "production": [ 29 | ">0.2%", 30 | "not dead", 31 | "not op_mini all" 32 | ], 33 | "development": [ 34 | "last 1 chrome version", 35 | "last 1 firefox version", 36 | "last 1 safari version" 37 | ] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/src/App.js: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from "react"; 2 | import logo from "./logo.svg"; 3 | import "./App.css"; 4 | import axios from "axios"; 5 | 6 | function App() { 7 | const [users, setUsers] = useState([]); 8 | 9 | useEffect(() => { 10 | axios 11 | .get("http://localhost:5000/api/users") 12 | .then((response) => { 13 | setUsers(response.data.data); 14 | }) 15 | .catch((error) => { 16 | console.error("There was an error fetching the users!", error); 17 | }); 18 | }, []); 19 | 20 | return ( 21 |
22 |
23 |

Users List

24 | {users.length > 0 ? ( 25 |
    26 | {users.map((user) => ( 27 |
  • 28 | {user.name} - {user.age} 29 | {user.name} - {user.age} 30 |
  • 31 | ))} 32 |
33 | ) : ( 34 |

No users found...

35 | )} 36 |
37 |
38 | ); 39 | } 40 | 41 | export default App; 42 | -------------------------------------------------------------------------------- /Containerize React Vite App/eslint.config.js: -------------------------------------------------------------------------------- 1 | import js from '@eslint/js' 2 | import globals from 'globals' 3 | import react from 'eslint-plugin-react' 4 | import reactHooks from 'eslint-plugin-react-hooks' 5 | import reactRefresh from 'eslint-plugin-react-refresh' 6 | 7 | export default [ 8 | { ignores: ['dist'] }, 9 | { 10 | files: ['**/*.{js,jsx}'], 11 | languageOptions: { 12 | ecmaVersion: 2020, 13 | globals: globals.browser, 14 | parserOptions: { 15 | ecmaVersion: 'latest', 16 | ecmaFeatures: { jsx: true }, 17 | sourceType: 'module', 18 | }, 19 | }, 20 | settings: { react: { version: '18.3' } }, 21 | plugins: { 22 | react, 23 | 'react-hooks': reactHooks, 24 | 'react-refresh': reactRefresh, 25 | }, 26 | rules: { 27 | ...js.configs.recommended.rules, 28 | ...react.configs.recommended.rules, 29 | ...react.configs['jsx-runtime'].rules, 30 | ...reactHooks.configs.recommended.rules, 31 | 'react/jsx-no-target-blank': 'off', 32 | 'react-refresh/only-export-components': [ 33 | 'warn', 34 | { allowConstantExport: true }, 35 | ], 36 | }, 37 | }, 38 | ] 39 | -------------------------------------------------------------------------------- /Containerize Node Application/server.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const app = express(); 3 | 4 | const PORT = process.env.PORT || 5000; 5 | 6 | // Define endpoint to fetch posts 7 | app.get("/posts", async (req, res) => { 8 | try { 9 | const responce = await fetch( 10 | "https://jsonplaceholder.typicode.com/posts?_limit=30" 11 | ); 12 | const data = await responce.json(); 13 | res.json(data); 14 | } catch (error) { 15 | console.error("Error fetching posts:", error); 16 | res.status(500).json({ error: "Error fetching posts" }); 17 | } 18 | }); 19 | 20 | // Define endpoint to fetch post by id as query parameter 21 | app.get("/posts/:id", async (req, res) => { 22 | const { id } = req.params; 23 | try { 24 | const responce = await fetch( 25 | `https://jsonplaceholder.typicode.com/posts/${id}` 26 | ); 27 | 28 | const data = await responce.json(); 29 | res.json(data); 30 | } catch (error) { 31 | console.error("Error fetching post by id:", error); 32 | res.status(500).json({ error: "Error fetching post by id" }); 33 | } 34 | }); 35 | 36 | app.listen(PORT, () => { 37 | console.log(`Server is running on http://localhost:${PORT}`); 38 | }); 39 | -------------------------------------------------------------------------------- /Containerize React Application/README.md: -------------------------------------------------------------------------------- 1 | # React + TypeScript + 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 | 10 | ## Expanding the ESLint configuration 11 | 12 | If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: 13 | 14 | - Configure the top-level `parserOptions` property like this: 15 | 16 | ```js 17 | export default { 18 | // other rules... 19 | parserOptions: { 20 | ecmaVersion: 'latest', 21 | sourceType: 'module', 22 | project: ['./tsconfig.json', './tsconfig.node.json'], 23 | tsconfigRootDir: __dirname, 24 | }, 25 | } 26 | ``` 27 | 28 | - Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` 29 | - Optionally add `plugin:@typescript-eslint/stylistic-type-checked` 30 | - Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list 31 | -------------------------------------------------------------------------------- /Containerize MERN Application/api/index.js: -------------------------------------------------------------------------------- 1 | const express = require("express"); 2 | const cors = require("cors"); 3 | const mongoose = require("mongoose"); 4 | 5 | //User model 6 | const User = require("./User"); 7 | 8 | const app = express(); 9 | app.use(cors()); 10 | app.use(express.json()); 11 | 12 | // Connect to MongoDB 13 | mongoose 14 | .connect(process.env.MONGO_URL, { 15 | useNewUrlParser: true, 16 | useUnifiedTopology: true, 17 | }) 18 | .then(() => { 19 | console.log("Connected to MongoDB"); 20 | }) 21 | .catch((err) => { 22 | console.error("Error connecting to MongoDB", err); 23 | }); 24 | 25 | // API routes for get user data 26 | app.get("/api/users", async (req, res) => { 27 | try { 28 | const users = await User.find(); 29 | res 30 | .status(200) 31 | .json({ message: "Users fetched successfully", data: users }); 32 | } catch (err) { 33 | res.status(500).json({ error: err }); 34 | } 35 | }); 36 | 37 | // API routes for create user 38 | app.post("/api/users", async (req, res) => { 39 | try { 40 | const user = new User(req.body); 41 | const result = await user.save(); 42 | res 43 | .status(201) 44 | .json({ message: "User created successfully", data: result }); 45 | } catch (err) { 46 | res.status(500).json({ error: err }); 47 | } 48 | }); 49 | 50 | // Listen to port 5000 51 | app.listen(5000, () => { 52 | console.log("Server is running on port 5000"); 53 | }); 54 | -------------------------------------------------------------------------------- /Containerize React Application/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Containerize React Vite App/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Containerize React Vite App/src/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | 10 | font-synthesis: none; 11 | text-rendering: optimizeLegibility; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | } 15 | 16 | a { 17 | font-weight: 500; 18 | color: #646cff; 19 | text-decoration: inherit; 20 | } 21 | a:hover { 22 | color: #535bf2; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | display: flex; 28 | place-items: center; 29 | min-width: 320px; 30 | min-height: 100vh; 31 | } 32 | 33 | h1 { 34 | font-size: 3.2em; 35 | line-height: 1.1; 36 | } 37 | 38 | button { 39 | border-radius: 8px; 40 | border: 1px solid transparent; 41 | padding: 0.6em 1.2em; 42 | font-size: 1em; 43 | font-weight: 500; 44 | font-family: inherit; 45 | background-color: #1a1a1a; 46 | cursor: pointer; 47 | transition: border-color 0.25s; 48 | } 49 | button:hover { 50 | border-color: #646cff; 51 | } 52 | button:focus, 53 | button:focus-visible { 54 | outline: 4px auto -webkit-focus-ring-color; 55 | } 56 | 57 | @media (prefers-color-scheme: light) { 58 | :root { 59 | color: #213547; 60 | background-color: #ffffff; 61 | } 62 | a:hover { 63 | color: #747bff; 64 | } 65 | button { 66 | background-color: #f9f9f9; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Containerize React Application/src/index.css: -------------------------------------------------------------------------------- 1 | :root { 2 | font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; 3 | line-height: 1.5; 4 | font-weight: 400; 5 | 6 | color-scheme: light dark; 7 | color: rgba(255, 255, 255, 0.87); 8 | background-color: #242424; 9 | 10 | font-synthesis: none; 11 | text-rendering: optimizeLegibility; 12 | -webkit-font-smoothing: antialiased; 13 | -moz-osx-font-smoothing: grayscale; 14 | } 15 | 16 | a { 17 | font-weight: 500; 18 | color: #646cff; 19 | text-decoration: inherit; 20 | } 21 | a:hover { 22 | color: #535bf2; 23 | } 24 | 25 | body { 26 | margin: 0; 27 | display: flex; 28 | place-items: center; 29 | min-width: 320px; 30 | min-height: 100vh; 31 | } 32 | 33 | h1 { 34 | font-size: 3.2em; 35 | line-height: 1.1; 36 | } 37 | 38 | button { 39 | border-radius: 8px; 40 | border: 1px solid transparent; 41 | padding: 0.6em 1.2em; 42 | font-size: 1em; 43 | font-weight: 500; 44 | font-family: inherit; 45 | background-color: #1a1a1a; 46 | cursor: pointer; 47 | transition: border-color 0.25s; 48 | } 49 | button:hover { 50 | border-color: #646cff; 51 | } 52 | button:focus, 53 | button:focus-visible { 54 | outline: 4px auto -webkit-focus-ring-color; 55 | } 56 | 57 | @media (prefers-color-scheme: light) { 58 | :root { 59 | color: #213547; 60 | background-color: #ffffff; 61 | } 62 | a:hover { 63 | color: #747bff; 64 | } 65 | button { 66 | background-color: #f9f9f9; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Containerize React Vite App/src/components/AppNotes.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | 3 | const AppNotes = () => { 4 | const [notes, setNotes] = useState([]); 5 | const [newNote, setNewNote] = useState(""); 6 | 7 | useEffect(() => { 8 | const fetchNotes = async () => { 9 | try { 10 | const response = await fetch("http://localhost:9000/notes"); 11 | const data = await response.json(); 12 | setNotes(data); 13 | } catch (error) { 14 | console.error("Error fetching notes:", error); 15 | } 16 | }; 17 | fetchNotes(); 18 | }, []); 19 | 20 | const addNote = async () => { 21 | try { 22 | const note = { content: newNote }; 23 | const response = await fetch("http://localhost:9000/notes", { 24 | method: "POST", 25 | headers: { "Content-Type": "application/json" }, 26 | body: JSON.stringify(note), 27 | }); 28 | const data = await response.json(); 29 | setNotes([...notes, data]); 30 | setNewNote(""); 31 | } catch (error) { 32 | console.error("Error adding note:", error); 33 | } 34 | }; 35 | 36 | return ( 37 |
38 |

Notes App

39 | setNewNote(e.target.value)} 43 | placeholder="Write a note" 44 | /> 45 | 46 | 47 |
    48 | {notes.map((note, index) => ( 49 |
  • {note.content}
  • 50 | ))} 51 |
52 |
53 | ); 54 | }; 55 | 56 | export default AppNotes; 57 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | React App 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Containerize MERN Application/client/README.md: -------------------------------------------------------------------------------- 1 | # Getting Started with Create React App 2 | 3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 4 | 5 | ## Available Scripts 6 | 7 | In the project directory, you can run: 8 | 9 | ### `npm start` 10 | 11 | Runs the app in the development mode.\ 12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser. 13 | 14 | The page will reload when you make changes.\ 15 | You may also see any lint errors in the console. 16 | 17 | ### `npm test` 18 | 19 | Launches the test runner in the interactive watch mode.\ 20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 21 | 22 | ### `npm run build` 23 | 24 | Builds the app for production to the `build` folder.\ 25 | It correctly bundles React in production mode and optimizes the build for the best performance. 26 | 27 | The build is minified and the filenames include the hashes.\ 28 | Your app is ready to be deployed! 29 | 30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 31 | 32 | ### `npm run eject` 33 | 34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!** 35 | 36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 37 | 38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. 39 | 40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. 41 | 42 | ## Learn More 43 | 44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 45 | 46 | To learn React, check out the [React documentation](https://reactjs.org/). 47 | 48 | ### Code Splitting 49 | 50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) 51 | 52 | ### Analyzing the Bundle Size 53 | 54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) 55 | 56 | ### Making a Progressive Web App 57 | 58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) 59 | 60 | ### Advanced Configuration 61 | 62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) 63 | 64 | ### Deployment 65 | 66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) 67 | 68 | ### `npm run build` fails to minify 69 | 70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) 71 | -------------------------------------------------------------------------------- /Containerize React Application/src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Containerize React Vite App/src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Docker Tutorial Source Codes and Notes 2 | 3 | ## 🔗Full Note: https://docs.google.com/document/d/129Dto4erhN7RO4ZS_ROCmgsJfwgb5CUXACVNkKeQQa8/edit?usp=sharing 4 | 5 | ## 🧪Tutorial: https://youtu.be/qtKK7qOGMuE?si=OclWCzs1B8bO5j0V 6 | 7 | Welcome to the Docker Tutorials and Projects repository! This repository contains code and resources related to a comprehensive Docker tutorial video. The video covers all the essential areas you need to know before using Docker, including hands-on projects to solidify your understanding. 8 | 9 | ## Table of Contents 10 | 11 | 1. [Introduction to Docker](#introduction-to-docker) 12 | 2. [Download and Install Docker](#download-and-install-docker) 13 | 3. [Docker Images](#docker-images) 14 | 4. [Docker Containers](#docker-containers) 15 | 5. [Parent/Base Images](#parentbase-images) 16 | 6. [Docker Hub](#docker-hub) 17 | 7. [Containerizing a JavaScript Application](#containerizing-a-javascript-application) 18 | 8. [Docker Volumes](#docker-volumes) 19 | 9. [Docker Compose](#docker-compose) 20 | 10. [Projects](#projects) 21 | - [Containerizing a React Frontend App](#containerizing-a-react-frontend-app) 22 | - [Dockerizing a Node Backend App](#dockerizing-a-node-backend-app) 23 | - [Containerizing a Full-Stack MERN Application](#containerizing-a-full-stack-mern-application) 24 | 25 | ## Introduction to Docker 26 | 27 | Docker is a platform designed to help developers build, share, and run modern applications. Docker containers enable you to package applications and their dependencies into a standardized unit for software development. 28 | 29 | ## Download and Install Docker 30 | 31 | Follow these steps to download and install Docker on your system: 32 | 33 | 1. Visit the [Docker download page](https://www.docker.com/products/docker-desktop). 34 | 2. Select your operating system and follow the installation instructions. 35 | 3. Verify the installation by running `docker --version` in your terminal. 36 | 37 | ## Docker Images 38 | 39 | A Docker image is a lightweight, standalone, and executable software package that includes everything needed to run a piece of software, including the code, runtime, libraries, environment variables, and configuration files. 40 | 41 | ## Docker Containers 42 | 43 | A Docker container is a running instance of a Docker image. Containers are isolated from each other and the host system, ensuring that they behave the same regardless of where they are deployed. 44 | 45 | ## Parent/Base Images 46 | 47 | Parent or base images are the starting point for creating Docker images. They provide the foundation on which your application's dependencies and code are added. 48 | 49 | ## Docker Hub 50 | 51 | Docker Hub is a cloud-based repository where Docker users and partners create, test, store, and distribute container images. You can find images for various software and use them as the basis for your own containers. 52 | 53 | ## Containerizing a JavaScript Application 54 | 55 | Learn how to containerize a simple JavaScript application by following the steps in the tutorial. 56 | 57 | ## Docker Volumes 58 | 59 | Docker volumes are used to persist data generated and used by Docker containers. They are the preferred way to manage data in Docker. 60 | 61 | ## Docker Compose 62 | 63 | Docker Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services, and then create and start all the services from your configuration with a single command. 64 | 65 | ## Projects 66 | 67 | ### Containerizing a React Frontend App 68 | 69 | This project demonstrates how to containerize a React frontend application. Follow the steps in the tutorial to build and run the container. 70 | 71 | ### Dockerizing a Node Backend App 72 | 73 | This project demonstrates how to dockerize a Node backend application. Follow the steps in the tutorial to build and run the container. 74 | 75 | ### Containerizing a Full-Stack MERN Application 76 | 77 | This project demonstrates how to containerize a full-stack MERN (MongoDB, Express, React, Node) application. Follow the steps in the tutorial to build and run the container. 78 | 79 | ## Getting Started 80 | 81 | 1. Clone the repository: 82 | ```bash 83 | git clone https://github.com/HGSChandeepa/Docker-Full-Tutorial-Codes-and-Notes 84 | cd Docker-Full-Tutorial-Codes-and-Notes 85 | ``` 86 | 87 | 2. Follow the instructions in each project's directory to build and run the Docker containers. 88 | 89 | ## Contributing 90 | 91 | Feel free to submit issues or pull requests if you have any improvements or suggestions. 92 | 93 | ## License 94 | 95 | This repository is licensed under the MIT License. 96 | -------------------------------------------------------------------------------- /Containerize Simple JavaScript Application/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sample-node-app", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "sample-node-app", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "nodemon": "^3.1.4" 13 | } 14 | }, 15 | "node_modules/anymatch": { 16 | "version": "3.1.3", 17 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 18 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 19 | "dependencies": { 20 | "normalize-path": "^3.0.0", 21 | "picomatch": "^2.0.4" 22 | }, 23 | "engines": { 24 | "node": ">= 8" 25 | } 26 | }, 27 | "node_modules/balanced-match": { 28 | "version": "1.0.2", 29 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 30 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 31 | }, 32 | "node_modules/binary-extensions": { 33 | "version": "2.3.0", 34 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 35 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 36 | "engines": { 37 | "node": ">=8" 38 | }, 39 | "funding": { 40 | "url": "https://github.com/sponsors/sindresorhus" 41 | } 42 | }, 43 | "node_modules/brace-expansion": { 44 | "version": "1.1.11", 45 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 46 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 47 | "dependencies": { 48 | "balanced-match": "^1.0.0", 49 | "concat-map": "0.0.1" 50 | } 51 | }, 52 | "node_modules/braces": { 53 | "version": "3.0.3", 54 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 55 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 56 | "dependencies": { 57 | "fill-range": "^7.1.1" 58 | }, 59 | "engines": { 60 | "node": ">=8" 61 | } 62 | }, 63 | "node_modules/chokidar": { 64 | "version": "3.6.0", 65 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 66 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 67 | "dependencies": { 68 | "anymatch": "~3.1.2", 69 | "braces": "~3.0.2", 70 | "glob-parent": "~5.1.2", 71 | "is-binary-path": "~2.1.0", 72 | "is-glob": "~4.0.1", 73 | "normalize-path": "~3.0.0", 74 | "readdirp": "~3.6.0" 75 | }, 76 | "engines": { 77 | "node": ">= 8.10.0" 78 | }, 79 | "funding": { 80 | "url": "https://paulmillr.com/funding/" 81 | }, 82 | "optionalDependencies": { 83 | "fsevents": "~2.3.2" 84 | } 85 | }, 86 | "node_modules/concat-map": { 87 | "version": "0.0.1", 88 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 89 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 90 | }, 91 | "node_modules/debug": { 92 | "version": "4.3.5", 93 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 94 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 95 | "dependencies": { 96 | "ms": "2.1.2" 97 | }, 98 | "engines": { 99 | "node": ">=6.0" 100 | }, 101 | "peerDependenciesMeta": { 102 | "supports-color": { 103 | "optional": true 104 | } 105 | } 106 | }, 107 | "node_modules/fill-range": { 108 | "version": "7.1.1", 109 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 110 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 111 | "dependencies": { 112 | "to-regex-range": "^5.0.1" 113 | }, 114 | "engines": { 115 | "node": ">=8" 116 | } 117 | }, 118 | "node_modules/fsevents": { 119 | "version": "2.3.3", 120 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 121 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 122 | "hasInstallScript": true, 123 | "optional": true, 124 | "os": [ 125 | "darwin" 126 | ], 127 | "engines": { 128 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 129 | } 130 | }, 131 | "node_modules/glob-parent": { 132 | "version": "5.1.2", 133 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 134 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 135 | "dependencies": { 136 | "is-glob": "^4.0.1" 137 | }, 138 | "engines": { 139 | "node": ">= 6" 140 | } 141 | }, 142 | "node_modules/has-flag": { 143 | "version": "3.0.0", 144 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 145 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 146 | "engines": { 147 | "node": ">=4" 148 | } 149 | }, 150 | "node_modules/ignore-by-default": { 151 | "version": "1.0.1", 152 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 153 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" 154 | }, 155 | "node_modules/is-binary-path": { 156 | "version": "2.1.0", 157 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 158 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 159 | "dependencies": { 160 | "binary-extensions": "^2.0.0" 161 | }, 162 | "engines": { 163 | "node": ">=8" 164 | } 165 | }, 166 | "node_modules/is-extglob": { 167 | "version": "2.1.1", 168 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 169 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 170 | "engines": { 171 | "node": ">=0.10.0" 172 | } 173 | }, 174 | "node_modules/is-glob": { 175 | "version": "4.0.3", 176 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 177 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 178 | "dependencies": { 179 | "is-extglob": "^2.1.1" 180 | }, 181 | "engines": { 182 | "node": ">=0.10.0" 183 | } 184 | }, 185 | "node_modules/is-number": { 186 | "version": "7.0.0", 187 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 188 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 189 | "engines": { 190 | "node": ">=0.12.0" 191 | } 192 | }, 193 | "node_modules/minimatch": { 194 | "version": "3.1.2", 195 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 196 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 197 | "dependencies": { 198 | "brace-expansion": "^1.1.7" 199 | }, 200 | "engines": { 201 | "node": "*" 202 | } 203 | }, 204 | "node_modules/ms": { 205 | "version": "2.1.2", 206 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 207 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 208 | }, 209 | "node_modules/nodemon": { 210 | "version": "3.1.4", 211 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", 212 | "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", 213 | "dependencies": { 214 | "chokidar": "^3.5.2", 215 | "debug": "^4", 216 | "ignore-by-default": "^1.0.1", 217 | "minimatch": "^3.1.2", 218 | "pstree.remy": "^1.1.8", 219 | "semver": "^7.5.3", 220 | "simple-update-notifier": "^2.0.0", 221 | "supports-color": "^5.5.0", 222 | "touch": "^3.1.0", 223 | "undefsafe": "^2.0.5" 224 | }, 225 | "bin": { 226 | "nodemon": "bin/nodemon.js" 227 | }, 228 | "engines": { 229 | "node": ">=10" 230 | }, 231 | "funding": { 232 | "type": "opencollective", 233 | "url": "https://opencollective.com/nodemon" 234 | } 235 | }, 236 | "node_modules/normalize-path": { 237 | "version": "3.0.0", 238 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 239 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 240 | "engines": { 241 | "node": ">=0.10.0" 242 | } 243 | }, 244 | "node_modules/picomatch": { 245 | "version": "2.3.1", 246 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 247 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 248 | "engines": { 249 | "node": ">=8.6" 250 | }, 251 | "funding": { 252 | "url": "https://github.com/sponsors/jonschlinkert" 253 | } 254 | }, 255 | "node_modules/pstree.remy": { 256 | "version": "1.1.8", 257 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 258 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" 259 | }, 260 | "node_modules/readdirp": { 261 | "version": "3.6.0", 262 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 263 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 264 | "dependencies": { 265 | "picomatch": "^2.2.1" 266 | }, 267 | "engines": { 268 | "node": ">=8.10.0" 269 | } 270 | }, 271 | "node_modules/semver": { 272 | "version": "7.6.2", 273 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", 274 | "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", 275 | "bin": { 276 | "semver": "bin/semver.js" 277 | }, 278 | "engines": { 279 | "node": ">=10" 280 | } 281 | }, 282 | "node_modules/simple-update-notifier": { 283 | "version": "2.0.0", 284 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 285 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 286 | "dependencies": { 287 | "semver": "^7.5.3" 288 | }, 289 | "engines": { 290 | "node": ">=10" 291 | } 292 | }, 293 | "node_modules/supports-color": { 294 | "version": "5.5.0", 295 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 296 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 297 | "dependencies": { 298 | "has-flag": "^3.0.0" 299 | }, 300 | "engines": { 301 | "node": ">=4" 302 | } 303 | }, 304 | "node_modules/to-regex-range": { 305 | "version": "5.0.1", 306 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 307 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 308 | "dependencies": { 309 | "is-number": "^7.0.0" 310 | }, 311 | "engines": { 312 | "node": ">=8.0" 313 | } 314 | }, 315 | "node_modules/touch": { 316 | "version": "3.1.1", 317 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", 318 | "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", 319 | "bin": { 320 | "nodetouch": "bin/nodetouch.js" 321 | } 322 | }, 323 | "node_modules/undefsafe": { 324 | "version": "2.0.5", 325 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 326 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" 327 | } 328 | } 329 | } 330 | -------------------------------------------------------------------------------- /Containerize MERN Application/api/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "api", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "cors": "^2.8.5", 13 | "dotenv": "^16.4.5", 14 | "express": "^4.19.2", 15 | "mongoose": "^8.4.3" 16 | } 17 | }, 18 | "node_modules/@mongodb-js/saslprep": { 19 | "version": "1.1.7", 20 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.7.tgz", 21 | "integrity": "sha512-dCHW/oEX0KJ4NjDULBo3JiOaK5+6axtpBbS+ao2ZInoAL9/YRQLhXzSNAFz7hP4nzLkIqsfYAK/PDE3+XHny0Q==", 22 | "dependencies": { 23 | "sparse-bitfield": "^3.0.3" 24 | } 25 | }, 26 | "node_modules/@types/webidl-conversions": { 27 | "version": "7.0.3", 28 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", 29 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==" 30 | }, 31 | "node_modules/@types/whatwg-url": { 32 | "version": "11.0.5", 33 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz", 34 | "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==", 35 | "dependencies": { 36 | "@types/webidl-conversions": "*" 37 | } 38 | }, 39 | "node_modules/accepts": { 40 | "version": "1.3.8", 41 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 42 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 43 | "dependencies": { 44 | "mime-types": "~2.1.34", 45 | "negotiator": "0.6.3" 46 | }, 47 | "engines": { 48 | "node": ">= 0.6" 49 | } 50 | }, 51 | "node_modules/array-flatten": { 52 | "version": "1.1.1", 53 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 54 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 55 | }, 56 | "node_modules/body-parser": { 57 | "version": "1.20.2", 58 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 59 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 60 | "dependencies": { 61 | "bytes": "3.1.2", 62 | "content-type": "~1.0.5", 63 | "debug": "2.6.9", 64 | "depd": "2.0.0", 65 | "destroy": "1.2.0", 66 | "http-errors": "2.0.0", 67 | "iconv-lite": "0.4.24", 68 | "on-finished": "2.4.1", 69 | "qs": "6.11.0", 70 | "raw-body": "2.5.2", 71 | "type-is": "~1.6.18", 72 | "unpipe": "1.0.0" 73 | }, 74 | "engines": { 75 | "node": ">= 0.8", 76 | "npm": "1.2.8000 || >= 1.4.16" 77 | } 78 | }, 79 | "node_modules/bson": { 80 | "version": "6.7.0", 81 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.7.0.tgz", 82 | "integrity": "sha512-w2IquM5mYzYZv6rs3uN2DZTOBe2a0zXLj53TGDqwF4l6Sz/XsISrisXOJihArF9+BZ6Cq/GjVht7Sjfmri7ytQ==", 83 | "engines": { 84 | "node": ">=16.20.1" 85 | } 86 | }, 87 | "node_modules/bytes": { 88 | "version": "3.1.2", 89 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 90 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 91 | "engines": { 92 | "node": ">= 0.8" 93 | } 94 | }, 95 | "node_modules/call-bind": { 96 | "version": "1.0.7", 97 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 98 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 99 | "dependencies": { 100 | "es-define-property": "^1.0.0", 101 | "es-errors": "^1.3.0", 102 | "function-bind": "^1.1.2", 103 | "get-intrinsic": "^1.2.4", 104 | "set-function-length": "^1.2.1" 105 | }, 106 | "engines": { 107 | "node": ">= 0.4" 108 | }, 109 | "funding": { 110 | "url": "https://github.com/sponsors/ljharb" 111 | } 112 | }, 113 | "node_modules/content-disposition": { 114 | "version": "0.5.4", 115 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 116 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 117 | "dependencies": { 118 | "safe-buffer": "5.2.1" 119 | }, 120 | "engines": { 121 | "node": ">= 0.6" 122 | } 123 | }, 124 | "node_modules/content-type": { 125 | "version": "1.0.5", 126 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 127 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 128 | "engines": { 129 | "node": ">= 0.6" 130 | } 131 | }, 132 | "node_modules/cookie": { 133 | "version": "0.6.0", 134 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 135 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 136 | "engines": { 137 | "node": ">= 0.6" 138 | } 139 | }, 140 | "node_modules/cookie-signature": { 141 | "version": "1.0.6", 142 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 143 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 144 | }, 145 | "node_modules/cors": { 146 | "version": "2.8.5", 147 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 148 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 149 | "dependencies": { 150 | "object-assign": "^4", 151 | "vary": "^1" 152 | }, 153 | "engines": { 154 | "node": ">= 0.10" 155 | } 156 | }, 157 | "node_modules/debug": { 158 | "version": "2.6.9", 159 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 160 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 161 | "dependencies": { 162 | "ms": "2.0.0" 163 | } 164 | }, 165 | "node_modules/define-data-property": { 166 | "version": "1.1.4", 167 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 168 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 169 | "dependencies": { 170 | "es-define-property": "^1.0.0", 171 | "es-errors": "^1.3.0", 172 | "gopd": "^1.0.1" 173 | }, 174 | "engines": { 175 | "node": ">= 0.4" 176 | }, 177 | "funding": { 178 | "url": "https://github.com/sponsors/ljharb" 179 | } 180 | }, 181 | "node_modules/depd": { 182 | "version": "2.0.0", 183 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 184 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 185 | "engines": { 186 | "node": ">= 0.8" 187 | } 188 | }, 189 | "node_modules/destroy": { 190 | "version": "1.2.0", 191 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 192 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 193 | "engines": { 194 | "node": ">= 0.8", 195 | "npm": "1.2.8000 || >= 1.4.16" 196 | } 197 | }, 198 | "node_modules/dotenv": { 199 | "version": "16.4.5", 200 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 201 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 202 | "engines": { 203 | "node": ">=12" 204 | }, 205 | "funding": { 206 | "url": "https://dotenvx.com" 207 | } 208 | }, 209 | "node_modules/ee-first": { 210 | "version": "1.1.1", 211 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 212 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 213 | }, 214 | "node_modules/encodeurl": { 215 | "version": "1.0.2", 216 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 217 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 218 | "engines": { 219 | "node": ">= 0.8" 220 | } 221 | }, 222 | "node_modules/es-define-property": { 223 | "version": "1.0.0", 224 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 225 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 226 | "dependencies": { 227 | "get-intrinsic": "^1.2.4" 228 | }, 229 | "engines": { 230 | "node": ">= 0.4" 231 | } 232 | }, 233 | "node_modules/es-errors": { 234 | "version": "1.3.0", 235 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 236 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 237 | "engines": { 238 | "node": ">= 0.4" 239 | } 240 | }, 241 | "node_modules/escape-html": { 242 | "version": "1.0.3", 243 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 244 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 245 | }, 246 | "node_modules/etag": { 247 | "version": "1.8.1", 248 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 249 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 250 | "engines": { 251 | "node": ">= 0.6" 252 | } 253 | }, 254 | "node_modules/express": { 255 | "version": "4.19.2", 256 | "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", 257 | "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", 258 | "dependencies": { 259 | "accepts": "~1.3.8", 260 | "array-flatten": "1.1.1", 261 | "body-parser": "1.20.2", 262 | "content-disposition": "0.5.4", 263 | "content-type": "~1.0.4", 264 | "cookie": "0.6.0", 265 | "cookie-signature": "1.0.6", 266 | "debug": "2.6.9", 267 | "depd": "2.0.0", 268 | "encodeurl": "~1.0.2", 269 | "escape-html": "~1.0.3", 270 | "etag": "~1.8.1", 271 | "finalhandler": "1.2.0", 272 | "fresh": "0.5.2", 273 | "http-errors": "2.0.0", 274 | "merge-descriptors": "1.0.1", 275 | "methods": "~1.1.2", 276 | "on-finished": "2.4.1", 277 | "parseurl": "~1.3.3", 278 | "path-to-regexp": "0.1.7", 279 | "proxy-addr": "~2.0.7", 280 | "qs": "6.11.0", 281 | "range-parser": "~1.2.1", 282 | "safe-buffer": "5.2.1", 283 | "send": "0.18.0", 284 | "serve-static": "1.15.0", 285 | "setprototypeof": "1.2.0", 286 | "statuses": "2.0.1", 287 | "type-is": "~1.6.18", 288 | "utils-merge": "1.0.1", 289 | "vary": "~1.1.2" 290 | }, 291 | "engines": { 292 | "node": ">= 0.10.0" 293 | } 294 | }, 295 | "node_modules/finalhandler": { 296 | "version": "1.2.0", 297 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 298 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 299 | "dependencies": { 300 | "debug": "2.6.9", 301 | "encodeurl": "~1.0.2", 302 | "escape-html": "~1.0.3", 303 | "on-finished": "2.4.1", 304 | "parseurl": "~1.3.3", 305 | "statuses": "2.0.1", 306 | "unpipe": "~1.0.0" 307 | }, 308 | "engines": { 309 | "node": ">= 0.8" 310 | } 311 | }, 312 | "node_modules/forwarded": { 313 | "version": "0.2.0", 314 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 315 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 316 | "engines": { 317 | "node": ">= 0.6" 318 | } 319 | }, 320 | "node_modules/fresh": { 321 | "version": "0.5.2", 322 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 323 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 324 | "engines": { 325 | "node": ">= 0.6" 326 | } 327 | }, 328 | "node_modules/function-bind": { 329 | "version": "1.1.2", 330 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 331 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 332 | "funding": { 333 | "url": "https://github.com/sponsors/ljharb" 334 | } 335 | }, 336 | "node_modules/get-intrinsic": { 337 | "version": "1.2.4", 338 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 339 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 340 | "dependencies": { 341 | "es-errors": "^1.3.0", 342 | "function-bind": "^1.1.2", 343 | "has-proto": "^1.0.1", 344 | "has-symbols": "^1.0.3", 345 | "hasown": "^2.0.0" 346 | }, 347 | "engines": { 348 | "node": ">= 0.4" 349 | }, 350 | "funding": { 351 | "url": "https://github.com/sponsors/ljharb" 352 | } 353 | }, 354 | "node_modules/gopd": { 355 | "version": "1.0.1", 356 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 357 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 358 | "dependencies": { 359 | "get-intrinsic": "^1.1.3" 360 | }, 361 | "funding": { 362 | "url": "https://github.com/sponsors/ljharb" 363 | } 364 | }, 365 | "node_modules/has-property-descriptors": { 366 | "version": "1.0.2", 367 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 368 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 369 | "dependencies": { 370 | "es-define-property": "^1.0.0" 371 | }, 372 | "funding": { 373 | "url": "https://github.com/sponsors/ljharb" 374 | } 375 | }, 376 | "node_modules/has-proto": { 377 | "version": "1.0.3", 378 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 379 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 380 | "engines": { 381 | "node": ">= 0.4" 382 | }, 383 | "funding": { 384 | "url": "https://github.com/sponsors/ljharb" 385 | } 386 | }, 387 | "node_modules/has-symbols": { 388 | "version": "1.0.3", 389 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 390 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 391 | "engines": { 392 | "node": ">= 0.4" 393 | }, 394 | "funding": { 395 | "url": "https://github.com/sponsors/ljharb" 396 | } 397 | }, 398 | "node_modules/hasown": { 399 | "version": "2.0.2", 400 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 401 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 402 | "dependencies": { 403 | "function-bind": "^1.1.2" 404 | }, 405 | "engines": { 406 | "node": ">= 0.4" 407 | } 408 | }, 409 | "node_modules/http-errors": { 410 | "version": "2.0.0", 411 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 412 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 413 | "dependencies": { 414 | "depd": "2.0.0", 415 | "inherits": "2.0.4", 416 | "setprototypeof": "1.2.0", 417 | "statuses": "2.0.1", 418 | "toidentifier": "1.0.1" 419 | }, 420 | "engines": { 421 | "node": ">= 0.8" 422 | } 423 | }, 424 | "node_modules/iconv-lite": { 425 | "version": "0.4.24", 426 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 427 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 428 | "dependencies": { 429 | "safer-buffer": ">= 2.1.2 < 3" 430 | }, 431 | "engines": { 432 | "node": ">=0.10.0" 433 | } 434 | }, 435 | "node_modules/inherits": { 436 | "version": "2.0.4", 437 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 438 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 439 | }, 440 | "node_modules/ipaddr.js": { 441 | "version": "1.9.1", 442 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 443 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 444 | "engines": { 445 | "node": ">= 0.10" 446 | } 447 | }, 448 | "node_modules/kareem": { 449 | "version": "2.6.3", 450 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", 451 | "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==", 452 | "engines": { 453 | "node": ">=12.0.0" 454 | } 455 | }, 456 | "node_modules/media-typer": { 457 | "version": "0.3.0", 458 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 459 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 460 | "engines": { 461 | "node": ">= 0.6" 462 | } 463 | }, 464 | "node_modules/memory-pager": { 465 | "version": "1.5.0", 466 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", 467 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==" 468 | }, 469 | "node_modules/merge-descriptors": { 470 | "version": "1.0.1", 471 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 472 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 473 | }, 474 | "node_modules/methods": { 475 | "version": "1.1.2", 476 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 477 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 478 | "engines": { 479 | "node": ">= 0.6" 480 | } 481 | }, 482 | "node_modules/mime": { 483 | "version": "1.6.0", 484 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 485 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 486 | "bin": { 487 | "mime": "cli.js" 488 | }, 489 | "engines": { 490 | "node": ">=4" 491 | } 492 | }, 493 | "node_modules/mime-db": { 494 | "version": "1.52.0", 495 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 496 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 497 | "engines": { 498 | "node": ">= 0.6" 499 | } 500 | }, 501 | "node_modules/mime-types": { 502 | "version": "2.1.35", 503 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 504 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 505 | "dependencies": { 506 | "mime-db": "1.52.0" 507 | }, 508 | "engines": { 509 | "node": ">= 0.6" 510 | } 511 | }, 512 | "node_modules/mongodb": { 513 | "version": "6.6.2", 514 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.6.2.tgz", 515 | "integrity": "sha512-ZF9Ugo2JCG/GfR7DEb4ypfyJJyiKbg5qBYKRintebj8+DNS33CyGMkWbrS9lara+u+h+yEOGSRiLhFO/g1s1aw==", 516 | "dependencies": { 517 | "@mongodb-js/saslprep": "^1.1.5", 518 | "bson": "^6.7.0", 519 | "mongodb-connection-string-url": "^3.0.0" 520 | }, 521 | "engines": { 522 | "node": ">=16.20.1" 523 | }, 524 | "peerDependencies": { 525 | "@aws-sdk/credential-providers": "^3.188.0", 526 | "@mongodb-js/zstd": "^1.1.0", 527 | "gcp-metadata": "^5.2.0", 528 | "kerberos": "^2.0.1", 529 | "mongodb-client-encryption": ">=6.0.0 <7", 530 | "snappy": "^7.2.2", 531 | "socks": "^2.7.1" 532 | }, 533 | "peerDependenciesMeta": { 534 | "@aws-sdk/credential-providers": { 535 | "optional": true 536 | }, 537 | "@mongodb-js/zstd": { 538 | "optional": true 539 | }, 540 | "gcp-metadata": { 541 | "optional": true 542 | }, 543 | "kerberos": { 544 | "optional": true 545 | }, 546 | "mongodb-client-encryption": { 547 | "optional": true 548 | }, 549 | "snappy": { 550 | "optional": true 551 | }, 552 | "socks": { 553 | "optional": true 554 | } 555 | } 556 | }, 557 | "node_modules/mongodb-connection-string-url": { 558 | "version": "3.0.1", 559 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.1.tgz", 560 | "integrity": "sha512-XqMGwRX0Lgn05TDB4PyG2h2kKO/FfWJyCzYQbIhXUxz7ETt0I/FqHjUeqj37irJ+Dl1ZtU82uYyj14u2XsZKfg==", 561 | "dependencies": { 562 | "@types/whatwg-url": "^11.0.2", 563 | "whatwg-url": "^13.0.0" 564 | } 565 | }, 566 | "node_modules/mongoose": { 567 | "version": "8.4.3", 568 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.4.3.tgz", 569 | "integrity": "sha512-GxPVLD+I/dxVkgcts2r2QmJJvS62/++btVj3RFt8YnHt+DSOp1Qjj62YEvgZaElwIOTcc4KGJM95X5LlrU1qQg==", 570 | "dependencies": { 571 | "bson": "^6.7.0", 572 | "kareem": "2.6.3", 573 | "mongodb": "6.6.2", 574 | "mpath": "0.9.0", 575 | "mquery": "5.0.0", 576 | "ms": "2.1.3", 577 | "sift": "17.1.3" 578 | }, 579 | "engines": { 580 | "node": ">=16.20.1" 581 | }, 582 | "funding": { 583 | "type": "opencollective", 584 | "url": "https://opencollective.com/mongoose" 585 | } 586 | }, 587 | "node_modules/mongoose/node_modules/ms": { 588 | "version": "2.1.3", 589 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 590 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 591 | }, 592 | "node_modules/mpath": { 593 | "version": "0.9.0", 594 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", 595 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", 596 | "engines": { 597 | "node": ">=4.0.0" 598 | } 599 | }, 600 | "node_modules/mquery": { 601 | "version": "5.0.0", 602 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz", 603 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==", 604 | "dependencies": { 605 | "debug": "4.x" 606 | }, 607 | "engines": { 608 | "node": ">=14.0.0" 609 | } 610 | }, 611 | "node_modules/mquery/node_modules/debug": { 612 | "version": "4.3.5", 613 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 614 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 615 | "dependencies": { 616 | "ms": "2.1.2" 617 | }, 618 | "engines": { 619 | "node": ">=6.0" 620 | }, 621 | "peerDependenciesMeta": { 622 | "supports-color": { 623 | "optional": true 624 | } 625 | } 626 | }, 627 | "node_modules/mquery/node_modules/ms": { 628 | "version": "2.1.2", 629 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 630 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 631 | }, 632 | "node_modules/ms": { 633 | "version": "2.0.0", 634 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 635 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 636 | }, 637 | "node_modules/negotiator": { 638 | "version": "0.6.3", 639 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 640 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 641 | "engines": { 642 | "node": ">= 0.6" 643 | } 644 | }, 645 | "node_modules/object-assign": { 646 | "version": "4.1.1", 647 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 648 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 649 | "engines": { 650 | "node": ">=0.10.0" 651 | } 652 | }, 653 | "node_modules/object-inspect": { 654 | "version": "1.13.1", 655 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", 656 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", 657 | "funding": { 658 | "url": "https://github.com/sponsors/ljharb" 659 | } 660 | }, 661 | "node_modules/on-finished": { 662 | "version": "2.4.1", 663 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 664 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 665 | "dependencies": { 666 | "ee-first": "1.1.1" 667 | }, 668 | "engines": { 669 | "node": ">= 0.8" 670 | } 671 | }, 672 | "node_modules/parseurl": { 673 | "version": "1.3.3", 674 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 675 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 676 | "engines": { 677 | "node": ">= 0.8" 678 | } 679 | }, 680 | "node_modules/path-to-regexp": { 681 | "version": "0.1.7", 682 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 683 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 684 | }, 685 | "node_modules/proxy-addr": { 686 | "version": "2.0.7", 687 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 688 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 689 | "dependencies": { 690 | "forwarded": "0.2.0", 691 | "ipaddr.js": "1.9.1" 692 | }, 693 | "engines": { 694 | "node": ">= 0.10" 695 | } 696 | }, 697 | "node_modules/punycode": { 698 | "version": "2.3.1", 699 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 700 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 701 | "engines": { 702 | "node": ">=6" 703 | } 704 | }, 705 | "node_modules/qs": { 706 | "version": "6.11.0", 707 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 708 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 709 | "dependencies": { 710 | "side-channel": "^1.0.4" 711 | }, 712 | "engines": { 713 | "node": ">=0.6" 714 | }, 715 | "funding": { 716 | "url": "https://github.com/sponsors/ljharb" 717 | } 718 | }, 719 | "node_modules/range-parser": { 720 | "version": "1.2.1", 721 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 722 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 723 | "engines": { 724 | "node": ">= 0.6" 725 | } 726 | }, 727 | "node_modules/raw-body": { 728 | "version": "2.5.2", 729 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 730 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 731 | "dependencies": { 732 | "bytes": "3.1.2", 733 | "http-errors": "2.0.0", 734 | "iconv-lite": "0.4.24", 735 | "unpipe": "1.0.0" 736 | }, 737 | "engines": { 738 | "node": ">= 0.8" 739 | } 740 | }, 741 | "node_modules/safe-buffer": { 742 | "version": "5.2.1", 743 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 744 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 745 | "funding": [ 746 | { 747 | "type": "github", 748 | "url": "https://github.com/sponsors/feross" 749 | }, 750 | { 751 | "type": "patreon", 752 | "url": "https://www.patreon.com/feross" 753 | }, 754 | { 755 | "type": "consulting", 756 | "url": "https://feross.org/support" 757 | } 758 | ] 759 | }, 760 | "node_modules/safer-buffer": { 761 | "version": "2.1.2", 762 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 763 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 764 | }, 765 | "node_modules/send": { 766 | "version": "0.18.0", 767 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 768 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 769 | "dependencies": { 770 | "debug": "2.6.9", 771 | "depd": "2.0.0", 772 | "destroy": "1.2.0", 773 | "encodeurl": "~1.0.2", 774 | "escape-html": "~1.0.3", 775 | "etag": "~1.8.1", 776 | "fresh": "0.5.2", 777 | "http-errors": "2.0.0", 778 | "mime": "1.6.0", 779 | "ms": "2.1.3", 780 | "on-finished": "2.4.1", 781 | "range-parser": "~1.2.1", 782 | "statuses": "2.0.1" 783 | }, 784 | "engines": { 785 | "node": ">= 0.8.0" 786 | } 787 | }, 788 | "node_modules/send/node_modules/ms": { 789 | "version": "2.1.3", 790 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 791 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 792 | }, 793 | "node_modules/serve-static": { 794 | "version": "1.15.0", 795 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 796 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 797 | "dependencies": { 798 | "encodeurl": "~1.0.2", 799 | "escape-html": "~1.0.3", 800 | "parseurl": "~1.3.3", 801 | "send": "0.18.0" 802 | }, 803 | "engines": { 804 | "node": ">= 0.8.0" 805 | } 806 | }, 807 | "node_modules/set-function-length": { 808 | "version": "1.2.2", 809 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 810 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 811 | "dependencies": { 812 | "define-data-property": "^1.1.4", 813 | "es-errors": "^1.3.0", 814 | "function-bind": "^1.1.2", 815 | "get-intrinsic": "^1.2.4", 816 | "gopd": "^1.0.1", 817 | "has-property-descriptors": "^1.0.2" 818 | }, 819 | "engines": { 820 | "node": ">= 0.4" 821 | } 822 | }, 823 | "node_modules/setprototypeof": { 824 | "version": "1.2.0", 825 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 826 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 827 | }, 828 | "node_modules/side-channel": { 829 | "version": "1.0.6", 830 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 831 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 832 | "dependencies": { 833 | "call-bind": "^1.0.7", 834 | "es-errors": "^1.3.0", 835 | "get-intrinsic": "^1.2.4", 836 | "object-inspect": "^1.13.1" 837 | }, 838 | "engines": { 839 | "node": ">= 0.4" 840 | }, 841 | "funding": { 842 | "url": "https://github.com/sponsors/ljharb" 843 | } 844 | }, 845 | "node_modules/sift": { 846 | "version": "17.1.3", 847 | "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", 848 | "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==" 849 | }, 850 | "node_modules/sparse-bitfield": { 851 | "version": "3.0.3", 852 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", 853 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", 854 | "dependencies": { 855 | "memory-pager": "^1.0.2" 856 | } 857 | }, 858 | "node_modules/statuses": { 859 | "version": "2.0.1", 860 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 861 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 862 | "engines": { 863 | "node": ">= 0.8" 864 | } 865 | }, 866 | "node_modules/toidentifier": { 867 | "version": "1.0.1", 868 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 869 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 870 | "engines": { 871 | "node": ">=0.6" 872 | } 873 | }, 874 | "node_modules/tr46": { 875 | "version": "4.1.1", 876 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", 877 | "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", 878 | "dependencies": { 879 | "punycode": "^2.3.0" 880 | }, 881 | "engines": { 882 | "node": ">=14" 883 | } 884 | }, 885 | "node_modules/type-is": { 886 | "version": "1.6.18", 887 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 888 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 889 | "dependencies": { 890 | "media-typer": "0.3.0", 891 | "mime-types": "~2.1.24" 892 | }, 893 | "engines": { 894 | "node": ">= 0.6" 895 | } 896 | }, 897 | "node_modules/unpipe": { 898 | "version": "1.0.0", 899 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 900 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 901 | "engines": { 902 | "node": ">= 0.8" 903 | } 904 | }, 905 | "node_modules/utils-merge": { 906 | "version": "1.0.1", 907 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 908 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 909 | "engines": { 910 | "node": ">= 0.4.0" 911 | } 912 | }, 913 | "node_modules/vary": { 914 | "version": "1.1.2", 915 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 916 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 917 | "engines": { 918 | "node": ">= 0.8" 919 | } 920 | }, 921 | "node_modules/webidl-conversions": { 922 | "version": "7.0.0", 923 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", 924 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", 925 | "engines": { 926 | "node": ">=12" 927 | } 928 | }, 929 | "node_modules/whatwg-url": { 930 | "version": "13.0.0", 931 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-13.0.0.tgz", 932 | "integrity": "sha512-9WWbymnqj57+XEuqADHrCJ2eSXzn8WXIW/YSGaZtb2WKAInQ6CHfaUUcTyyver0p8BDg5StLQq8h1vtZuwmOig==", 933 | "dependencies": { 934 | "tr46": "^4.1.1", 935 | "webidl-conversions": "^7.0.0" 936 | }, 937 | "engines": { 938 | "node": ">=16" 939 | } 940 | } 941 | } 942 | } 943 | -------------------------------------------------------------------------------- /Containerize Node Application/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docker_node_tutorial", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "docker_node_tutorial", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "dotenv": "^16.4.5", 13 | "express": "^4.19.2", 14 | "nodemon": "^3.1.4" 15 | } 16 | }, 17 | "node_modules/accepts": { 18 | "version": "1.3.8", 19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 20 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 21 | "dependencies": { 22 | "mime-types": "~2.1.34", 23 | "negotiator": "0.6.3" 24 | }, 25 | "engines": { 26 | "node": ">= 0.6" 27 | } 28 | }, 29 | "node_modules/anymatch": { 30 | "version": "3.1.3", 31 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 32 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 33 | "dependencies": { 34 | "normalize-path": "^3.0.0", 35 | "picomatch": "^2.0.4" 36 | }, 37 | "engines": { 38 | "node": ">= 8" 39 | } 40 | }, 41 | "node_modules/array-flatten": { 42 | "version": "1.1.1", 43 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 44 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 45 | }, 46 | "node_modules/balanced-match": { 47 | "version": "1.0.2", 48 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 49 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 50 | }, 51 | "node_modules/binary-extensions": { 52 | "version": "2.3.0", 53 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 54 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 55 | "engines": { 56 | "node": ">=8" 57 | }, 58 | "funding": { 59 | "url": "https://github.com/sponsors/sindresorhus" 60 | } 61 | }, 62 | "node_modules/body-parser": { 63 | "version": "1.20.2", 64 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", 65 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", 66 | "dependencies": { 67 | "bytes": "3.1.2", 68 | "content-type": "~1.0.5", 69 | "debug": "2.6.9", 70 | "depd": "2.0.0", 71 | "destroy": "1.2.0", 72 | "http-errors": "2.0.0", 73 | "iconv-lite": "0.4.24", 74 | "on-finished": "2.4.1", 75 | "qs": "6.11.0", 76 | "raw-body": "2.5.2", 77 | "type-is": "~1.6.18", 78 | "unpipe": "1.0.0" 79 | }, 80 | "engines": { 81 | "node": ">= 0.8", 82 | "npm": "1.2.8000 || >= 1.4.16" 83 | } 84 | }, 85 | "node_modules/brace-expansion": { 86 | "version": "1.1.11", 87 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 88 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 89 | "dependencies": { 90 | "balanced-match": "^1.0.0", 91 | "concat-map": "0.0.1" 92 | } 93 | }, 94 | "node_modules/braces": { 95 | "version": "3.0.3", 96 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 97 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 98 | "dependencies": { 99 | "fill-range": "^7.1.1" 100 | }, 101 | "engines": { 102 | "node": ">=8" 103 | } 104 | }, 105 | "node_modules/bytes": { 106 | "version": "3.1.2", 107 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 108 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 109 | "engines": { 110 | "node": ">= 0.8" 111 | } 112 | }, 113 | "node_modules/call-bind": { 114 | "version": "1.0.7", 115 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 116 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 117 | "dependencies": { 118 | "es-define-property": "^1.0.0", 119 | "es-errors": "^1.3.0", 120 | "function-bind": "^1.1.2", 121 | "get-intrinsic": "^1.2.4", 122 | "set-function-length": "^1.2.1" 123 | }, 124 | "engines": { 125 | "node": ">= 0.4" 126 | }, 127 | "funding": { 128 | "url": "https://github.com/sponsors/ljharb" 129 | } 130 | }, 131 | "node_modules/chokidar": { 132 | "version": "3.6.0", 133 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 134 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 135 | "dependencies": { 136 | "anymatch": "~3.1.2", 137 | "braces": "~3.0.2", 138 | "glob-parent": "~5.1.2", 139 | "is-binary-path": "~2.1.0", 140 | "is-glob": "~4.0.1", 141 | "normalize-path": "~3.0.0", 142 | "readdirp": "~3.6.0" 143 | }, 144 | "engines": { 145 | "node": ">= 8.10.0" 146 | }, 147 | "funding": { 148 | "url": "https://paulmillr.com/funding/" 149 | }, 150 | "optionalDependencies": { 151 | "fsevents": "~2.3.2" 152 | } 153 | }, 154 | "node_modules/concat-map": { 155 | "version": "0.0.1", 156 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 157 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" 158 | }, 159 | "node_modules/content-disposition": { 160 | "version": "0.5.4", 161 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 162 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 163 | "dependencies": { 164 | "safe-buffer": "5.2.1" 165 | }, 166 | "engines": { 167 | "node": ">= 0.6" 168 | } 169 | }, 170 | "node_modules/content-type": { 171 | "version": "1.0.5", 172 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 173 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 174 | "engines": { 175 | "node": ">= 0.6" 176 | } 177 | }, 178 | "node_modules/cookie": { 179 | "version": "0.6.0", 180 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", 181 | "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", 182 | "engines": { 183 | "node": ">= 0.6" 184 | } 185 | }, 186 | "node_modules/cookie-signature": { 187 | "version": "1.0.6", 188 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 189 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 190 | }, 191 | "node_modules/debug": { 192 | "version": "2.6.9", 193 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 194 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 195 | "dependencies": { 196 | "ms": "2.0.0" 197 | } 198 | }, 199 | "node_modules/define-data-property": { 200 | "version": "1.1.4", 201 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 202 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 203 | "dependencies": { 204 | "es-define-property": "^1.0.0", 205 | "es-errors": "^1.3.0", 206 | "gopd": "^1.0.1" 207 | }, 208 | "engines": { 209 | "node": ">= 0.4" 210 | }, 211 | "funding": { 212 | "url": "https://github.com/sponsors/ljharb" 213 | } 214 | }, 215 | "node_modules/depd": { 216 | "version": "2.0.0", 217 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 218 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 219 | "engines": { 220 | "node": ">= 0.8" 221 | } 222 | }, 223 | "node_modules/destroy": { 224 | "version": "1.2.0", 225 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 226 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 227 | "engines": { 228 | "node": ">= 0.8", 229 | "npm": "1.2.8000 || >= 1.4.16" 230 | } 231 | }, 232 | "node_modules/dotenv": { 233 | "version": "16.4.5", 234 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 235 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 236 | "engines": { 237 | "node": ">=12" 238 | }, 239 | "funding": { 240 | "url": "https://dotenvx.com" 241 | } 242 | }, 243 | "node_modules/ee-first": { 244 | "version": "1.1.1", 245 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 246 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 247 | }, 248 | "node_modules/encodeurl": { 249 | "version": "1.0.2", 250 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 251 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 252 | "engines": { 253 | "node": ">= 0.8" 254 | } 255 | }, 256 | "node_modules/es-define-property": { 257 | "version": "1.0.0", 258 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 259 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 260 | "dependencies": { 261 | "get-intrinsic": "^1.2.4" 262 | }, 263 | "engines": { 264 | "node": ">= 0.4" 265 | } 266 | }, 267 | "node_modules/es-errors": { 268 | "version": "1.3.0", 269 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 270 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 271 | "engines": { 272 | "node": ">= 0.4" 273 | } 274 | }, 275 | "node_modules/escape-html": { 276 | "version": "1.0.3", 277 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 278 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 279 | }, 280 | "node_modules/etag": { 281 | "version": "1.8.1", 282 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 283 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 284 | "engines": { 285 | "node": ">= 0.6" 286 | } 287 | }, 288 | "node_modules/express": { 289 | "version": "4.19.2", 290 | "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", 291 | "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", 292 | "dependencies": { 293 | "accepts": "~1.3.8", 294 | "array-flatten": "1.1.1", 295 | "body-parser": "1.20.2", 296 | "content-disposition": "0.5.4", 297 | "content-type": "~1.0.4", 298 | "cookie": "0.6.0", 299 | "cookie-signature": "1.0.6", 300 | "debug": "2.6.9", 301 | "depd": "2.0.0", 302 | "encodeurl": "~1.0.2", 303 | "escape-html": "~1.0.3", 304 | "etag": "~1.8.1", 305 | "finalhandler": "1.2.0", 306 | "fresh": "0.5.2", 307 | "http-errors": "2.0.0", 308 | "merge-descriptors": "1.0.1", 309 | "methods": "~1.1.2", 310 | "on-finished": "2.4.1", 311 | "parseurl": "~1.3.3", 312 | "path-to-regexp": "0.1.7", 313 | "proxy-addr": "~2.0.7", 314 | "qs": "6.11.0", 315 | "range-parser": "~1.2.1", 316 | "safe-buffer": "5.2.1", 317 | "send": "0.18.0", 318 | "serve-static": "1.15.0", 319 | "setprototypeof": "1.2.0", 320 | "statuses": "2.0.1", 321 | "type-is": "~1.6.18", 322 | "utils-merge": "1.0.1", 323 | "vary": "~1.1.2" 324 | }, 325 | "engines": { 326 | "node": ">= 0.10.0" 327 | } 328 | }, 329 | "node_modules/fill-range": { 330 | "version": "7.1.1", 331 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 332 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 333 | "dependencies": { 334 | "to-regex-range": "^5.0.1" 335 | }, 336 | "engines": { 337 | "node": ">=8" 338 | } 339 | }, 340 | "node_modules/finalhandler": { 341 | "version": "1.2.0", 342 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 343 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 344 | "dependencies": { 345 | "debug": "2.6.9", 346 | "encodeurl": "~1.0.2", 347 | "escape-html": "~1.0.3", 348 | "on-finished": "2.4.1", 349 | "parseurl": "~1.3.3", 350 | "statuses": "2.0.1", 351 | "unpipe": "~1.0.0" 352 | }, 353 | "engines": { 354 | "node": ">= 0.8" 355 | } 356 | }, 357 | "node_modules/forwarded": { 358 | "version": "0.2.0", 359 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 360 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 361 | "engines": { 362 | "node": ">= 0.6" 363 | } 364 | }, 365 | "node_modules/fresh": { 366 | "version": "0.5.2", 367 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 368 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 369 | "engines": { 370 | "node": ">= 0.6" 371 | } 372 | }, 373 | "node_modules/fsevents": { 374 | "version": "2.3.3", 375 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 376 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 377 | "hasInstallScript": true, 378 | "optional": true, 379 | "os": [ 380 | "darwin" 381 | ], 382 | "engines": { 383 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 384 | } 385 | }, 386 | "node_modules/function-bind": { 387 | "version": "1.1.2", 388 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 389 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 390 | "funding": { 391 | "url": "https://github.com/sponsors/ljharb" 392 | } 393 | }, 394 | "node_modules/get-intrinsic": { 395 | "version": "1.2.4", 396 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 397 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 398 | "dependencies": { 399 | "es-errors": "^1.3.0", 400 | "function-bind": "^1.1.2", 401 | "has-proto": "^1.0.1", 402 | "has-symbols": "^1.0.3", 403 | "hasown": "^2.0.0" 404 | }, 405 | "engines": { 406 | "node": ">= 0.4" 407 | }, 408 | "funding": { 409 | "url": "https://github.com/sponsors/ljharb" 410 | } 411 | }, 412 | "node_modules/glob-parent": { 413 | "version": "5.1.2", 414 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 415 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 416 | "dependencies": { 417 | "is-glob": "^4.0.1" 418 | }, 419 | "engines": { 420 | "node": ">= 6" 421 | } 422 | }, 423 | "node_modules/gopd": { 424 | "version": "1.0.1", 425 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 426 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 427 | "dependencies": { 428 | "get-intrinsic": "^1.1.3" 429 | }, 430 | "funding": { 431 | "url": "https://github.com/sponsors/ljharb" 432 | } 433 | }, 434 | "node_modules/has-flag": { 435 | "version": "3.0.0", 436 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 437 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 438 | "engines": { 439 | "node": ">=4" 440 | } 441 | }, 442 | "node_modules/has-property-descriptors": { 443 | "version": "1.0.2", 444 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 445 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 446 | "dependencies": { 447 | "es-define-property": "^1.0.0" 448 | }, 449 | "funding": { 450 | "url": "https://github.com/sponsors/ljharb" 451 | } 452 | }, 453 | "node_modules/has-proto": { 454 | "version": "1.0.3", 455 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 456 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 457 | "engines": { 458 | "node": ">= 0.4" 459 | }, 460 | "funding": { 461 | "url": "https://github.com/sponsors/ljharb" 462 | } 463 | }, 464 | "node_modules/has-symbols": { 465 | "version": "1.0.3", 466 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 467 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 468 | "engines": { 469 | "node": ">= 0.4" 470 | }, 471 | "funding": { 472 | "url": "https://github.com/sponsors/ljharb" 473 | } 474 | }, 475 | "node_modules/hasown": { 476 | "version": "2.0.2", 477 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 478 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 479 | "dependencies": { 480 | "function-bind": "^1.1.2" 481 | }, 482 | "engines": { 483 | "node": ">= 0.4" 484 | } 485 | }, 486 | "node_modules/http-errors": { 487 | "version": "2.0.0", 488 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 489 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 490 | "dependencies": { 491 | "depd": "2.0.0", 492 | "inherits": "2.0.4", 493 | "setprototypeof": "1.2.0", 494 | "statuses": "2.0.1", 495 | "toidentifier": "1.0.1" 496 | }, 497 | "engines": { 498 | "node": ">= 0.8" 499 | } 500 | }, 501 | "node_modules/iconv-lite": { 502 | "version": "0.4.24", 503 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 504 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 505 | "dependencies": { 506 | "safer-buffer": ">= 2.1.2 < 3" 507 | }, 508 | "engines": { 509 | "node": ">=0.10.0" 510 | } 511 | }, 512 | "node_modules/ignore-by-default": { 513 | "version": "1.0.1", 514 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", 515 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==" 516 | }, 517 | "node_modules/inherits": { 518 | "version": "2.0.4", 519 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 520 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 521 | }, 522 | "node_modules/ipaddr.js": { 523 | "version": "1.9.1", 524 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 525 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 526 | "engines": { 527 | "node": ">= 0.10" 528 | } 529 | }, 530 | "node_modules/is-binary-path": { 531 | "version": "2.1.0", 532 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 533 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 534 | "dependencies": { 535 | "binary-extensions": "^2.0.0" 536 | }, 537 | "engines": { 538 | "node": ">=8" 539 | } 540 | }, 541 | "node_modules/is-extglob": { 542 | "version": "2.1.1", 543 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 544 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 545 | "engines": { 546 | "node": ">=0.10.0" 547 | } 548 | }, 549 | "node_modules/is-glob": { 550 | "version": "4.0.3", 551 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 552 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 553 | "dependencies": { 554 | "is-extglob": "^2.1.1" 555 | }, 556 | "engines": { 557 | "node": ">=0.10.0" 558 | } 559 | }, 560 | "node_modules/is-number": { 561 | "version": "7.0.0", 562 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 563 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 564 | "engines": { 565 | "node": ">=0.12.0" 566 | } 567 | }, 568 | "node_modules/media-typer": { 569 | "version": "0.3.0", 570 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 571 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 572 | "engines": { 573 | "node": ">= 0.6" 574 | } 575 | }, 576 | "node_modules/merge-descriptors": { 577 | "version": "1.0.1", 578 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 579 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 580 | }, 581 | "node_modules/methods": { 582 | "version": "1.1.2", 583 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 584 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 585 | "engines": { 586 | "node": ">= 0.6" 587 | } 588 | }, 589 | "node_modules/mime": { 590 | "version": "1.6.0", 591 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 592 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 593 | "bin": { 594 | "mime": "cli.js" 595 | }, 596 | "engines": { 597 | "node": ">=4" 598 | } 599 | }, 600 | "node_modules/mime-db": { 601 | "version": "1.52.0", 602 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 603 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 604 | "engines": { 605 | "node": ">= 0.6" 606 | } 607 | }, 608 | "node_modules/mime-types": { 609 | "version": "2.1.35", 610 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 611 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 612 | "dependencies": { 613 | "mime-db": "1.52.0" 614 | }, 615 | "engines": { 616 | "node": ">= 0.6" 617 | } 618 | }, 619 | "node_modules/minimatch": { 620 | "version": "3.1.2", 621 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 622 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 623 | "dependencies": { 624 | "brace-expansion": "^1.1.7" 625 | }, 626 | "engines": { 627 | "node": "*" 628 | } 629 | }, 630 | "node_modules/ms": { 631 | "version": "2.0.0", 632 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 633 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 634 | }, 635 | "node_modules/negotiator": { 636 | "version": "0.6.3", 637 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 638 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 639 | "engines": { 640 | "node": ">= 0.6" 641 | } 642 | }, 643 | "node_modules/nodemon": { 644 | "version": "3.1.4", 645 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz", 646 | "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==", 647 | "dependencies": { 648 | "chokidar": "^3.5.2", 649 | "debug": "^4", 650 | "ignore-by-default": "^1.0.1", 651 | "minimatch": "^3.1.2", 652 | "pstree.remy": "^1.1.8", 653 | "semver": "^7.5.3", 654 | "simple-update-notifier": "^2.0.0", 655 | "supports-color": "^5.5.0", 656 | "touch": "^3.1.0", 657 | "undefsafe": "^2.0.5" 658 | }, 659 | "bin": { 660 | "nodemon": "bin/nodemon.js" 661 | }, 662 | "engines": { 663 | "node": ">=10" 664 | }, 665 | "funding": { 666 | "type": "opencollective", 667 | "url": "https://opencollective.com/nodemon" 668 | } 669 | }, 670 | "node_modules/nodemon/node_modules/debug": { 671 | "version": "4.3.5", 672 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", 673 | "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", 674 | "dependencies": { 675 | "ms": "2.1.2" 676 | }, 677 | "engines": { 678 | "node": ">=6.0" 679 | }, 680 | "peerDependenciesMeta": { 681 | "supports-color": { 682 | "optional": true 683 | } 684 | } 685 | }, 686 | "node_modules/nodemon/node_modules/ms": { 687 | "version": "2.1.2", 688 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 689 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 690 | }, 691 | "node_modules/normalize-path": { 692 | "version": "3.0.0", 693 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 694 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 695 | "engines": { 696 | "node": ">=0.10.0" 697 | } 698 | }, 699 | "node_modules/object-inspect": { 700 | "version": "1.13.2", 701 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 702 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 703 | "engines": { 704 | "node": ">= 0.4" 705 | }, 706 | "funding": { 707 | "url": "https://github.com/sponsors/ljharb" 708 | } 709 | }, 710 | "node_modules/on-finished": { 711 | "version": "2.4.1", 712 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 713 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 714 | "dependencies": { 715 | "ee-first": "1.1.1" 716 | }, 717 | "engines": { 718 | "node": ">= 0.8" 719 | } 720 | }, 721 | "node_modules/parseurl": { 722 | "version": "1.3.3", 723 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 724 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 725 | "engines": { 726 | "node": ">= 0.8" 727 | } 728 | }, 729 | "node_modules/path-to-regexp": { 730 | "version": "0.1.7", 731 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 732 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 733 | }, 734 | "node_modules/picomatch": { 735 | "version": "2.3.1", 736 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 737 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 738 | "engines": { 739 | "node": ">=8.6" 740 | }, 741 | "funding": { 742 | "url": "https://github.com/sponsors/jonschlinkert" 743 | } 744 | }, 745 | "node_modules/proxy-addr": { 746 | "version": "2.0.7", 747 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 748 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 749 | "dependencies": { 750 | "forwarded": "0.2.0", 751 | "ipaddr.js": "1.9.1" 752 | }, 753 | "engines": { 754 | "node": ">= 0.10" 755 | } 756 | }, 757 | "node_modules/pstree.remy": { 758 | "version": "1.1.8", 759 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", 760 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==" 761 | }, 762 | "node_modules/qs": { 763 | "version": "6.11.0", 764 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 765 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 766 | "dependencies": { 767 | "side-channel": "^1.0.4" 768 | }, 769 | "engines": { 770 | "node": ">=0.6" 771 | }, 772 | "funding": { 773 | "url": "https://github.com/sponsors/ljharb" 774 | } 775 | }, 776 | "node_modules/range-parser": { 777 | "version": "1.2.1", 778 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 779 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 780 | "engines": { 781 | "node": ">= 0.6" 782 | } 783 | }, 784 | "node_modules/raw-body": { 785 | "version": "2.5.2", 786 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 787 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 788 | "dependencies": { 789 | "bytes": "3.1.2", 790 | "http-errors": "2.0.0", 791 | "iconv-lite": "0.4.24", 792 | "unpipe": "1.0.0" 793 | }, 794 | "engines": { 795 | "node": ">= 0.8" 796 | } 797 | }, 798 | "node_modules/readdirp": { 799 | "version": "3.6.0", 800 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 801 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 802 | "dependencies": { 803 | "picomatch": "^2.2.1" 804 | }, 805 | "engines": { 806 | "node": ">=8.10.0" 807 | } 808 | }, 809 | "node_modules/safe-buffer": { 810 | "version": "5.2.1", 811 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 812 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 813 | "funding": [ 814 | { 815 | "type": "github", 816 | "url": "https://github.com/sponsors/feross" 817 | }, 818 | { 819 | "type": "patreon", 820 | "url": "https://www.patreon.com/feross" 821 | }, 822 | { 823 | "type": "consulting", 824 | "url": "https://feross.org/support" 825 | } 826 | ] 827 | }, 828 | "node_modules/safer-buffer": { 829 | "version": "2.1.2", 830 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 831 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 832 | }, 833 | "node_modules/semver": { 834 | "version": "7.6.2", 835 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", 836 | "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", 837 | "bin": { 838 | "semver": "bin/semver.js" 839 | }, 840 | "engines": { 841 | "node": ">=10" 842 | } 843 | }, 844 | "node_modules/send": { 845 | "version": "0.18.0", 846 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 847 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 848 | "dependencies": { 849 | "debug": "2.6.9", 850 | "depd": "2.0.0", 851 | "destroy": "1.2.0", 852 | "encodeurl": "~1.0.2", 853 | "escape-html": "~1.0.3", 854 | "etag": "~1.8.1", 855 | "fresh": "0.5.2", 856 | "http-errors": "2.0.0", 857 | "mime": "1.6.0", 858 | "ms": "2.1.3", 859 | "on-finished": "2.4.1", 860 | "range-parser": "~1.2.1", 861 | "statuses": "2.0.1" 862 | }, 863 | "engines": { 864 | "node": ">= 0.8.0" 865 | } 866 | }, 867 | "node_modules/send/node_modules/ms": { 868 | "version": "2.1.3", 869 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 870 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 871 | }, 872 | "node_modules/serve-static": { 873 | "version": "1.15.0", 874 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 875 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 876 | "dependencies": { 877 | "encodeurl": "~1.0.2", 878 | "escape-html": "~1.0.3", 879 | "parseurl": "~1.3.3", 880 | "send": "0.18.0" 881 | }, 882 | "engines": { 883 | "node": ">= 0.8.0" 884 | } 885 | }, 886 | "node_modules/set-function-length": { 887 | "version": "1.2.2", 888 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 889 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 890 | "dependencies": { 891 | "define-data-property": "^1.1.4", 892 | "es-errors": "^1.3.0", 893 | "function-bind": "^1.1.2", 894 | "get-intrinsic": "^1.2.4", 895 | "gopd": "^1.0.1", 896 | "has-property-descriptors": "^1.0.2" 897 | }, 898 | "engines": { 899 | "node": ">= 0.4" 900 | } 901 | }, 902 | "node_modules/setprototypeof": { 903 | "version": "1.2.0", 904 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 905 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 906 | }, 907 | "node_modules/side-channel": { 908 | "version": "1.0.6", 909 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 910 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 911 | "dependencies": { 912 | "call-bind": "^1.0.7", 913 | "es-errors": "^1.3.0", 914 | "get-intrinsic": "^1.2.4", 915 | "object-inspect": "^1.13.1" 916 | }, 917 | "engines": { 918 | "node": ">= 0.4" 919 | }, 920 | "funding": { 921 | "url": "https://github.com/sponsors/ljharb" 922 | } 923 | }, 924 | "node_modules/simple-update-notifier": { 925 | "version": "2.0.0", 926 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", 927 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", 928 | "dependencies": { 929 | "semver": "^7.5.3" 930 | }, 931 | "engines": { 932 | "node": ">=10" 933 | } 934 | }, 935 | "node_modules/statuses": { 936 | "version": "2.0.1", 937 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 938 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 939 | "engines": { 940 | "node": ">= 0.8" 941 | } 942 | }, 943 | "node_modules/supports-color": { 944 | "version": "5.5.0", 945 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 946 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 947 | "dependencies": { 948 | "has-flag": "^3.0.0" 949 | }, 950 | "engines": { 951 | "node": ">=4" 952 | } 953 | }, 954 | "node_modules/to-regex-range": { 955 | "version": "5.0.1", 956 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 957 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 958 | "dependencies": { 959 | "is-number": "^7.0.0" 960 | }, 961 | "engines": { 962 | "node": ">=8.0" 963 | } 964 | }, 965 | "node_modules/toidentifier": { 966 | "version": "1.0.1", 967 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 968 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 969 | "engines": { 970 | "node": ">=0.6" 971 | } 972 | }, 973 | "node_modules/touch": { 974 | "version": "3.1.1", 975 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", 976 | "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", 977 | "bin": { 978 | "nodetouch": "bin/nodetouch.js" 979 | } 980 | }, 981 | "node_modules/type-is": { 982 | "version": "1.6.18", 983 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 984 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 985 | "dependencies": { 986 | "media-typer": "0.3.0", 987 | "mime-types": "~2.1.24" 988 | }, 989 | "engines": { 990 | "node": ">= 0.6" 991 | } 992 | }, 993 | "node_modules/undefsafe": { 994 | "version": "2.0.5", 995 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", 996 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==" 997 | }, 998 | "node_modules/unpipe": { 999 | "version": "1.0.0", 1000 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1001 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 1002 | "engines": { 1003 | "node": ">= 0.8" 1004 | } 1005 | }, 1006 | "node_modules/utils-merge": { 1007 | "version": "1.0.1", 1008 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1009 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 1010 | "engines": { 1011 | "node": ">= 0.4.0" 1012 | } 1013 | }, 1014 | "node_modules/vary": { 1015 | "version": "1.1.2", 1016 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1017 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 1018 | "engines": { 1019 | "node": ">= 0.8" 1020 | } 1021 | } 1022 | } 1023 | } 1024 | --------------------------------------------------------------------------------