├── .gitignore
├── crud-frontend
├── src
│ ├── App.css
│ ├── index.css
│ ├── main.jsx
│ ├── components
│ │ ├── NavBar.jsx
│ │ ├── TableList.jsx
│ │ └── ModalForm.jsx
│ ├── App.jsx
│ └── assets
│ │ └── react.svg
├── postcss.config.js
├── vite.config.js
├── tailwind.config.js
├── .gitignore
├── index.html
├── README.md
├── package.json
├── eslint.config.js
└── public
│ └── vite.svg
└── crud-backend
├── vercel.json
├── src
├── index.js
├── routes
│ └── clientRoutes.js
├── db.js
├── services
│ └── clientServices.js
└── controllers
│ └── clientController.js
├── package.json
├── .gitignore
└── package-lock.json
/.gitignore:
--------------------------------------------------------------------------------
1 | .vercel
2 |
--------------------------------------------------------------------------------
/crud-frontend/src/App.css:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/crud-frontend/src/index.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
--------------------------------------------------------------------------------
/crud-frontend/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/crud-frontend/vite.config.js:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vite.dev/config/
5 | export default defineConfig({
6 | plugins: [react()],
7 | })
8 |
--------------------------------------------------------------------------------
/crud-frontend/src/main.jsx:
--------------------------------------------------------------------------------
1 | import { StrictMode } from 'react'
2 | import { createRoot } from 'react-dom/client'
3 | import './index.css'
4 | import App from './App.jsx'
5 |
6 | createRoot(document.getElementById('root')).render(
7 |
8 |
9 | ,
10 | )
11 |
--------------------------------------------------------------------------------
/crud-backend/vercel.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": 2,
3 | "builds": [
4 | {
5 | "src": "./src/index.js",
6 | "use": "@vercel/node"
7 | }
8 | ],
9 | "routes": [
10 | {
11 | "src": "/(.*)",
12 | "dest": "/"
13 | }
14 | ]
15 | }
--------------------------------------------------------------------------------
/crud-frontend/tailwind.config.js:
--------------------------------------------------------------------------------
1 | import daisyui from "daisyui"
2 |
3 | /** @type {import('tailwindcss').Config} */
4 | export default {
5 | content: [
6 | "./index.html",
7 | "./src/**/*.{js,ts,jsx,tsx}",
8 | ],
9 | theme: {
10 | extend: {},
11 | },
12 | plugins: [
13 | daisyui,
14 | ],
15 | daisyui: {
16 | themes: ["night"],
17 | },
18 | }
19 |
20 |
--------------------------------------------------------------------------------
/crud-backend/src/index.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 | import cors from 'cors'
3 | import clientRoutes from "./routes/clientRoutes.js"
4 |
5 | const app = express();
6 | const port = 3000;
7 |
8 | app.use(cors());
9 | app.use(express.json());
10 |
11 | app.use('/api', clientRoutes);
12 |
13 | app.listen(port, () => {
14 | console.log("listening on port 3000")
15 | });
16 |
17 |
--------------------------------------------------------------------------------
/crud-frontend/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 |
--------------------------------------------------------------------------------
/crud-frontend/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/crud-frontend/README.md:
--------------------------------------------------------------------------------
1 | # React + Vite
2 |
3 | This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
4 |
5 | Currently, two official plugins are available:
6 |
7 | - [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh
8 | - [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
9 |
--------------------------------------------------------------------------------
/crud-backend/src/routes/clientRoutes.js:
--------------------------------------------------------------------------------
1 | import express from 'express';
2 |
3 | import * as clientController from '../controllers/clientController.js'
4 |
5 | const router = express.Router();
6 |
7 | router.get('/clients', clientController.getClients);
8 | router.post('/clients', clientController.createClient);
9 | router.put('/clients/:id', clientController.updateClient);
10 | router.delete('/clients/:id', clientController.deleteClient);
11 | router.get('/clients/search', clientController.searchClients);
12 |
13 |
14 | export default router;
--------------------------------------------------------------------------------
/crud-backend/src/db.js:
--------------------------------------------------------------------------------
1 | import pg from "pg"
2 | import env from "dotenv"
3 |
4 | env.config();
5 |
6 | const db = new pg.Client({
7 | user: process.env.PG_USER,
8 | host: process.env.PG_HOST,
9 | database: process.env.PG_DATABASE,
10 | password: process.env.PG_PASSWORD,
11 | port: process.env.PG_PORT,
12 | });
13 | db.connect();
14 |
15 | db.on('error', (err) => {
16 | console.error('Unexpected error on idle client', err);
17 | process.exit(-1);
18 | });
19 |
20 | export const query = (text, params) => db.query(text, params);
--------------------------------------------------------------------------------
/crud-backend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "crud-backend",
3 | "version": "1.0.0",
4 | "main": "index.js",
5 | "type": "module",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "node src/index.js"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "description": "",
14 | "dependencies": {
15 | "cors": "^2.8.5",
16 | "dotenv": "^16.4.5",
17 | "express": "^4.21.1",
18 | "pg": "^8.13.1"
19 | },
20 | "devDependencies": {
21 | "nodemon": "^3.1.7"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/crud-frontend/src/components/NavBar.jsx:
--------------------------------------------------------------------------------
1 | export default function NavBar({ onOpen, onSearch}) {
2 | const handleSearchChange = (event) => {
3 | onSearch(event.target.value); // Call the onSearch callback with the input value
4 | };
5 |
6 |
7 |
8 | return (
9 | <>
10 |
24 | >
25 | )
26 | }
--------------------------------------------------------------------------------
/crud-frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "crud-frontend",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "lint": "eslint .",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "axios": "^1.7.7",
14 | "react": "^18.3.1",
15 | "react-dom": "^18.3.1"
16 | },
17 | "devDependencies": {
18 | "@eslint/js": "^9.13.0",
19 | "@types/react": "^18.3.11",
20 | "@types/react-dom": "^18.3.1",
21 | "@vitejs/plugin-react": "^4.3.3",
22 | "autoprefixer": "^10.4.20",
23 | "daisyui": "^4.12.13",
24 | "eslint": "^9.13.0",
25 | "eslint-plugin-react": "^7.37.1",
26 | "eslint-plugin-react-hooks": "^5.0.0",
27 | "eslint-plugin-react-refresh": "^0.4.13",
28 | "globals": "^15.11.0",
29 | "postcss": "^8.4.47",
30 | "tailwindcss": "^3.4.14",
31 | "vite": "^5.4.9"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/crud-frontend/eslint.config.js:
--------------------------------------------------------------------------------
1 | import js from '@eslint/js'
2 | import globals from 'globals'
3 | import react from 'eslint-plugin-react'
4 | import reactHooks from 'eslint-plugin-react-hooks'
5 | import reactRefresh from 'eslint-plugin-react-refresh'
6 |
7 | export default [
8 | { ignores: ['dist'] },
9 | {
10 | files: ['**/*.{js,jsx}'],
11 | languageOptions: {
12 | ecmaVersion: 2020,
13 | globals: globals.browser,
14 | parserOptions: {
15 | ecmaVersion: 'latest',
16 | ecmaFeatures: { jsx: true },
17 | sourceType: 'module',
18 | },
19 | },
20 | settings: { react: { version: '18.3' } },
21 | plugins: {
22 | react,
23 | 'react-hooks': reactHooks,
24 | 'react-refresh': reactRefresh,
25 | },
26 | rules: {
27 | ...js.configs.recommended.rules,
28 | ...react.configs.recommended.rules,
29 | ...react.configs['jsx-runtime'].rules,
30 | ...reactHooks.configs.recommended.rules,
31 | 'react/jsx-no-target-blank': 'off',
32 | 'react-refresh/only-export-components': [
33 | 'warn',
34 | { allowConstantExport: true },
35 | ],
36 | },
37 | },
38 | ]
39 |
--------------------------------------------------------------------------------
/crud-frontend/public/vite.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/crud-backend/src/services/clientServices.js:
--------------------------------------------------------------------------------
1 | import { query } from "../db.js"
2 |
3 | export const getClients = async() => {
4 | const {rows} = await query('SELECT * FROM clients_tb');
5 | return rows;
6 | }
7 |
8 | export const createClient = async(clientData) => {
9 | const { name, email, job, rate, isactive } = clientData;
10 | const { rows } = await query(
11 | `INSERT INTO clients_tb (name, email, job, rate, isactive)
12 | VALUES ($1, $2, $3, $4, $5) RETURNING *`,
13 | [name, email, job, rate, isactive]
14 | );
15 |
16 | return rows[0];
17 | }
18 |
19 |
20 | export const updateClient = async (clientId, clientData) => {
21 | const { name, email, job, rate, isactive } = clientData;
22 |
23 | const { rows } = await query(
24 | `UPDATE clients_tb SET name = $1, email = $2, job = $3, rate = $4, isactive = $5
25 | WHERE id = $6 RETURNING *`,
26 | [name, email, job, rate, isactive, clientId]
27 | );
28 |
29 | return rows[0];
30 | };
31 |
32 |
33 | export const deleteClient = async (clientId) => {
34 | const { rowCount } = await query(`DELETE FROM clients_tb WHERE id = $1`, [clientId]);
35 | return rowCount > 0; // Returns true if a row was deleted, false otherwise
36 | };
37 |
38 | export const searchClients = async (searchTerm) => {
39 | const { rows } = await query(
40 | `SELECT * FROM clients_tb WHERE name ILIKE $1 OR email ILIKE $1 OR job ILIKE $1`,
41 | [`%${searchTerm}%`]
42 | );
43 | return rows;
44 | };
--------------------------------------------------------------------------------
/crud-backend/src/controllers/clientController.js:
--------------------------------------------------------------------------------
1 | import * as clientService from "../services/clientServices.js";
2 |
3 |
4 | export const getClients = async (req, res) => {
5 | try {
6 | const clients = await clientService.getClients();
7 | res.status(200).json(clients);
8 | } catch (err) {
9 | console.error('Error fetching clients:', err);
10 | res.status(500).json({ message: 'Internal Server Error' });
11 | }
12 | };
13 |
14 |
15 | export const createClient = async (req, res) => {
16 | try {
17 | const clientData = req.body;
18 | const newClient = await clientService.createClient(clientData);
19 | res.status(200).json(newClient);
20 | } catch (err) {
21 | console.error('Error adding client:', err);
22 | res.status(500).json({ message: 'Internal Server Error' });
23 | }
24 | };
25 |
26 | export const updateClient = async (req, res) => {
27 | try {
28 | const clientId = req.params.id;
29 | const clientData = req.body;
30 | const updatedClient = await clientService.updateClient(clientId, clientData);
31 | if (!updatedClient) {
32 | return res.status(404).json({ message: 'Client not found' });
33 | }
34 | res.status(200).json(updatedClient);
35 |
36 | } catch (err) {
37 | console.error('Error updating client:', err);
38 | res.status(500).json({ message: 'Internal Server Error' });
39 | }
40 | };
41 |
42 |
43 | export const deleteClient = async (req, res) => {
44 | try {
45 | const clientId = req.params.id;
46 | const deleted = await clientService.deleteClient(clientId);
47 | if (!deleted) {
48 | return res.status(404).json({ message: 'Client not found' });
49 | }
50 |
51 | res.status(200).send();
52 |
53 | } catch (err) {
54 | console.error('Error deleting client:', err);
55 | res.status(500).json({ message: 'Internal Server Error' });
56 | }
57 | };
58 |
59 |
60 | export const searchClients = async (req, res) => {
61 | try {
62 | const searchTerm = req.query.q; // Get the search term from the query parameters
63 | const clients = await clientService.searchClients(searchTerm);
64 | res.status(200).json(clients);
65 | } catch (error) {
66 | console.error('Error searching clients:', error);
67 | res.status(500).json({ message: 'Internal Server Error' });
68 | }
69 | };
70 |
--------------------------------------------------------------------------------
/crud-backend/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 | .pnpm-debug.log*
9 |
10 | # Diagnostic reports (https://nodejs.org/api/report.html)
11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12 |
13 | # Runtime data
14 | pids
15 | *.pid
16 | *.seed
17 | *.pid.lock
18 |
19 | # Directory for instrumented libs generated by jscoverage/JSCover
20 | lib-cov
21 |
22 | # Coverage directory used by tools like istanbul
23 | coverage
24 | *.lcov
25 |
26 | # nyc test coverage
27 | .nyc_output
28 |
29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30 | .grunt
31 |
32 | # Bower dependency directory (https://bower.io/)
33 | bower_components
34 |
35 | # node-waf configuration
36 | .lock-wscript
37 |
38 | # Compiled binary addons (https://nodejs.org/api/addons.html)
39 | build/Release
40 |
41 | # Dependency directories
42 | node_modules/
43 | jspm_packages/
44 |
45 | # Snowpack dependency directory (https://snowpack.dev/)
46 | web_modules/
47 |
48 | # TypeScript cache
49 | *.tsbuildinfo
50 |
51 | # Optional npm cache directory
52 | .npm
53 |
54 | # Optional eslint cache
55 | .eslintcache
56 |
57 | # Optional stylelint cache
58 | .stylelintcache
59 |
60 | # Microbundle cache
61 | .rpt2_cache/
62 | .rts2_cache_cjs/
63 | .rts2_cache_es/
64 | .rts2_cache_umd/
65 |
66 | # Optional REPL history
67 | .node_repl_history
68 |
69 | # Output of 'npm pack'
70 | *.tgz
71 |
72 | # Yarn Integrity file
73 | .yarn-integrity
74 |
75 | # dotenv environment variable files
76 | .env
77 | .env.development.local
78 | .env.test.local
79 | .env.production.local
80 | .env.local
81 |
82 | # parcel-bundler cache (https://parceljs.org/)
83 | .cache
84 | .parcel-cache
85 |
86 | # Next.js build output
87 | .next
88 | out
89 |
90 | # Nuxt.js build / generate output
91 | .nuxt
92 | dist
93 |
94 | # Gatsby files
95 | .cache/
96 | # Comment in the public line in if your project uses Gatsby and not Next.js
97 | # https://nextjs.org/blog/next-9-1#public-directory-support
98 | # public
99 |
100 | # vuepress build output
101 | .vuepress/dist
102 |
103 | # vuepress v2.x temp and cache directory
104 | .temp
105 | .cache
106 |
107 | # Docusaurus cache and generated files
108 | .docusaurus
109 |
110 | # Serverless directories
111 | .serverless/
112 |
113 | # FuseBox cache
114 | .fusebox/
115 |
116 | # DynamoDB Local files
117 | .dynamodb/
118 |
119 | # TernJS port file
120 | .tern-port
121 |
122 | # Stores VSCode versions used for testing VSCode extensions
123 | .vscode-test
124 |
125 | # yarn v2
126 | .yarn/cache
127 | .yarn/unplugged
128 | .yarn/build-state.yml
129 | .yarn/install-state.gz
130 | .pnp.*
131 | .vercel
132 |
--------------------------------------------------------------------------------
/crud-frontend/src/App.jsx:
--------------------------------------------------------------------------------
1 |
2 | import { useState, useEffect } from 'react'
3 | import './App.css'
4 | import ModalForm from './components/Modalform'
5 | import NavBar from './components/Navbar'
6 | import TableList from './components/Tablelist'
7 | import axios from 'axios';
8 |
9 | function App() {
10 | const [isOpen, setIsOpen] = useState(false);
11 | const [modalMode, setModalMode] = useState('add');
12 | const [searchTerm, setSearchTerm] = useState('');
13 | const [clientData, setClientData] = useState(null);
14 | const [tableData, setTableData] = useState([]);
15 |
16 |
17 |
18 | const fetchClients = async () => {
19 | try {
20 | const response = await axios.get('http://localhost:3000/api/clients')
21 | setTableData(response.data); // Set the fetched data
22 |
23 | } catch (err) {
24 | setError(err.message);
25 | }
26 | };
27 |
28 | useEffect(() => {
29 | fetchClients();
30 | }, []);
31 |
32 |
33 |
34 | const handleOpen = (mode, client) => {
35 | setClientData(client);
36 | setModalMode(mode);
37 | setIsOpen(true);
38 | };
39 |
40 | const handleSubmit = async (newClientData) => {
41 | if (modalMode === 'add') {
42 | try {
43 | const response = await axios.post('http://localhost:3000/api/clients', newClientData); // Replace with your actual API URL
44 | console.log('Client added:', response.data); // Log the response
45 | setTableData((prevData) => [...prevData, response.data]);
46 | // Optionally, update your state here to reflect the newly added client
47 | } catch (error) {
48 | console.error('Error adding client:', error); // Log any errors
49 | }
50 | console.log('modal mode Add');
51 |
52 | } else {
53 | console.log('Updating client with ID:', clientData.id); // Log the ID being updated
54 | try {
55 | const response = await axios.put(`http://localhost:3000/api/clients/${clientData.id}`, newClientData);
56 | console.log('Client updated:', response.data);
57 | setTableData((prevData) =>
58 | prevData.map((client) => (client.id === clientData.id ? response.data : client))
59 | );
60 | } catch (error) {
61 | console.error('Error updating client:', error);
62 | }
63 |
64 | }
65 | }
66 |
67 | return (
68 | <>
69 | handleOpen('add')} onSearch={setSearchTerm} />
70 |
72 | setIsOpen(false)}
75 | mode={modalMode} clientData={clientData}
76 | />
77 | >
78 | )
79 | }
80 |
81 | export default App
82 |
--------------------------------------------------------------------------------
/crud-frontend/src/components/TableList.jsx:
--------------------------------------------------------------------------------
1 | import axios from 'axios';
2 | import { useState} from 'react';
3 |
4 | export default function TableList({ handleOpen, tableData, setTableData , searchTerm}) {
5 | const [error, setError] = useState(null);
6 |
7 |
8 |
9 | // Filter the tableData based on the searchTerm
10 | const filteredData = tableData.filter(client =>
11 | client.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
12 | client.email.toLowerCase().includes(searchTerm.toLowerCase()) ||
13 | client.job.toLowerCase().includes(searchTerm.toLowerCase())
14 | );
15 |
16 |
17 | const handleDelete = async (id) => {
18 | const confirmDelete = window.confirm("Are you sure you want to delete this client?");
19 | if (confirmDelete) {
20 | try {
21 | await axios.delete(`http://localhost:3000/api/clients/${id}`); // API call to delete client
22 | setTableData((prevData) => prevData.filter(client => client.id !== id)); // Update state
23 | } catch (err) {
24 | setError(err.message); // Handle any errors
25 | }
26 | }
27 | };
28 |
29 |
30 |
31 | return (
32 | <>
33 |
34 | {error && {error}
}
35 |
36 |
37 |
38 | {/* head */}
39 |
40 |
41 | |
42 | Name |
43 | Email |
44 | Job |
45 | Rate |
46 | Status |
47 |
48 |
49 |
50 |
51 | {/* row 1 */}
52 |
53 | {filteredData.map((client) => (
54 |
55 | | {client.id} |
56 | {client.name} |
57 | {client.email} |
58 | {client.job} |
59 | {client.rate} |
60 |
61 |
64 | |
65 |
66 |
67 | |
68 |
69 |
70 | |
71 |
72 |
73 |
74 |
75 | ))}
76 |
77 |
78 |
79 |
80 |
81 |
82 | >
83 | )
84 | }
--------------------------------------------------------------------------------
/crud-frontend/src/components/ModalForm.jsx:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from "react"
2 |
3 | export default function ModalForm({ isOpen , onClose, mode, OnSubmit,clientData}) {
4 | const [rate, setRate] = useState('');
5 | const [name, setName] = useState('');
6 | const [email, setEmail] = useState('');
7 | const [job, setJob] = useState('');
8 | const [status, setStatus] = useState(false);
9 |
10 | // Handle the change of status
11 | const handleStatusChange = (e) => {
12 | setStatus(e.target.value === 'Active'); // Set status as boolean
13 | }
14 |
15 | const handleSubmit = async (e) => {
16 | e.preventDefault();
17 | try {
18 | const clientData = {name, email, job, rate: Number(rate) , isactive: status}
19 | await OnSubmit(clientData)
20 | onClose();
21 | } catch (err) {
22 | console.error("Error adding client" , err);
23 | }
24 |
25 | }
26 |
27 | useEffect(() => {
28 | if (mode === 'edit' && clientData) {
29 | setName(clientData.name);
30 | setEmail(clientData.email);
31 | setJob(clientData.job);
32 | setRate(clientData.rate);
33 | setStatus(clientData.isActive); // Assuming isActive is a boolean
34 | } else {
35 | // Reset fields when adding a new client
36 | setName('');
37 | setEmail('');
38 | setJob('');
39 | setRate('');
40 | setStatus(false);
41 | }
42 | }, [mode, clientData]);
43 |
44 |
45 | return (
46 |
47 |
48 |
49 |
50 | <>
51 | {/* You can open the modal using document.getElementById('ID').showModal() method */}
52 |
92 | >
93 | )
94 | }
--------------------------------------------------------------------------------
/crud-frontend/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/crud-backend/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "crud-backend",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "crud-backend",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "cors": "^2.8.5",
13 | "dotenv": "^16.4.5",
14 | "express": "^4.21.1",
15 | "pg": "^8.13.1"
16 | },
17 | "devDependencies": {
18 | "nodemon": "^3.1.7"
19 | }
20 | },
21 | "node_modules/accepts": {
22 | "version": "1.3.8",
23 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
24 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
25 | "license": "MIT",
26 | "dependencies": {
27 | "mime-types": "~2.1.34",
28 | "negotiator": "0.6.3"
29 | },
30 | "engines": {
31 | "node": ">= 0.6"
32 | }
33 | },
34 | "node_modules/anymatch": {
35 | "version": "3.1.3",
36 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
37 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
38 | "dev": true,
39 | "license": "ISC",
40 | "dependencies": {
41 | "normalize-path": "^3.0.0",
42 | "picomatch": "^2.0.4"
43 | },
44 | "engines": {
45 | "node": ">= 8"
46 | }
47 | },
48 | "node_modules/array-flatten": {
49 | "version": "1.1.1",
50 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
51 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
52 | "license": "MIT"
53 | },
54 | "node_modules/balanced-match": {
55 | "version": "1.0.2",
56 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
57 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
58 | "dev": true,
59 | "license": "MIT"
60 | },
61 | "node_modules/binary-extensions": {
62 | "version": "2.3.0",
63 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
64 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
65 | "dev": true,
66 | "license": "MIT",
67 | "engines": {
68 | "node": ">=8"
69 | },
70 | "funding": {
71 | "url": "https://github.com/sponsors/sindresorhus"
72 | }
73 | },
74 | "node_modules/body-parser": {
75 | "version": "1.20.3",
76 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
77 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
78 | "license": "MIT",
79 | "dependencies": {
80 | "bytes": "3.1.2",
81 | "content-type": "~1.0.5",
82 | "debug": "2.6.9",
83 | "depd": "2.0.0",
84 | "destroy": "1.2.0",
85 | "http-errors": "2.0.0",
86 | "iconv-lite": "0.4.24",
87 | "on-finished": "2.4.1",
88 | "qs": "6.13.0",
89 | "raw-body": "2.5.2",
90 | "type-is": "~1.6.18",
91 | "unpipe": "1.0.0"
92 | },
93 | "engines": {
94 | "node": ">= 0.8",
95 | "npm": "1.2.8000 || >= 1.4.16"
96 | }
97 | },
98 | "node_modules/brace-expansion": {
99 | "version": "1.1.11",
100 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
101 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
102 | "dev": true,
103 | "license": "MIT",
104 | "dependencies": {
105 | "balanced-match": "^1.0.0",
106 | "concat-map": "0.0.1"
107 | }
108 | },
109 | "node_modules/braces": {
110 | "version": "3.0.3",
111 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
112 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
113 | "dev": true,
114 | "license": "MIT",
115 | "dependencies": {
116 | "fill-range": "^7.1.1"
117 | },
118 | "engines": {
119 | "node": ">=8"
120 | }
121 | },
122 | "node_modules/bytes": {
123 | "version": "3.1.2",
124 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
125 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
126 | "license": "MIT",
127 | "engines": {
128 | "node": ">= 0.8"
129 | }
130 | },
131 | "node_modules/call-bind": {
132 | "version": "1.0.7",
133 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
134 | "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
135 | "license": "MIT",
136 | "dependencies": {
137 | "es-define-property": "^1.0.0",
138 | "es-errors": "^1.3.0",
139 | "function-bind": "^1.1.2",
140 | "get-intrinsic": "^1.2.4",
141 | "set-function-length": "^1.2.1"
142 | },
143 | "engines": {
144 | "node": ">= 0.4"
145 | },
146 | "funding": {
147 | "url": "https://github.com/sponsors/ljharb"
148 | }
149 | },
150 | "node_modules/chokidar": {
151 | "version": "3.6.0",
152 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
153 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
154 | "dev": true,
155 | "license": "MIT",
156 | "dependencies": {
157 | "anymatch": "~3.1.2",
158 | "braces": "~3.0.2",
159 | "glob-parent": "~5.1.2",
160 | "is-binary-path": "~2.1.0",
161 | "is-glob": "~4.0.1",
162 | "normalize-path": "~3.0.0",
163 | "readdirp": "~3.6.0"
164 | },
165 | "engines": {
166 | "node": ">= 8.10.0"
167 | },
168 | "funding": {
169 | "url": "https://paulmillr.com/funding/"
170 | },
171 | "optionalDependencies": {
172 | "fsevents": "~2.3.2"
173 | }
174 | },
175 | "node_modules/concat-map": {
176 | "version": "0.0.1",
177 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
178 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
179 | "dev": true,
180 | "license": "MIT"
181 | },
182 | "node_modules/content-disposition": {
183 | "version": "0.5.4",
184 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
185 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
186 | "license": "MIT",
187 | "dependencies": {
188 | "safe-buffer": "5.2.1"
189 | },
190 | "engines": {
191 | "node": ">= 0.6"
192 | }
193 | },
194 | "node_modules/content-type": {
195 | "version": "1.0.5",
196 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
197 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
198 | "license": "MIT",
199 | "engines": {
200 | "node": ">= 0.6"
201 | }
202 | },
203 | "node_modules/cookie": {
204 | "version": "0.7.1",
205 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
206 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
207 | "license": "MIT",
208 | "engines": {
209 | "node": ">= 0.6"
210 | }
211 | },
212 | "node_modules/cookie-signature": {
213 | "version": "1.0.6",
214 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
215 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
216 | "license": "MIT"
217 | },
218 | "node_modules/cors": {
219 | "version": "2.8.5",
220 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
221 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
222 | "license": "MIT",
223 | "dependencies": {
224 | "object-assign": "^4",
225 | "vary": "^1"
226 | },
227 | "engines": {
228 | "node": ">= 0.10"
229 | }
230 | },
231 | "node_modules/debug": {
232 | "version": "2.6.9",
233 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
234 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
235 | "license": "MIT",
236 | "dependencies": {
237 | "ms": "2.0.0"
238 | }
239 | },
240 | "node_modules/define-data-property": {
241 | "version": "1.1.4",
242 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
243 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
244 | "license": "MIT",
245 | "dependencies": {
246 | "es-define-property": "^1.0.0",
247 | "es-errors": "^1.3.0",
248 | "gopd": "^1.0.1"
249 | },
250 | "engines": {
251 | "node": ">= 0.4"
252 | },
253 | "funding": {
254 | "url": "https://github.com/sponsors/ljharb"
255 | }
256 | },
257 | "node_modules/depd": {
258 | "version": "2.0.0",
259 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
260 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
261 | "license": "MIT",
262 | "engines": {
263 | "node": ">= 0.8"
264 | }
265 | },
266 | "node_modules/destroy": {
267 | "version": "1.2.0",
268 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
269 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
270 | "license": "MIT",
271 | "engines": {
272 | "node": ">= 0.8",
273 | "npm": "1.2.8000 || >= 1.4.16"
274 | }
275 | },
276 | "node_modules/dotenv": {
277 | "version": "16.4.5",
278 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz",
279 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==",
280 | "license": "BSD-2-Clause",
281 | "engines": {
282 | "node": ">=12"
283 | },
284 | "funding": {
285 | "url": "https://dotenvx.com"
286 | }
287 | },
288 | "node_modules/ee-first": {
289 | "version": "1.1.1",
290 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
291 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
292 | "license": "MIT"
293 | },
294 | "node_modules/encodeurl": {
295 | "version": "2.0.0",
296 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
297 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
298 | "license": "MIT",
299 | "engines": {
300 | "node": ">= 0.8"
301 | }
302 | },
303 | "node_modules/es-define-property": {
304 | "version": "1.0.0",
305 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
306 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
307 | "license": "MIT",
308 | "dependencies": {
309 | "get-intrinsic": "^1.2.4"
310 | },
311 | "engines": {
312 | "node": ">= 0.4"
313 | }
314 | },
315 | "node_modules/es-errors": {
316 | "version": "1.3.0",
317 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
318 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
319 | "license": "MIT",
320 | "engines": {
321 | "node": ">= 0.4"
322 | }
323 | },
324 | "node_modules/escape-html": {
325 | "version": "1.0.3",
326 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
327 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
328 | "license": "MIT"
329 | },
330 | "node_modules/etag": {
331 | "version": "1.8.1",
332 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
333 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
334 | "license": "MIT",
335 | "engines": {
336 | "node": ">= 0.6"
337 | }
338 | },
339 | "node_modules/express": {
340 | "version": "4.21.1",
341 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
342 | "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
343 | "license": "MIT",
344 | "dependencies": {
345 | "accepts": "~1.3.8",
346 | "array-flatten": "1.1.1",
347 | "body-parser": "1.20.3",
348 | "content-disposition": "0.5.4",
349 | "content-type": "~1.0.4",
350 | "cookie": "0.7.1",
351 | "cookie-signature": "1.0.6",
352 | "debug": "2.6.9",
353 | "depd": "2.0.0",
354 | "encodeurl": "~2.0.0",
355 | "escape-html": "~1.0.3",
356 | "etag": "~1.8.1",
357 | "finalhandler": "1.3.1",
358 | "fresh": "0.5.2",
359 | "http-errors": "2.0.0",
360 | "merge-descriptors": "1.0.3",
361 | "methods": "~1.1.2",
362 | "on-finished": "2.4.1",
363 | "parseurl": "~1.3.3",
364 | "path-to-regexp": "0.1.10",
365 | "proxy-addr": "~2.0.7",
366 | "qs": "6.13.0",
367 | "range-parser": "~1.2.1",
368 | "safe-buffer": "5.2.1",
369 | "send": "0.19.0",
370 | "serve-static": "1.16.2",
371 | "setprototypeof": "1.2.0",
372 | "statuses": "2.0.1",
373 | "type-is": "~1.6.18",
374 | "utils-merge": "1.0.1",
375 | "vary": "~1.1.2"
376 | },
377 | "engines": {
378 | "node": ">= 0.10.0"
379 | }
380 | },
381 | "node_modules/fill-range": {
382 | "version": "7.1.1",
383 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
384 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
385 | "dev": true,
386 | "license": "MIT",
387 | "dependencies": {
388 | "to-regex-range": "^5.0.1"
389 | },
390 | "engines": {
391 | "node": ">=8"
392 | }
393 | },
394 | "node_modules/finalhandler": {
395 | "version": "1.3.1",
396 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
397 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
398 | "license": "MIT",
399 | "dependencies": {
400 | "debug": "2.6.9",
401 | "encodeurl": "~2.0.0",
402 | "escape-html": "~1.0.3",
403 | "on-finished": "2.4.1",
404 | "parseurl": "~1.3.3",
405 | "statuses": "2.0.1",
406 | "unpipe": "~1.0.0"
407 | },
408 | "engines": {
409 | "node": ">= 0.8"
410 | }
411 | },
412 | "node_modules/forwarded": {
413 | "version": "0.2.0",
414 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
415 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
416 | "license": "MIT",
417 | "engines": {
418 | "node": ">= 0.6"
419 | }
420 | },
421 | "node_modules/fresh": {
422 | "version": "0.5.2",
423 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
424 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
425 | "license": "MIT",
426 | "engines": {
427 | "node": ">= 0.6"
428 | }
429 | },
430 | "node_modules/fsevents": {
431 | "version": "2.3.3",
432 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
433 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
434 | "dev": true,
435 | "hasInstallScript": true,
436 | "license": "MIT",
437 | "optional": true,
438 | "os": [
439 | "darwin"
440 | ],
441 | "engines": {
442 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
443 | }
444 | },
445 | "node_modules/function-bind": {
446 | "version": "1.1.2",
447 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
448 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
449 | "license": "MIT",
450 | "funding": {
451 | "url": "https://github.com/sponsors/ljharb"
452 | }
453 | },
454 | "node_modules/get-intrinsic": {
455 | "version": "1.2.4",
456 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
457 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
458 | "license": "MIT",
459 | "dependencies": {
460 | "es-errors": "^1.3.0",
461 | "function-bind": "^1.1.2",
462 | "has-proto": "^1.0.1",
463 | "has-symbols": "^1.0.3",
464 | "hasown": "^2.0.0"
465 | },
466 | "engines": {
467 | "node": ">= 0.4"
468 | },
469 | "funding": {
470 | "url": "https://github.com/sponsors/ljharb"
471 | }
472 | },
473 | "node_modules/glob-parent": {
474 | "version": "5.1.2",
475 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
476 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
477 | "dev": true,
478 | "license": "ISC",
479 | "dependencies": {
480 | "is-glob": "^4.0.1"
481 | },
482 | "engines": {
483 | "node": ">= 6"
484 | }
485 | },
486 | "node_modules/gopd": {
487 | "version": "1.0.1",
488 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
489 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
490 | "license": "MIT",
491 | "dependencies": {
492 | "get-intrinsic": "^1.1.3"
493 | },
494 | "funding": {
495 | "url": "https://github.com/sponsors/ljharb"
496 | }
497 | },
498 | "node_modules/has-flag": {
499 | "version": "3.0.0",
500 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
501 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
502 | "dev": true,
503 | "license": "MIT",
504 | "engines": {
505 | "node": ">=4"
506 | }
507 | },
508 | "node_modules/has-property-descriptors": {
509 | "version": "1.0.2",
510 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
511 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
512 | "license": "MIT",
513 | "dependencies": {
514 | "es-define-property": "^1.0.0"
515 | },
516 | "funding": {
517 | "url": "https://github.com/sponsors/ljharb"
518 | }
519 | },
520 | "node_modules/has-proto": {
521 | "version": "1.0.3",
522 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
523 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
524 | "license": "MIT",
525 | "engines": {
526 | "node": ">= 0.4"
527 | },
528 | "funding": {
529 | "url": "https://github.com/sponsors/ljharb"
530 | }
531 | },
532 | "node_modules/has-symbols": {
533 | "version": "1.0.3",
534 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
535 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
536 | "license": "MIT",
537 | "engines": {
538 | "node": ">= 0.4"
539 | },
540 | "funding": {
541 | "url": "https://github.com/sponsors/ljharb"
542 | }
543 | },
544 | "node_modules/hasown": {
545 | "version": "2.0.2",
546 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
547 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
548 | "license": "MIT",
549 | "dependencies": {
550 | "function-bind": "^1.1.2"
551 | },
552 | "engines": {
553 | "node": ">= 0.4"
554 | }
555 | },
556 | "node_modules/http-errors": {
557 | "version": "2.0.0",
558 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
559 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
560 | "license": "MIT",
561 | "dependencies": {
562 | "depd": "2.0.0",
563 | "inherits": "2.0.4",
564 | "setprototypeof": "1.2.0",
565 | "statuses": "2.0.1",
566 | "toidentifier": "1.0.1"
567 | },
568 | "engines": {
569 | "node": ">= 0.8"
570 | }
571 | },
572 | "node_modules/iconv-lite": {
573 | "version": "0.4.24",
574 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
575 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
576 | "license": "MIT",
577 | "dependencies": {
578 | "safer-buffer": ">= 2.1.2 < 3"
579 | },
580 | "engines": {
581 | "node": ">=0.10.0"
582 | }
583 | },
584 | "node_modules/ignore-by-default": {
585 | "version": "1.0.1",
586 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
587 | "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
588 | "dev": true,
589 | "license": "ISC"
590 | },
591 | "node_modules/inherits": {
592 | "version": "2.0.4",
593 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
594 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
595 | "license": "ISC"
596 | },
597 | "node_modules/ipaddr.js": {
598 | "version": "1.9.1",
599 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
600 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
601 | "license": "MIT",
602 | "engines": {
603 | "node": ">= 0.10"
604 | }
605 | },
606 | "node_modules/is-binary-path": {
607 | "version": "2.1.0",
608 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
609 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
610 | "dev": true,
611 | "license": "MIT",
612 | "dependencies": {
613 | "binary-extensions": "^2.0.0"
614 | },
615 | "engines": {
616 | "node": ">=8"
617 | }
618 | },
619 | "node_modules/is-extglob": {
620 | "version": "2.1.1",
621 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
622 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
623 | "dev": true,
624 | "license": "MIT",
625 | "engines": {
626 | "node": ">=0.10.0"
627 | }
628 | },
629 | "node_modules/is-glob": {
630 | "version": "4.0.3",
631 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
632 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
633 | "dev": true,
634 | "license": "MIT",
635 | "dependencies": {
636 | "is-extglob": "^2.1.1"
637 | },
638 | "engines": {
639 | "node": ">=0.10.0"
640 | }
641 | },
642 | "node_modules/is-number": {
643 | "version": "7.0.0",
644 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
645 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
646 | "dev": true,
647 | "license": "MIT",
648 | "engines": {
649 | "node": ">=0.12.0"
650 | }
651 | },
652 | "node_modules/media-typer": {
653 | "version": "0.3.0",
654 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
655 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
656 | "license": "MIT",
657 | "engines": {
658 | "node": ">= 0.6"
659 | }
660 | },
661 | "node_modules/merge-descriptors": {
662 | "version": "1.0.3",
663 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
664 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
665 | "license": "MIT",
666 | "funding": {
667 | "url": "https://github.com/sponsors/sindresorhus"
668 | }
669 | },
670 | "node_modules/methods": {
671 | "version": "1.1.2",
672 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
673 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
674 | "license": "MIT",
675 | "engines": {
676 | "node": ">= 0.6"
677 | }
678 | },
679 | "node_modules/mime": {
680 | "version": "1.6.0",
681 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
682 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
683 | "license": "MIT",
684 | "bin": {
685 | "mime": "cli.js"
686 | },
687 | "engines": {
688 | "node": ">=4"
689 | }
690 | },
691 | "node_modules/mime-db": {
692 | "version": "1.52.0",
693 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
694 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
695 | "license": "MIT",
696 | "engines": {
697 | "node": ">= 0.6"
698 | }
699 | },
700 | "node_modules/mime-types": {
701 | "version": "2.1.35",
702 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
703 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
704 | "license": "MIT",
705 | "dependencies": {
706 | "mime-db": "1.52.0"
707 | },
708 | "engines": {
709 | "node": ">= 0.6"
710 | }
711 | },
712 | "node_modules/minimatch": {
713 | "version": "3.1.2",
714 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
715 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
716 | "dev": true,
717 | "license": "ISC",
718 | "dependencies": {
719 | "brace-expansion": "^1.1.7"
720 | },
721 | "engines": {
722 | "node": "*"
723 | }
724 | },
725 | "node_modules/ms": {
726 | "version": "2.0.0",
727 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
728 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
729 | "license": "MIT"
730 | },
731 | "node_modules/negotiator": {
732 | "version": "0.6.3",
733 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
734 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
735 | "license": "MIT",
736 | "engines": {
737 | "node": ">= 0.6"
738 | }
739 | },
740 | "node_modules/nodemon": {
741 | "version": "3.1.7",
742 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz",
743 | "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==",
744 | "dev": true,
745 | "license": "MIT",
746 | "dependencies": {
747 | "chokidar": "^3.5.2",
748 | "debug": "^4",
749 | "ignore-by-default": "^1.0.1",
750 | "minimatch": "^3.1.2",
751 | "pstree.remy": "^1.1.8",
752 | "semver": "^7.5.3",
753 | "simple-update-notifier": "^2.0.0",
754 | "supports-color": "^5.5.0",
755 | "touch": "^3.1.0",
756 | "undefsafe": "^2.0.5"
757 | },
758 | "bin": {
759 | "nodemon": "bin/nodemon.js"
760 | },
761 | "engines": {
762 | "node": ">=10"
763 | },
764 | "funding": {
765 | "type": "opencollective",
766 | "url": "https://opencollective.com/nodemon"
767 | }
768 | },
769 | "node_modules/nodemon/node_modules/debug": {
770 | "version": "4.3.7",
771 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
772 | "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
773 | "dev": true,
774 | "license": "MIT",
775 | "dependencies": {
776 | "ms": "^2.1.3"
777 | },
778 | "engines": {
779 | "node": ">=6.0"
780 | },
781 | "peerDependenciesMeta": {
782 | "supports-color": {
783 | "optional": true
784 | }
785 | }
786 | },
787 | "node_modules/nodemon/node_modules/ms": {
788 | "version": "2.1.3",
789 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
790 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
791 | "dev": true,
792 | "license": "MIT"
793 | },
794 | "node_modules/normalize-path": {
795 | "version": "3.0.0",
796 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
797 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
798 | "dev": true,
799 | "license": "MIT",
800 | "engines": {
801 | "node": ">=0.10.0"
802 | }
803 | },
804 | "node_modules/object-assign": {
805 | "version": "4.1.1",
806 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
807 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
808 | "license": "MIT",
809 | "engines": {
810 | "node": ">=0.10.0"
811 | }
812 | },
813 | "node_modules/object-inspect": {
814 | "version": "1.13.2",
815 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
816 | "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
817 | "license": "MIT",
818 | "engines": {
819 | "node": ">= 0.4"
820 | },
821 | "funding": {
822 | "url": "https://github.com/sponsors/ljharb"
823 | }
824 | },
825 | "node_modules/on-finished": {
826 | "version": "2.4.1",
827 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
828 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
829 | "license": "MIT",
830 | "dependencies": {
831 | "ee-first": "1.1.1"
832 | },
833 | "engines": {
834 | "node": ">= 0.8"
835 | }
836 | },
837 | "node_modules/parseurl": {
838 | "version": "1.3.3",
839 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
840 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
841 | "license": "MIT",
842 | "engines": {
843 | "node": ">= 0.8"
844 | }
845 | },
846 | "node_modules/path-to-regexp": {
847 | "version": "0.1.10",
848 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
849 | "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
850 | "license": "MIT"
851 | },
852 | "node_modules/pg": {
853 | "version": "8.13.1",
854 | "resolved": "https://registry.npmjs.org/pg/-/pg-8.13.1.tgz",
855 | "integrity": "sha512-OUir1A0rPNZlX//c7ksiu7crsGZTKSOXJPgtNiHGIlC9H0lO+NC6ZDYksSgBYY/thSWhnSRBv8w1lieNNGATNQ==",
856 | "license": "MIT",
857 | "dependencies": {
858 | "pg-connection-string": "^2.7.0",
859 | "pg-pool": "^3.7.0",
860 | "pg-protocol": "^1.7.0",
861 | "pg-types": "^2.1.0",
862 | "pgpass": "1.x"
863 | },
864 | "engines": {
865 | "node": ">= 8.0.0"
866 | },
867 | "optionalDependencies": {
868 | "pg-cloudflare": "^1.1.1"
869 | },
870 | "peerDependencies": {
871 | "pg-native": ">=3.0.1"
872 | },
873 | "peerDependenciesMeta": {
874 | "pg-native": {
875 | "optional": true
876 | }
877 | }
878 | },
879 | "node_modules/pg-cloudflare": {
880 | "version": "1.1.1",
881 | "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz",
882 | "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==",
883 | "license": "MIT",
884 | "optional": true
885 | },
886 | "node_modules/pg-connection-string": {
887 | "version": "2.7.0",
888 | "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.7.0.tgz",
889 | "integrity": "sha512-PI2W9mv53rXJQEOb8xNR8lH7Hr+EKa6oJa38zsK0S/ky2er16ios1wLKhZyxzD7jUReiWokc9WK5nxSnC7W1TA==",
890 | "license": "MIT"
891 | },
892 | "node_modules/pg-int8": {
893 | "version": "1.0.1",
894 | "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
895 | "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
896 | "license": "ISC",
897 | "engines": {
898 | "node": ">=4.0.0"
899 | }
900 | },
901 | "node_modules/pg-pool": {
902 | "version": "3.7.0",
903 | "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.7.0.tgz",
904 | "integrity": "sha512-ZOBQForurqh4zZWjrgSwwAtzJ7QiRX0ovFkZr2klsen3Nm0aoh33Ls0fzfv3imeH/nw/O27cjdz5kzYJfeGp/g==",
905 | "license": "MIT",
906 | "peerDependencies": {
907 | "pg": ">=8.0"
908 | }
909 | },
910 | "node_modules/pg-protocol": {
911 | "version": "1.7.0",
912 | "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz",
913 | "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==",
914 | "license": "MIT"
915 | },
916 | "node_modules/pg-types": {
917 | "version": "2.2.0",
918 | "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
919 | "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
920 | "license": "MIT",
921 | "dependencies": {
922 | "pg-int8": "1.0.1",
923 | "postgres-array": "~2.0.0",
924 | "postgres-bytea": "~1.0.0",
925 | "postgres-date": "~1.0.4",
926 | "postgres-interval": "^1.1.0"
927 | },
928 | "engines": {
929 | "node": ">=4"
930 | }
931 | },
932 | "node_modules/pgpass": {
933 | "version": "1.0.5",
934 | "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
935 | "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
936 | "license": "MIT",
937 | "dependencies": {
938 | "split2": "^4.1.0"
939 | }
940 | },
941 | "node_modules/picomatch": {
942 | "version": "2.3.1",
943 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
944 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
945 | "dev": true,
946 | "license": "MIT",
947 | "engines": {
948 | "node": ">=8.6"
949 | },
950 | "funding": {
951 | "url": "https://github.com/sponsors/jonschlinkert"
952 | }
953 | },
954 | "node_modules/postgres-array": {
955 | "version": "2.0.0",
956 | "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
957 | "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
958 | "license": "MIT",
959 | "engines": {
960 | "node": ">=4"
961 | }
962 | },
963 | "node_modules/postgres-bytea": {
964 | "version": "1.0.0",
965 | "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
966 | "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
967 | "license": "MIT",
968 | "engines": {
969 | "node": ">=0.10.0"
970 | }
971 | },
972 | "node_modules/postgres-date": {
973 | "version": "1.0.7",
974 | "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
975 | "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
976 | "license": "MIT",
977 | "engines": {
978 | "node": ">=0.10.0"
979 | }
980 | },
981 | "node_modules/postgres-interval": {
982 | "version": "1.2.0",
983 | "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
984 | "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
985 | "license": "MIT",
986 | "dependencies": {
987 | "xtend": "^4.0.0"
988 | },
989 | "engines": {
990 | "node": ">=0.10.0"
991 | }
992 | },
993 | "node_modules/proxy-addr": {
994 | "version": "2.0.7",
995 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
996 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
997 | "license": "MIT",
998 | "dependencies": {
999 | "forwarded": "0.2.0",
1000 | "ipaddr.js": "1.9.1"
1001 | },
1002 | "engines": {
1003 | "node": ">= 0.10"
1004 | }
1005 | },
1006 | "node_modules/pstree.remy": {
1007 | "version": "1.1.8",
1008 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1009 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1010 | "dev": true,
1011 | "license": "MIT"
1012 | },
1013 | "node_modules/qs": {
1014 | "version": "6.13.0",
1015 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
1016 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
1017 | "license": "BSD-3-Clause",
1018 | "dependencies": {
1019 | "side-channel": "^1.0.6"
1020 | },
1021 | "engines": {
1022 | "node": ">=0.6"
1023 | },
1024 | "funding": {
1025 | "url": "https://github.com/sponsors/ljharb"
1026 | }
1027 | },
1028 | "node_modules/range-parser": {
1029 | "version": "1.2.1",
1030 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1031 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1032 | "license": "MIT",
1033 | "engines": {
1034 | "node": ">= 0.6"
1035 | }
1036 | },
1037 | "node_modules/raw-body": {
1038 | "version": "2.5.2",
1039 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1040 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1041 | "license": "MIT",
1042 | "dependencies": {
1043 | "bytes": "3.1.2",
1044 | "http-errors": "2.0.0",
1045 | "iconv-lite": "0.4.24",
1046 | "unpipe": "1.0.0"
1047 | },
1048 | "engines": {
1049 | "node": ">= 0.8"
1050 | }
1051 | },
1052 | "node_modules/readdirp": {
1053 | "version": "3.6.0",
1054 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1055 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1056 | "dev": true,
1057 | "license": "MIT",
1058 | "dependencies": {
1059 | "picomatch": "^2.2.1"
1060 | },
1061 | "engines": {
1062 | "node": ">=8.10.0"
1063 | }
1064 | },
1065 | "node_modules/safe-buffer": {
1066 | "version": "5.2.1",
1067 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1068 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1069 | "funding": [
1070 | {
1071 | "type": "github",
1072 | "url": "https://github.com/sponsors/feross"
1073 | },
1074 | {
1075 | "type": "patreon",
1076 | "url": "https://www.patreon.com/feross"
1077 | },
1078 | {
1079 | "type": "consulting",
1080 | "url": "https://feross.org/support"
1081 | }
1082 | ],
1083 | "license": "MIT"
1084 | },
1085 | "node_modules/safer-buffer": {
1086 | "version": "2.1.2",
1087 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1088 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1089 | "license": "MIT"
1090 | },
1091 | "node_modules/semver": {
1092 | "version": "7.6.3",
1093 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
1094 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
1095 | "dev": true,
1096 | "license": "ISC",
1097 | "bin": {
1098 | "semver": "bin/semver.js"
1099 | },
1100 | "engines": {
1101 | "node": ">=10"
1102 | }
1103 | },
1104 | "node_modules/send": {
1105 | "version": "0.19.0",
1106 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
1107 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
1108 | "license": "MIT",
1109 | "dependencies": {
1110 | "debug": "2.6.9",
1111 | "depd": "2.0.0",
1112 | "destroy": "1.2.0",
1113 | "encodeurl": "~1.0.2",
1114 | "escape-html": "~1.0.3",
1115 | "etag": "~1.8.1",
1116 | "fresh": "0.5.2",
1117 | "http-errors": "2.0.0",
1118 | "mime": "1.6.0",
1119 | "ms": "2.1.3",
1120 | "on-finished": "2.4.1",
1121 | "range-parser": "~1.2.1",
1122 | "statuses": "2.0.1"
1123 | },
1124 | "engines": {
1125 | "node": ">= 0.8.0"
1126 | }
1127 | },
1128 | "node_modules/send/node_modules/encodeurl": {
1129 | "version": "1.0.2",
1130 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1131 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
1132 | "license": "MIT",
1133 | "engines": {
1134 | "node": ">= 0.8"
1135 | }
1136 | },
1137 | "node_modules/send/node_modules/ms": {
1138 | "version": "2.1.3",
1139 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1140 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1141 | "license": "MIT"
1142 | },
1143 | "node_modules/serve-static": {
1144 | "version": "1.16.2",
1145 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
1146 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
1147 | "license": "MIT",
1148 | "dependencies": {
1149 | "encodeurl": "~2.0.0",
1150 | "escape-html": "~1.0.3",
1151 | "parseurl": "~1.3.3",
1152 | "send": "0.19.0"
1153 | },
1154 | "engines": {
1155 | "node": ">= 0.8.0"
1156 | }
1157 | },
1158 | "node_modules/set-function-length": {
1159 | "version": "1.2.2",
1160 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
1161 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
1162 | "license": "MIT",
1163 | "dependencies": {
1164 | "define-data-property": "^1.1.4",
1165 | "es-errors": "^1.3.0",
1166 | "function-bind": "^1.1.2",
1167 | "get-intrinsic": "^1.2.4",
1168 | "gopd": "^1.0.1",
1169 | "has-property-descriptors": "^1.0.2"
1170 | },
1171 | "engines": {
1172 | "node": ">= 0.4"
1173 | }
1174 | },
1175 | "node_modules/setprototypeof": {
1176 | "version": "1.2.0",
1177 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1178 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1179 | "license": "ISC"
1180 | },
1181 | "node_modules/side-channel": {
1182 | "version": "1.0.6",
1183 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
1184 | "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
1185 | "license": "MIT",
1186 | "dependencies": {
1187 | "call-bind": "^1.0.7",
1188 | "es-errors": "^1.3.0",
1189 | "get-intrinsic": "^1.2.4",
1190 | "object-inspect": "^1.13.1"
1191 | },
1192 | "engines": {
1193 | "node": ">= 0.4"
1194 | },
1195 | "funding": {
1196 | "url": "https://github.com/sponsors/ljharb"
1197 | }
1198 | },
1199 | "node_modules/simple-update-notifier": {
1200 | "version": "2.0.0",
1201 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
1202 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
1203 | "dev": true,
1204 | "license": "MIT",
1205 | "dependencies": {
1206 | "semver": "^7.5.3"
1207 | },
1208 | "engines": {
1209 | "node": ">=10"
1210 | }
1211 | },
1212 | "node_modules/split2": {
1213 | "version": "4.2.0",
1214 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
1215 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
1216 | "license": "ISC",
1217 | "engines": {
1218 | "node": ">= 10.x"
1219 | }
1220 | },
1221 | "node_modules/statuses": {
1222 | "version": "2.0.1",
1223 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1224 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1225 | "license": "MIT",
1226 | "engines": {
1227 | "node": ">= 0.8"
1228 | }
1229 | },
1230 | "node_modules/supports-color": {
1231 | "version": "5.5.0",
1232 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1233 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1234 | "dev": true,
1235 | "license": "MIT",
1236 | "dependencies": {
1237 | "has-flag": "^3.0.0"
1238 | },
1239 | "engines": {
1240 | "node": ">=4"
1241 | }
1242 | },
1243 | "node_modules/to-regex-range": {
1244 | "version": "5.0.1",
1245 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1246 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1247 | "dev": true,
1248 | "license": "MIT",
1249 | "dependencies": {
1250 | "is-number": "^7.0.0"
1251 | },
1252 | "engines": {
1253 | "node": ">=8.0"
1254 | }
1255 | },
1256 | "node_modules/toidentifier": {
1257 | "version": "1.0.1",
1258 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1259 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1260 | "license": "MIT",
1261 | "engines": {
1262 | "node": ">=0.6"
1263 | }
1264 | },
1265 | "node_modules/touch": {
1266 | "version": "3.1.1",
1267 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
1268 | "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
1269 | "dev": true,
1270 | "license": "ISC",
1271 | "bin": {
1272 | "nodetouch": "bin/nodetouch.js"
1273 | }
1274 | },
1275 | "node_modules/type-is": {
1276 | "version": "1.6.18",
1277 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1278 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1279 | "license": "MIT",
1280 | "dependencies": {
1281 | "media-typer": "0.3.0",
1282 | "mime-types": "~2.1.24"
1283 | },
1284 | "engines": {
1285 | "node": ">= 0.6"
1286 | }
1287 | },
1288 | "node_modules/undefsafe": {
1289 | "version": "2.0.5",
1290 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1291 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
1292 | "dev": true,
1293 | "license": "MIT"
1294 | },
1295 | "node_modules/unpipe": {
1296 | "version": "1.0.0",
1297 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1298 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1299 | "license": "MIT",
1300 | "engines": {
1301 | "node": ">= 0.8"
1302 | }
1303 | },
1304 | "node_modules/utils-merge": {
1305 | "version": "1.0.1",
1306 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1307 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1308 | "license": "MIT",
1309 | "engines": {
1310 | "node": ">= 0.4.0"
1311 | }
1312 | },
1313 | "node_modules/vary": {
1314 | "version": "1.1.2",
1315 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1316 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1317 | "license": "MIT",
1318 | "engines": {
1319 | "node": ">= 0.8"
1320 | }
1321 | },
1322 | "node_modules/xtend": {
1323 | "version": "4.0.2",
1324 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
1325 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
1326 | "license": "MIT",
1327 | "engines": {
1328 | "node": ">=0.4"
1329 | }
1330 | }
1331 | }
1332 | }
1333 |
--------------------------------------------------------------------------------