├── 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 |

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 |
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 |
--------------------------------------------------------------------------------