├── .nvmrc ├── frontend-client ├── src │ ├── App.css │ ├── index.css │ ├── main.jsx │ ├── components │ │ ├── ErrorAlert.jsx │ │ ├── LoadingSpinner.jsx │ │ └── MicroPostCard.jsx │ ├── pages │ │ ├── ShowPostPage.jsx │ │ ├── PostsListPage.jsx │ │ ├── PostFormPage.jsx │ │ └── AboutUsPage.jsx │ ├── App.jsx │ └── assets │ │ └── react.svg ├── .gitignore ├── vite.config.js ├── README.md ├── index.html ├── package.json ├── eslint.config.js └── public │ └── vite.svg ├── .prettierrc ├── backend-api ├── .env.example ├── eslint.config.js ├── controllers │ ├── index.js │ └── microPosts.js ├── models │ ├── MicroPost.model.js │ ├── index.js │ └── models.md ├── package.json ├── app.js └── package-lock.json ├── .gitignore ├── LICENSE ├── _docs ├── deploy-railway.md └── local-postgresql.md └── README.md /.nvmrc: -------------------------------------------------------------------------------- 1 | 20.16 -------------------------------------------------------------------------------- /frontend-client/src/App.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /frontend-client/src/index.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingComma": "es5" 3 | } 4 | -------------------------------------------------------------------------------- /backend-api/.env.example: -------------------------------------------------------------------------------- 1 | PORT=8080 2 | DATABASE_URL=REPLACE_WITH_YOUR_CONNECTION_STRING -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Environment Variables 2 | .env 3 | 4 | # Dependency directories 5 | node_modules 6 | 7 | # Sqlite databases 8 | *.sqlite3 9 | 10 | # misc 11 | .DS_Store 12 | 13 | npm-debug.log* 14 | yarn-debug.log* 15 | yarn-error.log* -------------------------------------------------------------------------------- /frontend-client/src/main.jsx: -------------------------------------------------------------------------------- 1 | import { StrictMode } from "react"; 2 | import { createRoot } from "react-dom/client"; 3 | import App from "./App.jsx"; 4 | import "./index.css"; 5 | 6 | createRoot(document.getElementById("root")).render( 7 | 8 | 9 | 10 | ); 11 | -------------------------------------------------------------------------------- /backend-api/eslint.config.js: -------------------------------------------------------------------------------- 1 | import globals from "globals"; 2 | import pluginJs from "@eslint/js"; 3 | import eslintConfigPrettier from "eslint-config-prettier"; 4 | 5 | export default [ 6 | { languageOptions: { globals: globals.node } }, 7 | pluginJs.configs.recommended, 8 | eslintConfigPrettier, 9 | ]; 10 | -------------------------------------------------------------------------------- /backend-api/controllers/index.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | 3 | // TODO: load your controllers here 4 | import microPostsController from "./microPosts.js"; 5 | 6 | // TODO: mount your controllers here to a URL path 7 | const router = express.Router(); 8 | router.use("/micro_posts", microPostsController); 9 | 10 | export default router; 11 | -------------------------------------------------------------------------------- /frontend-client/src/components/ErrorAlert.jsx: -------------------------------------------------------------------------------- 1 | function ErrorAlert({ details }) { 2 | return ( 3 |
4 |
5 | An error occurred {details || ""} 6 |
7 |
8 | ); 9 | } 10 | 11 | export default ErrorAlert; 12 | -------------------------------------------------------------------------------- /frontend-client/src/components/LoadingSpinner.jsx: -------------------------------------------------------------------------------- 1 | function LoadingSpinner() { 2 | return ( 3 |
4 |
5 | Loading... 6 |
7 |
8 | ); 9 | } 10 | 11 | export default LoadingSpinner; 12 | -------------------------------------------------------------------------------- /frontend-client/.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 | -------------------------------------------------------------------------------- /frontend-client/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | server: { 8 | proxy: { 9 | // string shorthand: http://localhost:5173/foo -> http://localhost:4567/foo 10 | "/api": "http://localhost:8080", 11 | }, 12 | }, 13 | }); 14 | -------------------------------------------------------------------------------- /frontend-client/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 | -------------------------------------------------------------------------------- /frontend-client/src/components/MicroPostCard.jsx: -------------------------------------------------------------------------------- 1 | import { Link } from "react-router-dom"; 2 | 3 | function MicroPostCard({ content, createdAt, id }) { 4 | return ( 5 |
6 |
7 |
8 | {content} 9 |
10 |
{createdAt}
11 |
12 |
13 | ); 14 | } 15 | 16 | export default MicroPostCard; 17 | -------------------------------------------------------------------------------- /backend-api/models/MicroPost.model.js: -------------------------------------------------------------------------------- 1 | import { Model } from "sequelize"; 2 | 3 | export default (sequelize, DataTypes) => { 4 | class MicroPost extends Model {} 5 | 6 | MicroPost.init( 7 | { 8 | content: { 9 | type: DataTypes.STRING, 10 | allowNull: false, 11 | validate: { 12 | len: [3, 250], 13 | notEmpty: true, 14 | }, 15 | }, 16 | }, 17 | { 18 | sequelize, 19 | modelName: "MicroPost", 20 | } 21 | ); 22 | 23 | MicroPost.associate = (/* models */) => { 24 | // associations can be defined here 25 | }; 26 | 27 | return MicroPost; 28 | }; 29 | -------------------------------------------------------------------------------- /frontend-client/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 13 | CTP Project Starter 14 | 15 | 16 |
17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /frontend-client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frontend-client", 3 | "private": true, 4 | "version": "0.1.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "lint": "eslint .", 10 | "format": "prettier . --check", 11 | "preview": "vite preview" 12 | }, 13 | "dependencies": { 14 | "react": "^18.3.1", 15 | "react-dom": "^18.3.1", 16 | "react-router-dom": "^6.26.1" 17 | }, 18 | "devDependencies": { 19 | "@eslint/js": "^9.9.0", 20 | "@types/react": "^18.3.3", 21 | "@types/react-dom": "^18.3.0", 22 | "@vitejs/plugin-react": "^4.3.2", 23 | "eslint": "^9.9.0", 24 | "eslint-config-prettier": "9.1.0", 25 | "eslint-plugin-react": "^7.35.0", 26 | "eslint-plugin-react-hooks": "^5.1.0-rc.0", 27 | "eslint-plugin-react-refresh": "^0.4.9", 28 | "globals": "^15.9.0", 29 | "prettier": "3.3.3", 30 | "vite": "^5.4.8" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /backend-api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend-api", 3 | "version": "0.1.0", 4 | "description": "Backend REST API server built with express.js and sequelize.js", 5 | "type": "module", 6 | "scripts": { 7 | "format": "prettier . --check", 8 | "lint": "eslint .", 9 | "start": "node app.js", 10 | "dev": "node --watch --env-file=.env app.js", 11 | "build": "cd ../frontend-client && npm install && npm run build" 12 | }, 13 | "author": "Edgardo Molina", 14 | "license": "MIT", 15 | "dependencies": { 16 | "express": "4.21.1", 17 | "morgan": "^1.10.0", 18 | "pg": "^8.12.0", 19 | "pg-hstore": "^2.3.4", 20 | "sequelize": "^6.37.3" 21 | }, 22 | "devDependencies": { 23 | "@eslint/js": "^9.9.1", 24 | "@types/express": "4.17.21", 25 | "eslint": "^9.9.1", 26 | "eslint-config-prettier": "9.1.0", 27 | "globals": "^15.9.0", 28 | "prettier": "3.3.3" 29 | }, 30 | "engines": { 31 | "node": ">=20.16.0 <21.0.0" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Edgardo Molina 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /frontend-client/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 | import eslintConfigPrettier from "eslint-config-prettier"; 7 | 8 | export default [ 9 | { ignores: ["dist"] }, 10 | { 11 | files: ["**/*.{js,jsx}"], 12 | languageOptions: { 13 | ecmaVersion: 2020, 14 | globals: globals.browser, 15 | parserOptions: { 16 | ecmaVersion: "latest", 17 | ecmaFeatures: { jsx: true }, 18 | sourceType: "module", 19 | }, 20 | }, 21 | settings: { react: { version: "18.3" } }, 22 | plugins: { 23 | react, 24 | "react-hooks": reactHooks, 25 | "react-refresh": reactRefresh, 26 | }, 27 | rules: { 28 | ...js.configs.recommended.rules, 29 | ...react.configs.recommended.rules, 30 | ...react.configs["jsx-runtime"].rules, 31 | ...reactHooks.configs.recommended.rules, 32 | "react/jsx-no-target-blank": "off", 33 | "react-refresh/only-export-components": [ 34 | "warn", 35 | { allowConstantExport: true }, 36 | ], 37 | "react/prop-types": "off", 38 | }, 39 | }, 40 | eslintConfigPrettier, 41 | ]; 42 | -------------------------------------------------------------------------------- /frontend-client/src/pages/ShowPostPage.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import MicroPostCard from "../components/MicroPostCard"; 3 | import LoadingSpinner from "../components/LoadingSpinner"; 4 | import ErrorAlert from "../components/ErrorAlert"; 5 | import { useParams } from "react-router-dom"; 6 | 7 | function ShowPostPage() { 8 | const [post, setPost] = useState(null); 9 | const [loading, setLoading] = useState(true); 10 | const [error, setError] = useState(false); 11 | let params = useParams(); 12 | 13 | useEffect(() => { 14 | async function getData() { 15 | setLoading(true); 16 | try { 17 | let response = await fetch("/api/micro_posts/" + params.id); 18 | let postData = await response.json(); 19 | setPost(postData); 20 | setLoading(false); 21 | } catch (error) { 22 | console.error("Error fetching /api/micro_posts/" + params.id, error); 23 | setError(true); 24 | } 25 | } 26 | 27 | getData(); 28 | 29 | return () => { 30 | // clean up function 31 | }; 32 | }, [params.id]); 33 | 34 | if (error) 35 | return ( 36 | 37 | ); 38 | if (loading) return ; 39 | 40 | return ; 41 | } 42 | 43 | export default ShowPostPage; 44 | -------------------------------------------------------------------------------- /frontend-client/src/pages/PostsListPage.jsx: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from "react"; 2 | import MicroPostCard from "../components/MicroPostCard"; 3 | import LoadingSpinner from "../components/LoadingSpinner"; 4 | import ErrorAlert from "../components/ErrorAlert"; 5 | 6 | function PostsListPage() { 7 | const [posts, setPosts] = useState([]); 8 | const [loading, setLoading] = useState(true); 9 | const [error, setError] = useState(false); 10 | 11 | useEffect(() => { 12 | async function getData() { 13 | setLoading(true); 14 | try { 15 | let response = await fetch("/api/micro_posts"); 16 | let allPosts = await response.json(); 17 | setPosts(allPosts); 18 | setLoading(false); 19 | } catch (error) { 20 | console.error("Error fetching all micro_posts", error); 21 | setError(true); 22 | } 23 | } 24 | 25 | getData(); 26 | 27 | return () => { 28 | // clean up function 29 | }; 30 | }, []); 31 | 32 | if (error) return ; 33 | if (loading) return ; 34 | 35 | return ( 36 |
37 |
38 | {posts.map((entryData) => ( 39 | 40 | ))} 41 |
42 |
43 | ); 44 | } 45 | 46 | export default PostsListPage; 47 | -------------------------------------------------------------------------------- /frontend-client/public/vite.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /backend-api/models/index.js: -------------------------------------------------------------------------------- 1 | import { readdirSync } from "node:fs"; 2 | import { basename, dirname } from "node:path"; 3 | import process from "node:process"; 4 | import { fileURLToPath } from "node:url"; 5 | import Sequelize, { DataTypes } from "sequelize"; 6 | 7 | const __filename = fileURLToPath(import.meta.url); 8 | const __dirname = dirname(__filename); 9 | 10 | const db = {}; 11 | 12 | // NOTE: database connection config, edit if you need options 13 | const config = { 14 | dialectOptions: { 15 | ssl: { 16 | rejectUnauthorized: false, 17 | }, 18 | }, 19 | }; 20 | 21 | // connect to the database 22 | const sequelize = new Sequelize(process.env.DATABASE_URL, config); 23 | 24 | // find all files in ./models/ that end in `.model.js` 25 | const files = readdirSync(__dirname).filter( 26 | (file) => 27 | file.indexOf(".") !== 0 && 28 | file !== basename(__filename) && 29 | file.slice(-9) === ".model.js" 30 | ); 31 | 32 | // dynamically import and initialize all models 33 | // model.default is the exported default function 34 | await Promise.all( 35 | files.map(async (file) => { 36 | const model = await import(`./${file}`); 37 | if (!model.default) { 38 | return; 39 | } 40 | 41 | const namedModel = model.default(sequelize, DataTypes); 42 | db[namedModel.name] = namedModel; 43 | }) 44 | ); 45 | 46 | // call the .associate() method on all models 47 | Object.keys(db).forEach((key) => { 48 | if ("associate" in db[key]) { 49 | db[key].associate(db); 50 | } 51 | }); 52 | 53 | export { sequelize }; 54 | 55 | export default db; 56 | -------------------------------------------------------------------------------- /frontend-client/src/App.jsx: -------------------------------------------------------------------------------- 1 | import { BrowserRouter, Routes, Route, Link, NavLink } from "react-router-dom"; 2 | import PostsListPage from "./pages/PostsListPage"; 3 | import PostFormPage from "./pages/PostFormPage"; 4 | import ShowPostPage from "./pages/ShowPostPage"; 5 | import AboutUsPage from "./pages/AboutUsPage"; 6 | 7 | import "./App.css"; 8 | 9 | function Navigation() { 10 | return ( 11 | 30 | ); 31 | } 32 | 33 | function App() { 34 | return ( 35 | 36 | 37 |
38 |
39 | 40 | } /> 41 | } /> 42 | } /> 43 | } /> 44 | 45 |
46 |
47 |
48 | ); 49 | } 50 | 51 | export default App; 52 | -------------------------------------------------------------------------------- /backend-api/app.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import morgan from "morgan"; 3 | import process from "node:process"; 4 | import path from "node:path"; 5 | import { sequelize } from "./models/index.js"; 6 | import apiRouter from "./controllers/index.js"; 7 | 8 | const app = express(); 9 | const PORT = process.env.PORT; 10 | 11 | app.use(express.json()); 12 | 13 | // add http request logging to help us debug and audit app use 14 | const logFormat = app.get("env") === "production" ? "combined" : "dev"; 15 | app.use(morgan(logFormat)); 16 | 17 | // load our controller routes at /api 18 | app.use("/api", apiRouter); 19 | 20 | // for production use, we serve the static react build folder 21 | if (process.env.NODE_ENV === "production") { 22 | app.use( 23 | express.static(path.join(import.meta.dirname, "../frontend-client/dist")) 24 | ); 25 | 26 | // all unknown routes should be handed to our react app 27 | app.get("*", function (req, res) { 28 | res.sendFile( 29 | path.join(import.meta.dirname, "../frontend-client/dist", "index.html") 30 | ); 31 | }); 32 | } 33 | 34 | // 404 route 35 | app.use((req, res) => { 36 | res.status(404); 37 | res.json({ 38 | error: "Not Found", 39 | }); 40 | }); 41 | 42 | // Error route: catches all errors 43 | app.use(function (err, req, res, next) { 44 | console.error(err); 45 | if (res.headersSent) { 46 | return next(err); 47 | } 48 | res.status(err.status || 500); 49 | res.json({ 50 | error: { 51 | code: err.status || 500, 52 | message: err.message, 53 | }, 54 | }); 55 | next(); 56 | }); 57 | 58 | // start database 59 | await sequelize.sync({ force: false }); 60 | 61 | // start server 62 | app.listen(PORT, () => { 63 | console.log(`Listening on port ${PORT}`); 64 | }); 65 | -------------------------------------------------------------------------------- /frontend-client/src/pages/PostFormPage.jsx: -------------------------------------------------------------------------------- 1 | import { useState } from "react"; 2 | import { Navigate } from "react-router-dom"; 3 | import ErrorAlert from "../components/ErrorAlert"; 4 | 5 | function PostFormPage() { 6 | const [content, setContent] = useState(""); 7 | const [success, setSuccess] = useState(false); 8 | const [error, setError] = useState(false); 9 | 10 | const handleContentChange = (event) => { 11 | setContent(event.target.value); 12 | }; 13 | 14 | const handleSubmit = async (event) => { 15 | event.preventDefault(); 16 | try { 17 | let response = await fetch("/api/micro_posts", { 18 | method: "POST", 19 | credentials: "include", 20 | headers: { 21 | "Content-Type": "application/json", 22 | }, 23 | body: JSON.stringify({ 24 | content: content, 25 | }), 26 | }); 27 | 28 | if (response.ok) { 29 | setSuccess(true); 30 | } else { 31 | setError(true); 32 | } 33 | } catch (error) { 34 | console.error("Server error while creating a new micro post", error); 35 | setError(true); 36 | } 37 | }; 38 | 39 | if (success) return ; 40 | 41 | return ( 42 |
43 | {error && } 44 |
45 |
46 | 54 | 57 |
58 |
59 |
60 | ); 61 | } 62 | 63 | export default PostFormPage; 64 | -------------------------------------------------------------------------------- /frontend-client/src/pages/AboutUsPage.jsx: -------------------------------------------------------------------------------- 1 | function AboutUsPage() { 2 | return ( 3 | <> 4 |
5 |

About our project

6 |

7 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Nostrum 8 | quidem adipisci nobis quia eum quaerat quos ducimus, deleniti 9 | exercitationem animi itaque iste illo reiciendis vitae atque 10 | necessitatibus voluptatum repellendus quisquam? 11 |

12 |

About our Team

13 |
14 |
15 |

Firstname Lastname

16 |

17 | Lorem ipsum dolor sit, amet consectetur adipisicing elit. 18 | Dignissimos in itaque nihil consectetur qui natus similique 19 | nostrum molestias, ipsa explicabo hic impedit aspernatur. Ipsa 20 | provident neque culpa alias incidunt amet. 21 |

22 |
23 |
24 |

Firstname Lastname

25 |

26 | Lorem ipsum dolor sit, amet consectetur adipisicing elit. 27 | Dignissimos in itaque nihil consectetur qui natus similique 28 | nostrum molestias, ipsa explicabo hic impedit aspernatur. Ipsa 29 | provident neque culpa alias incidunt amet. 30 |

31 |
32 |
33 |

Firstname Lastname

34 |

35 | Lorem ipsum dolor sit, amet consectetur adipisicing elit. 36 | Dignissimos in itaque nihil consectetur qui natus similique 37 | nostrum molestias, ipsa explicabo hic impedit aspernatur. Ipsa 38 | provident neque culpa alias incidunt amet. 39 |

40 |
41 |
42 |
43 | 44 | ); 45 | } 46 | 47 | export default AboutUsPage; 48 | -------------------------------------------------------------------------------- /backend-api/controllers/microPosts.js: -------------------------------------------------------------------------------- 1 | import { Router } from "express"; 2 | import db from "../models/index.js"; 3 | const { MicroPost } = db; 4 | 5 | const router = Router(); 6 | 7 | // This is a simple example for providing basic CRUD routes for 8 | // a resource/model. It provides the following: 9 | // GET /api/micro_posts 10 | // POST /api/micro_posts 11 | // GET /api/micro_posts/:id 12 | // PUT /api/micro_posts/:id 13 | // DELETE /api/micro_posts/:id 14 | // 15 | // The full URL's for these routes are composed by combining the 16 | // prefixes used to load the controller files. 17 | // /api comes from the file /app.js 18 | // /micro_posts comes from the file /controllers/index.js 19 | 20 | router.get("/", (req, res) => { 21 | MicroPost.findAll({}).then((allPosts) => res.json(allPosts)); 22 | }); 23 | 24 | router.post("/", (req, res) => { 25 | let { content } = req.body; 26 | 27 | MicroPost.create({ content }) 28 | .then((newPost) => { 29 | res.status(201).json(newPost); 30 | }) 31 | .catch((err) => { 32 | res.status(400).json(err); 33 | }); 34 | }); 35 | 36 | router.get("/:id", (req, res) => { 37 | const { id } = req.params; 38 | MicroPost.findByPk(id).then((mpost) => { 39 | if (!mpost) { 40 | return res.sendStatus(404); 41 | } 42 | 43 | res.json(mpost); 44 | }); 45 | }); 46 | 47 | router.put("/:id", (req, res) => { 48 | const { id } = req.params; 49 | MicroPost.findByPk(id).then((mpost) => { 50 | if (!mpost) { 51 | return res.sendStatus(404); 52 | } 53 | 54 | mpost.content = req.body.content; 55 | mpost 56 | .save() 57 | .then((updatedPost) => { 58 | res.json(updatedPost); 59 | }) 60 | .catch((err) => { 61 | res.status(400).json(err); 62 | }); 63 | }); 64 | }); 65 | 66 | router.delete("/:id", (req, res) => { 67 | const { id } = req.params; 68 | MicroPost.findByPk(id).then((mpost) => { 69 | if (!mpost) { 70 | return res.sendStatus(404); 71 | } 72 | 73 | mpost.destroy(); 74 | res.sendStatus(204); 75 | }); 76 | }); 77 | 78 | export default router; 79 | -------------------------------------------------------------------------------- /_docs/deploy-railway.md: -------------------------------------------------------------------------------- 1 | # Deploying to [Railway.app](https://railway.app/) 2 | 3 | 1. Create a Starter account using your Github username 4 | - You get a one-time $5 credit for free and do not have to provide a credit card 5 | 2. Verify your account by answering Railways questions 6 | 3. Create a **"New Project"** 7 | 4. Select **"Deploy from Github repo"** 8 | - follow instruction to link your project repo to railway 9 | - select your project repo 10 | 5. Click **"Deploy now"** 11 | - your app will fail, but we will fix it in the next steps 12 | 6. Add a PostgreSQL Database to your Railway project 13 | - close the setting page 14 | - click the **"+ Create"** button at the top right of the project 15 | - click **"Database >"** 16 | - click **"Add PostgreSQL"** 17 | - After 2 minutes a PostgreSQL Database will be added to your project 18 | 7. Click on your project's box to open up it's setting page 19 | 8. Click on the `Variables` tab of your project 20 | - Click on the link in the purple box that says `Looking to connect a database? Add a Variable Reference` 21 | - Choose `DATABASE_URL` and click `Add` 22 | - Add any other environment variables your project needs to run 23 | - Do not add the `PORT` variable (Railway will set this for you) 24 | 9. Click on the `Settings` tab of your project and make the following modifications 25 | - In the Networking section: 26 | - In **Public Networking**, click `Generate Domain` 27 | - Enter port `8080`, and click `Generate Domain` 28 | - In the Build section: 29 | - Add to **Providers**: `Node` 30 | - Add to **Custom Build Command**: `cd backend-api && npm install && npm run build` 31 | - In the Deploy section: 32 | - Add to **Custom Start Command**: `cd backend-api && npm run start` 33 | - _make sure you click the checkmark to apply each change_ 34 | 10. Click on the Deploy button 35 | - Deployments may take 2-5 minutes 36 | 37 | Your app will now be live and auto deployed on new commits. If it's not working you may need to restart the app manually in the Railway UI. 38 | 39 | ## (_Optional_) App Sleeping 40 | 41 | To reduce costs on your app you can configure your app components to sleep after some time of inactivity, this is called [App Sleeping](https://docs.railway.app/reference/app-sleeping) in Railway. 42 | 43 | To enable it: 44 | 45 | - Open up each of your App components 46 | - Click on the `Settings` tab 47 | - In the Deploy section, toggle on `Enable App Sleeping` 48 | 49 | > [!Note] 50 | > App Sleeping has to be enabled for each component and service you create. 51 | -------------------------------------------------------------------------------- /_docs/local-postgresql.md: -------------------------------------------------------------------------------- 1 | # Setting up PostgreSQL locally 2 | 3 | The goals of this guide are to help you: 4 | 5 | - Install PostgreSQL 6 | - Create a ROLE/USER with a PASSWORD 7 | - Create a DATABASE 8 | - Get your database URL connection string 9 | 10 | ## Install PostgreSQL 11 | 12 | Check if you already have PostgreSQL installed. You can try one of the following: 13 | 14 | - run the command `which psql` 15 | - check if it's listed in your computers Applications 16 | 17 | If you need to install PostgreSQL see the [installing PostgreSQL guides](https://github.com/CUNYTechPrep/guides#postgresql) 18 | 19 | ## Create a PostgreSQL user and database 20 | 21 | For this project-starter template you can use any values for the username, password, and database name. The rest of this guide will assume the following values were chosen: 22 | 23 | - PostgreSQL User/Role 24 | - name: `ctp_user` 25 | - password: `ctp_pass` 26 | - PostgreSQL Database 27 | - name: `ctp_appdb_development` 28 | 29 | > [!IMPORTANT] 30 | > Whatever values you choose, save them or you will lose access to your database data and will have to create a new one. 31 | 32 | ### For Windows/pgAdmin users 33 | 34 | If you are on Windows or installed **pgAdmin** follow our [pgAdmin guide](https://github.com/CUNYTechPrep/guides/blob/master/pgAdmin-create-user-db.md) to create a user in PostgreSQL named `ctp_user` with the password `ctp_pass` and a database named `ctp_appdb_development`. 35 | 36 | ### For Mac/Linux users 37 | 38 | Create a user in PostgreSQL named `ctp_user` with the password `ctp_pass`: 39 | 40 | ``` 41 | createuser -P -s -e ctp_user 42 | ``` 43 | 44 | Create a new db for this project: 45 | 46 | ``` 47 | createdb -h localhost -U ctp_user ctp_appdb_development 48 | ``` 49 | 50 | > You will create a DB for each project you start based on this repo. For other projects change `ctp_appdb_development` to the new apps database name. 51 | 52 | ## Getting your database URL connection string 53 | 54 | The database connection string takes the general form of: 55 | 56 | ``` 57 | postgresql://[YOUR-USERNAME]:[YOUR-PASSWORD]@[HOSTNAME]:5432/[DBNAME] 58 | ``` 59 | 60 | For the local DB setup described above, your string would be: 61 | 62 | ``` 63 | postgresql://ctp_user:ctp_pass@localhost:5432/ctp_appdb_development?sslmode=disable 64 | ``` 65 | 66 | > [!CAUTION] 67 | > the `?sslmode=disable` option should only be used for local development and _should NOT be used in a deployed/production setting_. For more info see the [SSL Mode documentation](https://www.postgresql.org/docs/14/libpq-ssl.html#LIBPQ-SSL-PROTECTION). 68 | -------------------------------------------------------------------------------- /backend-api/models/models.md: -------------------------------------------------------------------------------- 1 | # Models 2 | 3 | This app uses the [Sequelize ORM (v6)](https://sequelize.org/) for connecting to our Database. 4 | 5 | ## `./models/index.js` 6 | 7 | This file auto imports all Sequelize models defined in a file ending in `.model.js` 8 | 9 | > This file _should not be edited_, except for the `config` and only edit if you have a special database setup and _you know what you are doing_. 10 | 11 | ## Creating models 12 | 13 | Here is an example model file: 14 | 15 | Filename: `MicroPost.model.js` 16 | 17 | ```js 18 | import { Model } from "sequelize"; 19 | 20 | // NOTE: Ensure you export this function for initialization 21 | export default initMicroPost = (sequelize, DataTypes) => { 22 | class MicroPost extends Model {} 23 | 24 | MicroPost.init( 25 | { 26 | content: { 27 | type: DataTypes.STRING, 28 | allowNull: false, 29 | }, 30 | }, 31 | { 32 | sequelize, 33 | modelName: "MicroPost", // NOTE: This should match your class name 34 | } 35 | ); 36 | 37 | /* 38 | // NOTE: Uncomment this method to make associations to other models 39 | MicroPost.associate = (models) => { 40 | // associations can be defined here 41 | }; 42 | */ 43 | 44 | return MicroPost; 45 | }; 46 | ``` 47 | 48 | Things to look out for: 49 | 50 | - **Required:** Model filename must end in `.model.js`. Without this extension, the `./models/index.js` file won't be able to initialize the model. 51 | - For consistency, name your model filename with the model class name (`MicroPost`) you want to use in your code. For the example above we named the file `MicroPost.model.js`. 52 | - For consistency, we also set the `modelName: "MicroPost"` to the class name as well 53 | - The postgresql database table name will be the plural version of your modelName: i.e. `MicroPosts` 54 | 55 | Documentation: 56 | 57 | - https://sequelize.org/docs/v6/core-concepts/model-basics/#extending-model 58 | - https://sequelize.org/api/v6/class/src/model.js~model#static-method-init 59 | 60 | # Using the database models 61 | 62 | To use these models in your controllers you should import them from `./models/index.js`. Below are common import statements that will not work due to sequelizes initialization step or how ESM imports work. 63 | 64 | ```js 65 | // correct method to use db models ✅ 66 | import db from "../models/index.js"; 67 | const { MicroPost } = db; // or use `db.MicroPost` 68 | 69 | // The following methods will NOT work 70 | import { MicroPost } from "../models/index.js"; // ❌ 71 | import { MicroPost } from "../models/MicroPost.model.js"; // ❌ 72 | import MicroPost from "../models/MicroPost.model.js"; // ❌ 73 | ``` 74 | -------------------------------------------------------------------------------- /frontend-client/src/assets/react.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CTP Project Starter 2 | 3 | A full stack web application starter template for building projects with React, Express.js, and Sequelize.js 4 | 5 | **Current version:** 4.0.0 (Oct 2024) 6 | 7 | ## Stack 8 | 9 | > [!NOTE] 10 | > This project starter requires Node.js v20 (LTS) or newer to work properly. The project makes use of features not available in older versions such as ECMAScript/JavaScript modules ([ESM](https://nodejs.org/docs/latest-v20.x/api/esm.html)), node [watch mode](https://nodejs.org/docs/latest-v20.x/api/cli.html#--watch), and node [env-file support](https://nodejs.org/docs/latest-v20.x/api/cli.html#--env-fileconfig). 11 | > 12 | > LTS ([long-term support](https://nodejs.org/en/about/previous-releases#nodejs-releases)) versions (v20, v22) of Node.js are recommended for use with this starter. 13 | 14 | _Backend API_ 15 | 16 | - express.js (v4.21.1) 17 | - sequelize.js (v6.37.3) 18 | - PostgreSQL (v14+ recommended or use https://supabase.com/) 19 | 20 | _Frontend React Web Client_ 21 | 22 | - Based on `vite` 23 | - pre-configured to work with the backend-api 24 | - Bootstrap (v5) 25 | - added to `/frontend-client/index.html` (_optional_ can be removed) 26 | - React Router (v6.26.1) 27 | 28 | ## Development Setup 29 | 30 | Each team member will need to do this on their local machine and will need their own separate database. 31 | 32 | ### Setup a PostgreSQL database 33 | 34 | You have two options: 35 | 36 | - **Option 1** (_RECOMMENDED_) - Use a hosted database 37 | - Sign up to https://supabase.com/ and get a _FREE_ PostgreSQL database 38 | - **Option 2** (_ADVANCED_) - Install PostgreSQL locally 39 | - Check if you have PostgreSQL installed 40 | - ✅ versions 12-14 should work 41 | - 🚫 version 15+ has not been tested but will likely work 42 | - Follow the [instructions for locally setting up a PostgreSQL database](./_docs/local-postgresql.md) 43 | 44 | Save your databases URI connection string for the next steps. It will looks something like this: 45 | 46 | `postgresql://[YOUR-USERNAME]:[YOUR-PASSWORD]@[HOSTNAME]:5432/[DBNAME]` 47 | 48 | ### Running the app locally 49 | 50 | > [!IMPORTANT] 51 | > For local development you will need two terminals open, one for the backend-api and another for the frontend-client. 52 | 53 | _Clone_ this app, then: 54 | 55 | ```bash 56 | # backend-api terminal 1 57 | cd backend-api 58 | cp .env.example .env 59 | # in the .env file update the DATABASE_URL env var with your PostgreSQL connection string 60 | npm install 61 | npm run dev 62 | ``` 63 | 64 | ```bash 65 | # frontend-client terminal 2 66 | cd frontend-client 67 | npm install 68 | npm run dev 69 | ``` 70 | 71 | - backend-api will launch at: http://localhost:8080 72 | - frontend-client will launch at: http://localhost:5173 73 | 74 | > [!NOTE] 75 | > In production you will only deploy a single app. The React client will build into static files that will be served from the backend. The project has already been configured for this, but you are free to also deploy the backend and frontend separately if you wish. 76 | 77 | ## Deployment 78 | 79 | The following are hosting options that have a free tier for deploying apps based on this project-starter. Each option has it's pro's and con's. 80 | 81 | Students can also get education credits for using Heroku through the [GitHub Student Developer Pack](https://education.github.com/pack) 82 | 83 | ### Hosting on [Render.com](https://render.com/) (_recommended_) 84 | 85 | 1. Create an account by clicking the **Get Started** button 86 | 87 | - It's recommended to Sign up using your **Github** account for easy linking to project repos. 88 | - The **Individual** account type does NOT require a credit card 89 | 90 | 2. Navigate to the [Dashboard](https://dashboard.render.com/) 91 | 3. Create a PostgreSQL Database 92 | 93 | - Click the **New +** button at the top of the page 94 | - Select **PostgreSQL** from the drop down menu 95 | - Provide a **Name** for your projects database 96 | - Choose a **Region** closest to you or your users. 97 | - Choose **Instance Type**: Free 98 | - You can leave the optional settings empty 99 | - Click on the **Create Database** button 100 | - Your database will be ready to use in 1-5 minutes. 101 | - Once the database is active, make note of where to get the Connection details, such as "**Internal Database URL**" and "**External Database URL**" 102 | 103 | 4. Create a Web Service 104 | 105 | - Click the **New +** button at the top of the page 106 | - Select **Web Service** from the drop down menu 107 | - Click on the **"Build and deploy from a Git repository"** option and click **Next** 108 | - Connect to your project's repository on Github 109 | - Provide a **Name** for your projects web app 110 | - Choose the same **Region** as you chose for your database (_important for db connectivity_) 111 | - Choose the **Branch** with the code you want to deploy (usually `main`) 112 | - Set **Root Directory**: `backend-api` 113 | - Choose **Runtime**: Node 114 | - Set **Build Command**: `npm install && npm run build` 115 | - Set **Start Command**: `npm start` 116 | - Choose **Instance Type**: `Free` 117 | - Expand the **Advanced** options 118 | - Add **Environment Variables** 119 | - key: `SESSION_SECRET` = value: click on the **Generate** button 120 | - key: `DATABASE_URL` = value: copy the "**Internal Database URL**" from your step 3. 121 | * Do NOT add the `PORT` variable (Render will set this for you) 122 | - Click the "**Create Web Service**" button 123 | - Your application will be live in 1-5 minutes 124 | 125 | ### Hosting on [Railway.app](https://railway.app/) 126 | 127 | See the [Deploying to Railway guide](./_docs/deploy-railway.md) 128 | 129 | ### Hosting on Heroku (no longer free) 130 | 131 | > [!CAUTION] 132 | > Needs updating 133 | 134 | > NOTE: Heroku is no longer free, but these instructions still work. We recommend getting started with render.com or railway.app 135 | 136 | 1. Create a Heroku account (_if you don't have one_) 137 | 2. Install the [heroku cli](https://devcenter.heroku.com/articles/heroku-cli#download-and-install) (_if you don't already have it_) 138 | 139 | - Requires that you have `git` installed 140 | 141 | ```bash 142 | # login with the cli tool 143 | heroku login 144 | ``` 145 | 146 | #### Create a Heroku project 147 | 148 | Next, `cd` into this project directory and create a project: 149 | 150 | ```bash 151 | # replace `cool-appname` with your preferred app name 152 | heroku create cool-appname 153 | 154 | # add a free PostgreSQL database to your heroku project 155 | heroku addons:create heroku-postgresql:hobby-dev 156 | ``` 157 | 158 | > This will make your app accessible at https://cool-appname.herokuapp.com (_if the name is available_). 159 | 160 | > You only need to do this once per app 161 | 162 | #### Add Environment Variables 163 | 164 | Any environment variables your app needs will be available through your heroku project's settings page. 165 | 166 | > NOTE: _Heroku calls them **Config Vars**_ 167 | 168 | - Go to the dashboard page here: https://dashboard.heroku.com/apps 169 | - Click on the Settings tab 170 | - Click `Reveal Config Vars` 171 | - Add any environment variables you have in your `.env` file 172 | 173 | #### Deploying the app 174 | 175 | Whenever you want to update the deployed app run this command. 176 | 177 | ```bash 178 | git push heroku main 179 | ``` 180 | 181 | > This command deploys your main branch. You can change that and deploy a different branch such as: `git push heroku development` 182 | -------------------------------------------------------------------------------- /backend-api/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend-api", 3 | "version": "0.1.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "backend-api", 9 | "version": "0.1.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "express": "4.21.1", 13 | "morgan": "^1.10.0", 14 | "pg": "^8.12.0", 15 | "pg-hstore": "^2.3.4", 16 | "sequelize": "^6.37.3" 17 | }, 18 | "devDependencies": { 19 | "@eslint/js": "^9.9.1", 20 | "@types/express": "4.17.21", 21 | "eslint": "^9.9.1", 22 | "eslint-config-prettier": "9.1.0", 23 | "globals": "^15.9.0", 24 | "prettier": "3.3.3" 25 | }, 26 | "engines": { 27 | "node": ">=20.16.0 <21.0.0" 28 | } 29 | }, 30 | "node_modules/@eslint-community/eslint-utils": { 31 | "version": "4.4.0", 32 | "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", 33 | "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", 34 | "dev": true, 35 | "license": "MIT", 36 | "dependencies": { 37 | "eslint-visitor-keys": "^3.3.0" 38 | }, 39 | "engines": { 40 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 41 | }, 42 | "peerDependencies": { 43 | "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" 44 | } 45 | }, 46 | "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { 47 | "version": "3.4.3", 48 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", 49 | "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", 50 | "dev": true, 51 | "license": "Apache-2.0", 52 | "engines": { 53 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 54 | }, 55 | "funding": { 56 | "url": "https://opencollective.com/eslint" 57 | } 58 | }, 59 | "node_modules/@eslint-community/regexpp": { 60 | "version": "4.11.0", 61 | "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", 62 | "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", 63 | "dev": true, 64 | "license": "MIT", 65 | "engines": { 66 | "node": "^12.0.0 || ^14.0.0 || >=16.0.0" 67 | } 68 | }, 69 | "node_modules/@eslint/config-array": { 70 | "version": "0.18.0", 71 | "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", 72 | "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", 73 | "dev": true, 74 | "license": "Apache-2.0", 75 | "dependencies": { 76 | "@eslint/object-schema": "^2.1.4", 77 | "debug": "^4.3.1", 78 | "minimatch": "^3.1.2" 79 | }, 80 | "engines": { 81 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 82 | } 83 | }, 84 | "node_modules/@eslint/config-array/node_modules/debug": { 85 | "version": "4.3.6", 86 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 87 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 88 | "dev": true, 89 | "license": "MIT", 90 | "dependencies": { 91 | "ms": "2.1.2" 92 | }, 93 | "engines": { 94 | "node": ">=6.0" 95 | }, 96 | "peerDependenciesMeta": { 97 | "supports-color": { 98 | "optional": true 99 | } 100 | } 101 | }, 102 | "node_modules/@eslint/config-array/node_modules/ms": { 103 | "version": "2.1.2", 104 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 105 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 106 | "dev": true, 107 | "license": "MIT" 108 | }, 109 | "node_modules/@eslint/eslintrc": { 110 | "version": "3.1.0", 111 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", 112 | "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", 113 | "dev": true, 114 | "license": "MIT", 115 | "dependencies": { 116 | "ajv": "^6.12.4", 117 | "debug": "^4.3.2", 118 | "espree": "^10.0.1", 119 | "globals": "^14.0.0", 120 | "ignore": "^5.2.0", 121 | "import-fresh": "^3.2.1", 122 | "js-yaml": "^4.1.0", 123 | "minimatch": "^3.1.2", 124 | "strip-json-comments": "^3.1.1" 125 | }, 126 | "engines": { 127 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 128 | }, 129 | "funding": { 130 | "url": "https://opencollective.com/eslint" 131 | } 132 | }, 133 | "node_modules/@eslint/eslintrc/node_modules/debug": { 134 | "version": "4.3.6", 135 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 136 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 137 | "dev": true, 138 | "license": "MIT", 139 | "dependencies": { 140 | "ms": "2.1.2" 141 | }, 142 | "engines": { 143 | "node": ">=6.0" 144 | }, 145 | "peerDependenciesMeta": { 146 | "supports-color": { 147 | "optional": true 148 | } 149 | } 150 | }, 151 | "node_modules/@eslint/eslintrc/node_modules/globals": { 152 | "version": "14.0.0", 153 | "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", 154 | "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", 155 | "dev": true, 156 | "license": "MIT", 157 | "engines": { 158 | "node": ">=18" 159 | }, 160 | "funding": { 161 | "url": "https://github.com/sponsors/sindresorhus" 162 | } 163 | }, 164 | "node_modules/@eslint/eslintrc/node_modules/ms": { 165 | "version": "2.1.2", 166 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 167 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 168 | "dev": true, 169 | "license": "MIT" 170 | }, 171 | "node_modules/@eslint/js": { 172 | "version": "9.9.1", 173 | "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.9.1.tgz", 174 | "integrity": "sha512-xIDQRsfg5hNBqHz04H1R3scSVwmI+KUbqjsQKHKQ1DAUSaUjYPReZZmS/5PNiKu1fUvzDd6H7DEDKACSEhu+TQ==", 175 | "dev": true, 176 | "license": "MIT", 177 | "engines": { 178 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 179 | } 180 | }, 181 | "node_modules/@eslint/object-schema": { 182 | "version": "2.1.4", 183 | "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", 184 | "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", 185 | "dev": true, 186 | "license": "Apache-2.0", 187 | "engines": { 188 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 189 | } 190 | }, 191 | "node_modules/@humanwhocodes/module-importer": { 192 | "version": "1.0.1", 193 | "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", 194 | "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", 195 | "dev": true, 196 | "license": "Apache-2.0", 197 | "engines": { 198 | "node": ">=12.22" 199 | }, 200 | "funding": { 201 | "type": "github", 202 | "url": "https://github.com/sponsors/nzakas" 203 | } 204 | }, 205 | "node_modules/@humanwhocodes/retry": { 206 | "version": "0.3.0", 207 | "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", 208 | "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", 209 | "dev": true, 210 | "license": "Apache-2.0", 211 | "engines": { 212 | "node": ">=18.18" 213 | }, 214 | "funding": { 215 | "type": "github", 216 | "url": "https://github.com/sponsors/nzakas" 217 | } 218 | }, 219 | "node_modules/@nodelib/fs.scandir": { 220 | "version": "2.1.5", 221 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 222 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 223 | "dev": true, 224 | "license": "MIT", 225 | "dependencies": { 226 | "@nodelib/fs.stat": "2.0.5", 227 | "run-parallel": "^1.1.9" 228 | }, 229 | "engines": { 230 | "node": ">= 8" 231 | } 232 | }, 233 | "node_modules/@nodelib/fs.stat": { 234 | "version": "2.0.5", 235 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 236 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 237 | "dev": true, 238 | "license": "MIT", 239 | "engines": { 240 | "node": ">= 8" 241 | } 242 | }, 243 | "node_modules/@nodelib/fs.walk": { 244 | "version": "1.2.8", 245 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 246 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 247 | "dev": true, 248 | "license": "MIT", 249 | "dependencies": { 250 | "@nodelib/fs.scandir": "2.1.5", 251 | "fastq": "^1.6.0" 252 | }, 253 | "engines": { 254 | "node": ">= 8" 255 | } 256 | }, 257 | "node_modules/@types/body-parser": { 258 | "version": "1.19.5", 259 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", 260 | "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", 261 | "dev": true, 262 | "license": "MIT", 263 | "dependencies": { 264 | "@types/connect": "*", 265 | "@types/node": "*" 266 | } 267 | }, 268 | "node_modules/@types/connect": { 269 | "version": "3.4.38", 270 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", 271 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", 272 | "dev": true, 273 | "license": "MIT", 274 | "dependencies": { 275 | "@types/node": "*" 276 | } 277 | }, 278 | "node_modules/@types/debug": { 279 | "version": "4.1.12", 280 | "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", 281 | "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", 282 | "license": "MIT", 283 | "dependencies": { 284 | "@types/ms": "*" 285 | } 286 | }, 287 | "node_modules/@types/express": { 288 | "version": "4.17.21", 289 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", 290 | "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", 291 | "dev": true, 292 | "license": "MIT", 293 | "dependencies": { 294 | "@types/body-parser": "*", 295 | "@types/express-serve-static-core": "^4.17.33", 296 | "@types/qs": "*", 297 | "@types/serve-static": "*" 298 | } 299 | }, 300 | "node_modules/@types/express-serve-static-core": { 301 | "version": "4.19.6", 302 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", 303 | "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", 304 | "dev": true, 305 | "license": "MIT", 306 | "dependencies": { 307 | "@types/node": "*", 308 | "@types/qs": "*", 309 | "@types/range-parser": "*", 310 | "@types/send": "*" 311 | } 312 | }, 313 | "node_modules/@types/http-errors": { 314 | "version": "2.0.4", 315 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", 316 | "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", 317 | "dev": true, 318 | "license": "MIT" 319 | }, 320 | "node_modules/@types/mime": { 321 | "version": "1.3.5", 322 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", 323 | "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", 324 | "dev": true, 325 | "license": "MIT" 326 | }, 327 | "node_modules/@types/ms": { 328 | "version": "0.7.34", 329 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", 330 | "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", 331 | "license": "MIT" 332 | }, 333 | "node_modules/@types/node": { 334 | "version": "22.4.1", 335 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.4.1.tgz", 336 | "integrity": "sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==", 337 | "license": "MIT", 338 | "dependencies": { 339 | "undici-types": "~6.19.2" 340 | } 341 | }, 342 | "node_modules/@types/qs": { 343 | "version": "6.9.16", 344 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", 345 | "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", 346 | "dev": true, 347 | "license": "MIT" 348 | }, 349 | "node_modules/@types/range-parser": { 350 | "version": "1.2.7", 351 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", 352 | "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", 353 | "dev": true, 354 | "license": "MIT" 355 | }, 356 | "node_modules/@types/send": { 357 | "version": "0.17.4", 358 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", 359 | "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", 360 | "dev": true, 361 | "license": "MIT", 362 | "dependencies": { 363 | "@types/mime": "^1", 364 | "@types/node": "*" 365 | } 366 | }, 367 | "node_modules/@types/serve-static": { 368 | "version": "1.15.7", 369 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", 370 | "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", 371 | "dev": true, 372 | "license": "MIT", 373 | "dependencies": { 374 | "@types/http-errors": "*", 375 | "@types/node": "*", 376 | "@types/send": "*" 377 | } 378 | }, 379 | "node_modules/@types/validator": { 380 | "version": "13.12.0", 381 | "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", 382 | "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", 383 | "license": "MIT" 384 | }, 385 | "node_modules/accepts": { 386 | "version": "1.3.8", 387 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 388 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 389 | "license": "MIT", 390 | "dependencies": { 391 | "mime-types": "~2.1.34", 392 | "negotiator": "0.6.3" 393 | }, 394 | "engines": { 395 | "node": ">= 0.6" 396 | } 397 | }, 398 | "node_modules/acorn": { 399 | "version": "8.12.1", 400 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", 401 | "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", 402 | "dev": true, 403 | "license": "MIT", 404 | "bin": { 405 | "acorn": "bin/acorn" 406 | }, 407 | "engines": { 408 | "node": ">=0.4.0" 409 | } 410 | }, 411 | "node_modules/acorn-jsx": { 412 | "version": "5.3.2", 413 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 414 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 415 | "dev": true, 416 | "license": "MIT", 417 | "peerDependencies": { 418 | "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" 419 | } 420 | }, 421 | "node_modules/ajv": { 422 | "version": "6.12.6", 423 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 424 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 425 | "dev": true, 426 | "license": "MIT", 427 | "dependencies": { 428 | "fast-deep-equal": "^3.1.1", 429 | "fast-json-stable-stringify": "^2.0.0", 430 | "json-schema-traverse": "^0.4.1", 431 | "uri-js": "^4.2.2" 432 | }, 433 | "funding": { 434 | "type": "github", 435 | "url": "https://github.com/sponsors/epoberezkin" 436 | } 437 | }, 438 | "node_modules/ansi-regex": { 439 | "version": "5.0.1", 440 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 441 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 442 | "dev": true, 443 | "license": "MIT", 444 | "engines": { 445 | "node": ">=8" 446 | } 447 | }, 448 | "node_modules/ansi-styles": { 449 | "version": "4.3.0", 450 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 451 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 452 | "dev": true, 453 | "license": "MIT", 454 | "dependencies": { 455 | "color-convert": "^2.0.1" 456 | }, 457 | "engines": { 458 | "node": ">=8" 459 | }, 460 | "funding": { 461 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 462 | } 463 | }, 464 | "node_modules/argparse": { 465 | "version": "2.0.1", 466 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 467 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 468 | "dev": true, 469 | "license": "Python-2.0" 470 | }, 471 | "node_modules/array-flatten": { 472 | "version": "1.1.1", 473 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 474 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", 475 | "license": "MIT" 476 | }, 477 | "node_modules/balanced-match": { 478 | "version": "1.0.2", 479 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 480 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 481 | "dev": true, 482 | "license": "MIT" 483 | }, 484 | "node_modules/basic-auth": { 485 | "version": "2.0.1", 486 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", 487 | "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", 488 | "license": "MIT", 489 | "dependencies": { 490 | "safe-buffer": "5.1.2" 491 | }, 492 | "engines": { 493 | "node": ">= 0.8" 494 | } 495 | }, 496 | "node_modules/basic-auth/node_modules/safe-buffer": { 497 | "version": "5.1.2", 498 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 499 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 500 | "license": "MIT" 501 | }, 502 | "node_modules/body-parser": { 503 | "version": "1.20.3", 504 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", 505 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", 506 | "license": "MIT", 507 | "dependencies": { 508 | "bytes": "3.1.2", 509 | "content-type": "~1.0.5", 510 | "debug": "2.6.9", 511 | "depd": "2.0.0", 512 | "destroy": "1.2.0", 513 | "http-errors": "2.0.0", 514 | "iconv-lite": "0.4.24", 515 | "on-finished": "2.4.1", 516 | "qs": "6.13.0", 517 | "raw-body": "2.5.2", 518 | "type-is": "~1.6.18", 519 | "unpipe": "1.0.0" 520 | }, 521 | "engines": { 522 | "node": ">= 0.8", 523 | "npm": "1.2.8000 || >= 1.4.16" 524 | } 525 | }, 526 | "node_modules/brace-expansion": { 527 | "version": "1.1.11", 528 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 529 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 530 | "dev": true, 531 | "license": "MIT", 532 | "dependencies": { 533 | "balanced-match": "^1.0.0", 534 | "concat-map": "0.0.1" 535 | } 536 | }, 537 | "node_modules/bytes": { 538 | "version": "3.1.2", 539 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 540 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 541 | "license": "MIT", 542 | "engines": { 543 | "node": ">= 0.8" 544 | } 545 | }, 546 | "node_modules/call-bind": { 547 | "version": "1.0.7", 548 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", 549 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", 550 | "license": "MIT", 551 | "dependencies": { 552 | "es-define-property": "^1.0.0", 553 | "es-errors": "^1.3.0", 554 | "function-bind": "^1.1.2", 555 | "get-intrinsic": "^1.2.4", 556 | "set-function-length": "^1.2.1" 557 | }, 558 | "engines": { 559 | "node": ">= 0.4" 560 | }, 561 | "funding": { 562 | "url": "https://github.com/sponsors/ljharb" 563 | } 564 | }, 565 | "node_modules/callsites": { 566 | "version": "3.1.0", 567 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 568 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 569 | "dev": true, 570 | "license": "MIT", 571 | "engines": { 572 | "node": ">=6" 573 | } 574 | }, 575 | "node_modules/chalk": { 576 | "version": "4.1.2", 577 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 578 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 579 | "dev": true, 580 | "license": "MIT", 581 | "dependencies": { 582 | "ansi-styles": "^4.1.0", 583 | "supports-color": "^7.1.0" 584 | }, 585 | "engines": { 586 | "node": ">=10" 587 | }, 588 | "funding": { 589 | "url": "https://github.com/chalk/chalk?sponsor=1" 590 | } 591 | }, 592 | "node_modules/color-convert": { 593 | "version": "2.0.1", 594 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 595 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 596 | "dev": true, 597 | "license": "MIT", 598 | "dependencies": { 599 | "color-name": "~1.1.4" 600 | }, 601 | "engines": { 602 | "node": ">=7.0.0" 603 | } 604 | }, 605 | "node_modules/color-name": { 606 | "version": "1.1.4", 607 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 608 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 609 | "dev": true, 610 | "license": "MIT" 611 | }, 612 | "node_modules/concat-map": { 613 | "version": "0.0.1", 614 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 615 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 616 | "dev": true, 617 | "license": "MIT" 618 | }, 619 | "node_modules/content-disposition": { 620 | "version": "0.5.4", 621 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 622 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 623 | "license": "MIT", 624 | "dependencies": { 625 | "safe-buffer": "5.2.1" 626 | }, 627 | "engines": { 628 | "node": ">= 0.6" 629 | } 630 | }, 631 | "node_modules/content-type": { 632 | "version": "1.0.5", 633 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 634 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 635 | "license": "MIT", 636 | "engines": { 637 | "node": ">= 0.6" 638 | } 639 | }, 640 | "node_modules/cookie": { 641 | "version": "0.7.1", 642 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", 643 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", 644 | "license": "MIT", 645 | "engines": { 646 | "node": ">= 0.6" 647 | } 648 | }, 649 | "node_modules/cookie-signature": { 650 | "version": "1.0.6", 651 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 652 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", 653 | "license": "MIT" 654 | }, 655 | "node_modules/cross-spawn": { 656 | "version": "7.0.3", 657 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 658 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 659 | "dev": true, 660 | "license": "MIT", 661 | "dependencies": { 662 | "path-key": "^3.1.0", 663 | "shebang-command": "^2.0.0", 664 | "which": "^2.0.1" 665 | }, 666 | "engines": { 667 | "node": ">= 8" 668 | } 669 | }, 670 | "node_modules/debug": { 671 | "version": "2.6.9", 672 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 673 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 674 | "license": "MIT", 675 | "dependencies": { 676 | "ms": "2.0.0" 677 | } 678 | }, 679 | "node_modules/deep-is": { 680 | "version": "0.1.4", 681 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 682 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 683 | "dev": true, 684 | "license": "MIT" 685 | }, 686 | "node_modules/define-data-property": { 687 | "version": "1.1.4", 688 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 689 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 690 | "license": "MIT", 691 | "dependencies": { 692 | "es-define-property": "^1.0.0", 693 | "es-errors": "^1.3.0", 694 | "gopd": "^1.0.1" 695 | }, 696 | "engines": { 697 | "node": ">= 0.4" 698 | }, 699 | "funding": { 700 | "url": "https://github.com/sponsors/ljharb" 701 | } 702 | }, 703 | "node_modules/depd": { 704 | "version": "2.0.0", 705 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 706 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 707 | "license": "MIT", 708 | "engines": { 709 | "node": ">= 0.8" 710 | } 711 | }, 712 | "node_modules/destroy": { 713 | "version": "1.2.0", 714 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 715 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 716 | "license": "MIT", 717 | "engines": { 718 | "node": ">= 0.8", 719 | "npm": "1.2.8000 || >= 1.4.16" 720 | } 721 | }, 722 | "node_modules/dottie": { 723 | "version": "2.0.6", 724 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.6.tgz", 725 | "integrity": "sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==", 726 | "license": "MIT" 727 | }, 728 | "node_modules/ee-first": { 729 | "version": "1.1.1", 730 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 731 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", 732 | "license": "MIT" 733 | }, 734 | "node_modules/encodeurl": { 735 | "version": "2.0.0", 736 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", 737 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", 738 | "license": "MIT", 739 | "engines": { 740 | "node": ">= 0.8" 741 | } 742 | }, 743 | "node_modules/es-define-property": { 744 | "version": "1.0.0", 745 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 746 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 747 | "license": "MIT", 748 | "dependencies": { 749 | "get-intrinsic": "^1.2.4" 750 | }, 751 | "engines": { 752 | "node": ">= 0.4" 753 | } 754 | }, 755 | "node_modules/es-errors": { 756 | "version": "1.3.0", 757 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 758 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 759 | "license": "MIT", 760 | "engines": { 761 | "node": ">= 0.4" 762 | } 763 | }, 764 | "node_modules/escape-html": { 765 | "version": "1.0.3", 766 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 767 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", 768 | "license": "MIT" 769 | }, 770 | "node_modules/escape-string-regexp": { 771 | "version": "4.0.0", 772 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 773 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 774 | "dev": true, 775 | "license": "MIT", 776 | "engines": { 777 | "node": ">=10" 778 | }, 779 | "funding": { 780 | "url": "https://github.com/sponsors/sindresorhus" 781 | } 782 | }, 783 | "node_modules/eslint": { 784 | "version": "9.9.1", 785 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.9.1.tgz", 786 | "integrity": "sha512-dHvhrbfr4xFQ9/dq+jcVneZMyRYLjggWjk6RVsIiHsP8Rz6yZ8LvZ//iU4TrZF+SXWG+JkNF2OyiZRvzgRDqMg==", 787 | "dev": true, 788 | "license": "MIT", 789 | "dependencies": { 790 | "@eslint-community/eslint-utils": "^4.2.0", 791 | "@eslint-community/regexpp": "^4.11.0", 792 | "@eslint/config-array": "^0.18.0", 793 | "@eslint/eslintrc": "^3.1.0", 794 | "@eslint/js": "9.9.1", 795 | "@humanwhocodes/module-importer": "^1.0.1", 796 | "@humanwhocodes/retry": "^0.3.0", 797 | "@nodelib/fs.walk": "^1.2.8", 798 | "ajv": "^6.12.4", 799 | "chalk": "^4.0.0", 800 | "cross-spawn": "^7.0.2", 801 | "debug": "^4.3.2", 802 | "escape-string-regexp": "^4.0.0", 803 | "eslint-scope": "^8.0.2", 804 | "eslint-visitor-keys": "^4.0.0", 805 | "espree": "^10.1.0", 806 | "esquery": "^1.5.0", 807 | "esutils": "^2.0.2", 808 | "fast-deep-equal": "^3.1.3", 809 | "file-entry-cache": "^8.0.0", 810 | "find-up": "^5.0.0", 811 | "glob-parent": "^6.0.2", 812 | "ignore": "^5.2.0", 813 | "imurmurhash": "^0.1.4", 814 | "is-glob": "^4.0.0", 815 | "is-path-inside": "^3.0.3", 816 | "json-stable-stringify-without-jsonify": "^1.0.1", 817 | "levn": "^0.4.1", 818 | "lodash.merge": "^4.6.2", 819 | "minimatch": "^3.1.2", 820 | "natural-compare": "^1.4.0", 821 | "optionator": "^0.9.3", 822 | "strip-ansi": "^6.0.1", 823 | "text-table": "^0.2.0" 824 | }, 825 | "bin": { 826 | "eslint": "bin/eslint.js" 827 | }, 828 | "engines": { 829 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 830 | }, 831 | "funding": { 832 | "url": "https://eslint.org/donate" 833 | }, 834 | "peerDependencies": { 835 | "jiti": "*" 836 | }, 837 | "peerDependenciesMeta": { 838 | "jiti": { 839 | "optional": true 840 | } 841 | } 842 | }, 843 | "node_modules/eslint-config-prettier": { 844 | "version": "9.1.0", 845 | "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", 846 | "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", 847 | "dev": true, 848 | "license": "MIT", 849 | "bin": { 850 | "eslint-config-prettier": "bin/cli.js" 851 | }, 852 | "peerDependencies": { 853 | "eslint": ">=7.0.0" 854 | } 855 | }, 856 | "node_modules/eslint-scope": { 857 | "version": "8.0.2", 858 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", 859 | "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", 860 | "dev": true, 861 | "license": "BSD-2-Clause", 862 | "dependencies": { 863 | "esrecurse": "^4.3.0", 864 | "estraverse": "^5.2.0" 865 | }, 866 | "engines": { 867 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 868 | }, 869 | "funding": { 870 | "url": "https://opencollective.com/eslint" 871 | } 872 | }, 873 | "node_modules/eslint-visitor-keys": { 874 | "version": "4.0.0", 875 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", 876 | "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", 877 | "dev": true, 878 | "license": "Apache-2.0", 879 | "engines": { 880 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 881 | }, 882 | "funding": { 883 | "url": "https://opencollective.com/eslint" 884 | } 885 | }, 886 | "node_modules/eslint/node_modules/debug": { 887 | "version": "4.3.6", 888 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 889 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 890 | "dev": true, 891 | "license": "MIT", 892 | "dependencies": { 893 | "ms": "2.1.2" 894 | }, 895 | "engines": { 896 | "node": ">=6.0" 897 | }, 898 | "peerDependenciesMeta": { 899 | "supports-color": { 900 | "optional": true 901 | } 902 | } 903 | }, 904 | "node_modules/eslint/node_modules/ms": { 905 | "version": "2.1.2", 906 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 907 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 908 | "dev": true, 909 | "license": "MIT" 910 | }, 911 | "node_modules/espree": { 912 | "version": "10.1.0", 913 | "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", 914 | "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", 915 | "dev": true, 916 | "license": "BSD-2-Clause", 917 | "dependencies": { 918 | "acorn": "^8.12.0", 919 | "acorn-jsx": "^5.3.2", 920 | "eslint-visitor-keys": "^4.0.0" 921 | }, 922 | "engines": { 923 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 924 | }, 925 | "funding": { 926 | "url": "https://opencollective.com/eslint" 927 | } 928 | }, 929 | "node_modules/esquery": { 930 | "version": "1.6.0", 931 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", 932 | "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", 933 | "dev": true, 934 | "license": "BSD-3-Clause", 935 | "dependencies": { 936 | "estraverse": "^5.1.0" 937 | }, 938 | "engines": { 939 | "node": ">=0.10" 940 | } 941 | }, 942 | "node_modules/esrecurse": { 943 | "version": "4.3.0", 944 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 945 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 946 | "dev": true, 947 | "license": "BSD-2-Clause", 948 | "dependencies": { 949 | "estraverse": "^5.2.0" 950 | }, 951 | "engines": { 952 | "node": ">=4.0" 953 | } 954 | }, 955 | "node_modules/estraverse": { 956 | "version": "5.3.0", 957 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 958 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 959 | "dev": true, 960 | "license": "BSD-2-Clause", 961 | "engines": { 962 | "node": ">=4.0" 963 | } 964 | }, 965 | "node_modules/esutils": { 966 | "version": "2.0.3", 967 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 968 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 969 | "dev": true, 970 | "license": "BSD-2-Clause", 971 | "engines": { 972 | "node": ">=0.10.0" 973 | } 974 | }, 975 | "node_modules/etag": { 976 | "version": "1.8.1", 977 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 978 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 979 | "license": "MIT", 980 | "engines": { 981 | "node": ">= 0.6" 982 | } 983 | }, 984 | "node_modules/express": { 985 | "version": "4.21.1", 986 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", 987 | "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", 988 | "license": "MIT", 989 | "dependencies": { 990 | "accepts": "~1.3.8", 991 | "array-flatten": "1.1.1", 992 | "body-parser": "1.20.3", 993 | "content-disposition": "0.5.4", 994 | "content-type": "~1.0.4", 995 | "cookie": "0.7.1", 996 | "cookie-signature": "1.0.6", 997 | "debug": "2.6.9", 998 | "depd": "2.0.0", 999 | "encodeurl": "~2.0.0", 1000 | "escape-html": "~1.0.3", 1001 | "etag": "~1.8.1", 1002 | "finalhandler": "1.3.1", 1003 | "fresh": "0.5.2", 1004 | "http-errors": "2.0.0", 1005 | "merge-descriptors": "1.0.3", 1006 | "methods": "~1.1.2", 1007 | "on-finished": "2.4.1", 1008 | "parseurl": "~1.3.3", 1009 | "path-to-regexp": "0.1.10", 1010 | "proxy-addr": "~2.0.7", 1011 | "qs": "6.13.0", 1012 | "range-parser": "~1.2.1", 1013 | "safe-buffer": "5.2.1", 1014 | "send": "0.19.0", 1015 | "serve-static": "1.16.2", 1016 | "setprototypeof": "1.2.0", 1017 | "statuses": "2.0.1", 1018 | "type-is": "~1.6.18", 1019 | "utils-merge": "1.0.1", 1020 | "vary": "~1.1.2" 1021 | }, 1022 | "engines": { 1023 | "node": ">= 0.10.0" 1024 | } 1025 | }, 1026 | "node_modules/fast-deep-equal": { 1027 | "version": "3.1.3", 1028 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 1029 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 1030 | "dev": true, 1031 | "license": "MIT" 1032 | }, 1033 | "node_modules/fast-json-stable-stringify": { 1034 | "version": "2.1.0", 1035 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 1036 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 1037 | "dev": true, 1038 | "license": "MIT" 1039 | }, 1040 | "node_modules/fast-levenshtein": { 1041 | "version": "2.0.6", 1042 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1043 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 1044 | "dev": true, 1045 | "license": "MIT" 1046 | }, 1047 | "node_modules/fastq": { 1048 | "version": "1.17.1", 1049 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", 1050 | "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", 1051 | "dev": true, 1052 | "license": "ISC", 1053 | "dependencies": { 1054 | "reusify": "^1.0.4" 1055 | } 1056 | }, 1057 | "node_modules/file-entry-cache": { 1058 | "version": "8.0.0", 1059 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", 1060 | "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", 1061 | "dev": true, 1062 | "license": "MIT", 1063 | "dependencies": { 1064 | "flat-cache": "^4.0.0" 1065 | }, 1066 | "engines": { 1067 | "node": ">=16.0.0" 1068 | } 1069 | }, 1070 | "node_modules/finalhandler": { 1071 | "version": "1.3.1", 1072 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", 1073 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", 1074 | "license": "MIT", 1075 | "dependencies": { 1076 | "debug": "2.6.9", 1077 | "encodeurl": "~2.0.0", 1078 | "escape-html": "~1.0.3", 1079 | "on-finished": "2.4.1", 1080 | "parseurl": "~1.3.3", 1081 | "statuses": "2.0.1", 1082 | "unpipe": "~1.0.0" 1083 | }, 1084 | "engines": { 1085 | "node": ">= 0.8" 1086 | } 1087 | }, 1088 | "node_modules/find-up": { 1089 | "version": "5.0.0", 1090 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 1091 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 1092 | "dev": true, 1093 | "license": "MIT", 1094 | "dependencies": { 1095 | "locate-path": "^6.0.0", 1096 | "path-exists": "^4.0.0" 1097 | }, 1098 | "engines": { 1099 | "node": ">=10" 1100 | }, 1101 | "funding": { 1102 | "url": "https://github.com/sponsors/sindresorhus" 1103 | } 1104 | }, 1105 | "node_modules/flat-cache": { 1106 | "version": "4.0.1", 1107 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", 1108 | "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", 1109 | "dev": true, 1110 | "license": "MIT", 1111 | "dependencies": { 1112 | "flatted": "^3.2.9", 1113 | "keyv": "^4.5.4" 1114 | }, 1115 | "engines": { 1116 | "node": ">=16" 1117 | } 1118 | }, 1119 | "node_modules/flatted": { 1120 | "version": "3.3.1", 1121 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", 1122 | "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", 1123 | "dev": true, 1124 | "license": "ISC" 1125 | }, 1126 | "node_modules/forwarded": { 1127 | "version": "0.2.0", 1128 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1129 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 1130 | "license": "MIT", 1131 | "engines": { 1132 | "node": ">= 0.6" 1133 | } 1134 | }, 1135 | "node_modules/fresh": { 1136 | "version": "0.5.2", 1137 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1138 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 1139 | "license": "MIT", 1140 | "engines": { 1141 | "node": ">= 0.6" 1142 | } 1143 | }, 1144 | "node_modules/function-bind": { 1145 | "version": "1.1.2", 1146 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1147 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1148 | "license": "MIT", 1149 | "funding": { 1150 | "url": "https://github.com/sponsors/ljharb" 1151 | } 1152 | }, 1153 | "node_modules/get-intrinsic": { 1154 | "version": "1.2.4", 1155 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 1156 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 1157 | "license": "MIT", 1158 | "dependencies": { 1159 | "es-errors": "^1.3.0", 1160 | "function-bind": "^1.1.2", 1161 | "has-proto": "^1.0.1", 1162 | "has-symbols": "^1.0.3", 1163 | "hasown": "^2.0.0" 1164 | }, 1165 | "engines": { 1166 | "node": ">= 0.4" 1167 | }, 1168 | "funding": { 1169 | "url": "https://github.com/sponsors/ljharb" 1170 | } 1171 | }, 1172 | "node_modules/glob-parent": { 1173 | "version": "6.0.2", 1174 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1175 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1176 | "dev": true, 1177 | "license": "ISC", 1178 | "dependencies": { 1179 | "is-glob": "^4.0.3" 1180 | }, 1181 | "engines": { 1182 | "node": ">=10.13.0" 1183 | } 1184 | }, 1185 | "node_modules/globals": { 1186 | "version": "15.9.0", 1187 | "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", 1188 | "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", 1189 | "dev": true, 1190 | "license": "MIT", 1191 | "engines": { 1192 | "node": ">=18" 1193 | }, 1194 | "funding": { 1195 | "url": "https://github.com/sponsors/sindresorhus" 1196 | } 1197 | }, 1198 | "node_modules/gopd": { 1199 | "version": "1.0.1", 1200 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1201 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1202 | "license": "MIT", 1203 | "dependencies": { 1204 | "get-intrinsic": "^1.1.3" 1205 | }, 1206 | "funding": { 1207 | "url": "https://github.com/sponsors/ljharb" 1208 | } 1209 | }, 1210 | "node_modules/has-flag": { 1211 | "version": "4.0.0", 1212 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 1213 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 1214 | "dev": true, 1215 | "license": "MIT", 1216 | "engines": { 1217 | "node": ">=8" 1218 | } 1219 | }, 1220 | "node_modules/has-property-descriptors": { 1221 | "version": "1.0.2", 1222 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 1223 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 1224 | "license": "MIT", 1225 | "dependencies": { 1226 | "es-define-property": "^1.0.0" 1227 | }, 1228 | "funding": { 1229 | "url": "https://github.com/sponsors/ljharb" 1230 | } 1231 | }, 1232 | "node_modules/has-proto": { 1233 | "version": "1.0.3", 1234 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 1235 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 1236 | "license": "MIT", 1237 | "engines": { 1238 | "node": ">= 0.4" 1239 | }, 1240 | "funding": { 1241 | "url": "https://github.com/sponsors/ljharb" 1242 | } 1243 | }, 1244 | "node_modules/has-symbols": { 1245 | "version": "1.0.3", 1246 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1247 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1248 | "license": "MIT", 1249 | "engines": { 1250 | "node": ">= 0.4" 1251 | }, 1252 | "funding": { 1253 | "url": "https://github.com/sponsors/ljharb" 1254 | } 1255 | }, 1256 | "node_modules/hasown": { 1257 | "version": "2.0.2", 1258 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1259 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1260 | "license": "MIT", 1261 | "dependencies": { 1262 | "function-bind": "^1.1.2" 1263 | }, 1264 | "engines": { 1265 | "node": ">= 0.4" 1266 | } 1267 | }, 1268 | "node_modules/http-errors": { 1269 | "version": "2.0.0", 1270 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1271 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1272 | "license": "MIT", 1273 | "dependencies": { 1274 | "depd": "2.0.0", 1275 | "inherits": "2.0.4", 1276 | "setprototypeof": "1.2.0", 1277 | "statuses": "2.0.1", 1278 | "toidentifier": "1.0.1" 1279 | }, 1280 | "engines": { 1281 | "node": ">= 0.8" 1282 | } 1283 | }, 1284 | "node_modules/iconv-lite": { 1285 | "version": "0.4.24", 1286 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1287 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1288 | "license": "MIT", 1289 | "dependencies": { 1290 | "safer-buffer": ">= 2.1.2 < 3" 1291 | }, 1292 | "engines": { 1293 | "node": ">=0.10.0" 1294 | } 1295 | }, 1296 | "node_modules/ignore": { 1297 | "version": "5.3.2", 1298 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", 1299 | "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", 1300 | "dev": true, 1301 | "license": "MIT", 1302 | "engines": { 1303 | "node": ">= 4" 1304 | } 1305 | }, 1306 | "node_modules/import-fresh": { 1307 | "version": "3.3.0", 1308 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 1309 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 1310 | "dev": true, 1311 | "license": "MIT", 1312 | "dependencies": { 1313 | "parent-module": "^1.0.0", 1314 | "resolve-from": "^4.0.0" 1315 | }, 1316 | "engines": { 1317 | "node": ">=6" 1318 | }, 1319 | "funding": { 1320 | "url": "https://github.com/sponsors/sindresorhus" 1321 | } 1322 | }, 1323 | "node_modules/imurmurhash": { 1324 | "version": "0.1.4", 1325 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1326 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 1327 | "dev": true, 1328 | "license": "MIT", 1329 | "engines": { 1330 | "node": ">=0.8.19" 1331 | } 1332 | }, 1333 | "node_modules/inflection": { 1334 | "version": "1.13.4", 1335 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.13.4.tgz", 1336 | "integrity": "sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==", 1337 | "engines": [ 1338 | "node >= 0.4.0" 1339 | ], 1340 | "license": "MIT" 1341 | }, 1342 | "node_modules/inherits": { 1343 | "version": "2.0.4", 1344 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1345 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1346 | "license": "ISC" 1347 | }, 1348 | "node_modules/ipaddr.js": { 1349 | "version": "1.9.1", 1350 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1351 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 1352 | "license": "MIT", 1353 | "engines": { 1354 | "node": ">= 0.10" 1355 | } 1356 | }, 1357 | "node_modules/is-extglob": { 1358 | "version": "2.1.1", 1359 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1360 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1361 | "dev": true, 1362 | "license": "MIT", 1363 | "engines": { 1364 | "node": ">=0.10.0" 1365 | } 1366 | }, 1367 | "node_modules/is-glob": { 1368 | "version": "4.0.3", 1369 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1370 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1371 | "dev": true, 1372 | "license": "MIT", 1373 | "dependencies": { 1374 | "is-extglob": "^2.1.1" 1375 | }, 1376 | "engines": { 1377 | "node": ">=0.10.0" 1378 | } 1379 | }, 1380 | "node_modules/is-path-inside": { 1381 | "version": "3.0.3", 1382 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", 1383 | "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", 1384 | "dev": true, 1385 | "license": "MIT", 1386 | "engines": { 1387 | "node": ">=8" 1388 | } 1389 | }, 1390 | "node_modules/isexe": { 1391 | "version": "2.0.0", 1392 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1393 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1394 | "dev": true, 1395 | "license": "ISC" 1396 | }, 1397 | "node_modules/js-yaml": { 1398 | "version": "4.1.0", 1399 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1400 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1401 | "dev": true, 1402 | "license": "MIT", 1403 | "dependencies": { 1404 | "argparse": "^2.0.1" 1405 | }, 1406 | "bin": { 1407 | "js-yaml": "bin/js-yaml.js" 1408 | } 1409 | }, 1410 | "node_modules/json-buffer": { 1411 | "version": "3.0.1", 1412 | "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", 1413 | "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", 1414 | "dev": true, 1415 | "license": "MIT" 1416 | }, 1417 | "node_modules/json-schema-traverse": { 1418 | "version": "0.4.1", 1419 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1420 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1421 | "dev": true, 1422 | "license": "MIT" 1423 | }, 1424 | "node_modules/json-stable-stringify-without-jsonify": { 1425 | "version": "1.0.1", 1426 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1427 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1428 | "dev": true, 1429 | "license": "MIT" 1430 | }, 1431 | "node_modules/keyv": { 1432 | "version": "4.5.4", 1433 | "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", 1434 | "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", 1435 | "dev": true, 1436 | "license": "MIT", 1437 | "dependencies": { 1438 | "json-buffer": "3.0.1" 1439 | } 1440 | }, 1441 | "node_modules/levn": { 1442 | "version": "0.4.1", 1443 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1444 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1445 | "dev": true, 1446 | "license": "MIT", 1447 | "dependencies": { 1448 | "prelude-ls": "^1.2.1", 1449 | "type-check": "~0.4.0" 1450 | }, 1451 | "engines": { 1452 | "node": ">= 0.8.0" 1453 | } 1454 | }, 1455 | "node_modules/locate-path": { 1456 | "version": "6.0.0", 1457 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1458 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1459 | "dev": true, 1460 | "license": "MIT", 1461 | "dependencies": { 1462 | "p-locate": "^5.0.0" 1463 | }, 1464 | "engines": { 1465 | "node": ">=10" 1466 | }, 1467 | "funding": { 1468 | "url": "https://github.com/sponsors/sindresorhus" 1469 | } 1470 | }, 1471 | "node_modules/lodash": { 1472 | "version": "4.17.21", 1473 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1474 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1475 | "license": "MIT" 1476 | }, 1477 | "node_modules/lodash.merge": { 1478 | "version": "4.6.2", 1479 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1480 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1481 | "dev": true, 1482 | "license": "MIT" 1483 | }, 1484 | "node_modules/media-typer": { 1485 | "version": "0.3.0", 1486 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1487 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 1488 | "license": "MIT", 1489 | "engines": { 1490 | "node": ">= 0.6" 1491 | } 1492 | }, 1493 | "node_modules/merge-descriptors": { 1494 | "version": "1.0.3", 1495 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", 1496 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", 1497 | "license": "MIT", 1498 | "funding": { 1499 | "url": "https://github.com/sponsors/sindresorhus" 1500 | } 1501 | }, 1502 | "node_modules/methods": { 1503 | "version": "1.1.2", 1504 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1505 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 1506 | "license": "MIT", 1507 | "engines": { 1508 | "node": ">= 0.6" 1509 | } 1510 | }, 1511 | "node_modules/mime": { 1512 | "version": "1.6.0", 1513 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1514 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 1515 | "license": "MIT", 1516 | "bin": { 1517 | "mime": "cli.js" 1518 | }, 1519 | "engines": { 1520 | "node": ">=4" 1521 | } 1522 | }, 1523 | "node_modules/mime-db": { 1524 | "version": "1.52.0", 1525 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1526 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1527 | "license": "MIT", 1528 | "engines": { 1529 | "node": ">= 0.6" 1530 | } 1531 | }, 1532 | "node_modules/mime-types": { 1533 | "version": "2.1.35", 1534 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1535 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1536 | "license": "MIT", 1537 | "dependencies": { 1538 | "mime-db": "1.52.0" 1539 | }, 1540 | "engines": { 1541 | "node": ">= 0.6" 1542 | } 1543 | }, 1544 | "node_modules/minimatch": { 1545 | "version": "3.1.2", 1546 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1547 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1548 | "dev": true, 1549 | "license": "ISC", 1550 | "dependencies": { 1551 | "brace-expansion": "^1.1.7" 1552 | }, 1553 | "engines": { 1554 | "node": "*" 1555 | } 1556 | }, 1557 | "node_modules/moment": { 1558 | "version": "2.30.1", 1559 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", 1560 | "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", 1561 | "license": "MIT", 1562 | "engines": { 1563 | "node": "*" 1564 | } 1565 | }, 1566 | "node_modules/moment-timezone": { 1567 | "version": "0.5.45", 1568 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", 1569 | "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", 1570 | "license": "MIT", 1571 | "dependencies": { 1572 | "moment": "^2.29.4" 1573 | }, 1574 | "engines": { 1575 | "node": "*" 1576 | } 1577 | }, 1578 | "node_modules/morgan": { 1579 | "version": "1.10.0", 1580 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", 1581 | "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", 1582 | "license": "MIT", 1583 | "dependencies": { 1584 | "basic-auth": "~2.0.1", 1585 | "debug": "2.6.9", 1586 | "depd": "~2.0.0", 1587 | "on-finished": "~2.3.0", 1588 | "on-headers": "~1.0.2" 1589 | }, 1590 | "engines": { 1591 | "node": ">= 0.8.0" 1592 | } 1593 | }, 1594 | "node_modules/morgan/node_modules/on-finished": { 1595 | "version": "2.3.0", 1596 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1597 | "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", 1598 | "license": "MIT", 1599 | "dependencies": { 1600 | "ee-first": "1.1.1" 1601 | }, 1602 | "engines": { 1603 | "node": ">= 0.8" 1604 | } 1605 | }, 1606 | "node_modules/ms": { 1607 | "version": "2.0.0", 1608 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1609 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", 1610 | "license": "MIT" 1611 | }, 1612 | "node_modules/natural-compare": { 1613 | "version": "1.4.0", 1614 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1615 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1616 | "dev": true, 1617 | "license": "MIT" 1618 | }, 1619 | "node_modules/negotiator": { 1620 | "version": "0.6.3", 1621 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1622 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 1623 | "license": "MIT", 1624 | "engines": { 1625 | "node": ">= 0.6" 1626 | } 1627 | }, 1628 | "node_modules/object-inspect": { 1629 | "version": "1.13.2", 1630 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", 1631 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", 1632 | "license": "MIT", 1633 | "engines": { 1634 | "node": ">= 0.4" 1635 | }, 1636 | "funding": { 1637 | "url": "https://github.com/sponsors/ljharb" 1638 | } 1639 | }, 1640 | "node_modules/on-finished": { 1641 | "version": "2.4.1", 1642 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1643 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1644 | "license": "MIT", 1645 | "dependencies": { 1646 | "ee-first": "1.1.1" 1647 | }, 1648 | "engines": { 1649 | "node": ">= 0.8" 1650 | } 1651 | }, 1652 | "node_modules/on-headers": { 1653 | "version": "1.0.2", 1654 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 1655 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", 1656 | "license": "MIT", 1657 | "engines": { 1658 | "node": ">= 0.8" 1659 | } 1660 | }, 1661 | "node_modules/optionator": { 1662 | "version": "0.9.4", 1663 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", 1664 | "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", 1665 | "dev": true, 1666 | "license": "MIT", 1667 | "dependencies": { 1668 | "deep-is": "^0.1.3", 1669 | "fast-levenshtein": "^2.0.6", 1670 | "levn": "^0.4.1", 1671 | "prelude-ls": "^1.2.1", 1672 | "type-check": "^0.4.0", 1673 | "word-wrap": "^1.2.5" 1674 | }, 1675 | "engines": { 1676 | "node": ">= 0.8.0" 1677 | } 1678 | }, 1679 | "node_modules/p-limit": { 1680 | "version": "3.1.0", 1681 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1682 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1683 | "dev": true, 1684 | "license": "MIT", 1685 | "dependencies": { 1686 | "yocto-queue": "^0.1.0" 1687 | }, 1688 | "engines": { 1689 | "node": ">=10" 1690 | }, 1691 | "funding": { 1692 | "url": "https://github.com/sponsors/sindresorhus" 1693 | } 1694 | }, 1695 | "node_modules/p-locate": { 1696 | "version": "5.0.0", 1697 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1698 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1699 | "dev": true, 1700 | "license": "MIT", 1701 | "dependencies": { 1702 | "p-limit": "^3.0.2" 1703 | }, 1704 | "engines": { 1705 | "node": ">=10" 1706 | }, 1707 | "funding": { 1708 | "url": "https://github.com/sponsors/sindresorhus" 1709 | } 1710 | }, 1711 | "node_modules/parent-module": { 1712 | "version": "1.0.1", 1713 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1714 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1715 | "dev": true, 1716 | "license": "MIT", 1717 | "dependencies": { 1718 | "callsites": "^3.0.0" 1719 | }, 1720 | "engines": { 1721 | "node": ">=6" 1722 | } 1723 | }, 1724 | "node_modules/parseurl": { 1725 | "version": "1.3.3", 1726 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1727 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 1728 | "license": "MIT", 1729 | "engines": { 1730 | "node": ">= 0.8" 1731 | } 1732 | }, 1733 | "node_modules/path-exists": { 1734 | "version": "4.0.0", 1735 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1736 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1737 | "dev": true, 1738 | "license": "MIT", 1739 | "engines": { 1740 | "node": ">=8" 1741 | } 1742 | }, 1743 | "node_modules/path-key": { 1744 | "version": "3.1.1", 1745 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1746 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1747 | "dev": true, 1748 | "license": "MIT", 1749 | "engines": { 1750 | "node": ">=8" 1751 | } 1752 | }, 1753 | "node_modules/path-to-regexp": { 1754 | "version": "0.1.10", 1755 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", 1756 | "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", 1757 | "license": "MIT" 1758 | }, 1759 | "node_modules/pg": { 1760 | "version": "8.12.0", 1761 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", 1762 | "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", 1763 | "license": "MIT", 1764 | "dependencies": { 1765 | "pg-connection-string": "^2.6.4", 1766 | "pg-pool": "^3.6.2", 1767 | "pg-protocol": "^1.6.1", 1768 | "pg-types": "^2.1.0", 1769 | "pgpass": "1.x" 1770 | }, 1771 | "engines": { 1772 | "node": ">= 8.0.0" 1773 | }, 1774 | "optionalDependencies": { 1775 | "pg-cloudflare": "^1.1.1" 1776 | }, 1777 | "peerDependencies": { 1778 | "pg-native": ">=3.0.1" 1779 | }, 1780 | "peerDependenciesMeta": { 1781 | "pg-native": { 1782 | "optional": true 1783 | } 1784 | } 1785 | }, 1786 | "node_modules/pg-cloudflare": { 1787 | "version": "1.1.1", 1788 | "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", 1789 | "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", 1790 | "license": "MIT", 1791 | "optional": true 1792 | }, 1793 | "node_modules/pg-connection-string": { 1794 | "version": "2.6.4", 1795 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", 1796 | "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==", 1797 | "license": "MIT" 1798 | }, 1799 | "node_modules/pg-hstore": { 1800 | "version": "2.3.4", 1801 | "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.4.tgz", 1802 | "integrity": "sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==", 1803 | "license": "MIT", 1804 | "dependencies": { 1805 | "underscore": "^1.13.1" 1806 | }, 1807 | "engines": { 1808 | "node": ">= 0.8.x" 1809 | } 1810 | }, 1811 | "node_modules/pg-int8": { 1812 | "version": "1.0.1", 1813 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", 1814 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", 1815 | "license": "ISC", 1816 | "engines": { 1817 | "node": ">=4.0.0" 1818 | } 1819 | }, 1820 | "node_modules/pg-pool": { 1821 | "version": "3.6.2", 1822 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", 1823 | "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", 1824 | "license": "MIT", 1825 | "peerDependencies": { 1826 | "pg": ">=8.0" 1827 | } 1828 | }, 1829 | "node_modules/pg-protocol": { 1830 | "version": "1.6.1", 1831 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", 1832 | "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==", 1833 | "license": "MIT" 1834 | }, 1835 | "node_modules/pg-types": { 1836 | "version": "2.2.0", 1837 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", 1838 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", 1839 | "license": "MIT", 1840 | "dependencies": { 1841 | "pg-int8": "1.0.1", 1842 | "postgres-array": "~2.0.0", 1843 | "postgres-bytea": "~1.0.0", 1844 | "postgres-date": "~1.0.4", 1845 | "postgres-interval": "^1.1.0" 1846 | }, 1847 | "engines": { 1848 | "node": ">=4" 1849 | } 1850 | }, 1851 | "node_modules/pgpass": { 1852 | "version": "1.0.5", 1853 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", 1854 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", 1855 | "license": "MIT", 1856 | "dependencies": { 1857 | "split2": "^4.1.0" 1858 | } 1859 | }, 1860 | "node_modules/postgres-array": { 1861 | "version": "2.0.0", 1862 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", 1863 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", 1864 | "license": "MIT", 1865 | "engines": { 1866 | "node": ">=4" 1867 | } 1868 | }, 1869 | "node_modules/postgres-bytea": { 1870 | "version": "1.0.0", 1871 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", 1872 | "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", 1873 | "license": "MIT", 1874 | "engines": { 1875 | "node": ">=0.10.0" 1876 | } 1877 | }, 1878 | "node_modules/postgres-date": { 1879 | "version": "1.0.7", 1880 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", 1881 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", 1882 | "license": "MIT", 1883 | "engines": { 1884 | "node": ">=0.10.0" 1885 | } 1886 | }, 1887 | "node_modules/postgres-interval": { 1888 | "version": "1.2.0", 1889 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", 1890 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", 1891 | "license": "MIT", 1892 | "dependencies": { 1893 | "xtend": "^4.0.0" 1894 | }, 1895 | "engines": { 1896 | "node": ">=0.10.0" 1897 | } 1898 | }, 1899 | "node_modules/prelude-ls": { 1900 | "version": "1.2.1", 1901 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1902 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1903 | "dev": true, 1904 | "license": "MIT", 1905 | "engines": { 1906 | "node": ">= 0.8.0" 1907 | } 1908 | }, 1909 | "node_modules/prettier": { 1910 | "version": "3.3.3", 1911 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", 1912 | "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", 1913 | "dev": true, 1914 | "license": "MIT", 1915 | "bin": { 1916 | "prettier": "bin/prettier.cjs" 1917 | }, 1918 | "engines": { 1919 | "node": ">=14" 1920 | }, 1921 | "funding": { 1922 | "url": "https://github.com/prettier/prettier?sponsor=1" 1923 | } 1924 | }, 1925 | "node_modules/proxy-addr": { 1926 | "version": "2.0.7", 1927 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1928 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1929 | "license": "MIT", 1930 | "dependencies": { 1931 | "forwarded": "0.2.0", 1932 | "ipaddr.js": "1.9.1" 1933 | }, 1934 | "engines": { 1935 | "node": ">= 0.10" 1936 | } 1937 | }, 1938 | "node_modules/punycode": { 1939 | "version": "2.3.1", 1940 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", 1941 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", 1942 | "dev": true, 1943 | "license": "MIT", 1944 | "engines": { 1945 | "node": ">=6" 1946 | } 1947 | }, 1948 | "node_modules/qs": { 1949 | "version": "6.13.0", 1950 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", 1951 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", 1952 | "license": "BSD-3-Clause", 1953 | "dependencies": { 1954 | "side-channel": "^1.0.6" 1955 | }, 1956 | "engines": { 1957 | "node": ">=0.6" 1958 | }, 1959 | "funding": { 1960 | "url": "https://github.com/sponsors/ljharb" 1961 | } 1962 | }, 1963 | "node_modules/queue-microtask": { 1964 | "version": "1.2.3", 1965 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1966 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1967 | "dev": true, 1968 | "funding": [ 1969 | { 1970 | "type": "github", 1971 | "url": "https://github.com/sponsors/feross" 1972 | }, 1973 | { 1974 | "type": "patreon", 1975 | "url": "https://www.patreon.com/feross" 1976 | }, 1977 | { 1978 | "type": "consulting", 1979 | "url": "https://feross.org/support" 1980 | } 1981 | ], 1982 | "license": "MIT" 1983 | }, 1984 | "node_modules/range-parser": { 1985 | "version": "1.2.1", 1986 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1987 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 1988 | "license": "MIT", 1989 | "engines": { 1990 | "node": ">= 0.6" 1991 | } 1992 | }, 1993 | "node_modules/raw-body": { 1994 | "version": "2.5.2", 1995 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", 1996 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", 1997 | "license": "MIT", 1998 | "dependencies": { 1999 | "bytes": "3.1.2", 2000 | "http-errors": "2.0.0", 2001 | "iconv-lite": "0.4.24", 2002 | "unpipe": "1.0.0" 2003 | }, 2004 | "engines": { 2005 | "node": ">= 0.8" 2006 | } 2007 | }, 2008 | "node_modules/resolve-from": { 2009 | "version": "4.0.0", 2010 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 2011 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 2012 | "dev": true, 2013 | "license": "MIT", 2014 | "engines": { 2015 | "node": ">=4" 2016 | } 2017 | }, 2018 | "node_modules/retry-as-promised": { 2019 | "version": "7.0.4", 2020 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-7.0.4.tgz", 2021 | "integrity": "sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==", 2022 | "license": "MIT" 2023 | }, 2024 | "node_modules/reusify": { 2025 | "version": "1.0.4", 2026 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2027 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2028 | "dev": true, 2029 | "license": "MIT", 2030 | "engines": { 2031 | "iojs": ">=1.0.0", 2032 | "node": ">=0.10.0" 2033 | } 2034 | }, 2035 | "node_modules/run-parallel": { 2036 | "version": "1.2.0", 2037 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2038 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2039 | "dev": true, 2040 | "funding": [ 2041 | { 2042 | "type": "github", 2043 | "url": "https://github.com/sponsors/feross" 2044 | }, 2045 | { 2046 | "type": "patreon", 2047 | "url": "https://www.patreon.com/feross" 2048 | }, 2049 | { 2050 | "type": "consulting", 2051 | "url": "https://feross.org/support" 2052 | } 2053 | ], 2054 | "license": "MIT", 2055 | "dependencies": { 2056 | "queue-microtask": "^1.2.2" 2057 | } 2058 | }, 2059 | "node_modules/safe-buffer": { 2060 | "version": "5.2.1", 2061 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2062 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2063 | "funding": [ 2064 | { 2065 | "type": "github", 2066 | "url": "https://github.com/sponsors/feross" 2067 | }, 2068 | { 2069 | "type": "patreon", 2070 | "url": "https://www.patreon.com/feross" 2071 | }, 2072 | { 2073 | "type": "consulting", 2074 | "url": "https://feross.org/support" 2075 | } 2076 | ], 2077 | "license": "MIT" 2078 | }, 2079 | "node_modules/safer-buffer": { 2080 | "version": "2.1.2", 2081 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2082 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 2083 | "license": "MIT" 2084 | }, 2085 | "node_modules/semver": { 2086 | "version": "7.6.3", 2087 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", 2088 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", 2089 | "license": "ISC", 2090 | "bin": { 2091 | "semver": "bin/semver.js" 2092 | }, 2093 | "engines": { 2094 | "node": ">=10" 2095 | } 2096 | }, 2097 | "node_modules/send": { 2098 | "version": "0.19.0", 2099 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", 2100 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", 2101 | "license": "MIT", 2102 | "dependencies": { 2103 | "debug": "2.6.9", 2104 | "depd": "2.0.0", 2105 | "destroy": "1.2.0", 2106 | "encodeurl": "~1.0.2", 2107 | "escape-html": "~1.0.3", 2108 | "etag": "~1.8.1", 2109 | "fresh": "0.5.2", 2110 | "http-errors": "2.0.0", 2111 | "mime": "1.6.0", 2112 | "ms": "2.1.3", 2113 | "on-finished": "2.4.1", 2114 | "range-parser": "~1.2.1", 2115 | "statuses": "2.0.1" 2116 | }, 2117 | "engines": { 2118 | "node": ">= 0.8.0" 2119 | } 2120 | }, 2121 | "node_modules/send/node_modules/encodeurl": { 2122 | "version": "1.0.2", 2123 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 2124 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 2125 | "license": "MIT", 2126 | "engines": { 2127 | "node": ">= 0.8" 2128 | } 2129 | }, 2130 | "node_modules/send/node_modules/ms": { 2131 | "version": "2.1.3", 2132 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2133 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2134 | "license": "MIT" 2135 | }, 2136 | "node_modules/sequelize": { 2137 | "version": "6.37.3", 2138 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.37.3.tgz", 2139 | "integrity": "sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A==", 2140 | "funding": [ 2141 | { 2142 | "type": "opencollective", 2143 | "url": "https://opencollective.com/sequelize" 2144 | } 2145 | ], 2146 | "license": "MIT", 2147 | "dependencies": { 2148 | "@types/debug": "^4.1.8", 2149 | "@types/validator": "^13.7.17", 2150 | "debug": "^4.3.4", 2151 | "dottie": "^2.0.6", 2152 | "inflection": "^1.13.4", 2153 | "lodash": "^4.17.21", 2154 | "moment": "^2.29.4", 2155 | "moment-timezone": "^0.5.43", 2156 | "pg-connection-string": "^2.6.1", 2157 | "retry-as-promised": "^7.0.4", 2158 | "semver": "^7.5.4", 2159 | "sequelize-pool": "^7.1.0", 2160 | "toposort-class": "^1.0.1", 2161 | "uuid": "^8.3.2", 2162 | "validator": "^13.9.0", 2163 | "wkx": "^0.5.0" 2164 | }, 2165 | "engines": { 2166 | "node": ">=10.0.0" 2167 | }, 2168 | "peerDependenciesMeta": { 2169 | "ibm_db": { 2170 | "optional": true 2171 | }, 2172 | "mariadb": { 2173 | "optional": true 2174 | }, 2175 | "mysql2": { 2176 | "optional": true 2177 | }, 2178 | "oracledb": { 2179 | "optional": true 2180 | }, 2181 | "pg": { 2182 | "optional": true 2183 | }, 2184 | "pg-hstore": { 2185 | "optional": true 2186 | }, 2187 | "snowflake-sdk": { 2188 | "optional": true 2189 | }, 2190 | "sqlite3": { 2191 | "optional": true 2192 | }, 2193 | "tedious": { 2194 | "optional": true 2195 | } 2196 | } 2197 | }, 2198 | "node_modules/sequelize-pool": { 2199 | "version": "7.1.0", 2200 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-7.1.0.tgz", 2201 | "integrity": "sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==", 2202 | "license": "MIT", 2203 | "engines": { 2204 | "node": ">= 10.0.0" 2205 | } 2206 | }, 2207 | "node_modules/sequelize/node_modules/debug": { 2208 | "version": "4.3.6", 2209 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", 2210 | "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", 2211 | "license": "MIT", 2212 | "dependencies": { 2213 | "ms": "2.1.2" 2214 | }, 2215 | "engines": { 2216 | "node": ">=6.0" 2217 | }, 2218 | "peerDependenciesMeta": { 2219 | "supports-color": { 2220 | "optional": true 2221 | } 2222 | } 2223 | }, 2224 | "node_modules/sequelize/node_modules/ms": { 2225 | "version": "2.1.2", 2226 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2227 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2228 | "license": "MIT" 2229 | }, 2230 | "node_modules/serve-static": { 2231 | "version": "1.16.2", 2232 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", 2233 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", 2234 | "license": "MIT", 2235 | "dependencies": { 2236 | "encodeurl": "~2.0.0", 2237 | "escape-html": "~1.0.3", 2238 | "parseurl": "~1.3.3", 2239 | "send": "0.19.0" 2240 | }, 2241 | "engines": { 2242 | "node": ">= 0.8.0" 2243 | } 2244 | }, 2245 | "node_modules/set-function-length": { 2246 | "version": "1.2.2", 2247 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", 2248 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", 2249 | "license": "MIT", 2250 | "dependencies": { 2251 | "define-data-property": "^1.1.4", 2252 | "es-errors": "^1.3.0", 2253 | "function-bind": "^1.1.2", 2254 | "get-intrinsic": "^1.2.4", 2255 | "gopd": "^1.0.1", 2256 | "has-property-descriptors": "^1.0.2" 2257 | }, 2258 | "engines": { 2259 | "node": ">= 0.4" 2260 | } 2261 | }, 2262 | "node_modules/setprototypeof": { 2263 | "version": "1.2.0", 2264 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 2265 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", 2266 | "license": "ISC" 2267 | }, 2268 | "node_modules/shebang-command": { 2269 | "version": "2.0.0", 2270 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2271 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2272 | "dev": true, 2273 | "license": "MIT", 2274 | "dependencies": { 2275 | "shebang-regex": "^3.0.0" 2276 | }, 2277 | "engines": { 2278 | "node": ">=8" 2279 | } 2280 | }, 2281 | "node_modules/shebang-regex": { 2282 | "version": "3.0.0", 2283 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2284 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2285 | "dev": true, 2286 | "license": "MIT", 2287 | "engines": { 2288 | "node": ">=8" 2289 | } 2290 | }, 2291 | "node_modules/side-channel": { 2292 | "version": "1.0.6", 2293 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", 2294 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", 2295 | "license": "MIT", 2296 | "dependencies": { 2297 | "call-bind": "^1.0.7", 2298 | "es-errors": "^1.3.0", 2299 | "get-intrinsic": "^1.2.4", 2300 | "object-inspect": "^1.13.1" 2301 | }, 2302 | "engines": { 2303 | "node": ">= 0.4" 2304 | }, 2305 | "funding": { 2306 | "url": "https://github.com/sponsors/ljharb" 2307 | } 2308 | }, 2309 | "node_modules/split2": { 2310 | "version": "4.2.0", 2311 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 2312 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 2313 | "license": "ISC", 2314 | "engines": { 2315 | "node": ">= 10.x" 2316 | } 2317 | }, 2318 | "node_modules/statuses": { 2319 | "version": "2.0.1", 2320 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 2321 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 2322 | "license": "MIT", 2323 | "engines": { 2324 | "node": ">= 0.8" 2325 | } 2326 | }, 2327 | "node_modules/strip-ansi": { 2328 | "version": "6.0.1", 2329 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2330 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2331 | "dev": true, 2332 | "license": "MIT", 2333 | "dependencies": { 2334 | "ansi-regex": "^5.0.1" 2335 | }, 2336 | "engines": { 2337 | "node": ">=8" 2338 | } 2339 | }, 2340 | "node_modules/strip-json-comments": { 2341 | "version": "3.1.1", 2342 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2343 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2344 | "dev": true, 2345 | "license": "MIT", 2346 | "engines": { 2347 | "node": ">=8" 2348 | }, 2349 | "funding": { 2350 | "url": "https://github.com/sponsors/sindresorhus" 2351 | } 2352 | }, 2353 | "node_modules/supports-color": { 2354 | "version": "7.2.0", 2355 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2356 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2357 | "dev": true, 2358 | "license": "MIT", 2359 | "dependencies": { 2360 | "has-flag": "^4.0.0" 2361 | }, 2362 | "engines": { 2363 | "node": ">=8" 2364 | } 2365 | }, 2366 | "node_modules/text-table": { 2367 | "version": "0.2.0", 2368 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2369 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 2370 | "dev": true, 2371 | "license": "MIT" 2372 | }, 2373 | "node_modules/toidentifier": { 2374 | "version": "1.0.1", 2375 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 2376 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 2377 | "license": "MIT", 2378 | "engines": { 2379 | "node": ">=0.6" 2380 | } 2381 | }, 2382 | "node_modules/toposort-class": { 2383 | "version": "1.0.1", 2384 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", 2385 | "integrity": "sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==", 2386 | "license": "MIT" 2387 | }, 2388 | "node_modules/type-check": { 2389 | "version": "0.4.0", 2390 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 2391 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 2392 | "dev": true, 2393 | "license": "MIT", 2394 | "dependencies": { 2395 | "prelude-ls": "^1.2.1" 2396 | }, 2397 | "engines": { 2398 | "node": ">= 0.8.0" 2399 | } 2400 | }, 2401 | "node_modules/type-is": { 2402 | "version": "1.6.18", 2403 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 2404 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 2405 | "license": "MIT", 2406 | "dependencies": { 2407 | "media-typer": "0.3.0", 2408 | "mime-types": "~2.1.24" 2409 | }, 2410 | "engines": { 2411 | "node": ">= 0.6" 2412 | } 2413 | }, 2414 | "node_modules/underscore": { 2415 | "version": "1.13.7", 2416 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", 2417 | "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", 2418 | "license": "MIT" 2419 | }, 2420 | "node_modules/undici-types": { 2421 | "version": "6.19.8", 2422 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", 2423 | "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", 2424 | "license": "MIT" 2425 | }, 2426 | "node_modules/unpipe": { 2427 | "version": "1.0.0", 2428 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2429 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 2430 | "license": "MIT", 2431 | "engines": { 2432 | "node": ">= 0.8" 2433 | } 2434 | }, 2435 | "node_modules/uri-js": { 2436 | "version": "4.4.1", 2437 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 2438 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 2439 | "dev": true, 2440 | "license": "BSD-2-Clause", 2441 | "dependencies": { 2442 | "punycode": "^2.1.0" 2443 | } 2444 | }, 2445 | "node_modules/utils-merge": { 2446 | "version": "1.0.1", 2447 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2448 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 2449 | "license": "MIT", 2450 | "engines": { 2451 | "node": ">= 0.4.0" 2452 | } 2453 | }, 2454 | "node_modules/uuid": { 2455 | "version": "8.3.2", 2456 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 2457 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 2458 | "license": "MIT", 2459 | "bin": { 2460 | "uuid": "dist/bin/uuid" 2461 | } 2462 | }, 2463 | "node_modules/validator": { 2464 | "version": "13.12.0", 2465 | "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", 2466 | "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", 2467 | "license": "MIT", 2468 | "engines": { 2469 | "node": ">= 0.10" 2470 | } 2471 | }, 2472 | "node_modules/vary": { 2473 | "version": "1.1.2", 2474 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2475 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 2476 | "license": "MIT", 2477 | "engines": { 2478 | "node": ">= 0.8" 2479 | } 2480 | }, 2481 | "node_modules/which": { 2482 | "version": "2.0.2", 2483 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 2484 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 2485 | "dev": true, 2486 | "license": "ISC", 2487 | "dependencies": { 2488 | "isexe": "^2.0.0" 2489 | }, 2490 | "bin": { 2491 | "node-which": "bin/node-which" 2492 | }, 2493 | "engines": { 2494 | "node": ">= 8" 2495 | } 2496 | }, 2497 | "node_modules/wkx": { 2498 | "version": "0.5.0", 2499 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", 2500 | "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", 2501 | "license": "MIT", 2502 | "dependencies": { 2503 | "@types/node": "*" 2504 | } 2505 | }, 2506 | "node_modules/word-wrap": { 2507 | "version": "1.2.5", 2508 | "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", 2509 | "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", 2510 | "dev": true, 2511 | "license": "MIT", 2512 | "engines": { 2513 | "node": ">=0.10.0" 2514 | } 2515 | }, 2516 | "node_modules/xtend": { 2517 | "version": "4.0.2", 2518 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2519 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2520 | "license": "MIT", 2521 | "engines": { 2522 | "node": ">=0.4" 2523 | } 2524 | }, 2525 | "node_modules/yocto-queue": { 2526 | "version": "0.1.0", 2527 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 2528 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 2529 | "dev": true, 2530 | "license": "MIT", 2531 | "engines": { 2532 | "node": ">=10" 2533 | }, 2534 | "funding": { 2535 | "url": "https://github.com/sponsors/sindresorhus" 2536 | } 2537 | } 2538 | } 2539 | } 2540 | --------------------------------------------------------------------------------