From 776c1287b8b3518f8af86e22b3cd17630d17a73a Mon Sep 17 00:00:00 2001 From: abearxiong Date: Tue, 25 Jun 2024 23:56:12 +0800 Subject: [PATCH] feat: add code-flow base load --- dockerfile | 24 ++++++ package.json | 13 ++- src/admin/dashboard/load.ts | 60 ++++++++++++-- src/admin/dashboard/manager.ts | 28 ++++++- src/admin/index.ts | 65 +++++++++++---- src/app.ts | 11 ++- src/models/code.ts | 29 +++++-- src/models/user.ts | 8 +- test/db/code.test.ts | 10 +++ yarn.lock | 145 ++++++++++++--------------------- 10 files changed, 261 insertions(+), 132 deletions(-) create mode 100644 dockerfile diff --git a/dockerfile b/dockerfile new file mode 100644 index 0000000..befab2f --- /dev/null +++ b/dockerfile @@ -0,0 +1,24 @@ +# 使用官方 Node.js 运行时镜像作为基础镜像 +FROM node:22-alpine + +# 设置工作目录 +WORKDIR /app + +# 复制 package.json 和 package-lock.json +COPY package*.json ./ + +# 安装依赖 +# RUN npm install --production + +# 复制 dist 文件夹 +COPY dist ./dist +COPY app.config.json5 ./dist/app.config.json5 + +# 如果有其他静态资源文件夹,也可以一并复制 +# COPY public ./public + +# 暴露应用运行的端口(假设应用运行在 3000 端口) +EXPOSE 4000 + +# 启动应用 +CMD ["node", "dist/app.cjs"] diff --git a/package.json b/package.json index ac83d70..915d893 100644 --- a/package.json +++ b/package.json @@ -10,16 +10,20 @@ "test": "NODE_ENV=development node --experimental-vm-modules node_modules/jest/bin/jest.js --detectOpenHandles ", "build": "cross-env ENV=production webpack --mode=production", "build:sh": "cross-env webpack --mode=production -c ./webpack.shell.config.cjs", - "deploy": "scp ./dist/app.js light:~/apps/x2025/back-end", + "deploy": "scp ./dist/app.cjs light:~/apps/codeflow/backend", "deploy:sh": "", "clean": "rm -rf dist", - "reload": "ssh light pm2 restart x2025" + "reload": "ssh light pm2 restart codeflow", + "docker:build": "docker build -t docker.xiongxiao.me/code-flow:v0.0.1 .", + "docker:push": "docker push docker.xiongxiao.me/code-flow:v0.0.1", + "docker:build:gitea": "docker build -t git.xiongxiao.me/abearxiong/code-flow:v0.0.1 .", + "docker:push:gitea": "docker push git.xiongxiao.me/abearxiong/code-flow:v0.0.1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { - "@abearxiong/router": "^0.0.1-alpha.4", + "@abearxiong/router": "^0.0.1-alpha.6", "@abearxiong/use-config": "^0.0.1", "dayjs": "^1.11.11", "json5": "^2.2.3", @@ -53,5 +57,6 @@ "webpack": "^5.92.1", "webpack-cli": "^5.1.4", "webpack-node-externals": "^3.0.0" - } + }, + "packageManager": "yarn@1.22.19+sha1.4ba7fc5c6e704fce2066ecbfb0b0d8976fe62447" } diff --git a/src/admin/dashboard/load.ts b/src/admin/dashboard/load.ts index f5fa78e..af49ffd 100644 --- a/src/admin/dashboard/load.ts +++ b/src/admin/dashboard/load.ts @@ -2,9 +2,10 @@ import { router } from '../../modules/router.ts'; import { Route } from '@abearxiong/router'; import { RouterCodeModel, RouterCode } from '../../models/code.ts'; -enum CodeStatus { - success = 0, - fail = 1, +export enum CodeStatus { + running = 'running', + stop = 'stop', + fail = 'fail', } export type CodeManager = { @@ -16,11 +17,54 @@ const codeDemoRun = `async function run(ctx) { ctx.body = 'test js'; return ctx; }`; +export const loadOne = async (item: RouterCodeModel) => { + const { path, key, id, code, project } = item.toJSON(); + try { + const fn: any = new Function( + 'ctx', + ` + ${code} + return run(ctx); + `, + ); + // run code + const codeRunRoute = new Route(path, key, { id }); + codeRunRoute.run = fn; + router.add(codeRunRoute); + return { + path, + key, + id, + project, + fn, + status: CodeStatus.running, + }; + } catch (e) { + console.error('error id:', id, '\n', e); + return { + path, + key, + id, + project, + status: CodeStatus.fail, + errorMsg: e.message.toString(), + }; + } +}; export const load = async function () { const codes = await RouterCodeModel.findAll(); const codeManager: CodeManager[] = codes.map((item) => { - const { path, key, id, code, project } = item.toJSON(); - console.log('item', item, 'code', item.code); + const { path, key, id, code, project, active } = item.toJSON(); + if (!active) { + return { + path, + key, + id, + code, + project, + status: CodeStatus.stop, + }; + } try { const fn: any = new Function( 'ctx', @@ -37,9 +81,11 @@ export const load = async function () { path, key, id, + code, project, + type: item.type, fn, - status: CodeStatus.success, + status: CodeStatus.running, }; } catch (e) { console.error('error id:', id, '\n', e); @@ -47,7 +93,9 @@ export const load = async function () { path, key, id, + code, project, + type: item.type, status: CodeStatus.fail, errorMsg: e.message.toString(), }; diff --git a/src/admin/dashboard/manager.ts b/src/admin/dashboard/manager.ts index 1670526..b516b5c 100644 --- a/src/admin/dashboard/manager.ts +++ b/src/admin/dashboard/manager.ts @@ -1,5 +1,5 @@ import { EventEmitter, once } from 'stream'; -import { load, CodeManager } from './load.ts'; +import { load, CodeManager, CodeStatus } from './load.ts'; export enum LoadStatus { LOADING = 'loading', @@ -11,6 +11,30 @@ export const manager = { list: [] as CodeManager[], }; +// 更新 +export const updateNewCode = (code: CodeManager) => { + const index = manager.list.findIndex((item) => item.id === code.id); + if (index === -1) { + manager.list.push(code); + } else { + manager.list[index] = code; + } +}; +// 删除 +export const removeCode = (id: string) => { + const index = manager.list.findIndex((item) => item.id === id); + if (index !== -1) { + manager.list.splice(index, 1); + } +}; +export const stopCode = (id: string) => { + const index = manager.list.findIndex((item) => item.id === id); + if (index !== -1) { + manager.list[index].status = CodeStatus.stop; + } +}; + +// 事件 export const events = new EventEmitter(); once(events, 'loaded') @@ -26,7 +50,7 @@ once(events, 'loaded') const init = async function () { const r = await load(); manager.list = r; - + events.emit('loaded'); }; diff --git a/src/admin/index.ts b/src/admin/index.ts index d9656c4..556d13d 100644 --- a/src/admin/index.ts +++ b/src/admin/index.ts @@ -1,13 +1,16 @@ // admin 需要最后运行,并在route中进行过滤。 import { Route } from '@abearxiong/router'; import { router } from '../modules/router.ts'; -import { manager } from './dashboard/manager.ts'; +import { manager, updateNewCode, removeCode, stopCode } from './dashboard/manager.ts'; +import { loadOne } from './dashboard/load.ts'; +import { RouterCodeModel } from '../models/code.ts'; +import { nanoid } from 'nanoid'; export const getRouterList = new Route('admin', 'getRouterList'); getRouterList.run = async (ctx) => { + ctx.body = router.getList().filter((r) => !r.path.startsWith('admin')); // ctx.body = router.getList().filter((r) => r.path.startsWith('admin')); - ctx.body = router.getList().filter((r) => r.path.startsWith('admin')); return ctx; }; @@ -28,27 +31,56 @@ export const removeRouterById = new Route('admin', 'removeRouterById'); removeRouterById.run = async (ctx) => { const { id } = ctx.query; router.removeById(id); + removeCode(id); + await RouterCodeModel.destroy({ where: { id } }); ctx.body = 'success'; return ctx; }; router.add(removeRouterById); -// add router -export const addRouter = new Route('admin', 'addRouter'); - -addRouter.run = async (ctx) => { - const { path, key } = ctx.query; - router.add(new Route(path, key)); +// stop router by id +export const stopRouterById = new Route('admin', 'stopRouterById'); +stopRouterById.run = async (ctx) => { + const { id } = ctx.query; + router.removeById(id); + const routerCode = await RouterCodeModel.findByPk(id); + if (routerCode) { + routerCode.active = false; + await routerCode.save(); + } + stopCode(id); ctx.body = 'success'; return ctx; }; -router.add(addRouter); - -// update router +// add or update router export const updateRouter = new Route('admin', 'updateRouter'); updateRouter.run = async (ctx) => { - const { path, key } = ctx.query; - router.add(new Route(path, key)); + let { path, key, id, code } = ctx.query; + if (!path && !key) { + ctx.body = 'path and key is required'; + ctx.code = 500; + return ctx; + } + let codeRouter: RouterCodeModel | null = null; + const codeRouteCheck = await RouterCodeModel.findOne({ where: { path, key } }); // 检查是否存在 + if (codeRouteCheck && codeRouteCheck.id !== id) { + key = `${key}-${nanoid(6)}`; + } + if (id) { + codeRouter = await RouterCodeModel.findByPk(id); + codeRouter.path = path; + codeRouter.key = key; + codeRouter.code = code; + await codeRouter.save(); + } else { + const newCodeRouter = new RouterCodeModel({ path, key, code }); + await newCodeRouter.save(); + codeRouter = newCodeRouter; + } + + const codeOne = await loadOne(codeRouter); + updateNewCode(codeOne); + ctx.body = 'success'; return ctx; }; @@ -57,7 +89,10 @@ router.add(updateRouter); // get manager status export const managerRouter = new Route('admin', 'getManagerStatus'); managerRouter.run = async (ctx) => { - ctx.body = manager.loaded; + ctx.body = { + status: manager.loaded, + msg: 'system is running, and load manager success.', + }; return ctx; }; router.add(managerRouter); @@ -68,4 +103,4 @@ managerList.run = async (ctx) => { ctx.body = manager.list; return ctx; }; -router.add(managerList); \ No newline at end of file +router.add(managerList); diff --git a/src/app.ts b/src/app.ts index 8257dbe..b85182c 100644 --- a/src/app.ts +++ b/src/app.ts @@ -6,7 +6,16 @@ import http from 'http'; const config = useConfig(); routerServer.setHandle(handleMessage); -const server = http.createServer(routerServer.callback()); +const server = http.createServer((req, res) => { + // 设置跨域 + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); + res.setHeader('Access-Control-Max-Age', '86400'); + res.setHeader('Content-Type', 'application/json'); + // routerServer.handle(req, res); + return routerServer.callback()(req, res); +}); server.listen(config.port, () => { console.log(`Server running at http://localhost:${config.port}/`); diff --git a/src/models/code.ts b/src/models/code.ts index 34644d5..5395812 100644 --- a/src/models/code.ts +++ b/src/models/code.ts @@ -8,15 +8,21 @@ export type RouterCode = { active: boolean; project: string; code: string; + type: RouterCodeType; }; +export enum RouterCodeType { + route = 'route', + middleware = 'middleware', +} export class RouterCodeModel extends Model { declare id: string; - path: string; - key: string; - active: boolean; - project: string; - public code: string; + declare path: string; + declare key: string; + declare active: boolean; + declare project: string; + declare code: string; + declare type: RouterCodeType; } RouterCodeModel.init( { @@ -46,6 +52,18 @@ RouterCodeModel.init( type: DataTypes.STRING, defaultValue: '', }, + type: { + type: DataTypes.ENUM(RouterCodeType.route, RouterCodeType.middleware), + defaultValue: RouterCodeType.route, + }, + middleware: { + type: DataTypes.ARRAY(DataTypes.STRING), + defaultValue: [], + }, + next: { + type: DataTypes.STRING, + defaultValue: '', + }, }, { sequelize, @@ -53,3 +71,4 @@ RouterCodeModel.init( }, ); // RouterCodeModel.sync({ alter: true }); +// RouterCodeModel.sync({force: true}); diff --git a/src/models/user.ts b/src/models/user.ts index 1bcac11..68ae44a 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -41,13 +41,9 @@ User.init( export const initializeUser = async () => { const w = await User.findOne(); - const password = '2e8a305521bba54f49638ed25e46adf3'; + const password = '2e8a305521bba54f49638ed25e46adf3'; //123456 const salt = '123'; - const users = [ - { username: 'admin' }, - { username: 'user' }, - { username: 'root' }, - ]; + const users = [{ username: 'admin' }, { username: 'user' }, { username: 'root' }]; if (!w) { const newUsers = await User.bulkCreate( users.map((user) => { diff --git a/test/db/code.test.ts b/test/db/code.test.ts index 9dea4f7..b6024f0 100644 --- a/test/db/code.test.ts +++ b/test/db/code.test.ts @@ -15,6 +15,16 @@ describe('RouterCodeModel', () => { console.error('connect error', error); } }); + // yarn test --testNamePattern='RouterCodeModel:sync' + test('RouterCodeModel:sync', async () => { + try { + RouterCodeModel.sync({ alter: true }); + console.log('connect success'); + await sleep(2000); + } catch (error) { + console.error('connect error', error); + } + }); // yarn test --testNamePattern='RouterCodeModel:create' test('RouterCodeModel:create', async () => { try { diff --git a/yarn.lock b/yarn.lock index 00876ab..73adb51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@abearxiong/router@^0.0.1-alpha.4": - version "0.0.1-alpha.4" - resolved "https://npm.pkg.github.com/download/@abearxiong/router/0.0.1-alpha.4/4890036c8d5623d4d0173a052caa8b49b484fe7c" - integrity sha512-Uaelc/RRhh9bC/OBh3CvASCyEiNIF9TR4QVlHzm7kBxkHb0vR4K58jUS8lcq5AtAYCwhIZpHZT+FSSrmbvfh0Q== +"@abearxiong/router@^0.0.1-alpha.6": + version "0.0.1-alpha.6" + resolved "https://npm.pkg.github.com/download/@abearxiong/router/0.0.1-alpha.6/2009ce380ff3d1d205ed6ae3cc6b884503fb6b9f#2009ce380ff3d1d205ed6ae3cc6b884503fb6b9f" + integrity sha512-NINt44Sw9rNAP+SxMlwd0qQfUt1sfBLniMV8/kWuRVfwIirhtWq0Pp4C9auxDHJUR56EO6Z8XV6DYejhtpphgw== dependencies: nanoid "^5.0.6" @@ -39,7 +39,7 @@ resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.24.7.tgz" integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9", "@babel/core@^7.8.0", "@babel/core@>=7.0.0-beta.0 <8": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": version "7.24.7" resolved "https://registry.npmmirror.com/@babel/core/-/core-7.24.7.tgz" integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g== @@ -511,7 +511,7 @@ jest-haste-map "^29.7.0" slash "^3.0.0" -"@jest/transform@^29.0.0", "@jest/transform@^29.7.0": +"@jest/transform@^29.7.0": version "29.7.0" resolved "https://registry.npmmirror.com/@jest/transform/-/transform-29.7.0.tgz" integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== @@ -532,7 +532,7 @@ slash "^3.0.0" write-file-atomic "^4.0.2" -"@jest/types@^29.0.0", "@jest/types@^29.6.3": +"@jest/types@^29.6.3": version "29.6.3" resolved "https://registry.npmmirror.com/@jest/types/-/types-29.6.3.tgz" integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== @@ -576,14 +576,6 @@ resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - "@jridgewell/trace-mapping@0.3.9": version "0.3.9" resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" @@ -592,6 +584,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -600,7 +600,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -813,7 +813,7 @@ resolved "https://registry.npmmirror.com/@types/ms/-/ms-0.7.34.tgz" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== -"@types/node@*", "@types/node@^20.14.8", "@types/node@>=10.0.0": +"@types/node@*", "@types/node@>=10.0.0", "@types/node@^20.14.8": version "20.14.8" resolved "https://registry.npmmirror.com/@types/node/-/node-20.14.8.tgz" integrity sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA== @@ -864,7 +864,7 @@ dependencies: "@types/yargs-parser" "*" -"@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.12.1.tgz" integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== @@ -965,7 +965,7 @@ "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/wasm-parser" "1.12.1" -"@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1": +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== @@ -1030,7 +1030,7 @@ acorn-walk@^8.1.1: dependencies: acorn "^8.11.0" -acorn@^8, acorn@^8.11.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2: +acorn@^8.11.0, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.2: version "8.12.0" resolved "https://registry.npmmirror.com/acorn/-/acorn-8.12.0.tgz" integrity sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== @@ -1054,7 +1054,7 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.5, ajv@^6.9.1: +ajv@^6.12.5: version "6.12.6" resolved "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1064,17 +1064,7 @@ ajv@^6.12.5, ajv@^6.9.1: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0: - version "8.16.0" - resolved "https://registry.npmmirror.com/ajv/-/ajv-8.16.0.tgz" - integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== - dependencies: - fast-deep-equal "^3.1.3" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.4.1" - -ajv@^8.8.2, ajv@^8.9.0: +ajv@^8.0.0, ajv@^8.9.0: version "8.16.0" resolved "https://registry.npmmirror.com/ajv/-/ajv-8.16.0.tgz" integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== @@ -1150,7 +1140,7 @@ asynckit@^0.4.0: resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== -babel-jest@^29.0.0, babel-jest@^29.7.0: +babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.npmmirror.com/babel-jest/-/babel-jest-29.7.0.tgz" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== @@ -1215,7 +1205,7 @@ balanced-match@^1.0.0: resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base64id@~2.0.0, base64id@2.0.0: +base64id@2.0.0, base64id@~2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/base64id/-/base64id-2.0.0.tgz" integrity sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== @@ -1240,7 +1230,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browserslist@^4.21.10, browserslist@^4.22.2, "browserslist@>= 4.21.0": +browserslist@^4.21.10, browserslist@^4.22.2: version "4.23.1" resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.1.tgz" integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== @@ -1399,16 +1389,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + colorette@^2.0.14: version "2.0.20" resolved "https://registry.npmmirror.com/colorette/-/colorette-2.0.20.tgz" @@ -1783,7 +1773,7 @@ fast-glob@^3.3.2: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0, fast-json-stable-stringify@2.x: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: version "2.1.0" resolved "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== @@ -1928,7 +1918,7 @@ get-stream@^6.0.0: resolved "https://registry.npmmirror.com/get-stream/-/get-stream-6.0.1.tgz" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -1942,13 +1932,6 @@ glob-parent@^6.0.1: dependencies: is-glob "^4.0.3" -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" @@ -2423,7 +2406,7 @@ jest-resolve-dependencies@^29.7.0: jest-regex-util "^29.6.3" jest-snapshot "^29.7.0" -jest-resolve@*, jest-resolve@^29.7.0: +jest-resolve@^29.7.0: version "29.7.0" resolved "https://registry.npmmirror.com/jest-resolve/-/jest-resolve-29.7.0.tgz" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== @@ -2576,7 +2559,7 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.0.0, jest@^29.7.0: +jest@^29.7.0: version "29.7.0" resolved "https://registry.npmmirror.com/jest/-/jest-29.7.0.tgz" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== @@ -2769,7 +2752,7 @@ make-dir@^4.0.0: dependencies: semver "^7.5.3" -make-error@^1.1.1, make-error@1.x: +make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.npmmirror.com/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -2852,7 +2835,7 @@ moment@^2.29.4: resolved "https://registry.npmmirror.com/moment/-/moment-2.30.1.tgz" integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== -ms@^2.1.1, ms@2.1.2: +ms@2.1.2, ms@^2.1.1: version "2.1.2" resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== @@ -3053,7 +3036,7 @@ pg-types@^2.1.0: postgres-date "~1.0.4" postgres-interval "^1.1.0" -pg@^8.12.0, pg@>=8.0: +pg@^8.12.0: version "8.12.0" resolved "https://registry.npmmirror.com/pg/-/pg-8.12.0.tgz" integrity sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ== @@ -3281,12 +3264,7 @@ schema-utils@^4.2.0: ajv-formats "^2.1.1" ajv-keywords "^5.1.0" -semver@^6.3.0: - version "6.3.1" - resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^6.3.1: +semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== @@ -3432,14 +3410,6 @@ socket.io@^4.7.5: socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.13.tgz" @@ -3448,12 +3418,15 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" -source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -3547,14 +3520,7 @@ supertest@^7.0.0: methods "^1.1.2" superagent "^9.0.1" -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.5.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -3568,14 +3534,7 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: +supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -3679,7 +3638,7 @@ ts-loader@^9.5.1: semver "^7.3.4" source-map "^0.7.4" -ts-node@^10.9.2, ts-node@>=9.0.0: +ts-node@^10.9.2: version "10.9.2" resolved "https://registry.npmmirror.com/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -3713,7 +3672,7 @@ type-fest@^0.21.3: resolved "https://registry.npmmirror.com/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@*, typescript@^5.5.2, typescript@>=2.7, "typescript@>=4.3 <6", typescript@>=4.9.5, typescript@>3.6.0: +typescript@^5.5.2: version "5.5.2" resolved "https://registry.npmmirror.com/typescript/-/typescript-5.5.2.tgz" integrity sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew== @@ -3797,7 +3756,7 @@ watchpack@^2.4.1: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -webpack-cli@^5.1.4, webpack-cli@5.x.x: +webpack-cli@^5.1.4: version "5.1.4" resolved "https://registry.npmmirror.com/webpack-cli/-/webpack-cli-5.1.4.tgz" integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== @@ -3835,7 +3794,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.0.0, webpack@^5.1.0, webpack@^5.11.0, webpack@^5.90.3, webpack@^5.92.1, webpack@5.x.x: +webpack@^5.90.3, webpack@^5.92.1: version "5.92.1" resolved "https://registry.npmmirror.com/webpack/-/webpack-5.92.1.tgz" integrity sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==