, expiresIn: jsonwebtoken.SignOptions['expiresIn'] = '12h') {
13 | const token = this.instance.sign(payload, JWT_SECRET, { expiresIn })
14 |
15 | return token
16 | }
17 |
18 | verifyToken(token: string) {
19 | const auth = this.instance.verify(token, JWT_SECRET)
20 |
21 | return auth
22 | }
23 | }
24 |
25 | export default new JWT()
26 |
--------------------------------------------------------------------------------
/server/src/index.ts:
--------------------------------------------------------------------------------
1 | import dotenv from 'dotenv'
2 | dotenv.config()
3 |
4 | import app from './utils/app' // (server)
5 | import mongo from './utils/mongo' // (database)
6 | import { PORT } from './constants/index'
7 | import authRoutes from './routes/auth'
8 |
9 | const bootstrap = async () => {
10 | await mongo.connect()
11 |
12 | app.get('/', (req, res) => {
13 | res.status(200).send('Hello, world!')
14 | })
15 |
16 | app.get('/healthz', (req, res) => {
17 | res.status(204).end()
18 | })
19 |
20 | app.use('/auth', authRoutes)
21 | // add rest of routes here...
22 |
23 | app.listen(PORT, () => {
24 | console.log(`✅ Server is listening on port: ${PORT}`)
25 | })
26 | }
27 |
28 | bootstrap()
29 |
--------------------------------------------------------------------------------
/client/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Web Application",
3 | "short_name": "Web App",
4 | "description": "An awesome web application!",
5 | "icons": [
6 | {
7 | "src": "favicon.ico",
8 | "sizes": "64x64 32x32 24x24 16x16",
9 | "type": "image/x-icon"
10 | },
11 | {
12 | "src": "/android-chrome-192x192.png",
13 | "sizes": "192x192",
14 | "type": "image/png"
15 | },
16 | {
17 | "src": "/android-chrome-512x512.png",
18 | "sizes": "512x512",
19 | "type": "image/png"
20 | }
21 | ],
22 | "start_url": ".",
23 | "display": "standalone",
24 | "theme_color": "#000000",
25 | "background_color": "#ffffff",
26 | "developer": {
27 | "name": "",
28 | "url": ""
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/client/src/hooks/useMediaQuery.Ts:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react'
2 |
3 | /*
4 |
5 | How to use this hook:
6 | import useMediaQuery from './hooks/useMediaQuery';
7 |
8 | function App() {
9 | const isMobile = useMediaQuery('(max-width: 768px)');
10 |
11 | return ();
12 | };
13 |
14 | */
15 |
16 | const useMediaQuery = (query: string = '(max-width: 768px)') => {
17 | const [matches, setMatches] = useState(window.matchMedia(query).matches)
18 |
19 | useEffect(() => {
20 | const media = window.matchMedia(query)
21 | const listener = () => setMatches(media.matches)
22 |
23 | media.addListener(listener)
24 | return () => media.removeListener(listener)
25 | }, [query])
26 |
27 | return matches
28 | }
29 |
30 | export default useMediaQuery
31 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "0.1.0",
4 | "private": true,
5 | "type": "commonjs",
6 | "main": "src/index.ts",
7 | "scripts": {
8 | "dev": "npx tsx src/index.ts",
9 | "build": "rm -rf dist && npx tsc",
10 | "start": "node dist/index.js"
11 | },
12 | "dependencies": {
13 | "bcrypt": "^5.1.1",
14 | "cors": "^2.8.5",
15 | "dotenv": "^16.4.7",
16 | "express": "^4.21.2",
17 | "joi": "^17.13.3",
18 | "jsonwebtoken": "^9.0.2",
19 | "mongoose": "^8.15.1"
20 | },
21 | "devDependencies": {
22 | "@types/bcrypt": "^5.0.2",
23 | "@types/cors": "^2.8.17",
24 | "@types/express": "^5.0.0",
25 | "@types/jsonwebtoken": "^9.0.9",
26 | "@types/node": "^22.13.12",
27 | "typescript": "^5.8.2"
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/server/src/routes/auth.ts:
--------------------------------------------------------------------------------
1 | import express from 'express'
2 | import checkBearerToken from '../middlewares/check-bearer-token'
3 | import errorHandler from '../middlewares/error-handler'
4 | import register from '../controllers/auth/register'
5 | import login from '../controllers/auth/login'
6 | import loginWithToken from '../controllers/auth/login-with-token'
7 |
8 | // initialize router
9 | const router = express.Router()
10 |
11 | // POST at route: http://localhost:8080/auth/register
12 | router.post('/register', [], register, errorHandler)
13 |
14 | // POST at path: http://localhost:8080/auth/login
15 | router.post('/login', [], login, errorHandler)
16 |
17 | // GET at path: http://localhost:8080/auth/account
18 | router.get('/login', [checkBearerToken], loginWithToken, errorHandler)
19 |
20 | export default router
21 |
--------------------------------------------------------------------------------
/.github/workflows/build-backend.yml:
--------------------------------------------------------------------------------
1 | name: Build Backend (Server)
2 |
3 | on:
4 | pull_request:
5 | branches:
6 | - main
7 |
8 | jobs:
9 | build-backend:
10 | runs-on: ubuntu-latest
11 | defaults:
12 | run:
13 | working-directory: './server'
14 | strategy:
15 | matrix:
16 | node-version: [20.x]
17 | steps:
18 | - name: Check out code
19 | uses: actions/checkout@v4
20 | with:
21 | fetch-depth: 0
22 | clean: true
23 |
24 | - name: Use Node.js ${{ matrix.node-version }}
25 | uses: actions/setup-node@v4
26 | with:
27 | node-version: ${{ matrix.node-version }}
28 | cache: 'npm'
29 | cache-dependency-path: './server/package-lock.json'
30 | - run: npm ci
31 | - run: npm run build
32 |
--------------------------------------------------------------------------------
/.github/workflows/build-frontend.yml:
--------------------------------------------------------------------------------
1 | name: Build Frontend (Client)
2 |
3 | on:
4 | pull_request:
5 | branches:
6 | - main
7 |
8 | jobs:
9 | build-frontend:
10 | runs-on: ubuntu-latest
11 | defaults:
12 | run:
13 | working-directory: './client'
14 | strategy:
15 | matrix:
16 | node-version: [20.x]
17 | steps:
18 | - name: Check out code
19 | uses: actions/checkout@v4
20 | with:
21 | fetch-depth: 0
22 | clean: true
23 |
24 | - name: Use Node.js ${{ matrix.node-version }}
25 | uses: actions/setup-node@v4
26 | with:
27 | node-version: ${{ matrix.node-version }}
28 | cache: 'npm'
29 | cache-dependency-path: './client/package-lock.json'
30 | - run: npm ci
31 | - run: npm run build
32 |
--------------------------------------------------------------------------------
/server/src/middlewares/check-bearer-token.ts:
--------------------------------------------------------------------------------
1 | import { type RequestHandler } from 'express'
2 | import jwt from '../utils/jwt'
3 |
4 | const checkBearerToken: RequestHandler = (req, res, next) => {
5 | try {
6 | const token = req.headers.authorization?.split(' ')[1]
7 |
8 | if (!token) {
9 | return next({
10 | statusCode: 400,
11 | message: 'Token not provided',
12 | })
13 | }
14 |
15 | const auth = jwt.verifyToken(token)
16 |
17 | if (!auth) {
18 | return next({
19 | statusCode: 401,
20 | message: 'Invalid token',
21 | })
22 | }
23 |
24 | req.auth = typeof auth === 'string' ? JSON.parse(auth) : auth
25 |
26 | next()
27 | } catch (error) {
28 | next({
29 | statusCode: 401,
30 | message: 'Invalid token',
31 | })
32 | }
33 | }
34 |
35 | export default checkBearerToken
36 |
--------------------------------------------------------------------------------
/server/src/controllers/auth/login-with-token.ts:
--------------------------------------------------------------------------------
1 | import { type RequestHandler } from 'express'
2 | import jwt from '../../utils/jwt'
3 | import Account from '../../models/Account'
4 |
5 | const loginWithToken: RequestHandler = async (req, res, next) => {
6 | try {
7 | const { uid } = req.auth || {}
8 |
9 | // Get account from DB, password is not verified because we're already token-authorized at this point
10 | const account = await Account.findOne({ _id: uid }).select('-password')
11 |
12 | if (!account) {
13 | return next({
14 | statusCode: 400,
15 | message: 'Bad credentials',
16 | })
17 | }
18 |
19 | // Generate access token
20 | const token = jwt.signToken({ uid: account._id, role: account.role })
21 |
22 | res.status(200).json({
23 | message: 'Succesfully got account',
24 | data: account,
25 | token,
26 | })
27 | } catch (error) {
28 | next(error)
29 | }
30 | }
31 |
32 | export default loginWithToken
33 |
--------------------------------------------------------------------------------
/server/src/models/Account.ts:
--------------------------------------------------------------------------------
1 | import { type Document, model, Schema } from 'mongoose'
2 | import { type Account } from '../@types'
3 |
4 | interface I extends Document, Account {}
5 |
6 | const instance = new Schema(
7 | {
8 | /*
9 | document ID is set by default via MongoDB - the next line is deprecated!
10 | _id: mongoose.Schema.Types.ObjectId,
11 | */
12 |
13 | username: {
14 | type: String,
15 | required: true,
16 | lowercase: true,
17 | unique: true,
18 | },
19 | password: {
20 | type: String,
21 | required: true,
22 | },
23 | role: {
24 | type: String,
25 | required: true,
26 | enum: ['user', 'admin'],
27 | default: 'user',
28 | },
29 | },
30 | {
31 | timestamps: true,
32 | }
33 | )
34 |
35 | // NOTE! use a singular model name, mongoose automatically creates a collection like so:
36 | // model: 'Account' === collection: 'accounts'
37 | const modelName = 'Account'
38 |
39 | export default model(modelName, instance)
40 |
--------------------------------------------------------------------------------
/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client-v2",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "dev": "react-scripts start",
7 | "build": "react-scripts build",
8 | "start": "serve -s build"
9 | },
10 | "eslintConfig": {
11 | "extends": [
12 | "react-app",
13 | "react-app/jest"
14 | ]
15 | },
16 | "browserslist": {
17 | "production": [
18 | ">0.2%",
19 | "not dead",
20 | "not op_mini all"
21 | ],
22 | "development": [
23 | "last 1 chrome version",
24 | "last 1 firefox version",
25 | "last 1 safari version"
26 | ]
27 | },
28 | "dependencies": {
29 | "@emotion/react": "^11.14.0",
30 | "@emotion/styled": "^11.14.0",
31 | "@mui/material": "^6.4.8",
32 | "axios": "^1.13.1",
33 | "react": "^19.1.0",
34 | "react-dom": "^19.1.0",
35 | "react-scripts": "5.0.1",
36 | "zustand": "^5.0.8"
37 | },
38 | "devDependencies": {
39 | "@types/react": "^19.0.12",
40 | "@types/react-dom": "^19.0.4",
41 | "serve": "^14.2.5"
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/client/src/hooks/useLocalStorage.ts:
--------------------------------------------------------------------------------
1 | import { useState, useEffect } from 'react'
2 |
3 | /*
4 |
5 | How to use this hook:
6 | import useLocalStorage from './hooks/useLocalStorage';
7 |
8 | function App() {
9 | const [example, setExample] = useLocalStorage('example_key', { example: 'anything as default' });
10 |
11 | return ();
12 | };
13 |
14 | */
15 |
16 | const getLsVal = (key: string, defaultValue: any) => {
17 | const storedStr = localStorage.getItem(key) || ''
18 |
19 | if (!!storedStr) {
20 | return JSON.parse(storedStr)
21 | } else {
22 | return defaultValue
23 | }
24 | }
25 |
26 | const setLsVal = (key: string, value: any) => {
27 | if (value !== undefined && value !== null) {
28 | const str = JSON.stringify(value)
29 |
30 | localStorage.setItem(key, str)
31 | }
32 | }
33 |
34 | const useLocalStorage = (key: string, defaultValue: any = null) => {
35 | const [value, setValue] = useState(getLsVal(key, defaultValue))
36 |
37 | useEffect(() => setLsVal(key, value), [key, value])
38 |
39 | return [value, setValue]
40 | }
41 |
42 | export default useLocalStorage
43 |
--------------------------------------------------------------------------------
/client/public/favicon_SETUP.md:
--------------------------------------------------------------------------------
1 | # Favicon SETUP
2 |
3 | 1. Go to [https://favicon.io](https://favicon.io)
4 | 2. Generate an icon pack
5 | 3. Drop all images in `/client/public/`
6 | 4. And configure these 2 files:
7 |
8 | ### manifest.json:
9 |
10 | ```
11 | "icons": [
12 | {
13 | "src": "favicon.ico",
14 | "sizes": "64x64 32x32 24x24 16x16",
15 | "type": "image/x-icon"
16 | },
17 | {
18 | "src":"android-chrome-192x192.png",
19 | "sizes":"192x192",
20 | "type":"image/png"
21 | },
22 | {
23 | "src":"android-chrome-512x512.png",
24 | "sizes":"512x512",
25 | "type":"image/png"
26 | }
27 | ],
28 | ```
29 |
30 | ### index.html:
31 |
32 | ```
33 |
34 |
35 |
36 |
37 |
38 | ```
39 |
--------------------------------------------------------------------------------
/client/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
17 |
18 | Web App
19 |
20 |
21 |
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/client/src/App.tsx:
--------------------------------------------------------------------------------
1 | import React, { Fragment } from 'react'
2 | import { useAuth } from 'contexts/AuthContext'
3 | import AuthModal from 'components/AuthModal'
4 | import Header from 'components/Header'
5 | import logo from 'assets/react.svg'
6 | import 'styles/ReactWelcome.css'
7 |
8 | const App = () => {
9 | return (
10 |
16 | )
17 | }
18 |
19 | const ReactWelcome = () => {
20 | return (
21 |
22 |
23 |
24 | Edit src/App.tsx and save to reload.
25 |
26 |
27 | Learn React
28 |
29 |
30 | )
31 | }
32 |
33 | const LoggedInStatus = () => {
34 | const { isLoggedIn, account } = useAuth()
35 |
36 | if (isLoggedIn && !!account) {
37 | return Hey, {account.username}! I'm happy to let you know: you are authenticated!
38 | }
39 |
40 | return Don't forget to start your backend server, and then authenticate yourself.
41 | }
42 |
43 | export default App
44 |
--------------------------------------------------------------------------------
/server/src/utils/mongo.ts:
--------------------------------------------------------------------------------
1 | import mongoose from 'mongoose'
2 | import { MONGO_URI, MONGO_OPTIONS } from '../constants/index'
3 |
4 | class Mongo {
5 | instance: typeof mongoose = mongoose
6 | mongoUri: string
7 | mongoOptions: mongoose.ConnectOptions
8 | isConnected: boolean
9 |
10 | constructor() {
11 | this.mongoUri = MONGO_URI
12 | this.mongoOptions = MONGO_OPTIONS
13 | this.isConnected = false
14 | }
15 |
16 | async connect() {
17 | if (this.isConnected) return
18 |
19 | try {
20 | console.log('⏳ Connecting to MongoDB')
21 |
22 | const db = await this.instance.connect(this.mongoUri, this.mongoOptions)
23 | const connection = db.connection
24 |
25 | this.isConnected = connection.readyState === 1
26 | if (this.isConnected) console.log('✅ MongoDB connected')
27 |
28 | connection.on('connected', () => console.log('✅ MongoDB connected')) // re-connected
29 | connection.on('disconnected', () => console.log('❌ MongoDB disconnected')) // disconnected
30 | connection.on('error', (error) => console.log('❌ MongoDB connection error', error)) // listen for errors during the session
31 | } catch (error: any) {
32 | console.log('❌ MongoDB connection error:', error.message)
33 | }
34 | }
35 | }
36 |
37 | export default new Mongo()
38 |
--------------------------------------------------------------------------------
/client/src/styles/index.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --online: #44b700;
3 | --offline: #b74400;
4 | }
5 |
6 | body {
7 | margin: 0;
8 | font-size: 16px;
9 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
10 | sans-serif;
11 | -webkit-font-smoothing: antialiased;
12 | -moz-osx-font-smoothing: grayscale;
13 | }
14 |
15 | code {
16 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace;
17 | }
18 |
19 | .App {
20 | width: 100vw;
21 | min-height: 100vh;
22 | display: flex;
23 | flex-direction: column;
24 | align-items: center;
25 | }
26 |
27 | .header {
28 | width: 100% !important;
29 | padding: 0 1rem !important;
30 | background-color: whitesmoke !important;
31 | color: black !important;
32 |
33 | display: flex !important;
34 | flex-direction: row !important;
35 | align-items: center !important;
36 | justify-content: space-between !important;
37 | }
38 |
39 | .error {
40 | margin: 0.5rem;
41 | color: red;
42 | text-align: center;
43 | }
44 |
45 | /*
46 | Extra Small Devices, Phones
47 | @media only screen and (min-width: 480px) {}
48 | */
49 |
50 | /*
51 | Small Devices, Tablets
52 | @media only screen and (min-width: 768px) {}
53 | */
54 |
55 | /*
56 | Medium Devices, Desktops
57 | @media only screen and (min-width: 992px) {}
58 | */
59 |
60 | /*
61 | Large Devices, Wide Screens
62 | @media only screen and (min-width: 1200px) {}
63 | */
64 |
--------------------------------------------------------------------------------
/server/src/controllers/auth/register.ts:
--------------------------------------------------------------------------------
1 | import { type RequestHandler } from 'express'
2 | import joi from '../../utils/joi'
3 | import jwt from '../../utils/jwt'
4 | import crypt from '../../utils/crypt'
5 | import Account from '../../models/Account'
6 |
7 | const register: RequestHandler = async (req, res, next) => {
8 | try {
9 | const validationError = await joi.validate(
10 | {
11 | username: joi.instance.string().required(),
12 | password: joi.instance.string().required(),
13 | },
14 | req.body
15 | )
16 |
17 | if (validationError) {
18 | return next(validationError)
19 | }
20 |
21 | const { username, password } = req.body
22 |
23 | // Verify account username as unique
24 | const found = await Account.findOne({ username })
25 |
26 | if (found) {
27 | return next({
28 | statusCode: 400,
29 | message: 'An account already exists with that "username"',
30 | })
31 | }
32 |
33 | // Encrypt password
34 | const hash = crypt.hash(password)
35 |
36 | // Create account
37 | const account = new Account({ username, password: hash })
38 | await account.save()
39 |
40 | // Generate access token
41 | const token = jwt.signToken({ uid: account._id, role: account.role })
42 |
43 | // Exclude password from response
44 | const { password: _, ...data } = account.toObject()
45 |
46 | res.status(201).json({
47 | message: 'Succesfully registered',
48 | data,
49 | token,
50 | })
51 | } catch (error) {
52 | next(error)
53 | }
54 | }
55 |
56 | export default register
57 |
--------------------------------------------------------------------------------
/server/src/controllers/auth/login.ts:
--------------------------------------------------------------------------------
1 | import { type RequestHandler } from 'express'
2 | import joi from '../../utils/joi'
3 | import jwt from '../../utils/jwt'
4 | import crypt from '../../utils/crypt'
5 | import Account from '../../models/Account'
6 |
7 | const login: RequestHandler = async (req, res, next) => {
8 | try {
9 | const validationError = await joi.validate(
10 | {
11 | username: joi.instance.string().required(),
12 | password: joi.instance.string().required(),
13 | },
14 | req.body
15 | )
16 |
17 | if (validationError) {
18 | return next(validationError)
19 | }
20 |
21 | const { username, password } = req.body
22 |
23 | // Get account from DB, and verify existance
24 | const account = await Account.findOne({ username })
25 |
26 | if (!account) {
27 | return next({
28 | statusCode: 400,
29 | message: 'Bad credentials',
30 | })
31 | }
32 |
33 | // Verify password hash
34 | const passOk = crypt.validate(password, account.password)
35 |
36 | if (!passOk) {
37 | return next({
38 | statusCode: 400,
39 | message: 'Bad credentials',
40 | })
41 | }
42 |
43 | // Generate access token
44 | const token = jwt.signToken({ uid: account._id, role: account.role })
45 |
46 | // Remove password from response data
47 | const { password: _, ...accountData } = account.toObject()
48 |
49 | res.status(200).json({
50 | message: 'Succesfully logged-in',
51 | data: accountData,
52 | token,
53 | })
54 | } catch (error) {
55 | next(error)
56 | }
57 | }
58 |
59 | export default login
60 |
--------------------------------------------------------------------------------
/client/src/components/OnlineIndicator.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { styled } from '@mui/material/styles'
3 | import { Badge, Avatar } from '@mui/material'
4 |
5 | const StyledBadge = styled(Badge)(({ theme }) => ({
6 | '& .MuiBadge-badge': {
7 | backgroundColor: 'black',
8 | color: 'black',
9 | boxShadow: `0 0 0 2px ${theme.palette.background.paper}`,
10 | '&::after': {
11 | position: 'absolute',
12 | top: 0,
13 | left: 0,
14 | width: '100%',
15 | height: '100%',
16 | borderRadius: '50%',
17 | animation: 'ripple 1.2s infinite ease-in-out',
18 | border: '1px solid currentColor',
19 | content: '""',
20 | },
21 | },
22 | '@keyframes ripple': {
23 | '0%': {
24 | transform: 'scale(.8)',
25 | opacity: 1,
26 | },
27 | '100%': {
28 | transform: 'scale(2.4)',
29 | opacity: 0,
30 | },
31 | },
32 | }))
33 |
34 | const OnlineBadge = styled(StyledBadge)({
35 | '& .MuiBadge-badge': {
36 | backgroundColor: 'var(--online)',
37 | color: 'var(--online)',
38 | },
39 | })
40 |
41 | const OfflineBadge = styled(StyledBadge)({
42 | '& .MuiBadge-badge': {
43 | backgroundColor: 'var(--offline)',
44 | color: 'var(--offline)',
45 | },
46 | })
47 |
48 | const OnlineIndicator = ({ online = false, children = }) => {
49 | if (online) {
50 | return (
51 |
52 | {children}
53 |
54 | )
55 | }
56 |
57 | return (
58 |
59 | {children}
60 |
61 | )
62 | }
63 |
64 | export default OnlineIndicator
65 |
--------------------------------------------------------------------------------
/client/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5", // Specify ECMAScript target version
4 | "lib": ["dom", "dom.iterable", "esnext"], // List of library files to be included in the compilation
5 | "allowJs": true, // Allow JavaScript files to be compiled
6 | "skipLibCheck": true, // Skip type checking of all declaration files
7 | "esModuleInterop": true, // Disables namespace imports (import * as fs from "fs") and enables CJS/AMD/UMD style imports (import fs from "fs")
8 | "allowSyntheticDefaultImports": true, // Allow default imports from modules with no default export
9 | "strict": true, // Enable all strict type checking options
10 | "forceConsistentCasingInFileNames": true, // Disallow inconsistently-cased references to the same file.
11 | "module": "esnext", // Specify module code generation
12 | "moduleResolution": "node", // Resolve modules using Node.js style
13 | "isolatedModules": true, // Unconditionally emit imports for unresolved files
14 | "resolveJsonModule": true, // Include modules imported with .json extension
15 | "noEmit": true, // Do not emit output (meaning do not compile code, only perform type checking)
16 | "jsx": "react", // Support JSX in .tsx files
17 | "sourceMap": true, // Generate corrresponding .map file
18 | "declaration": true, // Generate corresponding .d.ts file
19 | "noUnusedLocals": true, // Report errors on unused locals
20 | "noUnusedParameters": true, // Report errors on unused parameters
21 | "incremental": true, // Enable incremental compilation by reading/writing information from prior compilations to a file on disk
22 | "noFallthroughCasesInSwitch": true, // Report errors for fallthrough cases in switch statement
23 | "baseUrl": "src"
24 | },
25 | "include": ["src"],
26 | "exclude": ["node_modules", "build"]
27 | }
28 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # MERN Stack Template
2 |
3 |
4 |
5 | - **M** = [MongoDB](https://www.mongodb.com)
6 | - **E** = [Express.js](https://expressjs.com)
7 | - **R** = [React.js](https://reactjs.org)
8 | - **N** = [Node.js](https://nodejs.org)
9 |
10 |
11 |
12 | # What is this template?
13 |
14 | This template allows you to quick-start your Fullstack application using the MERN stack, it has a server setup with some basic authentication, and a client ready to communicate with the backend.
15 |
16 |
17 |
18 |
19 |
20 | # How to use this template
21 |
22 | ### 1. Generate repository from template:
23 |
24 | Click ["Use this template"](https://github.com/benelferink/mern-template/generate) to generate a
25 | new repo, then open your terminal and clone your new repo.
26 |
27 | ```
28 | git clone https://github.com/[your_user_name]/[your_repo_name].git
29 | ```
30 |
31 | ### 2. Install dependencies:
32 |
33 | Go to the `server` folder, and run `install`.
34 |
35 | ```
36 | cd ./server
37 | npm i
38 | ```
39 |
40 | Go to the `client` folder, and run `install`.
41 |
42 | ```
43 | cd ./client
44 | npm i
45 | ```
46 |
47 | ### 3. Prepare MongoDB:
48 |
49 | Prepare your MongoDB database (using [Atlas](https://www.mongodb.com/cloud/atlas),
50 | or [Community]()). Then configure your database within `server/src/constants/index.js` (or `server/src/.env`), by configuring the `MONGO_URI` variable.
51 |
52 | ### 4. Start applications:
53 |
54 | Go to the `server` folder, and run `dev`.
55 |
56 | ```
57 | cd ./server
58 | npm run dev
59 | ```
60 |
61 | Go to the `client` folder, and run `dev`.
62 |
63 | ```
64 | cd ./client
65 | npm run dev
66 | ```
67 |
68 | ### 5. Happy Coding !!!
69 |
--------------------------------------------------------------------------------
/client/src/components/Header.tsx:
--------------------------------------------------------------------------------
1 | import React, { Fragment, type MouseEventHandler, useState } from 'react'
2 | import { useModalStore } from 'store/useModalStore'
3 | import { useAuth } from 'contexts/AuthContext'
4 | import OnlineIndicator from 'components/OnlineIndicator'
5 | import { AppBar, IconButton, Avatar, Popover, List, ListSubheader, ListItemButton } from '@mui/material'
6 |
7 | interface Props {}
8 |
9 | const Header: React.FC = () => {
10 | const { isLoggedIn, account, logout } = useAuth()
11 | const { setCurrentModal } = useModalStore()
12 |
13 | const [anchorEl, setAnchorEl] = useState<(EventTarget & HTMLButtonElement) | null>(null)
14 | const [popover, setPopover] = useState(false)
15 |
16 | const openPopover: MouseEventHandler = (e) => {
17 | setPopover(true)
18 | setAnchorEl(e.currentTarget)
19 | }
20 |
21 | const closePopover = () => {
22 | setPopover(false)
23 | setAnchorEl(null)
24 | }
25 |
26 | const clickLogin = () => {
27 | setCurrentModal('LOGIN')
28 | closePopover()
29 | }
30 |
31 | const clickRegister = () => {
32 | setCurrentModal('REGISTER')
33 | closePopover()
34 | }
35 |
36 | return (
37 |
38 | Web App
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
53 |
54 | Hello, {account?.username || 'Guest'}
55 |
56 | {isLoggedIn ? (
57 | Logout
58 | ) : (
59 |
60 | Login
61 | Register
62 |
63 | )}
64 |
65 |
66 |
67 | )
68 | }
69 |
70 | export default Header
71 |
--------------------------------------------------------------------------------
/client/src/assets/react.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/client/src/components/AuthModal.tsx:
--------------------------------------------------------------------------------
1 | import React, { type ChangeEventHandler, Fragment, useState } from 'react'
2 | import { useModalStore } from 'store/useModalStore'
3 | import { useAuth } from 'contexts/AuthContext'
4 | import { Dialog, DialogTitle, TextField, Button, CircularProgress } from '@mui/material'
5 | import { type FormData } from '@types'
6 |
7 | interface Props {}
8 |
9 | const AuthModal: React.FC = () => {
10 | const { login, register } = useAuth()
11 | const { currentModal, setCurrentModal } = useModalStore()
12 |
13 | const isRegisterMode = currentModal === 'REGISTER'
14 | const isOpen = ['AUTH', 'LOGIN', 'REGISTER'].includes(currentModal)
15 | const onClose = () => setCurrentModal('')
16 |
17 | const [formData, setFormData] = useState({ username: '', password: '' })
18 | const [loading, setLoading] = useState(false)
19 | const [error, setError] = useState('')
20 |
21 | const handleChange: ChangeEventHandler = (e) => {
22 | const { name, value } = e.target
23 | setFormData((prev) => ({ ...prev, [name]: value }))
24 | }
25 |
26 | const clickSubmit = async () => {
27 | setLoading(true)
28 | setError('')
29 |
30 | try {
31 | isRegisterMode ? await register(formData) : await login(formData)
32 | onClose()
33 | } catch (error: any) {
34 | setError(typeof error === 'string' ? error : JSON.stringify(error))
35 | }
36 |
37 | setLoading(false)
38 | }
39 |
40 | const isSubmitButtonDisabled = !formData['username'] || !formData['password']
41 |
42 | return (
43 |
89 | )
90 | }
91 |
92 | export default AuthModal
93 |
--------------------------------------------------------------------------------
/client/src/contexts/AuthContext.tsx:
--------------------------------------------------------------------------------
1 | import React, { createContext, useContext, useState, useEffect, type PropsWithChildren, useMemo } from 'react'
2 | import axios from 'utils/axios'
3 | import { type FormData, type Account } from '@types'
4 |
5 | interface Context {
6 | token: string | null
7 | account: Account | null
8 | isLoggedIn: boolean
9 | register: (payload: FormData) => Promise
10 | login: (payload: FormData) => Promise
11 | logout: () => void
12 | }
13 |
14 | const initContext: Context = {
15 | token: null,
16 | account: null,
17 | isLoggedIn: false,
18 | register: async () => {},
19 | login: async () => {},
20 | logout: () => {},
21 | }
22 |
23 | // init context
24 | const AuthContext = createContext(initContext)
25 | const { Provider } = AuthContext
26 |
27 | // export the consumer
28 | export const useAuth = () => useContext(AuthContext)
29 |
30 | // export the provider
31 | export const AuthProvider = ({ children }: PropsWithChildren) => {
32 | const [token, setToken] = useState(localStorage.getItem('token') || initContext.token)
33 | const [account, setAccount] = useState(initContext.account)
34 | const [isLoggedIn, setIsLoggedIn] = useState(initContext.isLoggedIn)
35 |
36 | const register = (formData: FormData) => {
37 | return new Promise((resolve, reject) => {
38 | axios
39 | .post('/auth/register', formData)
40 | .then(({ data: { data: accountData, token: accessToken } }) => {
41 | setAccount(accountData)
42 | setToken(accessToken)
43 | setIsLoggedIn(true)
44 | resolve(true)
45 | })
46 | .catch((error) => {
47 | reject(error?.response?.data?.message || error.message)
48 | })
49 | })
50 | }
51 |
52 | const login = (formData: FormData) => {
53 | return new Promise((resolve, reject) => {
54 | axios
55 | .post('/auth/login', formData)
56 | .then(({ data: { data: accountData, token: accessToken } }) => {
57 | setAccount(accountData)
58 | setToken(accessToken)
59 | setIsLoggedIn(true)
60 | resolve(true)
61 | })
62 | .catch((error) => {
63 | reject(error?.response?.data?.message || error.message)
64 | })
65 | })
66 | }
67 |
68 | const logout = () => {
69 | setIsLoggedIn(false)
70 | setAccount(null)
71 | setToken(null)
72 | }
73 |
74 | const loginWithToken = async () => {
75 | try {
76 | const {
77 | data: { data: accountData, token: accessToken },
78 | } = await axios.get('/auth/login', {
79 | headers: {
80 | authorization: `Bearer ${token}`,
81 | },
82 | })
83 |
84 | setAccount(accountData)
85 | setToken(accessToken)
86 | setIsLoggedIn(true)
87 | } catch (error: any) {
88 | console.error(error)
89 | if (error?.response?.statusCode === 401) setToken(null)
90 | }
91 | }
92 |
93 | // This side effect keeps local storage updated with recent token value,
94 | // making sure it can be re-used upon refresh or re-open browser
95 | useEffect(() => {
96 | if (token) {
97 | localStorage.setItem('token', token)
98 | } else {
99 | localStorage.removeItem('token')
100 | }
101 | }, [token])
102 |
103 | // This side effect runs only if we have a token, but no account or logged-in boolean.
104 | // This "if" statement is "true" only when refreshed, or re-opened the browser,
105 | // if true, it will then ask the backend for the account information (and will get them if the token hasn't expired)
106 | useEffect(() => {
107 | if (!isLoggedIn && !account && token) loginWithToken()
108 | }, [isLoggedIn, account, token]) // eslint-disable-line react-hooks/exhaustive-deps
109 |
110 | const value = useMemo(() => ({ token, account, isLoggedIn, register, login, logout }), [token, account, isLoggedIn])
111 |
112 | return {children}
113 | }
114 |
--------------------------------------------------------------------------------
/server/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "0.1.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "server",
9 | "version": "0.1.0",
10 | "dependencies": {
11 | "bcrypt": "^5.1.1",
12 | "cors": "^2.8.5",
13 | "dotenv": "^16.4.7",
14 | "express": "^4.21.2",
15 | "joi": "^17.13.3",
16 | "jsonwebtoken": "^9.0.2",
17 | "mongoose": "^8.15.1"
18 | },
19 | "devDependencies": {
20 | "@types/bcrypt": "^5.0.2",
21 | "@types/cors": "^2.8.17",
22 | "@types/express": "^5.0.0",
23 | "@types/jsonwebtoken": "^9.0.9",
24 | "@types/node": "^22.13.12",
25 | "typescript": "^5.8.2"
26 | }
27 | },
28 | "node_modules/@hapi/hoek": {
29 | "version": "9.3.0",
30 | "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
31 | "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
32 | "license": "BSD-3-Clause"
33 | },
34 | "node_modules/@hapi/topo": {
35 | "version": "5.1.0",
36 | "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
37 | "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
38 | "license": "BSD-3-Clause",
39 | "dependencies": {
40 | "@hapi/hoek": "^9.0.0"
41 | }
42 | },
43 | "node_modules/@mapbox/node-pre-gyp": {
44 | "version": "1.0.11",
45 | "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
46 | "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
47 | "license": "BSD-3-Clause",
48 | "dependencies": {
49 | "detect-libc": "^2.0.0",
50 | "https-proxy-agent": "^5.0.0",
51 | "make-dir": "^3.1.0",
52 | "node-fetch": "^2.6.7",
53 | "nopt": "^5.0.0",
54 | "npmlog": "^5.0.1",
55 | "rimraf": "^3.0.2",
56 | "semver": "^7.3.5",
57 | "tar": "^6.1.11"
58 | },
59 | "bin": {
60 | "node-pre-gyp": "bin/node-pre-gyp"
61 | }
62 | },
63 | "node_modules/@mongodb-js/saslprep": {
64 | "version": "1.2.2",
65 | "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.2.2.tgz",
66 | "integrity": "sha512-EB0O3SCSNRUFk66iRCpI+cXzIjdswfCs7F6nOC3RAGJ7xr5YhaicvsRwJ9eyzYvYRlCSDUO/c7g4yNulxKC1WA==",
67 | "license": "MIT",
68 | "dependencies": {
69 | "sparse-bitfield": "^3.0.3"
70 | }
71 | },
72 | "node_modules/@sideway/address": {
73 | "version": "4.1.5",
74 | "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
75 | "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
76 | "license": "BSD-3-Clause",
77 | "dependencies": {
78 | "@hapi/hoek": "^9.0.0"
79 | }
80 | },
81 | "node_modules/@sideway/formula": {
82 | "version": "3.0.1",
83 | "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
84 | "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
85 | "license": "BSD-3-Clause"
86 | },
87 | "node_modules/@sideway/pinpoint": {
88 | "version": "2.0.0",
89 | "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
90 | "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
91 | "license": "BSD-3-Clause"
92 | },
93 | "node_modules/@types/bcrypt": {
94 | "version": "5.0.2",
95 | "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-5.0.2.tgz",
96 | "integrity": "sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==",
97 | "dev": true,
98 | "license": "MIT",
99 | "dependencies": {
100 | "@types/node": "*"
101 | }
102 | },
103 | "node_modules/@types/body-parser": {
104 | "version": "1.19.5",
105 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
106 | "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
107 | "dev": true,
108 | "license": "MIT",
109 | "dependencies": {
110 | "@types/connect": "*",
111 | "@types/node": "*"
112 | }
113 | },
114 | "node_modules/@types/connect": {
115 | "version": "3.4.38",
116 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
117 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
118 | "dev": true,
119 | "license": "MIT",
120 | "dependencies": {
121 | "@types/node": "*"
122 | }
123 | },
124 | "node_modules/@types/cors": {
125 | "version": "2.8.17",
126 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
127 | "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
128 | "dev": true,
129 | "license": "MIT",
130 | "dependencies": {
131 | "@types/node": "*"
132 | }
133 | },
134 | "node_modules/@types/express": {
135 | "version": "5.0.0",
136 | "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz",
137 | "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==",
138 | "dev": true,
139 | "license": "MIT",
140 | "dependencies": {
141 | "@types/body-parser": "*",
142 | "@types/express-serve-static-core": "^5.0.0",
143 | "@types/qs": "*",
144 | "@types/serve-static": "*"
145 | }
146 | },
147 | "node_modules/@types/express-serve-static-core": {
148 | "version": "5.0.2",
149 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz",
150 | "integrity": "sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg==",
151 | "dev": true,
152 | "license": "MIT",
153 | "dependencies": {
154 | "@types/node": "*",
155 | "@types/qs": "*",
156 | "@types/range-parser": "*",
157 | "@types/send": "*"
158 | }
159 | },
160 | "node_modules/@types/http-errors": {
161 | "version": "2.0.4",
162 | "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
163 | "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
164 | "dev": true,
165 | "license": "MIT"
166 | },
167 | "node_modules/@types/jsonwebtoken": {
168 | "version": "9.0.9",
169 | "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz",
170 | "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==",
171 | "dev": true,
172 | "license": "MIT",
173 | "dependencies": {
174 | "@types/ms": "*",
175 | "@types/node": "*"
176 | }
177 | },
178 | "node_modules/@types/mime": {
179 | "version": "1.3.5",
180 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
181 | "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
182 | "dev": true,
183 | "license": "MIT"
184 | },
185 | "node_modules/@types/ms": {
186 | "version": "2.1.0",
187 | "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
188 | "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
189 | "dev": true,
190 | "license": "MIT"
191 | },
192 | "node_modules/@types/node": {
193 | "version": "22.13.12",
194 | "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.12.tgz",
195 | "integrity": "sha512-ixiWrCSRi33uqBMRuICcKECW7rtgY43TbsHDpM2XK7lXispd48opW+0IXrBVxv9NMhaz/Ue9kyj6r3NTVyXm8A==",
196 | "dev": true,
197 | "license": "MIT",
198 | "dependencies": {
199 | "undici-types": "~6.20.0"
200 | }
201 | },
202 | "node_modules/@types/qs": {
203 | "version": "6.9.17",
204 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz",
205 | "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==",
206 | "dev": true,
207 | "license": "MIT"
208 | },
209 | "node_modules/@types/range-parser": {
210 | "version": "1.2.7",
211 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
212 | "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
213 | "dev": true,
214 | "license": "MIT"
215 | },
216 | "node_modules/@types/send": {
217 | "version": "0.17.4",
218 | "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
219 | "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
220 | "dev": true,
221 | "license": "MIT",
222 | "dependencies": {
223 | "@types/mime": "^1",
224 | "@types/node": "*"
225 | }
226 | },
227 | "node_modules/@types/serve-static": {
228 | "version": "1.15.7",
229 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
230 | "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
231 | "dev": true,
232 | "license": "MIT",
233 | "dependencies": {
234 | "@types/http-errors": "*",
235 | "@types/node": "*",
236 | "@types/send": "*"
237 | }
238 | },
239 | "node_modules/@types/webidl-conversions": {
240 | "version": "7.0.3",
241 | "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz",
242 | "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==",
243 | "license": "MIT"
244 | },
245 | "node_modules/@types/whatwg-url": {
246 | "version": "11.0.5",
247 | "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-11.0.5.tgz",
248 | "integrity": "sha512-coYR071JRaHa+xoEvvYqvnIHaVqaYrLPbsufM9BF63HkwI5Lgmy2QR8Q5K/lYDYo5AK82wOvSOS0UsLTpTG7uQ==",
249 | "license": "MIT",
250 | "dependencies": {
251 | "@types/webidl-conversions": "*"
252 | }
253 | },
254 | "node_modules/abbrev": {
255 | "version": "1.1.1",
256 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
257 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
258 | "license": "ISC"
259 | },
260 | "node_modules/accepts": {
261 | "version": "1.3.8",
262 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
263 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
264 | "license": "MIT",
265 | "dependencies": {
266 | "mime-types": "~2.1.34",
267 | "negotiator": "0.6.3"
268 | },
269 | "engines": {
270 | "node": ">= 0.6"
271 | }
272 | },
273 | "node_modules/agent-base": {
274 | "version": "6.0.2",
275 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
276 | "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
277 | "license": "MIT",
278 | "dependencies": {
279 | "debug": "4"
280 | },
281 | "engines": {
282 | "node": ">= 6.0.0"
283 | }
284 | },
285 | "node_modules/agent-base/node_modules/debug": {
286 | "version": "4.4.0",
287 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
288 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
289 | "license": "MIT",
290 | "dependencies": {
291 | "ms": "^2.1.3"
292 | },
293 | "engines": {
294 | "node": ">=6.0"
295 | },
296 | "peerDependenciesMeta": {
297 | "supports-color": {
298 | "optional": true
299 | }
300 | }
301 | },
302 | "node_modules/agent-base/node_modules/ms": {
303 | "version": "2.1.3",
304 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
305 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
306 | "license": "MIT"
307 | },
308 | "node_modules/ansi-regex": {
309 | "version": "5.0.1",
310 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
311 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
312 | "license": "MIT",
313 | "engines": {
314 | "node": ">=8"
315 | }
316 | },
317 | "node_modules/aproba": {
318 | "version": "2.0.0",
319 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
320 | "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
321 | "license": "ISC"
322 | },
323 | "node_modules/are-we-there-yet": {
324 | "version": "2.0.0",
325 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
326 | "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
327 | "deprecated": "This package is no longer supported.",
328 | "license": "ISC",
329 | "dependencies": {
330 | "delegates": "^1.0.0",
331 | "readable-stream": "^3.6.0"
332 | },
333 | "engines": {
334 | "node": ">=10"
335 | }
336 | },
337 | "node_modules/array-flatten": {
338 | "version": "1.1.1",
339 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
340 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
341 | "license": "MIT"
342 | },
343 | "node_modules/balanced-match": {
344 | "version": "1.0.2",
345 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
346 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
347 | "license": "MIT"
348 | },
349 | "node_modules/bcrypt": {
350 | "version": "5.1.1",
351 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-5.1.1.tgz",
352 | "integrity": "sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==",
353 | "hasInstallScript": true,
354 | "license": "MIT",
355 | "dependencies": {
356 | "@mapbox/node-pre-gyp": "^1.0.11",
357 | "node-addon-api": "^5.0.0"
358 | },
359 | "engines": {
360 | "node": ">= 10.0.0"
361 | }
362 | },
363 | "node_modules/body-parser": {
364 | "version": "1.20.3",
365 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
366 | "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
367 | "license": "MIT",
368 | "dependencies": {
369 | "bytes": "3.1.2",
370 | "content-type": "~1.0.5",
371 | "debug": "2.6.9",
372 | "depd": "2.0.0",
373 | "destroy": "1.2.0",
374 | "http-errors": "2.0.0",
375 | "iconv-lite": "0.4.24",
376 | "on-finished": "2.4.1",
377 | "qs": "6.13.0",
378 | "raw-body": "2.5.2",
379 | "type-is": "~1.6.18",
380 | "unpipe": "1.0.0"
381 | },
382 | "engines": {
383 | "node": ">= 0.8",
384 | "npm": "1.2.8000 || >= 1.4.16"
385 | }
386 | },
387 | "node_modules/brace-expansion": {
388 | "version": "1.1.12",
389 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
390 | "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
391 | "license": "MIT",
392 | "dependencies": {
393 | "balanced-match": "^1.0.0",
394 | "concat-map": "0.0.1"
395 | }
396 | },
397 | "node_modules/bson": {
398 | "version": "6.10.3",
399 | "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz",
400 | "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==",
401 | "license": "Apache-2.0",
402 | "engines": {
403 | "node": ">=16.20.1"
404 | }
405 | },
406 | "node_modules/buffer-equal-constant-time": {
407 | "version": "1.0.1",
408 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
409 | "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
410 | "license": "BSD-3-Clause"
411 | },
412 | "node_modules/bytes": {
413 | "version": "3.1.2",
414 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
415 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
416 | "license": "MIT",
417 | "engines": {
418 | "node": ">= 0.8"
419 | }
420 | },
421 | "node_modules/call-bind": {
422 | "version": "1.0.8",
423 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
424 | "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
425 | "license": "MIT",
426 | "dependencies": {
427 | "call-bind-apply-helpers": "^1.0.0",
428 | "es-define-property": "^1.0.0",
429 | "get-intrinsic": "^1.2.4",
430 | "set-function-length": "^1.2.2"
431 | },
432 | "engines": {
433 | "node": ">= 0.4"
434 | },
435 | "funding": {
436 | "url": "https://github.com/sponsors/ljharb"
437 | }
438 | },
439 | "node_modules/call-bind-apply-helpers": {
440 | "version": "1.0.1",
441 | "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz",
442 | "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==",
443 | "license": "MIT",
444 | "dependencies": {
445 | "es-errors": "^1.3.0",
446 | "function-bind": "^1.1.2"
447 | },
448 | "engines": {
449 | "node": ">= 0.4"
450 | }
451 | },
452 | "node_modules/call-bound": {
453 | "version": "1.0.2",
454 | "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.2.tgz",
455 | "integrity": "sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==",
456 | "license": "MIT",
457 | "dependencies": {
458 | "call-bind": "^1.0.8",
459 | "get-intrinsic": "^1.2.5"
460 | },
461 | "engines": {
462 | "node": ">= 0.4"
463 | },
464 | "funding": {
465 | "url": "https://github.com/sponsors/ljharb"
466 | }
467 | },
468 | "node_modules/chownr": {
469 | "version": "2.0.0",
470 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
471 | "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
472 | "license": "ISC",
473 | "engines": {
474 | "node": ">=10"
475 | }
476 | },
477 | "node_modules/color-support": {
478 | "version": "1.1.3",
479 | "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
480 | "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
481 | "license": "ISC",
482 | "bin": {
483 | "color-support": "bin.js"
484 | }
485 | },
486 | "node_modules/concat-map": {
487 | "version": "0.0.1",
488 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
489 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
490 | "license": "MIT"
491 | },
492 | "node_modules/console-control-strings": {
493 | "version": "1.1.0",
494 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
495 | "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
496 | "license": "ISC"
497 | },
498 | "node_modules/content-disposition": {
499 | "version": "0.5.4",
500 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
501 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
502 | "license": "MIT",
503 | "dependencies": {
504 | "safe-buffer": "5.2.1"
505 | },
506 | "engines": {
507 | "node": ">= 0.6"
508 | }
509 | },
510 | "node_modules/content-type": {
511 | "version": "1.0.5",
512 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
513 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
514 | "license": "MIT",
515 | "engines": {
516 | "node": ">= 0.6"
517 | }
518 | },
519 | "node_modules/cookie": {
520 | "version": "0.7.1",
521 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
522 | "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
523 | "license": "MIT",
524 | "engines": {
525 | "node": ">= 0.6"
526 | }
527 | },
528 | "node_modules/cookie-signature": {
529 | "version": "1.0.6",
530 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
531 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
532 | "license": "MIT"
533 | },
534 | "node_modules/cors": {
535 | "version": "2.8.5",
536 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
537 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
538 | "license": "MIT",
539 | "dependencies": {
540 | "object-assign": "^4",
541 | "vary": "^1"
542 | },
543 | "engines": {
544 | "node": ">= 0.10"
545 | }
546 | },
547 | "node_modules/debug": {
548 | "version": "2.6.9",
549 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
550 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
551 | "license": "MIT",
552 | "dependencies": {
553 | "ms": "2.0.0"
554 | }
555 | },
556 | "node_modules/define-data-property": {
557 | "version": "1.1.4",
558 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
559 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
560 | "license": "MIT",
561 | "dependencies": {
562 | "es-define-property": "^1.0.0",
563 | "es-errors": "^1.3.0",
564 | "gopd": "^1.0.1"
565 | },
566 | "engines": {
567 | "node": ">= 0.4"
568 | },
569 | "funding": {
570 | "url": "https://github.com/sponsors/ljharb"
571 | }
572 | },
573 | "node_modules/delegates": {
574 | "version": "1.0.0",
575 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
576 | "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
577 | "license": "MIT"
578 | },
579 | "node_modules/depd": {
580 | "version": "2.0.0",
581 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
582 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
583 | "license": "MIT",
584 | "engines": {
585 | "node": ">= 0.8"
586 | }
587 | },
588 | "node_modules/destroy": {
589 | "version": "1.2.0",
590 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
591 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
592 | "license": "MIT",
593 | "engines": {
594 | "node": ">= 0.8",
595 | "npm": "1.2.8000 || >= 1.4.16"
596 | }
597 | },
598 | "node_modules/detect-libc": {
599 | "version": "2.0.3",
600 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
601 | "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
602 | "license": "Apache-2.0",
603 | "engines": {
604 | "node": ">=8"
605 | }
606 | },
607 | "node_modules/dotenv": {
608 | "version": "16.4.7",
609 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
610 | "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==",
611 | "license": "BSD-2-Clause",
612 | "engines": {
613 | "node": ">=12"
614 | },
615 | "funding": {
616 | "url": "https://dotenvx.com"
617 | }
618 | },
619 | "node_modules/dunder-proto": {
620 | "version": "1.0.0",
621 | "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.0.tgz",
622 | "integrity": "sha512-9+Sj30DIu+4KvHqMfLUGLFYL2PkURSYMVXJyXe92nFRvlYq5hBjLEhblKB+vkd/WVlUYMWigiY07T91Fkk0+4A==",
623 | "license": "MIT",
624 | "dependencies": {
625 | "call-bind-apply-helpers": "^1.0.0",
626 | "es-errors": "^1.3.0",
627 | "gopd": "^1.2.0"
628 | },
629 | "engines": {
630 | "node": ">= 0.4"
631 | }
632 | },
633 | "node_modules/ecdsa-sig-formatter": {
634 | "version": "1.0.11",
635 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
636 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
637 | "license": "Apache-2.0",
638 | "dependencies": {
639 | "safe-buffer": "^5.0.1"
640 | }
641 | },
642 | "node_modules/ee-first": {
643 | "version": "1.1.1",
644 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
645 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
646 | "license": "MIT"
647 | },
648 | "node_modules/emoji-regex": {
649 | "version": "8.0.0",
650 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
651 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
652 | "license": "MIT"
653 | },
654 | "node_modules/encodeurl": {
655 | "version": "2.0.0",
656 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
657 | "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
658 | "license": "MIT",
659 | "engines": {
660 | "node": ">= 0.8"
661 | }
662 | },
663 | "node_modules/es-define-property": {
664 | "version": "1.0.1",
665 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
666 | "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
667 | "license": "MIT",
668 | "engines": {
669 | "node": ">= 0.4"
670 | }
671 | },
672 | "node_modules/es-errors": {
673 | "version": "1.3.0",
674 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
675 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
676 | "license": "MIT",
677 | "engines": {
678 | "node": ">= 0.4"
679 | }
680 | },
681 | "node_modules/es-object-atoms": {
682 | "version": "1.0.0",
683 | "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
684 | "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
685 | "license": "MIT",
686 | "dependencies": {
687 | "es-errors": "^1.3.0"
688 | },
689 | "engines": {
690 | "node": ">= 0.4"
691 | }
692 | },
693 | "node_modules/escape-html": {
694 | "version": "1.0.3",
695 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
696 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
697 | "license": "MIT"
698 | },
699 | "node_modules/etag": {
700 | "version": "1.8.1",
701 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
702 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
703 | "license": "MIT",
704 | "engines": {
705 | "node": ">= 0.6"
706 | }
707 | },
708 | "node_modules/express": {
709 | "version": "4.21.2",
710 | "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
711 | "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
712 | "license": "MIT",
713 | "dependencies": {
714 | "accepts": "~1.3.8",
715 | "array-flatten": "1.1.1",
716 | "body-parser": "1.20.3",
717 | "content-disposition": "0.5.4",
718 | "content-type": "~1.0.4",
719 | "cookie": "0.7.1",
720 | "cookie-signature": "1.0.6",
721 | "debug": "2.6.9",
722 | "depd": "2.0.0",
723 | "encodeurl": "~2.0.0",
724 | "escape-html": "~1.0.3",
725 | "etag": "~1.8.1",
726 | "finalhandler": "1.3.1",
727 | "fresh": "0.5.2",
728 | "http-errors": "2.0.0",
729 | "merge-descriptors": "1.0.3",
730 | "methods": "~1.1.2",
731 | "on-finished": "2.4.1",
732 | "parseurl": "~1.3.3",
733 | "path-to-regexp": "0.1.12",
734 | "proxy-addr": "~2.0.7",
735 | "qs": "6.13.0",
736 | "range-parser": "~1.2.1",
737 | "safe-buffer": "5.2.1",
738 | "send": "0.19.0",
739 | "serve-static": "1.16.2",
740 | "setprototypeof": "1.2.0",
741 | "statuses": "2.0.1",
742 | "type-is": "~1.6.18",
743 | "utils-merge": "1.0.1",
744 | "vary": "~1.1.2"
745 | },
746 | "engines": {
747 | "node": ">= 0.10.0"
748 | },
749 | "funding": {
750 | "type": "opencollective",
751 | "url": "https://opencollective.com/express"
752 | }
753 | },
754 | "node_modules/finalhandler": {
755 | "version": "1.3.1",
756 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
757 | "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
758 | "license": "MIT",
759 | "dependencies": {
760 | "debug": "2.6.9",
761 | "encodeurl": "~2.0.0",
762 | "escape-html": "~1.0.3",
763 | "on-finished": "2.4.1",
764 | "parseurl": "~1.3.3",
765 | "statuses": "2.0.1",
766 | "unpipe": "~1.0.0"
767 | },
768 | "engines": {
769 | "node": ">= 0.8"
770 | }
771 | },
772 | "node_modules/forwarded": {
773 | "version": "0.2.0",
774 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
775 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
776 | "license": "MIT",
777 | "engines": {
778 | "node": ">= 0.6"
779 | }
780 | },
781 | "node_modules/fresh": {
782 | "version": "0.5.2",
783 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
784 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
785 | "license": "MIT",
786 | "engines": {
787 | "node": ">= 0.6"
788 | }
789 | },
790 | "node_modules/fs-minipass": {
791 | "version": "2.1.0",
792 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
793 | "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
794 | "license": "ISC",
795 | "dependencies": {
796 | "minipass": "^3.0.0"
797 | },
798 | "engines": {
799 | "node": ">= 8"
800 | }
801 | },
802 | "node_modules/fs-minipass/node_modules/minipass": {
803 | "version": "3.3.6",
804 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
805 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
806 | "license": "ISC",
807 | "dependencies": {
808 | "yallist": "^4.0.0"
809 | },
810 | "engines": {
811 | "node": ">=8"
812 | }
813 | },
814 | "node_modules/fs.realpath": {
815 | "version": "1.0.0",
816 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
817 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
818 | "license": "ISC"
819 | },
820 | "node_modules/function-bind": {
821 | "version": "1.1.2",
822 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
823 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
824 | "license": "MIT",
825 | "funding": {
826 | "url": "https://github.com/sponsors/ljharb"
827 | }
828 | },
829 | "node_modules/gauge": {
830 | "version": "3.0.2",
831 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
832 | "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
833 | "deprecated": "This package is no longer supported.",
834 | "license": "ISC",
835 | "dependencies": {
836 | "aproba": "^1.0.3 || ^2.0.0",
837 | "color-support": "^1.1.2",
838 | "console-control-strings": "^1.0.0",
839 | "has-unicode": "^2.0.1",
840 | "object-assign": "^4.1.1",
841 | "signal-exit": "^3.0.0",
842 | "string-width": "^4.2.3",
843 | "strip-ansi": "^6.0.1",
844 | "wide-align": "^1.1.2"
845 | },
846 | "engines": {
847 | "node": ">=10"
848 | }
849 | },
850 | "node_modules/get-intrinsic": {
851 | "version": "1.2.6",
852 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz",
853 | "integrity": "sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==",
854 | "license": "MIT",
855 | "dependencies": {
856 | "call-bind-apply-helpers": "^1.0.1",
857 | "dunder-proto": "^1.0.0",
858 | "es-define-property": "^1.0.1",
859 | "es-errors": "^1.3.0",
860 | "es-object-atoms": "^1.0.0",
861 | "function-bind": "^1.1.2",
862 | "gopd": "^1.2.0",
863 | "has-symbols": "^1.1.0",
864 | "hasown": "^2.0.2",
865 | "math-intrinsics": "^1.0.0"
866 | },
867 | "engines": {
868 | "node": ">= 0.4"
869 | },
870 | "funding": {
871 | "url": "https://github.com/sponsors/ljharb"
872 | }
873 | },
874 | "node_modules/glob": {
875 | "version": "7.2.3",
876 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
877 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
878 | "deprecated": "Glob versions prior to v9 are no longer supported",
879 | "license": "ISC",
880 | "dependencies": {
881 | "fs.realpath": "^1.0.0",
882 | "inflight": "^1.0.4",
883 | "inherits": "2",
884 | "minimatch": "^3.1.1",
885 | "once": "^1.3.0",
886 | "path-is-absolute": "^1.0.0"
887 | },
888 | "engines": {
889 | "node": "*"
890 | },
891 | "funding": {
892 | "url": "https://github.com/sponsors/isaacs"
893 | }
894 | },
895 | "node_modules/gopd": {
896 | "version": "1.2.0",
897 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
898 | "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
899 | "license": "MIT",
900 | "engines": {
901 | "node": ">= 0.4"
902 | },
903 | "funding": {
904 | "url": "https://github.com/sponsors/ljharb"
905 | }
906 | },
907 | "node_modules/has-property-descriptors": {
908 | "version": "1.0.2",
909 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
910 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
911 | "license": "MIT",
912 | "dependencies": {
913 | "es-define-property": "^1.0.0"
914 | },
915 | "funding": {
916 | "url": "https://github.com/sponsors/ljharb"
917 | }
918 | },
919 | "node_modules/has-symbols": {
920 | "version": "1.1.0",
921 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
922 | "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
923 | "license": "MIT",
924 | "engines": {
925 | "node": ">= 0.4"
926 | },
927 | "funding": {
928 | "url": "https://github.com/sponsors/ljharb"
929 | }
930 | },
931 | "node_modules/has-unicode": {
932 | "version": "2.0.1",
933 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
934 | "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
935 | "license": "ISC"
936 | },
937 | "node_modules/hasown": {
938 | "version": "2.0.2",
939 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
940 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
941 | "license": "MIT",
942 | "dependencies": {
943 | "function-bind": "^1.1.2"
944 | },
945 | "engines": {
946 | "node": ">= 0.4"
947 | }
948 | },
949 | "node_modules/http-errors": {
950 | "version": "2.0.0",
951 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
952 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
953 | "license": "MIT",
954 | "dependencies": {
955 | "depd": "2.0.0",
956 | "inherits": "2.0.4",
957 | "setprototypeof": "1.2.0",
958 | "statuses": "2.0.1",
959 | "toidentifier": "1.0.1"
960 | },
961 | "engines": {
962 | "node": ">= 0.8"
963 | }
964 | },
965 | "node_modules/https-proxy-agent": {
966 | "version": "5.0.1",
967 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
968 | "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
969 | "license": "MIT",
970 | "dependencies": {
971 | "agent-base": "6",
972 | "debug": "4"
973 | },
974 | "engines": {
975 | "node": ">= 6"
976 | }
977 | },
978 | "node_modules/https-proxy-agent/node_modules/debug": {
979 | "version": "4.4.0",
980 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
981 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
982 | "license": "MIT",
983 | "dependencies": {
984 | "ms": "^2.1.3"
985 | },
986 | "engines": {
987 | "node": ">=6.0"
988 | },
989 | "peerDependenciesMeta": {
990 | "supports-color": {
991 | "optional": true
992 | }
993 | }
994 | },
995 | "node_modules/https-proxy-agent/node_modules/ms": {
996 | "version": "2.1.3",
997 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
998 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
999 | "license": "MIT"
1000 | },
1001 | "node_modules/iconv-lite": {
1002 | "version": "0.4.24",
1003 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1004 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1005 | "license": "MIT",
1006 | "dependencies": {
1007 | "safer-buffer": ">= 2.1.2 < 3"
1008 | },
1009 | "engines": {
1010 | "node": ">=0.10.0"
1011 | }
1012 | },
1013 | "node_modules/inflight": {
1014 | "version": "1.0.6",
1015 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1016 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
1017 | "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
1018 | "license": "ISC",
1019 | "dependencies": {
1020 | "once": "^1.3.0",
1021 | "wrappy": "1"
1022 | }
1023 | },
1024 | "node_modules/inherits": {
1025 | "version": "2.0.4",
1026 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1027 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1028 | "license": "ISC"
1029 | },
1030 | "node_modules/ipaddr.js": {
1031 | "version": "1.9.1",
1032 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1033 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
1034 | "license": "MIT",
1035 | "engines": {
1036 | "node": ">= 0.10"
1037 | }
1038 | },
1039 | "node_modules/is-fullwidth-code-point": {
1040 | "version": "3.0.0",
1041 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1042 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1043 | "license": "MIT",
1044 | "engines": {
1045 | "node": ">=8"
1046 | }
1047 | },
1048 | "node_modules/joi": {
1049 | "version": "17.13.3",
1050 | "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
1051 | "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
1052 | "license": "BSD-3-Clause",
1053 | "dependencies": {
1054 | "@hapi/hoek": "^9.3.0",
1055 | "@hapi/topo": "^5.1.0",
1056 | "@sideway/address": "^4.1.5",
1057 | "@sideway/formula": "^3.0.1",
1058 | "@sideway/pinpoint": "^2.0.0"
1059 | }
1060 | },
1061 | "node_modules/jsonwebtoken": {
1062 | "version": "9.0.2",
1063 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
1064 | "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
1065 | "license": "MIT",
1066 | "dependencies": {
1067 | "jws": "^3.2.2",
1068 | "lodash.includes": "^4.3.0",
1069 | "lodash.isboolean": "^3.0.3",
1070 | "lodash.isinteger": "^4.0.4",
1071 | "lodash.isnumber": "^3.0.3",
1072 | "lodash.isplainobject": "^4.0.6",
1073 | "lodash.isstring": "^4.0.1",
1074 | "lodash.once": "^4.0.0",
1075 | "ms": "^2.1.1",
1076 | "semver": "^7.5.4"
1077 | },
1078 | "engines": {
1079 | "node": ">=12",
1080 | "npm": ">=6"
1081 | }
1082 | },
1083 | "node_modules/jsonwebtoken/node_modules/ms": {
1084 | "version": "2.1.3",
1085 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1086 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1087 | "license": "MIT"
1088 | },
1089 | "node_modules/jwa": {
1090 | "version": "1.4.1",
1091 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
1092 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
1093 | "license": "MIT",
1094 | "dependencies": {
1095 | "buffer-equal-constant-time": "1.0.1",
1096 | "ecdsa-sig-formatter": "1.0.11",
1097 | "safe-buffer": "^5.0.1"
1098 | }
1099 | },
1100 | "node_modules/jws": {
1101 | "version": "3.2.2",
1102 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
1103 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
1104 | "license": "MIT",
1105 | "dependencies": {
1106 | "jwa": "^1.4.1",
1107 | "safe-buffer": "^5.0.1"
1108 | }
1109 | },
1110 | "node_modules/kareem": {
1111 | "version": "2.6.3",
1112 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz",
1113 | "integrity": "sha512-C3iHfuGUXK2u8/ipq9LfjFfXFxAZMQJJq7vLS45r3D9Y2xQ/m4S8zaR4zMLFWh9AsNPXmcFfUDhTEO8UIC/V6Q==",
1114 | "license": "Apache-2.0",
1115 | "engines": {
1116 | "node": ">=12.0.0"
1117 | }
1118 | },
1119 | "node_modules/lodash.includes": {
1120 | "version": "4.3.0",
1121 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
1122 | "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
1123 | "license": "MIT"
1124 | },
1125 | "node_modules/lodash.isboolean": {
1126 | "version": "3.0.3",
1127 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
1128 | "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
1129 | "license": "MIT"
1130 | },
1131 | "node_modules/lodash.isinteger": {
1132 | "version": "4.0.4",
1133 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
1134 | "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
1135 | "license": "MIT"
1136 | },
1137 | "node_modules/lodash.isnumber": {
1138 | "version": "3.0.3",
1139 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
1140 | "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
1141 | "license": "MIT"
1142 | },
1143 | "node_modules/lodash.isplainobject": {
1144 | "version": "4.0.6",
1145 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
1146 | "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
1147 | "license": "MIT"
1148 | },
1149 | "node_modules/lodash.isstring": {
1150 | "version": "4.0.1",
1151 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
1152 | "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
1153 | "license": "MIT"
1154 | },
1155 | "node_modules/lodash.once": {
1156 | "version": "4.1.1",
1157 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
1158 | "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
1159 | "license": "MIT"
1160 | },
1161 | "node_modules/make-dir": {
1162 | "version": "3.1.0",
1163 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
1164 | "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
1165 | "license": "MIT",
1166 | "dependencies": {
1167 | "semver": "^6.0.0"
1168 | },
1169 | "engines": {
1170 | "node": ">=8"
1171 | },
1172 | "funding": {
1173 | "url": "https://github.com/sponsors/sindresorhus"
1174 | }
1175 | },
1176 | "node_modules/make-dir/node_modules/semver": {
1177 | "version": "6.3.1",
1178 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
1179 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
1180 | "license": "ISC",
1181 | "bin": {
1182 | "semver": "bin/semver.js"
1183 | }
1184 | },
1185 | "node_modules/math-intrinsics": {
1186 | "version": "1.0.0",
1187 | "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz",
1188 | "integrity": "sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==",
1189 | "license": "MIT",
1190 | "engines": {
1191 | "node": ">= 0.4"
1192 | }
1193 | },
1194 | "node_modules/media-typer": {
1195 | "version": "0.3.0",
1196 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1197 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
1198 | "license": "MIT",
1199 | "engines": {
1200 | "node": ">= 0.6"
1201 | }
1202 | },
1203 | "node_modules/memory-pager": {
1204 | "version": "1.5.0",
1205 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
1206 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
1207 | "license": "MIT"
1208 | },
1209 | "node_modules/merge-descriptors": {
1210 | "version": "1.0.3",
1211 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
1212 | "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
1213 | "license": "MIT",
1214 | "funding": {
1215 | "url": "https://github.com/sponsors/sindresorhus"
1216 | }
1217 | },
1218 | "node_modules/methods": {
1219 | "version": "1.1.2",
1220 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1221 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
1222 | "license": "MIT",
1223 | "engines": {
1224 | "node": ">= 0.6"
1225 | }
1226 | },
1227 | "node_modules/mime": {
1228 | "version": "1.6.0",
1229 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1230 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1231 | "license": "MIT",
1232 | "bin": {
1233 | "mime": "cli.js"
1234 | },
1235 | "engines": {
1236 | "node": ">=4"
1237 | }
1238 | },
1239 | "node_modules/mime-db": {
1240 | "version": "1.52.0",
1241 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1242 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1243 | "license": "MIT",
1244 | "engines": {
1245 | "node": ">= 0.6"
1246 | }
1247 | },
1248 | "node_modules/mime-types": {
1249 | "version": "2.1.35",
1250 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1251 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1252 | "license": "MIT",
1253 | "dependencies": {
1254 | "mime-db": "1.52.0"
1255 | },
1256 | "engines": {
1257 | "node": ">= 0.6"
1258 | }
1259 | },
1260 | "node_modules/minimatch": {
1261 | "version": "3.1.2",
1262 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1263 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1264 | "license": "ISC",
1265 | "dependencies": {
1266 | "brace-expansion": "^1.1.7"
1267 | },
1268 | "engines": {
1269 | "node": "*"
1270 | }
1271 | },
1272 | "node_modules/minipass": {
1273 | "version": "5.0.0",
1274 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
1275 | "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
1276 | "license": "ISC",
1277 | "engines": {
1278 | "node": ">=8"
1279 | }
1280 | },
1281 | "node_modules/minizlib": {
1282 | "version": "2.1.2",
1283 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
1284 | "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
1285 | "license": "MIT",
1286 | "dependencies": {
1287 | "minipass": "^3.0.0",
1288 | "yallist": "^4.0.0"
1289 | },
1290 | "engines": {
1291 | "node": ">= 8"
1292 | }
1293 | },
1294 | "node_modules/minizlib/node_modules/minipass": {
1295 | "version": "3.3.6",
1296 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
1297 | "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
1298 | "license": "ISC",
1299 | "dependencies": {
1300 | "yallist": "^4.0.0"
1301 | },
1302 | "engines": {
1303 | "node": ">=8"
1304 | }
1305 | },
1306 | "node_modules/mkdirp": {
1307 | "version": "1.0.4",
1308 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
1309 | "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
1310 | "license": "MIT",
1311 | "bin": {
1312 | "mkdirp": "bin/cmd.js"
1313 | },
1314 | "engines": {
1315 | "node": ">=10"
1316 | }
1317 | },
1318 | "node_modules/mongodb": {
1319 | "version": "6.16.0",
1320 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz",
1321 | "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==",
1322 | "license": "Apache-2.0",
1323 | "dependencies": {
1324 | "@mongodb-js/saslprep": "^1.1.9",
1325 | "bson": "^6.10.3",
1326 | "mongodb-connection-string-url": "^3.0.0"
1327 | },
1328 | "engines": {
1329 | "node": ">=16.20.1"
1330 | },
1331 | "peerDependencies": {
1332 | "@aws-sdk/credential-providers": "^3.188.0",
1333 | "@mongodb-js/zstd": "^1.1.0 || ^2.0.0",
1334 | "gcp-metadata": "^5.2.0",
1335 | "kerberos": "^2.0.1",
1336 | "mongodb-client-encryption": ">=6.0.0 <7",
1337 | "snappy": "^7.2.2",
1338 | "socks": "^2.7.1"
1339 | },
1340 | "peerDependenciesMeta": {
1341 | "@aws-sdk/credential-providers": {
1342 | "optional": true
1343 | },
1344 | "@mongodb-js/zstd": {
1345 | "optional": true
1346 | },
1347 | "gcp-metadata": {
1348 | "optional": true
1349 | },
1350 | "kerberos": {
1351 | "optional": true
1352 | },
1353 | "mongodb-client-encryption": {
1354 | "optional": true
1355 | },
1356 | "snappy": {
1357 | "optional": true
1358 | },
1359 | "socks": {
1360 | "optional": true
1361 | }
1362 | }
1363 | },
1364 | "node_modules/mongodb-connection-string-url": {
1365 | "version": "3.0.2",
1366 | "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-3.0.2.tgz",
1367 | "integrity": "sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==",
1368 | "license": "Apache-2.0",
1369 | "dependencies": {
1370 | "@types/whatwg-url": "^11.0.2",
1371 | "whatwg-url": "^14.1.0 || ^13.0.0"
1372 | }
1373 | },
1374 | "node_modules/mongoose": {
1375 | "version": "8.15.1",
1376 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.1.tgz",
1377 | "integrity": "sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw==",
1378 | "license": "MIT",
1379 | "dependencies": {
1380 | "bson": "^6.10.3",
1381 | "kareem": "2.6.3",
1382 | "mongodb": "~6.16.0",
1383 | "mpath": "0.9.0",
1384 | "mquery": "5.0.0",
1385 | "ms": "2.1.3",
1386 | "sift": "17.1.3"
1387 | },
1388 | "engines": {
1389 | "node": ">=16.20.1"
1390 | },
1391 | "funding": {
1392 | "type": "opencollective",
1393 | "url": "https://opencollective.com/mongoose"
1394 | }
1395 | },
1396 | "node_modules/mongoose/node_modules/ms": {
1397 | "version": "2.1.3",
1398 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1399 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1400 | "license": "MIT"
1401 | },
1402 | "node_modules/mpath": {
1403 | "version": "0.9.0",
1404 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz",
1405 | "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==",
1406 | "license": "MIT",
1407 | "engines": {
1408 | "node": ">=4.0.0"
1409 | }
1410 | },
1411 | "node_modules/mquery": {
1412 | "version": "5.0.0",
1413 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-5.0.0.tgz",
1414 | "integrity": "sha512-iQMncpmEK8R8ncT8HJGsGc9Dsp8xcgYMVSbs5jgnm1lFHTZqMJTUWTDx1LBO8+mK3tPNZWFLBghQEIOULSTHZg==",
1415 | "license": "MIT",
1416 | "dependencies": {
1417 | "debug": "4.x"
1418 | },
1419 | "engines": {
1420 | "node": ">=14.0.0"
1421 | }
1422 | },
1423 | "node_modules/mquery/node_modules/debug": {
1424 | "version": "4.4.0",
1425 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
1426 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
1427 | "license": "MIT",
1428 | "dependencies": {
1429 | "ms": "^2.1.3"
1430 | },
1431 | "engines": {
1432 | "node": ">=6.0"
1433 | },
1434 | "peerDependenciesMeta": {
1435 | "supports-color": {
1436 | "optional": true
1437 | }
1438 | }
1439 | },
1440 | "node_modules/mquery/node_modules/ms": {
1441 | "version": "2.1.3",
1442 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1443 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1444 | "license": "MIT"
1445 | },
1446 | "node_modules/ms": {
1447 | "version": "2.0.0",
1448 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1449 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
1450 | "license": "MIT"
1451 | },
1452 | "node_modules/negotiator": {
1453 | "version": "0.6.3",
1454 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1455 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
1456 | "license": "MIT",
1457 | "engines": {
1458 | "node": ">= 0.6"
1459 | }
1460 | },
1461 | "node_modules/node-addon-api": {
1462 | "version": "5.1.0",
1463 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
1464 | "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==",
1465 | "license": "MIT"
1466 | },
1467 | "node_modules/node-fetch": {
1468 | "version": "2.7.0",
1469 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
1470 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
1471 | "license": "MIT",
1472 | "dependencies": {
1473 | "whatwg-url": "^5.0.0"
1474 | },
1475 | "engines": {
1476 | "node": "4.x || >=6.0.0"
1477 | },
1478 | "peerDependencies": {
1479 | "encoding": "^0.1.0"
1480 | },
1481 | "peerDependenciesMeta": {
1482 | "encoding": {
1483 | "optional": true
1484 | }
1485 | }
1486 | },
1487 | "node_modules/node-fetch/node_modules/tr46": {
1488 | "version": "0.0.3",
1489 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
1490 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
1491 | "license": "MIT"
1492 | },
1493 | "node_modules/node-fetch/node_modules/webidl-conversions": {
1494 | "version": "3.0.1",
1495 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
1496 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
1497 | "license": "BSD-2-Clause"
1498 | },
1499 | "node_modules/node-fetch/node_modules/whatwg-url": {
1500 | "version": "5.0.0",
1501 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
1502 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
1503 | "license": "MIT",
1504 | "dependencies": {
1505 | "tr46": "~0.0.3",
1506 | "webidl-conversions": "^3.0.0"
1507 | }
1508 | },
1509 | "node_modules/nopt": {
1510 | "version": "5.0.0",
1511 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
1512 | "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
1513 | "license": "ISC",
1514 | "dependencies": {
1515 | "abbrev": "1"
1516 | },
1517 | "bin": {
1518 | "nopt": "bin/nopt.js"
1519 | },
1520 | "engines": {
1521 | "node": ">=6"
1522 | }
1523 | },
1524 | "node_modules/npmlog": {
1525 | "version": "5.0.1",
1526 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
1527 | "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
1528 | "deprecated": "This package is no longer supported.",
1529 | "license": "ISC",
1530 | "dependencies": {
1531 | "are-we-there-yet": "^2.0.0",
1532 | "console-control-strings": "^1.1.0",
1533 | "gauge": "^3.0.0",
1534 | "set-blocking": "^2.0.0"
1535 | }
1536 | },
1537 | "node_modules/object-assign": {
1538 | "version": "4.1.1",
1539 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1540 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1541 | "license": "MIT",
1542 | "engines": {
1543 | "node": ">=0.10.0"
1544 | }
1545 | },
1546 | "node_modules/object-inspect": {
1547 | "version": "1.13.3",
1548 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
1549 | "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
1550 | "license": "MIT",
1551 | "engines": {
1552 | "node": ">= 0.4"
1553 | },
1554 | "funding": {
1555 | "url": "https://github.com/sponsors/ljharb"
1556 | }
1557 | },
1558 | "node_modules/on-finished": {
1559 | "version": "2.4.1",
1560 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1561 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1562 | "license": "MIT",
1563 | "dependencies": {
1564 | "ee-first": "1.1.1"
1565 | },
1566 | "engines": {
1567 | "node": ">= 0.8"
1568 | }
1569 | },
1570 | "node_modules/once": {
1571 | "version": "1.4.0",
1572 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1573 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
1574 | "license": "ISC",
1575 | "dependencies": {
1576 | "wrappy": "1"
1577 | }
1578 | },
1579 | "node_modules/parseurl": {
1580 | "version": "1.3.3",
1581 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1582 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1583 | "license": "MIT",
1584 | "engines": {
1585 | "node": ">= 0.8"
1586 | }
1587 | },
1588 | "node_modules/path-is-absolute": {
1589 | "version": "1.0.1",
1590 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1591 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
1592 | "license": "MIT",
1593 | "engines": {
1594 | "node": ">=0.10.0"
1595 | }
1596 | },
1597 | "node_modules/path-to-regexp": {
1598 | "version": "0.1.12",
1599 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
1600 | "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
1601 | "license": "MIT"
1602 | },
1603 | "node_modules/proxy-addr": {
1604 | "version": "2.0.7",
1605 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1606 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1607 | "license": "MIT",
1608 | "dependencies": {
1609 | "forwarded": "0.2.0",
1610 | "ipaddr.js": "1.9.1"
1611 | },
1612 | "engines": {
1613 | "node": ">= 0.10"
1614 | }
1615 | },
1616 | "node_modules/punycode": {
1617 | "version": "2.3.1",
1618 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
1619 | "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
1620 | "license": "MIT",
1621 | "engines": {
1622 | "node": ">=6"
1623 | }
1624 | },
1625 | "node_modules/qs": {
1626 | "version": "6.13.0",
1627 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
1628 | "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
1629 | "license": "BSD-3-Clause",
1630 | "dependencies": {
1631 | "side-channel": "^1.0.6"
1632 | },
1633 | "engines": {
1634 | "node": ">=0.6"
1635 | },
1636 | "funding": {
1637 | "url": "https://github.com/sponsors/ljharb"
1638 | }
1639 | },
1640 | "node_modules/range-parser": {
1641 | "version": "1.2.1",
1642 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1643 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1644 | "license": "MIT",
1645 | "engines": {
1646 | "node": ">= 0.6"
1647 | }
1648 | },
1649 | "node_modules/raw-body": {
1650 | "version": "2.5.2",
1651 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1652 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1653 | "license": "MIT",
1654 | "dependencies": {
1655 | "bytes": "3.1.2",
1656 | "http-errors": "2.0.0",
1657 | "iconv-lite": "0.4.24",
1658 | "unpipe": "1.0.0"
1659 | },
1660 | "engines": {
1661 | "node": ">= 0.8"
1662 | }
1663 | },
1664 | "node_modules/readable-stream": {
1665 | "version": "3.6.2",
1666 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
1667 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
1668 | "license": "MIT",
1669 | "dependencies": {
1670 | "inherits": "^2.0.3",
1671 | "string_decoder": "^1.1.1",
1672 | "util-deprecate": "^1.0.1"
1673 | },
1674 | "engines": {
1675 | "node": ">= 6"
1676 | }
1677 | },
1678 | "node_modules/rimraf": {
1679 | "version": "3.0.2",
1680 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1681 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1682 | "deprecated": "Rimraf versions prior to v4 are no longer supported",
1683 | "license": "ISC",
1684 | "dependencies": {
1685 | "glob": "^7.1.3"
1686 | },
1687 | "bin": {
1688 | "rimraf": "bin.js"
1689 | },
1690 | "funding": {
1691 | "url": "https://github.com/sponsors/isaacs"
1692 | }
1693 | },
1694 | "node_modules/safe-buffer": {
1695 | "version": "5.2.1",
1696 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1697 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1698 | "funding": [
1699 | {
1700 | "type": "github",
1701 | "url": "https://github.com/sponsors/feross"
1702 | },
1703 | {
1704 | "type": "patreon",
1705 | "url": "https://www.patreon.com/feross"
1706 | },
1707 | {
1708 | "type": "consulting",
1709 | "url": "https://feross.org/support"
1710 | }
1711 | ],
1712 | "license": "MIT"
1713 | },
1714 | "node_modules/safer-buffer": {
1715 | "version": "2.1.2",
1716 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1717 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1718 | "license": "MIT"
1719 | },
1720 | "node_modules/semver": {
1721 | "version": "7.6.3",
1722 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
1723 | "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
1724 | "license": "ISC",
1725 | "bin": {
1726 | "semver": "bin/semver.js"
1727 | },
1728 | "engines": {
1729 | "node": ">=10"
1730 | }
1731 | },
1732 | "node_modules/send": {
1733 | "version": "0.19.0",
1734 | "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
1735 | "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
1736 | "license": "MIT",
1737 | "dependencies": {
1738 | "debug": "2.6.9",
1739 | "depd": "2.0.0",
1740 | "destroy": "1.2.0",
1741 | "encodeurl": "~1.0.2",
1742 | "escape-html": "~1.0.3",
1743 | "etag": "~1.8.1",
1744 | "fresh": "0.5.2",
1745 | "http-errors": "2.0.0",
1746 | "mime": "1.6.0",
1747 | "ms": "2.1.3",
1748 | "on-finished": "2.4.1",
1749 | "range-parser": "~1.2.1",
1750 | "statuses": "2.0.1"
1751 | },
1752 | "engines": {
1753 | "node": ">= 0.8.0"
1754 | }
1755 | },
1756 | "node_modules/send/node_modules/encodeurl": {
1757 | "version": "1.0.2",
1758 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1759 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
1760 | "license": "MIT",
1761 | "engines": {
1762 | "node": ">= 0.8"
1763 | }
1764 | },
1765 | "node_modules/send/node_modules/ms": {
1766 | "version": "2.1.3",
1767 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1768 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
1769 | "license": "MIT"
1770 | },
1771 | "node_modules/serve-static": {
1772 | "version": "1.16.2",
1773 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
1774 | "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
1775 | "license": "MIT",
1776 | "dependencies": {
1777 | "encodeurl": "~2.0.0",
1778 | "escape-html": "~1.0.3",
1779 | "parseurl": "~1.3.3",
1780 | "send": "0.19.0"
1781 | },
1782 | "engines": {
1783 | "node": ">= 0.8.0"
1784 | }
1785 | },
1786 | "node_modules/set-blocking": {
1787 | "version": "2.0.0",
1788 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1789 | "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
1790 | "license": "ISC"
1791 | },
1792 | "node_modules/set-function-length": {
1793 | "version": "1.2.2",
1794 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
1795 | "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
1796 | "license": "MIT",
1797 | "dependencies": {
1798 | "define-data-property": "^1.1.4",
1799 | "es-errors": "^1.3.0",
1800 | "function-bind": "^1.1.2",
1801 | "get-intrinsic": "^1.2.4",
1802 | "gopd": "^1.0.1",
1803 | "has-property-descriptors": "^1.0.2"
1804 | },
1805 | "engines": {
1806 | "node": ">= 0.4"
1807 | }
1808 | },
1809 | "node_modules/setprototypeof": {
1810 | "version": "1.2.0",
1811 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1812 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
1813 | "license": "ISC"
1814 | },
1815 | "node_modules/side-channel": {
1816 | "version": "1.1.0",
1817 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1818 | "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1819 | "license": "MIT",
1820 | "dependencies": {
1821 | "es-errors": "^1.3.0",
1822 | "object-inspect": "^1.13.3",
1823 | "side-channel-list": "^1.0.0",
1824 | "side-channel-map": "^1.0.1",
1825 | "side-channel-weakmap": "^1.0.2"
1826 | },
1827 | "engines": {
1828 | "node": ">= 0.4"
1829 | },
1830 | "funding": {
1831 | "url": "https://github.com/sponsors/ljharb"
1832 | }
1833 | },
1834 | "node_modules/side-channel-list": {
1835 | "version": "1.0.0",
1836 | "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1837 | "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1838 | "license": "MIT",
1839 | "dependencies": {
1840 | "es-errors": "^1.3.0",
1841 | "object-inspect": "^1.13.3"
1842 | },
1843 | "engines": {
1844 | "node": ">= 0.4"
1845 | },
1846 | "funding": {
1847 | "url": "https://github.com/sponsors/ljharb"
1848 | }
1849 | },
1850 | "node_modules/side-channel-map": {
1851 | "version": "1.0.1",
1852 | "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1853 | "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1854 | "license": "MIT",
1855 | "dependencies": {
1856 | "call-bound": "^1.0.2",
1857 | "es-errors": "^1.3.0",
1858 | "get-intrinsic": "^1.2.5",
1859 | "object-inspect": "^1.13.3"
1860 | },
1861 | "engines": {
1862 | "node": ">= 0.4"
1863 | },
1864 | "funding": {
1865 | "url": "https://github.com/sponsors/ljharb"
1866 | }
1867 | },
1868 | "node_modules/side-channel-weakmap": {
1869 | "version": "1.0.2",
1870 | "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1871 | "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1872 | "license": "MIT",
1873 | "dependencies": {
1874 | "call-bound": "^1.0.2",
1875 | "es-errors": "^1.3.0",
1876 | "get-intrinsic": "^1.2.5",
1877 | "object-inspect": "^1.13.3",
1878 | "side-channel-map": "^1.0.1"
1879 | },
1880 | "engines": {
1881 | "node": ">= 0.4"
1882 | },
1883 | "funding": {
1884 | "url": "https://github.com/sponsors/ljharb"
1885 | }
1886 | },
1887 | "node_modules/sift": {
1888 | "version": "17.1.3",
1889 | "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz",
1890 | "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==",
1891 | "license": "MIT"
1892 | },
1893 | "node_modules/signal-exit": {
1894 | "version": "3.0.7",
1895 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1896 | "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
1897 | "license": "ISC"
1898 | },
1899 | "node_modules/sparse-bitfield": {
1900 | "version": "3.0.3",
1901 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
1902 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
1903 | "license": "MIT",
1904 | "dependencies": {
1905 | "memory-pager": "^1.0.2"
1906 | }
1907 | },
1908 | "node_modules/statuses": {
1909 | "version": "2.0.1",
1910 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1911 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1912 | "license": "MIT",
1913 | "engines": {
1914 | "node": ">= 0.8"
1915 | }
1916 | },
1917 | "node_modules/string_decoder": {
1918 | "version": "1.3.0",
1919 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1920 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1921 | "license": "MIT",
1922 | "dependencies": {
1923 | "safe-buffer": "~5.2.0"
1924 | }
1925 | },
1926 | "node_modules/string-width": {
1927 | "version": "4.2.3",
1928 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1929 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1930 | "license": "MIT",
1931 | "dependencies": {
1932 | "emoji-regex": "^8.0.0",
1933 | "is-fullwidth-code-point": "^3.0.0",
1934 | "strip-ansi": "^6.0.1"
1935 | },
1936 | "engines": {
1937 | "node": ">=8"
1938 | }
1939 | },
1940 | "node_modules/strip-ansi": {
1941 | "version": "6.0.1",
1942 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1943 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1944 | "license": "MIT",
1945 | "dependencies": {
1946 | "ansi-regex": "^5.0.1"
1947 | },
1948 | "engines": {
1949 | "node": ">=8"
1950 | }
1951 | },
1952 | "node_modules/tar": {
1953 | "version": "6.2.1",
1954 | "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
1955 | "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
1956 | "license": "ISC",
1957 | "dependencies": {
1958 | "chownr": "^2.0.0",
1959 | "fs-minipass": "^2.0.0",
1960 | "minipass": "^5.0.0",
1961 | "minizlib": "^2.1.1",
1962 | "mkdirp": "^1.0.3",
1963 | "yallist": "^4.0.0"
1964 | },
1965 | "engines": {
1966 | "node": ">=10"
1967 | }
1968 | },
1969 | "node_modules/toidentifier": {
1970 | "version": "1.0.1",
1971 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1972 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1973 | "license": "MIT",
1974 | "engines": {
1975 | "node": ">=0.6"
1976 | }
1977 | },
1978 | "node_modules/tr46": {
1979 | "version": "5.1.1",
1980 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz",
1981 | "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==",
1982 | "license": "MIT",
1983 | "dependencies": {
1984 | "punycode": "^2.3.1"
1985 | },
1986 | "engines": {
1987 | "node": ">=18"
1988 | }
1989 | },
1990 | "node_modules/type-is": {
1991 | "version": "1.6.18",
1992 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1993 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1994 | "license": "MIT",
1995 | "dependencies": {
1996 | "media-typer": "0.3.0",
1997 | "mime-types": "~2.1.24"
1998 | },
1999 | "engines": {
2000 | "node": ">= 0.6"
2001 | }
2002 | },
2003 | "node_modules/typescript": {
2004 | "version": "5.8.2",
2005 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz",
2006 | "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==",
2007 | "dev": true,
2008 | "license": "Apache-2.0",
2009 | "bin": {
2010 | "tsc": "bin/tsc",
2011 | "tsserver": "bin/tsserver"
2012 | },
2013 | "engines": {
2014 | "node": ">=14.17"
2015 | }
2016 | },
2017 | "node_modules/undici-types": {
2018 | "version": "6.20.0",
2019 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
2020 | "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
2021 | "dev": true,
2022 | "license": "MIT"
2023 | },
2024 | "node_modules/unpipe": {
2025 | "version": "1.0.0",
2026 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2027 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
2028 | "license": "MIT",
2029 | "engines": {
2030 | "node": ">= 0.8"
2031 | }
2032 | },
2033 | "node_modules/util-deprecate": {
2034 | "version": "1.0.2",
2035 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2036 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2037 | "license": "MIT"
2038 | },
2039 | "node_modules/utils-merge": {
2040 | "version": "1.0.1",
2041 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2042 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
2043 | "license": "MIT",
2044 | "engines": {
2045 | "node": ">= 0.4.0"
2046 | }
2047 | },
2048 | "node_modules/vary": {
2049 | "version": "1.1.2",
2050 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2051 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
2052 | "license": "MIT",
2053 | "engines": {
2054 | "node": ">= 0.8"
2055 | }
2056 | },
2057 | "node_modules/webidl-conversions": {
2058 | "version": "7.0.0",
2059 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
2060 | "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
2061 | "license": "BSD-2-Clause",
2062 | "engines": {
2063 | "node": ">=12"
2064 | }
2065 | },
2066 | "node_modules/whatwg-url": {
2067 | "version": "14.2.0",
2068 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz",
2069 | "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==",
2070 | "license": "MIT",
2071 | "dependencies": {
2072 | "tr46": "^5.1.0",
2073 | "webidl-conversions": "^7.0.0"
2074 | },
2075 | "engines": {
2076 | "node": ">=18"
2077 | }
2078 | },
2079 | "node_modules/wide-align": {
2080 | "version": "1.1.5",
2081 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
2082 | "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
2083 | "license": "ISC",
2084 | "dependencies": {
2085 | "string-width": "^1.0.2 || 2 || 3 || 4"
2086 | }
2087 | },
2088 | "node_modules/wrappy": {
2089 | "version": "1.0.2",
2090 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2091 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
2092 | "license": "ISC"
2093 | },
2094 | "node_modules/yallist": {
2095 | "version": "4.0.0",
2096 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
2097 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
2098 | "license": "ISC"
2099 | }
2100 | }
2101 | }
2102 |
--------------------------------------------------------------------------------