├── lib ├── system │ ├── config.js │ ├── middleware.js │ └── validator.js ├── scraper │ └── tempo.js ├── cloudflare.js └── global.js ├── middlewares ├── error.js ├── restrict.js ├── rpm.js ├── authorization.js ├── only │ └── secret.js ├── requires.js ├── protector.js └── premium.js ├── vercel.json ├── pm2.cjs ├── pm2.config.cjs ├── .env ├── routers ├── endpoint │ ├── example-only.js │ └── example.js └── index.js ├── install.sh ├── package.json ├── .github ├── dependabot.yml └── workflows │ └── auto-merge.yml ├── index.js ├── README.md ├── .gitignore ├── public ├── 404.html └── index.html └── yarn.lock /lib/system/config.js: -------------------------------------------------------------------------------- 1 | export const allowedIPs = [] -------------------------------------------------------------------------------- /middlewares/error.js: -------------------------------------------------------------------------------- 1 | export default (req, res) => { 2 | res.json({ 3 | creator: global.creator, 4 | status: false, 5 | msg: 'Feature is currently unavailable' 6 | }) 7 | } -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": 2, 3 | "builds": [{ 4 | "src": "index.js", 5 | "use": "@vercel/node" 6 | }], 7 | "routes": [{ 8 | "src": "/.*", 9 | "dest": "/" 10 | }] 11 | } -------------------------------------------------------------------------------- /pm2.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps: [ 3 | { 4 | name: "open-api", 5 | script: "yarn", 6 | args: "start", 7 | interpreter: "none", 8 | env: { 9 | NODE_ENV: "production" 10 | } 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /pm2.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps: [ 3 | { 4 | name: "open-api", 5 | script: "yarn", 6 | args: "start", 7 | interpreter: "none", 8 | env: { 9 | NODE_ENV: "production" 10 | } 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | ### Configuration 2 | SITE_NAME = "Open's API" 3 | SITE_SECRET_KEY = '12345' 4 | SITE_API_KEY = 'demo' 5 | 6 | ### Timezone (Important) 7 | TZ = 'Asia/Jakarta' 8 | 9 | ### JWT Secret 10 | JWT_SECRET = 'neoxr' 11 | 12 | ### RPM (Request Per Minute) 13 | REQUEST_LIMIT = 30 14 | 15 | ### Cloudflare 16 | CF_API_TOKEN = '' 17 | CF_ZONE_ID = '' -------------------------------------------------------------------------------- /routers/endpoint/example-only.js: -------------------------------------------------------------------------------- 1 | import secret from '../../middlewares/only/secret.js' 2 | 3 | export const routes = { 4 | category: 'main', 5 | path: '/api/test', 6 | method: 'get', 7 | middleware: [secret], 8 | execution: async (req, res, next) => { 9 | res.send('Access Granted!') 10 | }, 11 | error: false, 12 | rpm: true 13 | } -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | sudo apt update && sudo apt upgrade -y 2 | sudo apt install ffmpeg git curl -y 3 | curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash 4 | export NVM_DIR="$HOME/.nvm" 5 | [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 6 | source ~/.bashrc 7 | nvm install 20 8 | nvm alias default 20 9 | nvm use default 10 | npm install -g pm2 yarn 11 | yarn 12 | -------------------------------------------------------------------------------- /middlewares/restrict.js: -------------------------------------------------------------------------------- 1 | import requestIp from 'request-ip' 2 | import { allowedIPs } from '../lib/system/config.js' 3 | 4 | export default (req, res, next) => { 5 | const userIP = requestIp.getClientIp(req) 6 | if (!allowedIPs.includes(userIP)) { 7 | return res.status(403).json({ 8 | creator: global.creator, 9 | status: false, 10 | msg: 'Your IP is not allowed' 11 | }) 12 | } 13 | next() 14 | } -------------------------------------------------------------------------------- /routers/endpoint/example.js: -------------------------------------------------------------------------------- 1 | import { Loader } from '@neoxr/webly' 2 | const Scraper = Loader.scrapers 3 | 4 | export const routes = { 5 | category: 'main', 6 | path: '/api/tempo', 7 | parameter: ['q'], 8 | method: 'get', 9 | execution: async (req, res, next) => { 10 | const { q } = req.query 11 | const json = await Scraper.tempo.search(q) 12 | res.json(json) 13 | }, 14 | error: false, 15 | rpm: true, 16 | premium: true 17 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "open-api", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "type": "module", 6 | "engines": { 7 | "node": ">= 18.x" 8 | }, 9 | "scripts": { 10 | "start": "node ." 11 | }, 12 | "license": "MIT", 13 | "author": { 14 | "name": "Wildan Izzudin", 15 | "email": "contact@neoxr.my.id", 16 | "url": "https://api.neoxr.eu/" 17 | }, 18 | "dependencies": { 19 | "@neoxr/webly": "^0.0.9" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | -------------------------------------------------------------------------------- /routers/index.js: -------------------------------------------------------------------------------- 1 | export const routes = { 2 | category: 'main', 3 | path: '/', 4 | method: 'get', 5 | execution: async (req, res, next) => { 6 | try { 7 | const json = await (await fetch('http://ip-api.com/json')).json() 8 | res.json({ 9 | creator: global.creator, 10 | status: true, 11 | data: json 12 | }) 13 | } catch (e) { 14 | res.json({ 15 | creator: global.creator, 16 | status: false, 17 | msg: e.message 18 | }) 19 | } 20 | }, 21 | error: false 22 | } -------------------------------------------------------------------------------- /middlewares/rpm.js: -------------------------------------------------------------------------------- 1 | import requestIp from 'request-ip' 2 | 3 | const ipRequests = new Map() 4 | 5 | export default (req, res, next) => { 6 | const userIP = requestIp.getClientIp(req) 7 | const currentTime = Date.now() 8 | 9 | if (!ipRequests.has(userIP)) ipRequests.set(userIP, []) 10 | 11 | const filtered = ipRequests.get(userIP).filter(t => currentTime - t < 60000) 12 | 13 | if (filtered.length >= process.env.REQUEST_LIMIT) { 14 | return res.status(429).json({ 15 | creator: global.creator, 16 | status: false, 17 | msg: 'Too many requests' 18 | }) 19 | } 20 | 21 | filtered.push(currentTime) 22 | ipRequests.set(userIP, filtered) 23 | next() 24 | } -------------------------------------------------------------------------------- /middlewares/authorization.js: -------------------------------------------------------------------------------- 1 | import jwt from 'jsonwebtoken' 2 | 3 | export default (req, res, next) => { 4 | const authHeader = req.headers['authorization'] 5 | const authToken = authHeader?.split(' ')[1]?.trim() 6 | 7 | if (!authToken || authToken !== req.session?.token) { 8 | return res.status(401).json({ 9 | creator: global.creator, 10 | status: false, 11 | msg: 'Unauthorized' 12 | }) 13 | } 14 | 15 | jwt.verify(authToken, process.env.JWT_SECRET, (err) => { 16 | if (err) { 17 | return res.status(403).json({ 18 | creator: global.creator, 19 | status: false, 20 | msg: 'Forbidden access' 21 | }) 22 | } 23 | next() 24 | }) 25 | } -------------------------------------------------------------------------------- /lib/system/middleware.js: -------------------------------------------------------------------------------- 1 | import restrict from '../../middlewares/restrict.js' 2 | import authorization from '../../middlewares/authorization.js' 3 | import rpm from '../../middlewares/rpm.js' 4 | import protector from '../../middlewares/protector.js' 5 | import premium from '../../middlewares/premium.js' 6 | import requires from '../../middlewares/requires.js' 7 | import error from '../../middlewares/error.js' 8 | 9 | const FLAG_TO_MIDDLEWARE = { 10 | restrict, 11 | authorize: authorization, 12 | protect: protector, 13 | rpm, 14 | error 15 | } 16 | 17 | export default route => { 18 | let middlewares = [] 19 | 20 | middlewares = Object.entries(FLAG_TO_MIDDLEWARE) 21 | .filter(([flagName]) => route[flagName]) 22 | .map(([, middlewareFn]) => middlewareFn) 23 | 24 | if (route.premium) { 25 | middlewares.push(premium(route)) 26 | } 27 | 28 | if (route.requires) { 29 | middlewares.push(route.requires) 30 | } else { 31 | middlewares.push(requires(route)) 32 | } 33 | 34 | if (route.validator) { 35 | middlewares.push(route.validator) 36 | } 37 | 38 | return middlewares 39 | } -------------------------------------------------------------------------------- /lib/system/validator.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Core helper function to perform validation on a data source. 3 | * @param {object} source - The source object (e.g., req.body, req.query). 4 | * @param {string[]} params - An array of required parameter keys. 5 | * @param {string} location - The name of the location for the error message (e.g., 'body', 'query string', 'route parameters'). 6 | * @returns {{status: boolean, msg?: string, creator?: string}} The validation result object. 7 | */ 8 | export default (source, params, location) => { 9 | if (!params || params.length === 0) { 10 | return { status: true } 11 | } 12 | 13 | const required = params.filter(key => !(key in source) || !source[key]) 14 | 15 | if (required.length > 0) { 16 | const missingParams = required.length > 1 17 | ? `"${required.slice(0, -1).join('", "')}" and "${required.slice(-1)}"` 18 | : `"${required[0]}"` 19 | 20 | return { 21 | creator: global.creator, 22 | status: false, 23 | msg: `Parameter ${missingParams} is required in the request ${location}.` 24 | } 25 | } 26 | 27 | return { status: true } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /lib/scraper/tempo.js: -------------------------------------------------------------------------------- 1 | class Tempo { 2 | async search(q) { 3 | try { 4 | const json = await (await fetch('https://u2ciazrcad-dsn.algolia.net/1/indexes/production_articles/query?x-algolia-agent=Algolia%20for%20JavaScript%20(4.24.0)%3B%20Browser', { 5 | method: 'POST', 6 | body: JSON.stringify({ 7 | query: q, 8 | filters: "NOT unpublished_at", 9 | hitsPerPage: 10, 10 | page: 0 11 | }), 12 | headers: { 13 | 'origin': 'https://www.tempo.co', 14 | 'referer': 'https://www.tempo.co/', 15 | 'x-algolia-api-key': 'a74cdcfcc2c69b5dabb4d13c4ce52788', 16 | 'x-algolia-application-id': 'U2CIAZRCAD' 17 | } 18 | })).json() 19 | if (json?.status === 403 || json?.hits?.length < 1) throw new Error(json.message) 20 | return { 21 | creator: global.creator, 22 | status: true, 23 | data: json.hits 24 | } 25 | } catch (e) { 26 | return { 27 | creator: global.creator, 28 | status: false, 29 | msg: e.message 30 | } 31 | } 32 | } 33 | } 34 | 35 | export default new Tempo -------------------------------------------------------------------------------- /middlewares/only/secret.js: -------------------------------------------------------------------------------- 1 | export default (req, res, next) => { 2 | const isGet = req.method?.toLowerCase() === 'get' 3 | const validatorFn = isGet ? global.validator.get : global.validator.post 4 | const source = isGet ? req.query : req.body 5 | 6 | const check = validatorFn(req, ['secret']) 7 | if (!check.status) { 8 | return res.status(400).json(check) 9 | } 10 | 11 | for (const paramName in source) { 12 | if (paramName === 'secret') continue 13 | 14 | const value = source[paramName] 15 | if (value) { 16 | let formatCheck = { status: true } 17 | 18 | if (paramName === 'url') { 19 | formatCheck = global.validator.url(value) 20 | } else if (paramName === 'number') { 21 | formatCheck = global.validator.number(value) 22 | } 23 | 24 | if (!formatCheck.status) { 25 | formatCheck.msg = `Parameter "${paramName}" has an invalid format. (${formatCheck.msg})` 26 | return res.status(400).json(formatCheck) 27 | } 28 | } 29 | } 30 | 31 | const secret = source.secret 32 | console.log(secret) 33 | if (secret !== process.env.SITE_SECRET_KEY) { 34 | return res.status(403).json({ 35 | creator: global.creator, 36 | status: false, 37 | msg: 'Invalid secret key' 38 | }) 39 | } 40 | 41 | next() 42 | } -------------------------------------------------------------------------------- /.github/workflows/auto-merge.yml: -------------------------------------------------------------------------------- 1 | name: Auto Approve and Merge 2 | 3 | on: 4 | pull_request: 5 | types: [opened, synchronize, reopened, ready_for_review] 6 | branches: 7 | - master 8 | 9 | jobs: 10 | auto-approve-and-merge: 11 | runs-on: ubuntu-latest 12 | 13 | if: > 14 | github.event.pull_request.user.login == 'neoxr' && 15 | github.event.pull_request.base.ref == 'master' 16 | 17 | steps: 18 | - name: Wait for CodeQL check to pass 19 | uses: lewagon/wait-on-check-action@v1.4.0 20 | with: 21 | ref: ${{ github.event.pull_request.head.sha }} 22 | check-regexp: "Analyze \\(javascript-typescript\\)(?: \\(dynamic\\))?" 23 | repo-token: ${{ secrets.GITHUB_TOKEN }} 24 | wait-interval: 30 25 | 26 | - name: Approve PR 27 | uses: hmarr/auto-approve-action@v3 28 | with: 29 | github-token: ${{ secrets.PERSONAL_TOKEN }} 30 | 31 | - name: Merge PR directly to master 32 | uses: devmasx/merge-branch@v1.4.0 33 | with: 34 | type: now 35 | from_branch: ${{ github.event.pull_request.head.ref }} 36 | target_branch: master 37 | merge_method: squash 38 | commit_message: "Auto-merge: ${{ github.event.pull_request.title }}" 39 | env: 40 | GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }} 41 | 42 | - name: Delete branch after merge 43 | run: | 44 | git push origin --delete ${{ github.event.pull_request.head.ref }} 45 | env: 46 | GITHUB_TOKEN: ${{ secrets.PERSONAL_TOKEN }} 47 | -------------------------------------------------------------------------------- /lib/cloudflare.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | export class CloudflareIPBlocker { 4 | constructor(apiToken, zoneId) { 5 | this.apiToken = apiToken 6 | this.zoneId = zoneId 7 | this.apiBase = `https://api.cloudflare.com/client/v4/zones/${zoneId}/firewall/access_rules/rules` 8 | } 9 | 10 | async blockIP(ip, note = 'Blocked due to spam') { 11 | try { 12 | const response = await axios.post(this.apiBase, { 13 | mode: 'block', 14 | configuration: { 15 | target: 'ip', 16 | value: ip 17 | }, 18 | notes: note 19 | }, { 20 | headers: { 21 | Authorization: `Bearer ${this.apiToken}`, 22 | 'Content-Type': 'application/json' 23 | } 24 | }) 25 | 26 | if (!response.data.success) { 27 | console.error('Failed to block IP:', response.data.errors) 28 | } else { 29 | console.log(`Blocked IP: ${ip}`) 30 | } 31 | 32 | return response.data 33 | } catch (error) { 34 | if (error.response) { 35 | console.error('API error:', error.response.data) 36 | } else { 37 | console.error('Request error:', error.message) 38 | } 39 | } 40 | } 41 | 42 | detectSpam(ip, requestMap, threshold) { 43 | const now = Date.now() 44 | if (!requestMap[ip]) requestMap[ip] = [] 45 | 46 | requestMap[ip].push(now) 47 | 48 | requestMap[ip] = requestMap[ip].filter(ts => now - ts < 60000) 49 | 50 | return requestMap[ip].length > (threshold || process.env.REQUEST_LIMIT) 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import Webly, { App, Loader } from '@neoxr/webly' 2 | import './lib/global.js' 3 | import middleware from './lib/system/middleware.js' 4 | import os from 'node:os' 5 | await Loader.scraper('./lib/scraper') 6 | 7 | const app = new App({ 8 | name: 'Open-API', 9 | staticPath: ['public'], 10 | routePath: './routers', 11 | middleware, 12 | socket: true, 13 | socketOpts: { 14 | transports: ['websocket', 'polling'], 15 | reconnection: true, 16 | reconnectionAttempts: 5, 17 | reconnectionDelay: 1000, 18 | pingInterval: 25000, 19 | pingTimeout: 5000 20 | }, 21 | port: 3000, 22 | error: (req, res) => { 23 | res.status(404).sendFile('./public/404.html', { root: process.cwd() }) 24 | } 25 | }) 26 | 27 | app.socket?.on('connection', (socket) => { 28 | console.log(`Client connected: ${socket.id}`); 29 | 30 | const systemMonitorInterval = setInterval(() => { 31 | const totalMemory = os.totalmem() 32 | const freeMemory = os.freemem() 33 | const usedMemory = totalMemory - freeMemory 34 | const usagePercentage = (usedMemory / totalMemory) * 100 35 | 36 | const formattedData = { 37 | total: `${(totalMemory / 1024 / 1024).toFixed(2)} MB`, 38 | free: `${(freeMemory / 1024 / 1024).toFixed(2)} MB`, 39 | used: `${(usedMemory / 1024 / 1024).toFixed(2)} MB`, 40 | usagePercentage: usagePercentage.toFixed(2) 41 | } 42 | 43 | socket.emit('system_update', formattedData) 44 | 45 | }, 2000) 46 | 47 | socket.on('disconnect', () => { 48 | console.log(`Client disconnected: ${socket.id}`) 49 | clearInterval(systemMonitorInterval) 50 | }) 51 | }) 52 | 53 | app.start() -------------------------------------------------------------------------------- /middlewares/requires.js: -------------------------------------------------------------------------------- 1 | export default (route) => { 2 | return (req, res, next) => { 3 | if (route.parameter && route.parameter.length > 0) { 4 | let check 5 | 6 | switch (route.method.toLowerCase()) { 7 | case 'get': 8 | check = global.validator.get(req, route.parameter) 9 | break 10 | case 'post': 11 | case 'put': 12 | case 'patch': 13 | check = global.validator.post(req, route.parameter) 14 | break 15 | case 'delete': 16 | check = global.validator.delete(req, route.parameter) 17 | break 18 | default: 19 | check = { status: true } 20 | } 21 | 22 | if (!check.status) { 23 | return res.status(400).json(check) 24 | } 25 | } 26 | 27 | const source = route.method === 'get' ? req.query : req.body 28 | 29 | if (route.parameter && route.parameter.length > 0) { 30 | for (const paramName of route.parameter) { 31 | const value = source[paramName] 32 | 33 | if (value) { 34 | let formatCheck = { status: true } 35 | 36 | if (paramName === 'url') { 37 | formatCheck = global.validator.url(value) 38 | } else if (paramName === 'number') { 39 | formatCheck = global.validator.number(value) 40 | } 41 | 42 | if (!formatCheck.status) { 43 | formatCheck.msg = `Parameter "${paramName}" has an invalid format. (${formatCheck.msg})` 44 | return res.status(400).json(formatCheck) 45 | } 46 | } 47 | } 48 | } 49 | 50 | next() 51 | } 52 | } -------------------------------------------------------------------------------- /middlewares/protector.js: -------------------------------------------------------------------------------- 1 | import { allowedIPs } from '../lib/system/config.js' 2 | import requestIp from 'request-ip' 3 | import { CloudflareIPBlocker } from '../lib/cloudflare.js' 4 | const blockedIps = new Map() 5 | 6 | const blocker = new CloudflareIPBlocker(process.env.CF_API_TOKEN, process.env.CF_ZONE_ID) 7 | const requestMap = {} 8 | 9 | export default async (req, res, next) => { 10 | try { 11 | const userIP = requestIp.getClientIp(req)?.trim() 12 | 13 | if (!userIP) { 14 | console.warn('Could not determine client IP') 15 | return res.status(400).json({ 16 | creator: global.creator, 17 | status: false, 18 | msg: 'Unable to determine client IP' 19 | }) 20 | } 21 | 22 | if (blockedIps.has(userIP)) { 23 | return res.status(403).json({ 24 | creator: global.creator, 25 | status: false, 26 | msg: 'IP is blocked' 27 | }) 28 | } 29 | 30 | if (allowedIPs.includes(userIP)) { 31 | return next() 32 | } 33 | 34 | if (blocker.detectSpam(userIP, requestMap)) { 35 | console.log(`Spam detected from IP: ${userIP}`) 36 | blockedIps.set(userIP, true) 37 | await blocker.blockIP(userIP, 'Automatically blocked due to suspicious activity') 38 | 39 | return res.status(403).json({ 40 | creator: global.creator, 41 | status: false, 42 | msg: 'Automatically blocked due to suspicious activity' 43 | }) 44 | } 45 | 46 | return next() 47 | } catch (e) { 48 | console.error('Error occurred:', e) 49 | res.status(500).json({ 50 | creator: global.creator, 51 | status: false, 52 | msg: 'Internal Server Error' 53 | }) 54 | } 55 | } -------------------------------------------------------------------------------- /middlewares/premium.js: -------------------------------------------------------------------------------- 1 | export default (route) => { 2 | return (req, res, next) => { 3 | const allParams = [...(route.parameter || []), 'apikey'] 4 | let check 5 | 6 | switch (route.method.toLowerCase()) { 7 | case 'get': 8 | check = global.validator.get(req, allParams) 9 | break 10 | case 'post': 11 | case 'put': 12 | case 'patch': 13 | check = global.validator.post(req, allParams) 14 | break 15 | case 'delete': 16 | check = global.validator.delete(req, allParams) 17 | break 18 | default: 19 | check = { status: true } 20 | } 21 | 22 | if (!check.status) { 23 | return res.status(400).json(check) 24 | } 25 | 26 | const source = route.method === 'get' ? req.query : req.body 27 | 28 | if (route.parameter && route.parameter.length > 0) { 29 | for (const paramName of route.parameter) { 30 | const value = source[paramName] 31 | 32 | if (value) { 33 | let formatCheck = { status: true } 34 | 35 | if (paramName === 'url') { 36 | formatCheck = global.validator.url(value) 37 | } else if (paramName === 'number') { 38 | formatCheck = global.validator.number(value) 39 | } 40 | 41 | if (!formatCheck.status) { 42 | formatCheck.msg = `Parameter "${paramName}" has an invalid format. (${formatCheck.msg})` 43 | return res.status(400).json(formatCheck) 44 | } 45 | } 46 | } 47 | } 48 | 49 | const apikey = req.query.apikey || req.body.apikey 50 | 51 | if (apikey !== process.env.SITE_API_KEY) { 52 | return res.status(403).json({ 53 | creator: global.creator, 54 | status: false, 55 | msg: 'Invalid apikey' 56 | }) 57 | } 58 | 59 | next() 60 | } 61 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## OPEN-API 2 | 3 | > JavaScript (ESM) base website script using a plugin as a router that is lightweight and easy to customize. 4 | 5 |

Open-API

6 | 7 | ### Features 8 | 9 | - [x] Plugin as Router 10 | - [x] Auto List Feature 11 | - [x] High Optimation 12 | - [x] Easy to Customize 13 | - [x] Show User IP 14 | - [x] Restrict Access (IP Whitelist) 15 | - [x] Request Per Minute Limit 16 | - [x] Suitable for Rest API 17 | - [x] etc. 18 | 19 | ### Router 20 | 21 | > This is an example of a router 22 | 23 | ```Javascript 24 | import { Loader } from '../lib/index.js' 25 | const Scraper = Loader.scrapers 26 | 27 | export const routes = { 28 | category: 'main', 29 | path: '/api/tempo', 30 | parameter: ['q'], 31 | method: 'get', 32 | execution: async (req, res, next) => { 33 | const { q } = req.query 34 | const json = await Scraper.tempo.search(q) 35 | res.json(json) 36 | }, 37 | error: false, 38 | authorize: false, 39 | rpm: false, 40 | protect: true, 41 | premium: false, 42 | restrict: false 43 | } 44 | ``` 45 | 46 | ### Middleware 47 | 48 | > There are two types of middleware: **global middleware**, which is applied based on route attributes, and **'only' middleware**, which is applied directly in the router or plugin. 49 | 50 | #### 1. Global Middleware 51 | 52 | ```Javascript 53 | export const routes = { 54 | error: Boolean, 55 | authorize: Boolean, 56 | rpm: Boolean, 57 | protect: Boolean, 58 | premium: Boolean, 59 | restrict: Boolean 60 | } 61 | ``` 62 | 63 | #### 2. Only/Single Middleware 64 | 65 | ```Javascript 66 | import some from './middlewares/only/some.js' 67 | 68 | export const routes = { 69 | middleware: [some] 70 | } 71 | ``` 72 | 73 | ### Installation & Run 74 | 75 | ``` 76 | $ yarn 77 | $ node . 78 | ``` 79 | 80 | or want to use pm2 81 | 82 | ``` 83 | $ yarn 84 | $ npm i -g pm2 85 | $ pm2 start pm2.cjs && pm2 logs 86 | ``` 87 | 88 | ### Example 89 | 90 | > /api/tempo?q={query} 91 | 92 | ### Conclusion 93 | 94 | > Open-API is part of [Neoxr API](https://api.neoxr.my.id) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # yarn v2 126 | .yarn/cache 127 | .yarn/unplugged 128 | .yarn/build-state.yml 129 | .yarn/install-state.gz 130 | .pnp.* 131 | -------------------------------------------------------------------------------- /lib/global.js: -------------------------------------------------------------------------------- 1 | import 'dotenv/config' 2 | import _validate from './system/validator.js' 3 | 4 | global.creator = `@neoxr.js – Wildan Izzudin` 5 | 6 | global.validator = { 7 | get: (req, params) => { 8 | return _validate(req.query, params, 'query string') 9 | }, 10 | post: (req, params) => { 11 | return _validate(req.body, params, 'body') 12 | }, 13 | params: (req, params) => { 14 | return _validate(req.params, params, 'route parameters') 15 | }, 16 | delete: (req, params) => { 17 | let validationResult = _validate(req.params, params, 'route parameters') 18 | if (params.every(p => p in req.params)) return validationResult 19 | 20 | validationResult = _validate(req.query, params, 'query string') 21 | if (params.every(p => p in req.query)) return validationResult 22 | 23 | return _validate(req.body, params, 'body') 24 | }, 25 | all: (req, rules) => { 26 | const locations = ['body', 'query', 'params'] 27 | const errors = [] 28 | 29 | for (const location of locations) { 30 | if (rules[location] && rules[location].length > 0) { 31 | const result = _validate( 32 | req[location], 33 | rules[location], 34 | location === 'query' ? 'query string' : (location === 'params' ? 'route parameters' : 'body') 35 | ) 36 | 37 | if (!result.status) { 38 | errors.push(result.msg) 39 | } 40 | } 41 | } 42 | 43 | if (errors.length > 0) { 44 | return { 45 | creator: global.creator, 46 | status: false, 47 | msg: errors.join(' ') 48 | } 49 | } 50 | 51 | return { status: true } 52 | }, 53 | url: (input) => { 54 | if (!input) { 55 | return { 56 | creator: global.creator, 57 | status: false, 58 | msg: 'Input value cannot be empty.' 59 | } 60 | } 61 | try { 62 | new URL(input) 63 | return { status: true } 64 | } catch (error) { 65 | return { 66 | creator: global.creator, 67 | status: false, 68 | msg: `The value "${input}" is not a valid URL.` 69 | } 70 | } 71 | }, 72 | number: (input) => { 73 | if (input === null || input === undefined || String(input).trim() === '') { 74 | return { 75 | creator: global.creator, 76 | status: false, 77 | msg: 'Input value cannot be empty and must be a number.' 78 | } 79 | } 80 | if (!isFinite(input)) { 81 | return { 82 | creator: global.creator, 83 | status: false, 84 | msg: `The value "${input}" must be a valid number.` 85 | } 86 | } 87 | return { status: true } 88 | } 89 | } -------------------------------------------------------------------------------- /public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 404 - Not Found 7 | 8 | 9 | 10 | 11 | 12 | 85 | 86 | 87 |
88 |

404

89 |

PAGE NOT FOUND

90 |

91 | We're sorry, the page you requested could not be found. Please check the URL or navigate back to the homepage. 92 |

93 | GO TO HOMEPAGE 94 |
95 | 96 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Responsive System Memory 8 | 9 | 10 | 11 | 12 | 13 | 122 | 123 | 124 | 125 | 126 |
127 |

System Memory Monitor

128 | 129 |
130 |
0%
131 |
132 | 133 |
134 | Total Memory: 135 | ... 136 |
137 |
138 | Used Memory: 139 | ... 140 |
141 |
142 | Free Memory: 143 | ... 144 |
145 | 146 |

Connecting...

147 |
148 | 149 | 150 | 182 | 183 | 184 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@neoxr/webly@^0.0.7": 6 | version "0.0.7" 7 | resolved "https://registry.yarnpkg.com/@neoxr/webly/-/webly-0.0.7.tgz#39fce4133ecfb1b5dc551a918ca546ed9d8c805b" 8 | integrity sha512-Xvx4m1bT4FbudOQQ8pRceSQ68CBVFkcIqUPlHNfqLEnnCnLf+qnGwEju+0NoXSx27LWqfDX3WR69FvGJ4bv2Jw== 9 | dependencies: 10 | axios "^1.12.2" 11 | body-parser "^2.2.0" 12 | cfonts "3.3.0" 13 | chalk "4.1.0" 14 | cookie-parser "~1.4.4" 15 | cookie-session "^2.0.0" 16 | cors "^2.8.5" 17 | date-fns "^4.1.0" 18 | dotenv "^17.2.3" 19 | express "~4.16.4" 20 | jsonwebtoken "^9.0.2" 21 | morgan "^1.10.0" 22 | path "^0.12.7" 23 | request-ip "^3.3.0" 24 | socket.io "^4.8.1" 25 | 26 | "@socket.io/component-emitter@~3.1.0": 27 | version "3.1.2" 28 | resolved "https://registry.yarnpkg.com/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz#821f8442f4175d8f0467b9daf26e3a18e2d02af2" 29 | integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== 30 | 31 | "@types/cors@^2.8.12": 32 | version "2.8.19" 33 | resolved "https://registry.yarnpkg.com/@types/cors/-/cors-2.8.19.tgz#d93ea2673fd8c9f697367f5eeefc2bbfa94f0342" 34 | integrity sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg== 35 | dependencies: 36 | "@types/node" "*" 37 | 38 | "@types/node@*", "@types/node@>=10.0.0": 39 | version "24.9.1" 40 | resolved "https://registry.yarnpkg.com/@types/node/-/node-24.9.1.tgz#b7360b3c789089e57e192695a855aa4f6981a53c" 41 | integrity sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg== 42 | dependencies: 43 | undici-types "~7.16.0" 44 | 45 | accepts@~1.3.4, accepts@~1.3.5: 46 | version "1.3.8" 47 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 48 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 49 | dependencies: 50 | mime-types "~2.1.34" 51 | negotiator "0.6.3" 52 | 53 | ansi-styles@^4.1.0: 54 | version "4.3.0" 55 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 56 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 57 | dependencies: 58 | color-convert "^2.0.1" 59 | 60 | array-flatten@1.1.1: 61 | version "1.1.1" 62 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 63 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 64 | 65 | asynckit@^0.4.0: 66 | version "0.4.0" 67 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 68 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 69 | 70 | axios@^1.12.2: 71 | version "1.12.2" 72 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.12.2.tgz#6c307390136cf7a2278d09cec63b136dfc6e6da7" 73 | integrity sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw== 74 | dependencies: 75 | follow-redirects "^1.15.6" 76 | form-data "^4.0.4" 77 | proxy-from-env "^1.1.0" 78 | 79 | base64id@2.0.0, base64id@~2.0.0: 80 | version "2.0.0" 81 | resolved "https://registry.yarnpkg.com/base64id/-/base64id-2.0.0.tgz#2770ac6bc47d312af97a8bf9a634342e0cd25cb6" 82 | integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== 83 | 84 | basic-auth@~2.0.1: 85 | version "2.0.1" 86 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" 87 | integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== 88 | dependencies: 89 | safe-buffer "5.1.2" 90 | 91 | body-parser@1.18.3: 92 | version "1.18.3" 93 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" 94 | integrity sha512-YQyoqQG3sO8iCmf8+hyVpgHHOv0/hCEFiS4zTGUwTA1HjAFX66wRcNQrVCeJq9pgESMRvUAOvSil5MJlmccuKQ== 95 | dependencies: 96 | bytes "3.0.0" 97 | content-type "~1.0.4" 98 | debug "2.6.9" 99 | depd "~1.1.2" 100 | http-errors "~1.6.3" 101 | iconv-lite "0.4.23" 102 | on-finished "~2.3.0" 103 | qs "6.5.2" 104 | raw-body "2.3.3" 105 | type-is "~1.6.16" 106 | 107 | body-parser@^2.2.0: 108 | version "2.2.0" 109 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-2.2.0.tgz#f7a9656de305249a715b549b7b8fd1ab9dfddcfa" 110 | integrity sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg== 111 | dependencies: 112 | bytes "^3.1.2" 113 | content-type "^1.0.5" 114 | debug "^4.4.0" 115 | http-errors "^2.0.0" 116 | iconv-lite "^0.6.3" 117 | on-finished "^2.4.1" 118 | qs "^6.14.0" 119 | raw-body "^3.0.0" 120 | type-is "^2.0.0" 121 | 122 | buffer-equal-constant-time@^1.0.1: 123 | version "1.0.1" 124 | resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" 125 | integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== 126 | 127 | bytes@3.0.0: 128 | version "3.0.0" 129 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 130 | integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== 131 | 132 | bytes@3.1.2, bytes@^3.1.2: 133 | version "3.1.2" 134 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 135 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 136 | 137 | call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: 138 | version "1.0.2" 139 | resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6" 140 | integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== 141 | dependencies: 142 | es-errors "^1.3.0" 143 | function-bind "^1.1.2" 144 | 145 | call-bound@^1.0.2: 146 | version "1.0.4" 147 | resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a" 148 | integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== 149 | dependencies: 150 | call-bind-apply-helpers "^1.0.2" 151 | get-intrinsic "^1.3.0" 152 | 153 | cfonts@3.3.0: 154 | version "3.3.0" 155 | resolved "https://registry.yarnpkg.com/cfonts/-/cfonts-3.3.0.tgz#53e80fa239c2dc8fb11b9c7c00ede2c8ceedb34c" 156 | integrity sha512-RlVxeEw2FXWI5Bs9LD0/Ef3bsQIc9m6lK/DINN20HIW0Y0YHUO2jjy88cot9YKZITiRTCdWzTfLmTyx47HeSLA== 157 | dependencies: 158 | supports-color "^8" 159 | window-size "^1" 160 | 161 | chalk@4.1.0: 162 | version "4.1.0" 163 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 164 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 165 | dependencies: 166 | ansi-styles "^4.1.0" 167 | supports-color "^7.1.0" 168 | 169 | color-convert@^2.0.1: 170 | version "2.0.1" 171 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 172 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 173 | dependencies: 174 | color-name "~1.1.4" 175 | 176 | color-name@~1.1.4: 177 | version "1.1.4" 178 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 179 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 180 | 181 | combined-stream@^1.0.8: 182 | version "1.0.8" 183 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 184 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 185 | dependencies: 186 | delayed-stream "~1.0.0" 187 | 188 | content-disposition@0.5.2: 189 | version "0.5.2" 190 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 191 | integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== 192 | 193 | content-type@^1.0.5, content-type@~1.0.4: 194 | version "1.0.5" 195 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 196 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 197 | 198 | cookie-parser@~1.4.4: 199 | version "1.4.7" 200 | resolved "https://registry.yarnpkg.com/cookie-parser/-/cookie-parser-1.4.7.tgz#e2125635dfd766888ffe90d60c286404fa0e7b26" 201 | integrity sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw== 202 | dependencies: 203 | cookie "0.7.2" 204 | cookie-signature "1.0.6" 205 | 206 | cookie-session@^2.0.0: 207 | version "2.1.1" 208 | resolved "https://registry.yarnpkg.com/cookie-session/-/cookie-session-2.1.1.tgz#3e0bdd4a8386467a1d7cca5249690a0ebfb27842" 209 | integrity sha512-ji3kym/XZaFVew1+tIZk5ZLp9Z/fLv9rK1aZmpug0FsgE7Cu3ZDrUdRo7FT9vFjMYfNimrrUHJzywDwT7XEFlg== 210 | dependencies: 211 | cookies "0.9.1" 212 | debug "3.2.7" 213 | on-headers "~1.1.0" 214 | safe-buffer "5.2.1" 215 | 216 | cookie-signature@1.0.6: 217 | version "1.0.6" 218 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 219 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 220 | 221 | cookie@0.3.1: 222 | version "0.3.1" 223 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 224 | integrity sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw== 225 | 226 | cookie@0.7.2, cookie@~0.7.2: 227 | version "0.7.2" 228 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7" 229 | integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== 230 | 231 | cookies@0.9.1: 232 | version "0.9.1" 233 | resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.9.1.tgz#3ffed6f60bb4fb5f146feeedba50acc418af67e3" 234 | integrity sha512-TG2hpqe4ELx54QER/S3HQ9SRVnQnGBtKUz5bLQWtYAQ+o6GpgMs6sYUvaiJjVxb+UXwhRhAEP3m7LbsIZ77Hmw== 235 | dependencies: 236 | depd "~2.0.0" 237 | keygrip "~1.1.0" 238 | 239 | cors@^2.8.5, cors@~2.8.5: 240 | version "2.8.5" 241 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" 242 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 243 | dependencies: 244 | object-assign "^4" 245 | vary "^1" 246 | 247 | date-fns@^4.1.0: 248 | version "4.1.0" 249 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14" 250 | integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== 251 | 252 | debug@2.6.9: 253 | version "2.6.9" 254 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 255 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 256 | dependencies: 257 | ms "2.0.0" 258 | 259 | debug@3.2.7: 260 | version "3.2.7" 261 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" 262 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 263 | dependencies: 264 | ms "^2.1.1" 265 | 266 | debug@^4.4.0: 267 | version "4.4.3" 268 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" 269 | integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== 270 | dependencies: 271 | ms "^2.1.3" 272 | 273 | debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: 274 | version "4.3.7" 275 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" 276 | integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== 277 | dependencies: 278 | ms "^2.1.3" 279 | 280 | define-property@^1.0.0: 281 | version "1.0.0" 282 | resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" 283 | integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== 284 | dependencies: 285 | is-descriptor "^1.0.0" 286 | 287 | delayed-stream@~1.0.0: 288 | version "1.0.0" 289 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 290 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 291 | 292 | depd@2.0.0, depd@~2.0.0: 293 | version "2.0.0" 294 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 295 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 296 | 297 | depd@~1.1.2: 298 | version "1.1.2" 299 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 300 | integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== 301 | 302 | destroy@~1.0.4: 303 | version "1.0.4" 304 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 305 | integrity sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg== 306 | 307 | dotenv@^17.2.3: 308 | version "17.2.3" 309 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-17.2.3.tgz#ad995d6997f639b11065f419a22fabf567cdb9a2" 310 | integrity sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w== 311 | 312 | dunder-proto@^1.0.1: 313 | version "1.0.1" 314 | resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" 315 | integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== 316 | dependencies: 317 | call-bind-apply-helpers "^1.0.1" 318 | es-errors "^1.3.0" 319 | gopd "^1.2.0" 320 | 321 | ecdsa-sig-formatter@1.0.11: 322 | version "1.0.11" 323 | resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" 324 | integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== 325 | dependencies: 326 | safe-buffer "^5.0.1" 327 | 328 | ee-first@1.1.1: 329 | version "1.1.1" 330 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 331 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 332 | 333 | encodeurl@~1.0.2: 334 | version "1.0.2" 335 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 336 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 337 | 338 | engine.io-parser@~5.2.1: 339 | version "5.2.3" 340 | resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-5.2.3.tgz#00dc5b97b1f233a23c9398d0209504cf5f94d92f" 341 | integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== 342 | 343 | engine.io@~6.6.0: 344 | version "6.6.4" 345 | resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-6.6.4.tgz#0a89a3e6b6c1d4b0c2a2a637495e7c149ec8d8ee" 346 | integrity sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g== 347 | dependencies: 348 | "@types/cors" "^2.8.12" 349 | "@types/node" ">=10.0.0" 350 | accepts "~1.3.4" 351 | base64id "2.0.0" 352 | cookie "~0.7.2" 353 | cors "~2.8.5" 354 | debug "~4.3.1" 355 | engine.io-parser "~5.2.1" 356 | ws "~8.17.1" 357 | 358 | es-define-property@^1.0.1: 359 | version "1.0.1" 360 | resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" 361 | integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== 362 | 363 | es-errors@^1.3.0: 364 | version "1.3.0" 365 | resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" 366 | integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== 367 | 368 | es-object-atoms@^1.0.0, es-object-atoms@^1.1.1: 369 | version "1.1.1" 370 | resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz#1c4f2c4837327597ce69d2ca190a7fdd172338c1" 371 | integrity sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== 372 | dependencies: 373 | es-errors "^1.3.0" 374 | 375 | es-set-tostringtag@^2.1.0: 376 | version "2.1.0" 377 | resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d" 378 | integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== 379 | dependencies: 380 | es-errors "^1.3.0" 381 | get-intrinsic "^1.2.6" 382 | has-tostringtag "^1.0.2" 383 | hasown "^2.0.2" 384 | 385 | escape-html@~1.0.3: 386 | version "1.0.3" 387 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 388 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 389 | 390 | etag@~1.8.1: 391 | version "1.8.1" 392 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 393 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 394 | 395 | express@~4.16.4: 396 | version "4.16.4" 397 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" 398 | integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== 399 | dependencies: 400 | accepts "~1.3.5" 401 | array-flatten "1.1.1" 402 | body-parser "1.18.3" 403 | content-disposition "0.5.2" 404 | content-type "~1.0.4" 405 | cookie "0.3.1" 406 | cookie-signature "1.0.6" 407 | debug "2.6.9" 408 | depd "~1.1.2" 409 | encodeurl "~1.0.2" 410 | escape-html "~1.0.3" 411 | etag "~1.8.1" 412 | finalhandler "1.1.1" 413 | fresh "0.5.2" 414 | merge-descriptors "1.0.1" 415 | methods "~1.1.2" 416 | on-finished "~2.3.0" 417 | parseurl "~1.3.2" 418 | path-to-regexp "0.1.7" 419 | proxy-addr "~2.0.4" 420 | qs "6.5.2" 421 | range-parser "~1.2.0" 422 | safe-buffer "5.1.2" 423 | send "0.16.2" 424 | serve-static "1.13.2" 425 | setprototypeof "1.1.0" 426 | statuses "~1.4.0" 427 | type-is "~1.6.16" 428 | utils-merge "1.0.1" 429 | vary "~1.1.2" 430 | 431 | finalhandler@1.1.1: 432 | version "1.1.1" 433 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 434 | integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== 435 | dependencies: 436 | debug "2.6.9" 437 | encodeurl "~1.0.2" 438 | escape-html "~1.0.3" 439 | on-finished "~2.3.0" 440 | parseurl "~1.3.2" 441 | statuses "~1.4.0" 442 | unpipe "~1.0.0" 443 | 444 | follow-redirects@^1.15.6: 445 | version "1.15.11" 446 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.11.tgz#777d73d72a92f8ec4d2e410eb47352a56b8e8340" 447 | integrity sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ== 448 | 449 | form-data@^4.0.4: 450 | version "4.0.4" 451 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.4.tgz#784cdcce0669a9d68e94d11ac4eea98088edd2c4" 452 | integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== 453 | dependencies: 454 | asynckit "^0.4.0" 455 | combined-stream "^1.0.8" 456 | es-set-tostringtag "^2.1.0" 457 | hasown "^2.0.2" 458 | mime-types "^2.1.12" 459 | 460 | forwarded@0.2.0: 461 | version "0.2.0" 462 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 463 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 464 | 465 | fresh@0.5.2: 466 | version "0.5.2" 467 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 468 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 469 | 470 | function-bind@^1.1.2: 471 | version "1.1.2" 472 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 473 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 474 | 475 | get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.3.0: 476 | version "1.3.0" 477 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01" 478 | integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== 479 | dependencies: 480 | call-bind-apply-helpers "^1.0.2" 481 | es-define-property "^1.0.1" 482 | es-errors "^1.3.0" 483 | es-object-atoms "^1.1.1" 484 | function-bind "^1.1.2" 485 | get-proto "^1.0.1" 486 | gopd "^1.2.0" 487 | has-symbols "^1.1.0" 488 | hasown "^2.0.2" 489 | math-intrinsics "^1.1.0" 490 | 491 | get-proto@^1.0.1: 492 | version "1.0.1" 493 | resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" 494 | integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== 495 | dependencies: 496 | dunder-proto "^1.0.1" 497 | es-object-atoms "^1.0.0" 498 | 499 | gopd@^1.2.0: 500 | version "1.2.0" 501 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" 502 | integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== 503 | 504 | has-flag@^4.0.0: 505 | version "4.0.0" 506 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 507 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 508 | 509 | has-symbols@^1.0.3, has-symbols@^1.1.0: 510 | version "1.1.0" 511 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" 512 | integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== 513 | 514 | has-tostringtag@^1.0.2: 515 | version "1.0.2" 516 | resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" 517 | integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== 518 | dependencies: 519 | has-symbols "^1.0.3" 520 | 521 | hasown@^2.0.0, hasown@^2.0.2: 522 | version "2.0.2" 523 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 524 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 525 | dependencies: 526 | function-bind "^1.1.2" 527 | 528 | http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: 529 | version "1.6.3" 530 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 531 | integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== 532 | dependencies: 533 | depd "~1.1.2" 534 | inherits "2.0.3" 535 | setprototypeof "1.1.0" 536 | statuses ">= 1.4.0 < 2" 537 | 538 | http-errors@2.0.0, http-errors@^2.0.0: 539 | version "2.0.0" 540 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 541 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 542 | dependencies: 543 | depd "2.0.0" 544 | inherits "2.0.4" 545 | setprototypeof "1.2.0" 546 | statuses "2.0.1" 547 | toidentifier "1.0.1" 548 | 549 | iconv-lite@0.4.23: 550 | version "0.4.23" 551 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 552 | integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== 553 | dependencies: 554 | safer-buffer ">= 2.1.2 < 3" 555 | 556 | iconv-lite@0.7.0: 557 | version "0.7.0" 558 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.0.tgz#c50cd80e6746ca8115eb98743afa81aa0e147a3e" 559 | integrity sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ== 560 | dependencies: 561 | safer-buffer ">= 2.1.2 < 3.0.0" 562 | 563 | iconv-lite@^0.6.3: 564 | version "0.6.3" 565 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" 566 | integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== 567 | dependencies: 568 | safer-buffer ">= 2.1.2 < 3.0.0" 569 | 570 | inherits@2.0.3: 571 | version "2.0.3" 572 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 573 | integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== 574 | 575 | inherits@2.0.4: 576 | version "2.0.4" 577 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 578 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 579 | 580 | ipaddr.js@1.9.1: 581 | version "1.9.1" 582 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 583 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 584 | 585 | is-accessor-descriptor@^1.0.1: 586 | version "1.0.1" 587 | resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" 588 | integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== 589 | dependencies: 590 | hasown "^2.0.0" 591 | 592 | is-buffer@^1.1.5: 593 | version "1.1.6" 594 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 595 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 596 | 597 | is-data-descriptor@^1.0.1: 598 | version "1.0.1" 599 | resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" 600 | integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== 601 | dependencies: 602 | hasown "^2.0.0" 603 | 604 | is-descriptor@^1.0.0: 605 | version "1.0.3" 606 | resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" 607 | integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== 608 | dependencies: 609 | is-accessor-descriptor "^1.0.1" 610 | is-data-descriptor "^1.0.1" 611 | 612 | is-number@^3.0.0: 613 | version "3.0.0" 614 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 615 | integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== 616 | dependencies: 617 | kind-of "^3.0.2" 618 | 619 | jsonwebtoken@^9.0.2: 620 | version "9.0.2" 621 | resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz#65ff91f4abef1784697d40952bb1998c504caaf3" 622 | integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== 623 | dependencies: 624 | jws "^3.2.2" 625 | lodash.includes "^4.3.0" 626 | lodash.isboolean "^3.0.3" 627 | lodash.isinteger "^4.0.4" 628 | lodash.isnumber "^3.0.3" 629 | lodash.isplainobject "^4.0.6" 630 | lodash.isstring "^4.0.1" 631 | lodash.once "^4.0.0" 632 | ms "^2.1.1" 633 | semver "^7.5.4" 634 | 635 | jwa@^1.4.1: 636 | version "1.4.2" 637 | resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.2.tgz#16011ac6db48de7b102777e57897901520eec7b9" 638 | integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== 639 | dependencies: 640 | buffer-equal-constant-time "^1.0.1" 641 | ecdsa-sig-formatter "1.0.11" 642 | safe-buffer "^5.0.1" 643 | 644 | jws@^3.2.2: 645 | version "3.2.2" 646 | resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" 647 | integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== 648 | dependencies: 649 | jwa "^1.4.1" 650 | safe-buffer "^5.0.1" 651 | 652 | keygrip@~1.1.0: 653 | version "1.1.0" 654 | resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226" 655 | integrity sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ== 656 | dependencies: 657 | tsscmp "1.0.6" 658 | 659 | kind-of@^3.0.2: 660 | version "3.2.2" 661 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 662 | integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== 663 | dependencies: 664 | is-buffer "^1.1.5" 665 | 666 | lodash.includes@^4.3.0: 667 | version "4.3.0" 668 | resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" 669 | integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== 670 | 671 | lodash.isboolean@^3.0.3: 672 | version "3.0.3" 673 | resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" 674 | integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== 675 | 676 | lodash.isinteger@^4.0.4: 677 | version "4.0.4" 678 | resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" 679 | integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== 680 | 681 | lodash.isnumber@^3.0.3: 682 | version "3.0.3" 683 | resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" 684 | integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== 685 | 686 | lodash.isplainobject@^4.0.6: 687 | version "4.0.6" 688 | resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" 689 | integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== 690 | 691 | lodash.isstring@^4.0.1: 692 | version "4.0.1" 693 | resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" 694 | integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== 695 | 696 | lodash.once@^4.0.0: 697 | version "4.1.1" 698 | resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" 699 | integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== 700 | 701 | math-intrinsics@^1.1.0: 702 | version "1.1.0" 703 | resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" 704 | integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== 705 | 706 | media-typer@0.3.0: 707 | version "0.3.0" 708 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 709 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 710 | 711 | media-typer@^1.1.0: 712 | version "1.1.0" 713 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-1.1.0.tgz#6ab74b8f2d3320f2064b2a87a38e7931ff3a5561" 714 | integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== 715 | 716 | merge-descriptors@1.0.1: 717 | version "1.0.1" 718 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 719 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 720 | 721 | methods@~1.1.2: 722 | version "1.1.2" 723 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 724 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 725 | 726 | mime-db@1.52.0: 727 | version "1.52.0" 728 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 729 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 730 | 731 | mime-db@^1.54.0: 732 | version "1.54.0" 733 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.54.0.tgz#cddb3ee4f9c64530dff640236661d42cb6a314f5" 734 | integrity sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== 735 | 736 | mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: 737 | version "2.1.35" 738 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 739 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 740 | dependencies: 741 | mime-db "1.52.0" 742 | 743 | mime-types@^3.0.0: 744 | version "3.0.1" 745 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-3.0.1.tgz#b1d94d6997a9b32fd69ebaed0db73de8acb519ce" 746 | integrity sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA== 747 | dependencies: 748 | mime-db "^1.54.0" 749 | 750 | mime@1.4.1: 751 | version "1.4.1" 752 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 753 | integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== 754 | 755 | morgan@^1.10.0: 756 | version "1.10.1" 757 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.1.tgz#4e02e6a4465a48e26af540191593955d17f61570" 758 | integrity sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A== 759 | dependencies: 760 | basic-auth "~2.0.1" 761 | debug "2.6.9" 762 | depd "~2.0.0" 763 | on-finished "~2.3.0" 764 | on-headers "~1.1.0" 765 | 766 | ms@2.0.0: 767 | version "2.0.0" 768 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 769 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 770 | 771 | ms@^2.1.1, ms@^2.1.3: 772 | version "2.1.3" 773 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 774 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 775 | 776 | negotiator@0.6.3: 777 | version "0.6.3" 778 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 779 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 780 | 781 | object-assign@^4: 782 | version "4.1.1" 783 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 784 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 785 | 786 | object-inspect@^1.13.3: 787 | version "1.13.4" 788 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213" 789 | integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== 790 | 791 | on-finished@^2.4.1: 792 | version "2.4.1" 793 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 794 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 795 | dependencies: 796 | ee-first "1.1.1" 797 | 798 | on-finished@~2.3.0: 799 | version "2.3.0" 800 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 801 | integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== 802 | dependencies: 803 | ee-first "1.1.1" 804 | 805 | on-headers@~1.1.0: 806 | version "1.1.0" 807 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.1.0.tgz#59da4f91c45f5f989c6e4bcedc5a3b0aed70ff65" 808 | integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== 809 | 810 | parseurl@~1.3.2: 811 | version "1.3.3" 812 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 813 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 814 | 815 | path-to-regexp@0.1.7: 816 | version "0.1.7" 817 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 818 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 819 | 820 | path@^0.12.7: 821 | version "0.12.7" 822 | resolved "https://registry.yarnpkg.com/path/-/path-0.12.7.tgz#d4dc2a506c4ce2197eb481ebfcd5b36c0140b10f" 823 | integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== 824 | dependencies: 825 | process "^0.11.1" 826 | util "^0.10.3" 827 | 828 | process@^0.11.1: 829 | version "0.11.10" 830 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 831 | integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== 832 | 833 | proxy-addr@~2.0.4: 834 | version "2.0.7" 835 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 836 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 837 | dependencies: 838 | forwarded "0.2.0" 839 | ipaddr.js "1.9.1" 840 | 841 | proxy-from-env@^1.1.0: 842 | version "1.1.0" 843 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 844 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 845 | 846 | qs@6.5.2: 847 | version "6.5.2" 848 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 849 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 850 | 851 | qs@^6.14.0: 852 | version "6.14.0" 853 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.14.0.tgz#c63fa40680d2c5c941412a0e899c89af60c0a930" 854 | integrity sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== 855 | dependencies: 856 | side-channel "^1.1.0" 857 | 858 | range-parser@~1.2.0: 859 | version "1.2.1" 860 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 861 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 862 | 863 | raw-body@2.3.3: 864 | version "2.3.3" 865 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 866 | integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== 867 | dependencies: 868 | bytes "3.0.0" 869 | http-errors "1.6.3" 870 | iconv-lite "0.4.23" 871 | unpipe "1.0.0" 872 | 873 | raw-body@^3.0.0: 874 | version "3.0.1" 875 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-3.0.1.tgz#ced5cd79a77bbb0496d707f2a0f9e1ae3aecdcb1" 876 | integrity sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA== 877 | dependencies: 878 | bytes "3.1.2" 879 | http-errors "2.0.0" 880 | iconv-lite "0.7.0" 881 | unpipe "1.0.0" 882 | 883 | request-ip@^3.3.0: 884 | version "3.3.0" 885 | resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-3.3.0.tgz#863451e8fec03847d44f223e30a5d63e369fa611" 886 | integrity sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA== 887 | 888 | safe-buffer@5.1.2: 889 | version "5.1.2" 890 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 891 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 892 | 893 | safe-buffer@5.2.1, safe-buffer@^5.0.1: 894 | version "5.2.1" 895 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 896 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 897 | 898 | "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": 899 | version "2.1.2" 900 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 901 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 902 | 903 | semver@^7.5.4: 904 | version "7.7.3" 905 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" 906 | integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== 907 | 908 | send@0.16.2: 909 | version "0.16.2" 910 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 911 | integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== 912 | dependencies: 913 | debug "2.6.9" 914 | depd "~1.1.2" 915 | destroy "~1.0.4" 916 | encodeurl "~1.0.2" 917 | escape-html "~1.0.3" 918 | etag "~1.8.1" 919 | fresh "0.5.2" 920 | http-errors "~1.6.2" 921 | mime "1.4.1" 922 | ms "2.0.0" 923 | on-finished "~2.3.0" 924 | range-parser "~1.2.0" 925 | statuses "~1.4.0" 926 | 927 | serve-static@1.13.2: 928 | version "1.13.2" 929 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 930 | integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== 931 | dependencies: 932 | encodeurl "~1.0.2" 933 | escape-html "~1.0.3" 934 | parseurl "~1.3.2" 935 | send "0.16.2" 936 | 937 | setprototypeof@1.1.0: 938 | version "1.1.0" 939 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 940 | integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 941 | 942 | setprototypeof@1.2.0: 943 | version "1.2.0" 944 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 945 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 946 | 947 | side-channel-list@^1.0.0: 948 | version "1.0.0" 949 | resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" 950 | integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== 951 | dependencies: 952 | es-errors "^1.3.0" 953 | object-inspect "^1.13.3" 954 | 955 | side-channel-map@^1.0.1: 956 | version "1.0.1" 957 | resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" 958 | integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== 959 | dependencies: 960 | call-bound "^1.0.2" 961 | es-errors "^1.3.0" 962 | get-intrinsic "^1.2.5" 963 | object-inspect "^1.13.3" 964 | 965 | side-channel-weakmap@^1.0.2: 966 | version "1.0.2" 967 | resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" 968 | integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== 969 | dependencies: 970 | call-bound "^1.0.2" 971 | es-errors "^1.3.0" 972 | get-intrinsic "^1.2.5" 973 | object-inspect "^1.13.3" 974 | side-channel-map "^1.0.1" 975 | 976 | side-channel@^1.1.0: 977 | version "1.1.0" 978 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" 979 | integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== 980 | dependencies: 981 | es-errors "^1.3.0" 982 | object-inspect "^1.13.3" 983 | side-channel-list "^1.0.0" 984 | side-channel-map "^1.0.1" 985 | side-channel-weakmap "^1.0.2" 986 | 987 | socket.io-adapter@~2.5.2: 988 | version "2.5.5" 989 | resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz#c7a1f9c703d7756844751b6ff9abfc1780664082" 990 | integrity sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg== 991 | dependencies: 992 | debug "~4.3.4" 993 | ws "~8.17.1" 994 | 995 | socket.io-parser@~4.2.4: 996 | version "4.2.4" 997 | resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-4.2.4.tgz#c806966cf7270601e47469ddeec30fbdfda44c83" 998 | integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== 999 | dependencies: 1000 | "@socket.io/component-emitter" "~3.1.0" 1001 | debug "~4.3.1" 1002 | 1003 | socket.io@^4.8.1: 1004 | version "4.8.1" 1005 | resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-4.8.1.tgz#fa0eaff965cc97fdf4245e8d4794618459f7558a" 1006 | integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== 1007 | dependencies: 1008 | accepts "~1.3.4" 1009 | base64id "~2.0.0" 1010 | cors "~2.8.5" 1011 | debug "~4.3.2" 1012 | engine.io "~6.6.0" 1013 | socket.io-adapter "~2.5.2" 1014 | socket.io-parser "~4.2.4" 1015 | 1016 | statuses@2.0.1: 1017 | version "2.0.1" 1018 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1019 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1020 | 1021 | "statuses@>= 1.4.0 < 2": 1022 | version "1.5.0" 1023 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 1024 | integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== 1025 | 1026 | statuses@~1.4.0: 1027 | version "1.4.0" 1028 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 1029 | integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== 1030 | 1031 | supports-color@^7.1.0: 1032 | version "7.2.0" 1033 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1034 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1035 | dependencies: 1036 | has-flag "^4.0.0" 1037 | 1038 | supports-color@^8: 1039 | version "8.1.1" 1040 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1041 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1042 | dependencies: 1043 | has-flag "^4.0.0" 1044 | 1045 | toidentifier@1.0.1: 1046 | version "1.0.1" 1047 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1048 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1049 | 1050 | tsscmp@1.0.6: 1051 | version "1.0.6" 1052 | resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb" 1053 | integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== 1054 | 1055 | type-is@^2.0.0: 1056 | version "2.0.1" 1057 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-2.0.1.tgz#64f6cf03f92fce4015c2b224793f6bdd4b068c97" 1058 | integrity sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== 1059 | dependencies: 1060 | content-type "^1.0.5" 1061 | media-typer "^1.1.0" 1062 | mime-types "^3.0.0" 1063 | 1064 | type-is@~1.6.16: 1065 | version "1.6.18" 1066 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1067 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1068 | dependencies: 1069 | media-typer "0.3.0" 1070 | mime-types "~2.1.24" 1071 | 1072 | undici-types@~7.16.0: 1073 | version "7.16.0" 1074 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.16.0.tgz#ffccdff36aea4884cbfce9a750a0580224f58a46" 1075 | integrity sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== 1076 | 1077 | unpipe@1.0.0, unpipe@~1.0.0: 1078 | version "1.0.0" 1079 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1080 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 1081 | 1082 | util@^0.10.3: 1083 | version "0.10.4" 1084 | resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" 1085 | integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== 1086 | dependencies: 1087 | inherits "2.0.3" 1088 | 1089 | utils-merge@1.0.1: 1090 | version "1.0.1" 1091 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1092 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 1093 | 1094 | vary@^1, vary@~1.1.2: 1095 | version "1.1.2" 1096 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1097 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 1098 | 1099 | window-size@^1: 1100 | version "1.1.1" 1101 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-1.1.1.tgz#9858586580ada78ab26ecd6978a6e03115c1af20" 1102 | integrity sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA== 1103 | dependencies: 1104 | define-property "^1.0.0" 1105 | is-number "^3.0.0" 1106 | 1107 | ws@~8.17.1: 1108 | version "8.17.1" 1109 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.17.1.tgz#9293da530bb548febc95371d90f9c878727d919b" 1110 | integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== 1111 | --------------------------------------------------------------------------------