From 82191217de7a58eef23ff7a5ce89d3133f84bc7d Mon Sep 17 00:00:00 2001 From: expressgy Date: Sat, 2 Dec 2023 00:52:48 +0800 Subject: [PATCH] first commit --- .eslintrc.cjs | 65 + .gitignore | 135 + .idea/.gitignore | 5 + .idea/graphResource2.iml | 12 + .idea/modules.xml | 8 + .idea/prettier.xml | 6 + .prettierrc.json | 5 + OM系统资源结构实例.xmind | Bin 0 -> 124892 bytes bootstrap.js | 106 + development.env.js | 22 + gen-Model/models/init-models.js | 38 + gen-Model/models/lauchuser.js | 58 + gen-Model/models/lauchuserexpandfield.js | 82 + gen-Model/models/lauchuserexpandrecord.js | 52 + gen-Model/models/lauchuserloginrecord.js | 37 + gen-Model/models/lauchuserpasswd.js | 41 + gen-Model/models/lauchuserstructauthority.js | 64 + .../models/lauchuserstructorganization.js | 54 + ...uchuserstructrelationorganizationaccent.js | 42 + ...userstructrelationorganizationauthority.js | 42 + gen-Model/使用方式.md | 1 + graphResource2数据结构.xmind | Bin 0 -> 201481 bytes package.json | 56 + pnpm-lock.yaml | 2376 +++++++++++++++++ production.env.js | 43 + src/app.js | 125 + src/cache/index.js | 43 + .../dataModels/atomModel.dataModel.js | 61 + .../database/dataModels/baseDict.dataModel.js | 83 + .../dataModels/resourceClassBase.dataModel.js | 103 + .../resourceClassExpandField.dataModel.js | 83 + .../resourceClassRelation.dataModel.js | 60 + .../resourceEntityRelation.dataModel.js | 60 + .../resourceEntityStruct.dataModel.js | 130 + src/common/database/index.js | 60 + src/common/dto/index.js | 36 + src/common/logger/index.js | 91 + src/common/tools/getArrayPage.js | 20 + src/common/tools/getNoSpacesStr.js | 16 + .../graphResource2/atomModel/index.dto.js | 180 ++ src/routes/graphResource2/atomModel/index.js | 180 ++ .../graphResource2/baseDict/index.dto.js | 206 ++ src/routes/graphResource2/baseDict/index.js | 93 + src/routes/graphResource2/index.js | 63 + src/routes/index.dto.js | 28 + src/routes/index.js | 41 + test/ajvTest.js | 82 + test/koa-body使用.md | 286 ++ test/koa-compress说明.md | 104 + ...elimit限制批量请求工具的应用.md | 33 + test/koa-send方法.md | 46 + test/koa修改code.md | 39 + 52 files changed, 5702 insertions(+) create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/graphResource2.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/prettier.xml create mode 100644 .prettierrc.json create mode 100644 OM系统资源结构实例.xmind create mode 100644 bootstrap.js create mode 100644 development.env.js create mode 100644 gen-Model/models/init-models.js create mode 100644 gen-Model/models/lauchuser.js create mode 100644 gen-Model/models/lauchuserexpandfield.js create mode 100644 gen-Model/models/lauchuserexpandrecord.js create mode 100644 gen-Model/models/lauchuserloginrecord.js create mode 100644 gen-Model/models/lauchuserpasswd.js create mode 100644 gen-Model/models/lauchuserstructauthority.js create mode 100644 gen-Model/models/lauchuserstructorganization.js create mode 100644 gen-Model/models/lauchuserstructrelationorganizationaccent.js create mode 100644 gen-Model/models/lauchuserstructrelationorganizationauthority.js create mode 100644 gen-Model/使用方式.md create mode 100644 graphResource2数据结构.xmind create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 production.env.js create mode 100644 src/app.js create mode 100644 src/cache/index.js create mode 100644 src/common/database/dataModels/atomModel.dataModel.js create mode 100644 src/common/database/dataModels/baseDict.dataModel.js create mode 100644 src/common/database/dataModels/resourceClassBase.dataModel.js create mode 100644 src/common/database/dataModels/resourceClassExpandField.dataModel.js create mode 100644 src/common/database/dataModels/resourceClassRelation.dataModel.js create mode 100644 src/common/database/dataModels/resourceEntityRelation.dataModel.js create mode 100644 src/common/database/dataModels/resourceEntityStruct.dataModel.js create mode 100644 src/common/database/index.js create mode 100644 src/common/dto/index.js create mode 100644 src/common/logger/index.js create mode 100644 src/common/tools/getArrayPage.js create mode 100644 src/common/tools/getNoSpacesStr.js create mode 100644 src/routes/graphResource2/atomModel/index.dto.js create mode 100644 src/routes/graphResource2/atomModel/index.js create mode 100644 src/routes/graphResource2/baseDict/index.dto.js create mode 100644 src/routes/graphResource2/baseDict/index.js create mode 100644 src/routes/graphResource2/index.js create mode 100644 src/routes/index.dto.js create mode 100644 src/routes/index.js create mode 100644 test/ajvTest.js create mode 100644 test/koa-body使用.md create mode 100644 test/koa-compress说明.md create mode 100644 test/koa-ratelimit限制批量请求工具的应用.md create mode 100644 test/koa-send方法.md create mode 100644 test/koa修改code.md diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..ce0bb13 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,65 @@ +module.exports = { + "env": { + "browser": true, + "es2021": true, + "es2022": true, + "es2023": true, + }, + "extends": ["eslint:recommended"], + "overrides": [ + { + "env": { + "node": true + }, + "files": [ + ".eslintrc.{js,cjs}" + ], + "parserOptions": { + "sourceType": "script" + } + } + ], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + indent: ['error', 4, { "SwitchCase": 1 }], // 用于指定代码缩进的方式,这里配置为使用四个空格进行缩进。 + // 'linebreak-style': [0, 'error', 'windows'], // 用于指定换行符的风格,这里配置为使用 Windows 风格的换行符(\r\n)。 + quotes: ['error', 'single'], // 用于指定字符串的引号风格,这里配置为使用单引号作为字符串的引号。 + semi: ['error', 'always'], //用于指定是否需要在语句末尾添加分号,这里配置为必须始终添加分号。 + "no-console": 2,//禁止使用console + "no-const-assign": 2,//禁止修改const声明的变量 + "no-empty": 2,//块语句中的内容不能为空 + "no-extra-parens": 2,//禁止非必要的括号 + "no-extra-semi": 2,//禁止多余的冒号 + "no-fallthrough": 1,//禁止switch穿透 + "no-func-assign": 2,//禁止重复的函数声明 + "no-inline-comments": 2,//禁止行内备注 + "no-irregular-whitespace": 2,//不能有不规则的空格 + "no-mixed-spaces-and-tabs": [2, false],//禁止混用tab和空格 + "no-multi-spaces": 1,//不能用多余的空格 + "no-multiple-empty-lines": [1, {"max": 2}],//空行最多不能超过2行 + "no-nested-ternary": 0,//禁止使用嵌套的三目运算 + "no-redeclare": 2,//禁止重复声明变量 + "no-shadow": 2,//外部作用域中的变量不能与它所包含的作用域中的变量或参数同名 + "no-trailing-spaces": 2,//一行结束后面不要有空格 + "no-unexpected-multiline": 2,//避免多行表达式 + "no-unused-vars": [2, {"vars": "all", "args": "after-used"}],//不能有声明后未被使用的变量或参数 + "no-use-before-define": 2,//未定义前不能使用 + "no-var": 2,//禁用var,用let和const代替 + "arrow-parens": 0,//箭头函数用小括号括起来 + "array-bracket-spacing": [2, "never"],//是否允许非空数组里面有多余的空格 + "camelcase": 2,//强制驼峰法命名 + "comma-style": [2, "last"],//逗号风格,换行时在行首还是行尾 + "comma-spacing": ["error", {"before": false, "after": true}],//对象字面量中冒号的前后空格 + "key-spacing": ["error", { "beforeColon": false, "afterColon": true }],// 冒号后面有空格 + "lines-around-comment": 0,//行前/行后备注 + "array-bracket-spacing": ["error", "always"],// 检查数组字面量中的元素之间的空格。 + }, + "globals": { + global: true, + Buffer: true, + process: true + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..805bc40 --- /dev/null +++ b/.gitignore @@ -0,0 +1,135 @@ +# ---> Node +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +pnpm-debug.log* +.pnpm-debug.log* +# log +winston-logs/* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..10b731c --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,5 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ diff --git a/.idea/graphResource2.iml b/.idea/graphResource2.iml new file mode 100644 index 0000000..24643cc --- /dev/null +++ b/.idea/graphResource2.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..fdcb436 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/prettier.xml b/.idea/prettier.xml new file mode 100644 index 0000000..b0c1c68 --- /dev/null +++ b/.idea/prettier.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..f4f39af --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "singleQuote": true, + "trailingComma": "all", + "tabWidth": 4 +} diff --git a/OM系统资源结构实例.xmind b/OM系统资源结构实例.xmind new file mode 100644 index 0000000000000000000000000000000000000000..0727090ac07db4c9b1502df3e736a0f7c8b729af GIT binary patch literal 124892 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 y&cf<*nwjYHhuK&U6zf-6-9! literal 0 HcmV?d00001 diff --git a/bootstrap.js b/bootstrap.js new file mode 100644 index 0000000..f574971 --- /dev/null +++ b/bootstrap.js @@ -0,0 +1,106 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: bootstrap.js - Koa项目启动文件 +// | @创建时间: 2023-11-25 21:17 +// | @更新时间: 2023-11-25 21:17 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + + +import devConfig from '#root/development.env.js'; +import prodConfig from '#root/production.env.js'; +import startApp from '#home/app.js'; +import winston from "winston"; +import {logger, colorizer} from "#common/logger/index.js"; +import createDatabase from "#common/database/index.js"; +import {createCatch} from "#cache/index.js"; +// | 获取ENV +const ENV = process.env.NODE_ENV && process.env.NODE_ENV.toLowerCase().trim(); + +if (ENV === 'development' || ENV === undefined) { + global.config = devConfig; + logger.add(new winston.transports.Console({ + format:winston.format.combine( + winston.format.printf( + (i) => { + return colorizer.colorize( + i.level, + i.message + ); + }, + ), + ) + })) +} else if (ENV === 'production') { + global.config = prodConfig; + logger.exceptions.handle(new winston.transports.File({ filename: 'winston-logs/winston-exceptions.log' })); + logger.rejections.handle(new winston.transports.File({ filename: 'winston-logs/winston-rejections.log' })) +} else { + throw new Error(`未识别的环境变量${ENV}`); +} +global.logger = logger +global.ENV = ENV; + +// = 函数名: checkPort +// = 描述: 检测服务端口是否正常 +// = 参数: None +// = 返回值: undefined +// = 创建人: nie +// = 创建时间: 2023-11-25 21:49:22 - +function checkPort() { + if ( + typeof global.config.port !== 'number' || + global.config.port > 65536 || + global.config.port < 3000 + ) { + throw new Error(`服务监听端口不合法:${global.config.port}`); + } +} +checkPort(); + +// = 函数名: checkAppName +// = 描述: 检测服务名是否正常 +// = 参数: None +// = 返回值: undefined +// = 创建人: nie +// = 创建时间: 2023-11-25 21:51:03 - +function checkAppName() { + if (!global.config.appName) { + throw new Error(`服务名不存在:${global.config.appName}`); + } +} +checkAppName() +// process.stdout.write('\u001b[2J\u001b[0;0H'); +async function createApp(){ + const sequelize = createDatabase(logger); + + await sequelize.sync({alter: true}) + await sequelize.authenticate().catch(e => { + console.error(`数据库连接失败, ${e}`); + throw new Error(e) + }); + logger.info(`== 已成功与数据库建立连接。 ==`); + + createCatch(sequelize) + + + + const app = startApp(); + + sequelize.getQueryInterface().showAllTables().then(data => { + // console.log(data) + }).catch(e => { + console.error(e) + }) + + app.context.sequelize = sequelize + app.listen(config.port); + logger.info( `Web服务 ${global.config.appName} 启动成功,访问: http://127.0.0.1:${global.config.port}`) +} +createApp() + diff --git a/development.env.js b/development.env.js new file mode 100644 index 0000000..dca18da --- /dev/null +++ b/development.env.js @@ -0,0 +1,22 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: development.env.js - +// | @创建时间: 2023-11-25 21:36 +// | @更新时间: 2023-11-25 21:36 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import prodConfig from "#root/production.env.js"; + +const config = { + port: 3000, +} + +const devConfig = {...prodConfig, ...config} + +export default devConfig diff --git a/gen-Model/models/init-models.js b/gen-Model/models/init-models.js new file mode 100644 index 0000000..412134f --- /dev/null +++ b/gen-Model/models/init-models.js @@ -0,0 +1,38 @@ +var DataTypes = require("sequelize").DataTypes; +var _lauchuser = require("./lauchuser"); +var _lauchuserexpandfield = require("./lauchuserexpandfield"); +var _lauchuserexpandrecord = require("./lauchuserexpandrecord"); +var _lauchuserloginrecord = require("./lauchuserloginrecord"); +var _lauchuserpasswd = require("./lauchuserpasswd"); +var _lauchuserstructauthority = require("./lauchuserstructauthority"); +var _lauchuserstructorganization = require("./lauchuserstructorganization"); +var _lauchuserstructrelationorganizationaccent = require("./lauchuserstructrelationorganizationaccent"); +var _lauchuserstructrelationorganizationauthority = require("./lauchuserstructrelationorganizationauthority"); + +function initModels(sequelize) { + var lauchuser = _lauchuser(sequelize, DataTypes); + var lauchuserexpandfield = _lauchuserexpandfield(sequelize, DataTypes); + var lauchuserexpandrecord = _lauchuserexpandrecord(sequelize, DataTypes); + var lauchuserloginrecord = _lauchuserloginrecord(sequelize, DataTypes); + var lauchuserpasswd = _lauchuserpasswd(sequelize, DataTypes); + var lauchuserstructauthority = _lauchuserstructauthority(sequelize, DataTypes); + var lauchuserstructorganization = _lauchuserstructorganization(sequelize, DataTypes); + var lauchuserstructrelationorganizationaccent = _lauchuserstructrelationorganizationaccent(sequelize, DataTypes); + var lauchuserstructrelationorganizationauthority = _lauchuserstructrelationorganizationauthority(sequelize, DataTypes); + + + return { + lauchuser, + lauchuserexpandfield, + lauchuserexpandrecord, + lauchuserloginrecord, + lauchuserpasswd, + lauchuserstructauthority, + lauchuserstructorganization, + lauchuserstructrelationorganizationaccent, + lauchuserstructrelationorganizationauthority, + }; +} +module.exports = initModels; +module.exports.initModels = initModels; +module.exports.default = initModels; diff --git a/gen-Model/models/lauchuser.js b/gen-Model/models/lauchuser.js new file mode 100644 index 0000000..3fa6f0b --- /dev/null +++ b/gen-Model/models/lauchuser.js @@ -0,0 +1,58 @@ +const Sequelize = require('sequelize'); +module.exports = function (sequelize, DataTypes) { + return sequelize.define('lauchuser', { + uuid: { + type: DataTypes.UUID, + allowNull: false, + primaryKey: true, + comment: "用户唯一ID" + }, + username: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "用户名" + }, + email: { + type: DataTypes.STRING(255), + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false, + comment: "创建时间" + }, + status: { + type: DataTypes.INTEGER.UNSIGNED.ZEROFILL, + allowNull: false, + defaultValue: 0000000000, + comment: "0正常1注销2停用" + }, + selfSequence: { + type: DataTypes.INTEGER, + allowNull: false, + autoIncrement: true, + comment: "自增序列" + } + }, { + sequelize, + tableName: 'lauchuser', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + {name: "uuid"}, + ] + }, + { + name: "selfSequence", + using: "BTREE", + fields: [ + {name: "selfSequence"}, + ] + }, + ] + }); +}; diff --git a/gen-Model/models/lauchuserexpandfield.js b/gen-Model/models/lauchuserexpandfield.js new file mode 100644 index 0000000..18c9177 --- /dev/null +++ b/gen-Model/models/lauchuserexpandfield.js @@ -0,0 +1,82 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserexpandfield', { + expandFieldId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + comment: "拓展字段ID" + }, + fieldIdentify: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "字段标识" + }, + displayName: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "字段名" + }, + fieldDescribe: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "字段描述" + }, + defaultValue: { + type: DataTypes.STRING(255), + allowNull: true, + comment: "默认值" + }, + storageType: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "存储类型" + }, + storageLength: { + type: DataTypes.INTEGER, + allowNull: false, + comment: "存储长度" + }, + isRequired: { + type: DataTypes.BOOLEAN, + allowNull: true, + comment: "是否必填" + }, + isRepeat: { + type: DataTypes.BOOLEAN, + allowNull: true, + comment: "是否可以重复" + }, + isEnable: { + type: DataTypes.BOOLEAN, + allowNull: true, + comment: "是否启用" + }, + createTime: { + type: DataTypes.DATE, + allowNull: false, + comment: "创建时间" + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "", + comment: "删除时间" + } + }, { + sequelize, + tableName: 'lauchuserexpandfield', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "expandFieldId" }, + ] + }, + ] + }); +}; diff --git a/gen-Model/models/lauchuserexpandrecord.js b/gen-Model/models/lauchuserexpandrecord.js new file mode 100644 index 0000000..b19f526 --- /dev/null +++ b/gen-Model/models/lauchuserexpandrecord.js @@ -0,0 +1,52 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserexpandrecord', { + expandRecordId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + comment: "记录ID" + }, + uuid: { + type: DataTypes.INTEGER, + allowNull: false, + comment: "用户ID" + }, + expandField: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "多占字段ID" + }, + expandFieldValue: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "拓展字段值" + }, + createTime: { + type: DataTypes.DATE, + allowNull: false, + comment: "创建时间" + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "", + comment: "删除时间" + } + }, { + sequelize, + tableName: 'lauchuserexpandrecord', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "expandRecordId" }, + ] + }, + ] + }); +}; diff --git a/gen-Model/models/lauchuserloginrecord.js b/gen-Model/models/lauchuserloginrecord.js new file mode 100644 index 0000000..c1d1107 --- /dev/null +++ b/gen-Model/models/lauchuserloginrecord.js @@ -0,0 +1,37 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserloginrecord', { + loginRecordId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + uuid: { + type: DataTypes.UUID, + allowNull: false + }, + recoredJson: { + type: DataTypes.TEXT, + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + } + }, { + sequelize, + tableName: 'lauchuserloginrecord', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "loginRecordId" }, + ] + }, + ] + }); +}; diff --git a/gen-Model/models/lauchuserpasswd.js b/gen-Model/models/lauchuserpasswd.js new file mode 100644 index 0000000..ab60d82 --- /dev/null +++ b/gen-Model/models/lauchuserpasswd.js @@ -0,0 +1,41 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserpasswd', { + passwdId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true, + comment: "密码记录ID" + }, + uuid: { + type: DataTypes.UUID, + allowNull: false, + comment: "用户ID" + }, + passwd: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "用户密码" + }, + createTime: { + type: DataTypes.DATE, + allowNull: false, + comment: "创建时间" + } + }, { + sequelize, + tableName: 'lauchuserpasswd', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "passwdId" }, + ] + }, + ] + }); +}; diff --git a/gen-Model/models/lauchuserstructauthority.js b/gen-Model/models/lauchuserstructauthority.js new file mode 100644 index 0000000..b18ded5 --- /dev/null +++ b/gen-Model/models/lauchuserstructauthority.js @@ -0,0 +1,64 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserstructauthority', { + authorityStructId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + authorityType: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "按钮、页面、接口" + }, + authorityName: { + type: DataTypes.STRING(255), + allowNull: false + }, + authorityIdentify: { + type: DataTypes.STRING(255), + allowNull: false + }, + authorityDescribe: { + type: DataTypes.STRING(255), + allowNull: false + }, + father: { + type: DataTypes.INTEGER, + allowNull: false + }, + avatar: { + type: DataTypes.STRING(255), + allowNull: false + }, + status: { + type: DataTypes.STRING(255), + allowNull: false, + comment: "禁用启用" + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "" + } + }, { + sequelize, + tableName: 'lauchuserstructauthority', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "authorityStructId" }, + ] + }, + ] + }); +}; diff --git a/gen-Model/models/lauchuserstructorganization.js b/gen-Model/models/lauchuserstructorganization.js new file mode 100644 index 0000000..0975916 --- /dev/null +++ b/gen-Model/models/lauchuserstructorganization.js @@ -0,0 +1,54 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserstructorganization', { + organizationStructId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + organizationType: { + type: DataTypes.STRING(255), + allowNull: false + }, + organizationName: { + type: DataTypes.STRING(255), + allowNull: false + }, + organizationDescribe: { + type: DataTypes.STRING(255), + allowNull: false + }, + father: { + type: DataTypes.INTEGER.UNSIGNED.ZEROFILL, + allowNull: false + }, + isDefault: { + type: DataTypes.STRING(255), + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "" + } + }, { + sequelize, + tableName: 'lauchuserstructorganization', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "organizationStructId" }, + ] + }, + ] + }); +}; diff --git a/gen-Model/models/lauchuserstructrelationorganizationaccent.js b/gen-Model/models/lauchuserstructrelationorganizationaccent.js new file mode 100644 index 0000000..97c33f9 --- /dev/null +++ b/gen-Model/models/lauchuserstructrelationorganizationaccent.js @@ -0,0 +1,42 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserstructrelationorganizationaccent', { + organizationRelationAccentId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + uuid: { + type: DataTypes.UUID, + allowNull: false + }, + organizationStruct: { + type: DataTypes.INTEGER, + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "" + } + }, { + sequelize, + tableName: 'lauchuserstructrelationorganizationaccent', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "organizationRelationAccentId" }, + ] + }, + ] + }); +}; diff --git a/gen-Model/models/lauchuserstructrelationorganizationauthority.js b/gen-Model/models/lauchuserstructrelationorganizationauthority.js new file mode 100644 index 0000000..6417ae4 --- /dev/null +++ b/gen-Model/models/lauchuserstructrelationorganizationauthority.js @@ -0,0 +1,42 @@ +const Sequelize = require('sequelize'); +module.exports = function(sequelize, DataTypes) { + return sequelize.define('lauchuserstructrelationorganizationauthority', { + organizationRelationAuthorityId: { + autoIncrement: true, + type: DataTypes.INTEGER, + allowNull: false, + primaryKey: true + }, + organizationStruct: { + type: DataTypes.INTEGER, + allowNull: false + }, + authorityStruct: { + type: DataTypes.INTEGER, + allowNull: false + }, + createTime: { + type: DataTypes.DATE, + allowNull: false + }, + isDelete: { + type: DataTypes.STRING(64), + allowNull: false, + defaultValue: "" + } + }, { + sequelize, + tableName: 'lauchuserstructrelationorganizationauthority', + timestamps: false, + indexes: [ + { + name: "PRIMARY", + unique: true, + using: "BTREE", + fields: [ + { name: "organizationRelationAuthorityId" }, + ] + }, + ] + }); +}; diff --git a/gen-Model/使用方式.md b/gen-Model/使用方式.md new file mode 100644 index 0000000..c6f1650 --- /dev/null +++ b/gen-Model/使用方式.md @@ -0,0 +1 @@ +sequelize-auto -h 数据库的IP地址 -d 数据库名 -u 用户名 -x 密码 -p 端口 -t 表名 diff --git a/graphResource2数据结构.xmind b/graphResource2数据结构.xmind new file mode 100644 index 0000000000000000000000000000000000000000..e675fa42ab10448fc619fc3f711a61505b02fcd7 GIT binary patch literal 201481 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.10.0'} + dev: true + + /@colors/colors@1.6.0: + resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} + engines: {node: '>=0.1.90'} + dev: false + + /@dabh/diagnostics@2.0.3: + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: false + + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.54.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@pkgr/utils@2.4.2: + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + fast-glob: 3.3.2 + is-glob: 4.0.3 + open: 9.1.0 + picocolors: 1.0.0 + tslib: 2.6.2 + dev: true + + /@types/accepts@1.3.7: + resolution: {integrity: sha512-Pay9fq2lM2wXPWbteBsRAGiWH2hig4ZE2asK+mm7kUzlxRTfL961rj89I6zV/E3PcIkDqyuBEcMxFT7rccugeQ==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.10.0 + dev: false + + /@types/co-body@6.1.3: + resolution: {integrity: sha512-UhuhrQ5hclX6UJctv5m4Rfp52AfG9o9+d9/HwjxhVB5NjXxr5t9oKgJxN8xRHgr35oo8meUEHUPFWiKg6y71aA==} + dependencies: + '@types/node': 20.10.0 + '@types/qs': 6.9.10 + dev: false + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@types/content-disposition@0.5.8: + resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + dev: false + + /@types/cookies@0.7.10: + resolution: {integrity: sha512-hmUCjAk2fwZVPPkkPBcI7jGLIR5mg4OVoNMBwU6aVsMm/iNPY7z9/R+x2fSwLt/ZXoGua6C5Zy2k5xOo9jUyhQ==} + dependencies: + '@types/connect': 3.4.38 + '@types/express': 4.17.21 + '@types/keygrip': 1.0.6 + '@types/node': 20.10.0 + dev: false + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + + /@types/express-serve-static-core@4.17.41: + resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} + dependencies: + '@types/node': 20.10.0 + '@types/qs': 6.9.10 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: false + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.17.41 + '@types/qs': 6.9.10 + '@types/serve-static': 1.15.5 + dev: false + + /@types/formidable@2.0.6: + resolution: {integrity: sha512-L4HcrA05IgQyNYJj6kItuIkXrInJvsXTPC5B1i64FggWKKqSL+4hgt7asiSNva75AoLQjq29oPxFfU4GAQ6Z2w==} + dependencies: + '@types/node': 20.10.0 + dev: false + + /@types/http-assert@1.5.5: + resolution: {integrity: sha512-4+tE/lwdAahgZT1g30Jkdm9PzFRde0xwxBNUyRsCitRvCQB90iuA2uJYdUnhnANRcqGXaWOGY4FEoxeElNAK2g==} + dev: false + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: false + + /@types/keygrip@1.0.6: + resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} + dev: false + + /@types/koa-compose@3.2.8: + resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==} + dependencies: + '@types/koa': 2.13.12 + dev: false + + /@types/koa@2.13.12: + resolution: {integrity: sha512-vAo1KuDSYWFDB4Cs80CHvfmzSQWeUb909aQib0C0aFx4sw0K9UZFz2m5jaEP+b3X1+yr904iQiruS0hXi31jbw==} + dependencies: + '@types/accepts': 1.3.7 + '@types/content-disposition': 0.5.8 + '@types/cookies': 0.7.10 + '@types/http-assert': 1.5.5 + '@types/http-errors': 2.0.4 + '@types/keygrip': 1.0.6 + '@types/koa-compose': 3.2.8 + '@types/node': 20.10.0 + dev: false + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: false + + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + dev: false + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + /@types/node@20.10.0: + resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} + dependencies: + undici-types: 5.26.5 + + /@types/qs@6.9.10: + resolution: {integrity: sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==} + dev: false + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: false + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.10.0 + dev: false + + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/mime': 3.0.4 + '@types/node': 20.10.0 + dev: false + + /@types/triple-beam@1.3.5: + resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} + dev: false + + /@types/validator@13.11.7: + resolution: {integrity: sha512-q0JomTsJ2I5Mv7dhHhQLGjMvX0JJm5dyZ1DXQySIUzU1UlwzB8bt+R6+LODUbz0UDIOvEzGc28tk27gBJw2N8Q==} + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: true + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv-errors@3.0.0(ajv@8.12.0): + resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} + peerDependencies: + ajv: ^8.0.1 + dependencies: + ajv: 8.12.0 + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: false + + /async-ratelimiter@1.3.12: + resolution: {integrity: sha512-W7WWxWMjJ+XEZCyQhEWGrskqDgz3k2UWM/aUlatSl3ejFLwpM/G90AYSgkHHXeY2S53fiP204GITnmIxrJMsSQ==} + engines: {node: '>= 8'} + dev: false + + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.52 + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: false + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: false + + /call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + dependencies: + function-bind: 1.1.2 + get-intrinsic: 1.2.2 + set-function-length: 1.1.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /co-body@6.1.0: + resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} + dependencies: + inflation: 2.1.0 + qs: 6.11.2 + raw-body: 2.5.2 + type-is: 1.6.18 + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: false + + /colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + dev: false + + /compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: false + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@3.2.7(supports-color@5.5.0): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 + dev: true + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + dev: false + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true + + /default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true + + /define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: false + + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: false + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /dottie@2.0.6: + resolution: {integrity: sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==} + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-prettier@9.0.0(eslint@8.54.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.54.0 + dev: true + + /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.0.0)(eslint@8.54.0)(prettier@3.1.0): + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.54.0 + eslint-config-prettier: 9.0.0(eslint@8.54.0) + prettier: 3.1.0 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.5 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.54.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /express-useragent@1.0.15: + resolution: {integrity: sha512-eq5xMiYCYwFPoekffMjvEIk+NWdlQY9Y38OsTyl13IvA728vKT+q/CSERYWzcw93HGBJcIqMIsZC5CZGARPVdg==} + engines: {node: '>=4.5'} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: false + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /file-stream-rotator@0.6.1: + resolution: {integrity: sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==} + dependencies: + moment: 2.29.4 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + dev: false + + /formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + dependencies: + dezalgo: 1.0.4 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.11.2 + dev: false + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + dependencies: + function-bind: 1.1.2 + has-proto: 1.0.1 + has-symbols: 1.0.3 + hasown: 2.0.0 + dev: false + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + dependencies: + get-intrinsic: 1.2.2 + dev: false + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: false + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + dev: false + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true + + /humanize-number@0.0.2: + resolution: {integrity: sha512-un3ZAcNQGI7RzaWGZzQDH47HETM4Wrj6z6E4TId8Yeq9w5ZKUVB1nrT2jwFheTUjEmqcgTjXDc959jum+ai1kQ==} + dev: false + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /ignore-by-default@1.0.1: + resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + dev: true + + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflation@2.1.0: + resolution: {integrity: sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==} + engines: {node: '>= 0.8.0'} + dev: false + + /inflection@1.13.4: + resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==} + engines: {'0': node >= 0.4.0} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + dependencies: + tsscmp: 1.0.6 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /koa-body@6.0.1: + resolution: {integrity: sha512-M8ZvMD8r+kPHy28aWP9VxL7kY8oPWA+C7ZgCljrCMeaU7uX6wsIQgDHskyrAr9sw+jqnIXyv4Mlxri5R4InIJg==} + dependencies: + '@types/co-body': 6.1.3 + '@types/formidable': 2.0.6 + '@types/koa': 2.13.12 + co-body: 6.1.0 + formidable: 2.1.2 + zod: 3.22.4 + dev: false + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + dev: false + + /koa-compress@5.1.1: + resolution: {integrity: sha512-UgMIN7ZoEP2DuoSQmD6CYvFSLt0NReGlc2qSY4bO4Oq0L56OiD9pDG41Kj/zFmVY/A3Wvmn4BqKcfq5H30LGIg==} + engines: {node: '>= 12'} + dependencies: + bytes: 3.1.2 + compressible: 2.0.18 + http-errors: 1.8.1 + koa-is-json: 1.0.0 + dev: false + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: false + + /koa-is-json@1.0.0: + resolution: {integrity: sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==} + dev: false + + /koa-json-error@3.1.2: + resolution: {integrity: sha512-nqfNwD4W+hYaJijFl+6qNSQJHbTS4vp+gXTdXl5U8YK2PVNzCF0HnLZwyKHaMeBebhanAgmfheQv96wLDjLRxg==} + engines: {node: '>=6.0.0'} + dependencies: + lodash.compact: 3.0.1 + lodash.curry: 4.1.1 + dev: false + + /koa-logger@3.2.1: + resolution: {integrity: sha512-MjlznhLLKy9+kG8nAXKJLM0/ClsQp/Or2vI3a5rbSQmgl8IJBQO0KI5FA70BvW+hqjtxjp49SpH2E7okS6NmHg==} + engines: {node: '>= 7.6.0'} + dependencies: + bytes: 3.1.2 + chalk: 2.4.2 + humanize-number: 0.0.2 + passthrough-counter: 1.0.0 + dev: false + + /koa-ratelimit@5.0.1: + resolution: {integrity: sha512-H7IEkNS/b18Uwtm3RIvAK3orJE8ew8wEBsnezlQWz7GTWqEnDtbTNfTedVXjj07gyh8gWTkEdODEXRquGCBqmg==} + engines: {node: '>= 10'} + dependencies: + async-ratelimiter: 1.3.12 + debug: 4.3.4 + ms: 2.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-router@12.0.1: + resolution: {integrity: sha512-gaDdj3GtzoLoeosacd50kBBTnnh3B9AYxDThQUo4sfUyXdOhY6ku1qyZKW88tQCRgc3Sw6ChXYXWZwwgjOxE0w==} + engines: {node: '>= 12'} + dependencies: + debug: 4.3.4 + http-errors: 2.0.0 + koa-compose: 4.1.0 + methods: 1.1.2 + path-to-regexp: 6.2.1 + transitivePeerDependencies: + - supports-color + dev: false + + /koa-useragent@4.1.0: + resolution: {integrity: sha512-x/HUDZ1zAmNNh5hA9hHbPm9p3UVg2prlpHzxCXQCzbibrNS0kmj7MkCResCbAbG7ZT6FVxNSMjR94ZGamdMwxA==} + engines: {node: '>=7.6.0'} + dependencies: + express-useragent: 1.0.15 + dev: false + + /koa@2.14.2: + resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + + /kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: false + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.compact@3.0.1: + resolution: {integrity: sha512-2ozeiPi+5eBXW1CLtzjk8XQFhQOEMwwfxblqeq6EGyTxZJ1bPATqilY0e6g2SLQpP4KuMeuioBhEnWz5Pr7ICQ==} + dev: false + + /lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /logform@2.6.0: + resolution: {integrity: sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@types/triple-beam': 1.3.5 + fecha: 4.2.3 + ms: 2.1.2 + safe-stable-stringify: 2.4.3 + triple-beam: 1.4.1 + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + /lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /moment-timezone@0.5.43: + resolution: {integrity: sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==} + dependencies: + moment: 2.29.4 + + /moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /mysql2@3.6.5: + resolution: {integrity: sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==} + engines: {node: '>= 8.0'} + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + + /named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + dependencies: + lru-cache: 7.18.3 + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /nodemon@3.0.1: + resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + chokidar: 3.5.3 + debug: 3.2.7(supports-color@5.5.0) + ignore-by-default: 1.0.1 + minimatch: 3.1.2 + pstree.remy: 1.1.8 + semver: 7.5.4 + simple-update-notifier: 2.0.0 + supports-color: 5.5.0 + touch: 3.1.0 + undefsafe: 2.0.5 + dev: true + + /nopt@1.0.10: + resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /object-hash@2.2.0: + resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} + engines: {node: '>= 6'} + dev: false + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: false + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + dev: false + + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: false + + /passthrough-counter@1.0.0: + resolution: {integrity: sha512-Wy8PXTLqPAN0oEgBrlnsXPMww3SYJ44tQ8aVrGAI4h4JZYCS0oYqsPqtPR8OhJpv6qFbpbB7XAn0liKV7EXubA==} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@3.1.0: + resolution: {integrity: sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pstree.remy@1.1.8: + resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /reserved-words@0.1.2: + resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /retry-as-promised@7.0.4: + resolution: {integrity: sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==} + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + + /sequelize-auto@0.8.8(sequelize@6.35.1): + resolution: {integrity: sha512-9o0qi2yMA86oFqcA5Nh14PnQSHP0E9WPEB4hP/NgxqdFE44Nq2u8Di5O3xmvWwXMIV6W+Q0YI/2VTLvlMJAjnQ==} + engines: {node: '>= 10'} + hasBin: true + peerDependencies: + sequelize: '>3.30.0' + dependencies: + lodash: 4.17.21 + mkdirp: 1.0.4 + reserved-words: 0.1.2 + sequelize: 6.35.1(mysql2@3.6.5) + yargs: 16.2.0 + dev: true + + /sequelize-pool@7.1.0: + resolution: {integrity: sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==} + engines: {node: '>= 10.0.0'} + + /sequelize@6.35.1(mysql2@3.6.5): + resolution: {integrity: sha512-UlP5k33nJsN11wCDLaWZXw9bB8w4ESKc5QmG6D04qMimwBwKVNeqRJiaaBlEJdtg8cRK+OJh95dliP+uEi+g9Q==} + engines: {node: '>=10.0.0'} + peerDependencies: + ibm_db: '*' + mariadb: '*' + mysql2: '*' + oracledb: '*' + pg: '*' + pg-hstore: '*' + snowflake-sdk: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + ibm_db: + optional: true + mariadb: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-hstore: + optional: true + snowflake-sdk: + optional: true + sqlite3: + optional: true + tedious: + optional: true + dependencies: + '@types/debug': 4.1.12 + '@types/validator': 13.11.7 + debug: 4.3.4 + dottie: 2.0.6 + inflection: 1.13.4 + lodash: 4.17.21 + moment: 2.29.4 + moment-timezone: 0.5.43 + mysql2: 3.6.5 + pg-connection-string: 2.6.2 + retry-as-promised: 7.0.4 + semver: 7.5.4 + sequelize-pool: 7.1.0 + toposort-class: 1.0.1 + uuid: 8.3.2 + validator: 13.11.0 + wkx: 0.5.0 + transitivePeerDependencies: + - supports-color + + /set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.1 + get-intrinsic: 1.2.2 + gopd: 1.0.1 + has-property-descriptors: 1.0.1 + dev: false + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.5 + get-intrinsic: 1.2.2 + object-inspect: 1.13.1 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /simple-update-notifier@2.0.0: + resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: false + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/utils': 2.4.2 + tslib: 2.6.2 + dev: true + + /text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false + + /toposort-class@1.0.1: + resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==} + + /touch@3.1.0: + resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + hasBin: true + dependencies: + nopt: 1.0.10 + dev: true + + /triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: true + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + + /undefsafe@2.0.5: + resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /winston-daily-rotate-file@4.7.1(winston@3.11.0): + resolution: {integrity: sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==} + engines: {node: '>=8'} + peerDependencies: + winston: ^3 + dependencies: + file-stream-rotator: 0.6.1 + object-hash: 2.2.0 + triple-beam: 1.4.1 + winston: 3.11.0 + winston-transport: 4.6.0 + dev: false + + /winston-transport@4.6.0: + resolution: {integrity: sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==} + engines: {node: '>= 12.0.0'} + dependencies: + logform: 2.6.0 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + dev: false + + /winston@3.11.0: + resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.6.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.5 + is-stream: 2.0.1 + logform: 2.6.0 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.4.3 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.6.0 + dev: false + + /wkx@0.5.0: + resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} + dependencies: + '@types/node': 20.10.0 + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false diff --git a/production.env.js b/production.env.js new file mode 100644 index 0000000..a3aad51 --- /dev/null +++ b/production.env.js @@ -0,0 +1,43 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: production.env.js - +// | @创建时间: 2023-11-25 21:36 +// | @更新时间: 2023-11-25 21:36 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + + +const prodConfig = { + appName: 'graphResource2', + port: 3000, + zip: true, + upfile:{ + maxFileSize: 200 * 1024 * 1024, + hashAlgorithm: false, // md5 sha1 sha256 sha512 + }, + request:{ + maxFieldsSize: 2 * 1024 * 1024,// 请求体大小 + }, + ratelimit:{ + // 同设备(IP)限制登陆次数 + status: true, + duration: 60 * 1000, + max: 3, + }, + database:{ + mysql:{ + host: '127.0.0.1', + port: 3306, + username: 'root', + password: 'root', + database: 'graph_resource2' + } + } +} + +export default prodConfig diff --git a/src/app.js b/src/app.js new file mode 100644 index 0000000..872b513 --- /dev/null +++ b/src/app.js @@ -0,0 +1,125 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: app.js - Koa项目的入口文件 +// | @创建时间: 2023-11-25 20:58 +// | @更新时间: 2023-11-25 20:58 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Koa from 'koa'; +import koaLogger from 'koa-logger'; +import compress from 'koa-compress'; +import ratelimit from 'koa-ratelimit'; +import handleError from 'koa-json-error'; +import { koaBody } from 'koa-body'; +import { userAgent } from 'koa-useragent'; + +import rootRouter from '#routes/index.js'; + +export default function startApp() { + const app = new Koa(); + if (global.ENV === 'development') { + // | 开启自带日志 + app.use(koaLogger()); + } + + if (config.ratelimit.status) { + // | 限制同一用户的频繁请求 + app.use( + ratelimit({ + driver: 'memory', // 存储限流数据的驱动,这里使用内存驱动 + db: new Map(), // 存储被限制的客户端信息的数据结构 + duration: config.ratelimit.duration, // 时间窗口,单位毫秒 + max: config.ratelimit.max, // 时间窗口内允许的最大请求数量 + id: (ctx) => ctx.ip, // 提取每个请求的唯一标识符,默认使用请求的 IP 地址 + }), + ); + } + + app.use( + handleError({ + format: (err) => { + // 返回错误的格式 + switch (err.status) { + case 400: { + return { + code: err.status, + message: err.e, + }; + break; + } + default: { + return { + code: err.status, + message: err.message, + result: ENV === 'development' && err.stack, + }; + } + } + }, + postFormat: (err, obj) => { + //根据不同环境,返回不同格式的错误信息 + const { result, ...rest } = obj; + return process.env.NODE_ENV == 'production' ? rest : obj; + }, + }), + ); + + // 响应封装中间件 + async function responseHandler(ctx, next) { + // 执行后续中间件 + await next(); + // 如果有响应且没有错误状态码 + if (ctx.response.is('json') && ![404, 204].includes(ctx.status)) { + // 封装响应体为标准格式 + ctx.body = { + code: ctx.status, + success: true, + data: ctx.body, + }; + } + } + + // 在路由之前加载响应封装中间件 + app.use(responseHandler); + + if (global.zip === true) { + // | koa-compress 是一个 Koa 中间件,用于压缩 HTTP 响应。使用该中间件可减少 HTTP 响应的大小,从而提升应用程序的性能。 + app.use(compress()); + } + app.use(userAgent); + + app.use( + koaBody({ + multipart: true, // 支持文件上传 + detectJSON: true, + gzip: true, + // encoding: 'gzip', + formidable: { + // uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录 + keepExtensions: true, // 保持文件的后缀 + maxFileSize: config.upfile.maxFileSize, // 文件上传大小 + maxFieldsSize: config.request.maxFieldsSize, // 除文件外的数据大小 + onFileBegin: (name, file) => { + // 文件上传前的设置 + }, + hashAlgorithm: config.upfile.hashAlgorithm, + }, + }), + ); + + app.use(rootRouter.routes()); + app.use(rootRouter.allowedMethods()); + + // console.log(rootRouter) + + const routes = rootRouter.stack.map((route) => route.path); + // console.log(routes); + + return app; +} diff --git a/src/cache/index.js b/src/cache/index.js new file mode 100644 index 0000000..5972a5e --- /dev/null +++ b/src/cache/index.js @@ -0,0 +1,43 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.js - +// | @创建时间: 2023-12-01 21:38 +// | @更新时间: 2023-12-01 21:38 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import {Op} from "sequelize"; + +export async function createCatch(sequelize){ + global.resourceCache = {} + // atomModelCache + const atomModelPoolStartTime = performance.now() + const atomModelPool = await makeAtomModelCache(sequelize) + global.resourceCache.atomModelPool = atomModelPool + const atomModelPoolEndTime = performance.now() + logger.fatal(`元分类/模型缓存加载完毕: atomModelPool - ${atomModelPoolEndTime - atomModelPoolStartTime} ms`) +} + +async function makeAtomModelCache(sequelize){ + const atomModelList = await sequelize.models.AtomModel.findAll({ + attributes:['*'], + where: { + isDelete:{ + [Op.is]: null, + } + }, + raw: true, // 原始数据 + mapToModel: true, // 将下划线变成驼峰 + }); + const atomModelPool = { + length: atomModelList.length, + createtime: new Date().getTime(), + updatetime: new Date().getTime(), + data: atomModelList + } + return atomModelPool +} diff --git a/src/common/database/dataModels/atomModel.dataModel.js b/src/common/database/dataModels/atomModel.dataModel.js new file mode 100644 index 0000000..0ac150e --- /dev/null +++ b/src/common/database/dataModels/atomModel.dataModel.js @@ -0,0 +1,61 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: atomModel.dataModel.js - +// | @创建时间: 2023-12-01 13:45 +// | @更新时间: 2023-12-01 13:45 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import {Model} from 'sequelize'; + +export function mountAtomModel(sequelize, DataTypes) { + class AtomModel extends Model { + } + + AtomModel.init({ + // 在这里定义模型属性 + atomModelId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '元分类/模型ID' + }, + atomModelName: { + type: DataTypes.STRING, + allowNull: false, + comment: '元分类/模型名称' + }, + atomModelDescribe: { + type: DataTypes.STRING(2048), + allowNull: false, + comment: '元分类/模型描述' + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'AtomModel', // 我们需要选择模型名称 + // tableName: 'atom_model', + comment: "元分类/模型表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return AtomModel +} diff --git a/src/common/database/dataModels/baseDict.dataModel.js b/src/common/database/dataModels/baseDict.dataModel.js new file mode 100644 index 0000000..bd346ce --- /dev/null +++ b/src/common/database/dataModels/baseDict.dataModel.js @@ -0,0 +1,83 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: baseDict.dataModel.js - +// | @创建时间: 2023-12-01 14:37 +// | @更新时间: 2023-12-01 14:37 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import {Model} from 'sequelize'; + +export function mountBaseDict(sequelize, DataTypes) { + class BaseDict extends Model { + } + + BaseDict.init({ + // 在这里定义模型属性 + baseDictId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '基础字典Id' + }, + atomModel: { + type: DataTypes.INTEGER, + allowNull: true, + comment: '元分类/模型Id' + }, + baseDictIsBase: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '是否为基础字典(0是自定义,1是基础)', + defaultValue: 0, + }, + baseDictOriginType: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '模型数据来源(0是系统内,1是系统外)', + defaultValue: 0, + }, + baseDictName:{ + type: DataTypes.STRING, + allowNull: false, + comment: "字典项名称" + }, + baseDictDescribe:{ + type: DataTypes.STRING(2048), + comment: "字典项名描述" + }, + baseDictFather:{ + type: DataTypes.INTEGER, + allowNull: false, + comment: "字典项父级", + defaultValue: 0, + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'BaseDict', // 我们需要选择模型名称 + // tableName: 'baseDict', + comment: "基础字典表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return BaseDict +} diff --git a/src/common/database/dataModels/resourceClassBase.dataModel.js b/src/common/database/dataModels/resourceClassBase.dataModel.js new file mode 100644 index 0000000..fb58daa --- /dev/null +++ b/src/common/database/dataModels/resourceClassBase.dataModel.js @@ -0,0 +1,103 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceClassBase.dataModel.js - +// | @创建时间: 2023-12-01 14:56 +// | @更新时间: 2023-12-01 14:56 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: atomModel.dataModel.js - +// | @创建时间: 2023-12-01 13:45 +// | @更新时间: 2023-12-01 13:45 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import { Model } from 'sequelize'; + +export function mountResourceClassBase(sequelize, DataTypes) { + class ResourceClassBase extends Model {} + + ResourceClassBase.init( + { + // 在这里定义模型属性 + resourceClassBaseId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '资源类ID', + }, + atomModel: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '元分类/模型Id', + }, + resourceClassBaseDefine:{ + type: DataTypes.INTEGER, + comment: "对资源类的定义,方便建立资源结构,来源于基础字典。" + }, + resourceClassBaseIdentify:{ + type: DataTypes.STRING(8), + allowNull: false, + comment: '资源类标识', + }, + resourceClassBaseName:{ + type: DataTypes.STRING, + allowNull: false, + comment: '资源类名', + }, + resourceClassBaseDescribe: { + type: DataTypes.STRING(2048), + comment: '资源类描述', + }, + resourceClassBaseType:{ + type: DataTypes.INTEGER, + allowNull: false, + comment: "对资源类的分类,0实体、1虚拟、2管理。", + defaultValue: 0, + }, + resourceClassBaseColor:{ + type: DataTypes.STRING, + comment: '资源类名', + }, + resourceClassBaseAvatar:{ + type: DataTypes.STRING, + comment: '资源类图标', + }, + creator: { + type: DataTypes.STRING, + comment: '创建人', + }, + isDelete: { + type: DataTypes.STRING(64), + comment: '删除时间', + }, + }, + { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceClassBase', // 我们需要选择模型名称 + // tableName: 'ResourceClassBase', + comment: '资源类基础表', + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }, + ); + + return ResourceClassBase; +} diff --git a/src/common/database/dataModels/resourceClassExpandField.dataModel.js b/src/common/database/dataModels/resourceClassExpandField.dataModel.js new file mode 100644 index 0000000..c7aaf36 --- /dev/null +++ b/src/common/database/dataModels/resourceClassExpandField.dataModel.js @@ -0,0 +1,83 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceClassExpandField.dataModel.js - +// | @创建时间: 2023-12-01 15:12 +// | @更新时间: 2023-12-01 15:12 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import { Model } from 'sequelize'; + +export function mountResourceClassExpandField(sequelize, DataTypes) { + class ResourceClassExpandField extends Model {} + + ResourceClassExpandField.init( + { + // 在这里定义模型属性 + resourceClassExpandFieldId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '资源类拓展字段ID', + }, + resourceClassBase: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '资源类ID', + }, + resourceClassExpandFieldName: { + type: DataTypes.STRING, + allowNull: false, + comment: '资源类拓展字段名', + }, + resourceClassExpandFieldIdentify: { + type: DataTypes.STRING(64), + allowNull: false, + comment: '资源类拓展字段标识', + }, + resourceClassExpandFieldDisplayType: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '显示类型,后期在字典添加', + defaultValue:0 + }, + resourceClassExpandFieldRelationType: { + type: DataTypes.INTEGER, + comment: '拓展字段关联类型,0字典,1资源类', + }, + resourceClassExpandFieldValue: { + type: DataTypes.STRING, + allowNull: false, + comment: '资源类拓展字段值', + }, + creator: { + type: DataTypes.STRING, + comment: '创建人', + }, + isDelete: { + type: DataTypes.STRING(64), + comment: '删除时间', + }, + }, + { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceClassExpandField', // 我们需要选择模型名称 + // tableName: 'ResourceClassExpandField', + comment: '资源类拓展字段表', + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }, + ); + + return ResourceClassExpandField; +} diff --git a/src/common/database/dataModels/resourceClassRelation.dataModel.js b/src/common/database/dataModels/resourceClassRelation.dataModel.js new file mode 100644 index 0000000..9bf13f6 --- /dev/null +++ b/src/common/database/dataModels/resourceClassRelation.dataModel.js @@ -0,0 +1,60 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceClassRelation.dataModel.js - +// | @创建时间: 2023-12-01 15:23 +// | @更新时间: 2023-12-01 15:23 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import {Model} from 'sequelize'; + +export function mountResourceClassRelation(sequelize, DataTypes) { + class ResourceClassRelation extends Model { + } + + ResourceClassRelation.init({ + // 在这里定义模型属性 + resourceClassRelationId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '资源类关系ID' + }, + resourceClassRelationTarget: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '目标资源类ID' + }, + resourceClassRelationFather: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '父资源类ID' + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceClassRelation', // 我们需要选择模型名称 + // tableName: 'ResourceClassRelation', + comment: "资源类关系表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return ResourceClassRelation +} diff --git a/src/common/database/dataModels/resourceEntityRelation.dataModel.js b/src/common/database/dataModels/resourceEntityRelation.dataModel.js new file mode 100644 index 0000000..ed615a2 --- /dev/null +++ b/src/common/database/dataModels/resourceEntityRelation.dataModel.js @@ -0,0 +1,60 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceEntityRelation.dataModel.js - +// | @创建时间: 2023-12-01 15:23 +// | @更新时间: 2023-12-01 15:23 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import {Model} from 'sequelize'; + +export function mountResourceEntityRelation(sequelize, DataTypes) { + class ResourceEntityRelation extends Model { + } + + ResourceEntityRelation.init({ + // 在这里定义模型属性 + resourceEntityRelationId: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '资源关系ID' + }, + resourceEntityRelationTarget: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '目标资源ID' + }, + resourceEntityRelationFather: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '父资源ID' + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceEntityRelation', // 我们需要选择模型名称 + // tableName: 'ResourceEntityRelation', + comment: "资源实体关系表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return ResourceEntityRelation +} diff --git a/src/common/database/dataModels/resourceEntityStruct.dataModel.js b/src/common/database/dataModels/resourceEntityStruct.dataModel.js new file mode 100644 index 0000000..c2695db --- /dev/null +++ b/src/common/database/dataModels/resourceEntityStruct.dataModel.js @@ -0,0 +1,130 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: resourceEntityStruct.dataModel.js - +// | @创建时间: 2023-12-01 15:38 +// | @更新时间: 2023-12-01 15:38 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import {Model} from 'sequelize'; + +export function mountResourceEntityStruct(sequelize, DataTypes) { + class ResourceEntityStruct extends Model { + } + + ResourceEntityStruct.init({ + // 在这里定义模型属性 + resourceEntityStructId: { + type: DataTypes.INTEGER, + // type: DataTypes.STRING, + autoIncrement: true, + primaryKey: true, + allowNull: false, + comment: '元分类/模型ID' + }, + resourceClassBase: { + type: DataTypes.INTEGER, + allowNull: false, + comment: '资源类ID', + }, + resourceEntityStructName:{ + type: DataTypes.STRING, + allowNull: false, + comment: '资源实体字段名', + }, + resourceEntityStructIdentify:{ + type: DataTypes.STRING(64), + allowNull: false, + comment: '资源实体字段标识', + }, + resourceEntityStructNickname:{ + type: DataTypes.STRING, + comment: '资源实体字段别名', + }, + resourceEntityStructDescribe:{ + type: DataTypes.STRING(2048), + comment: '资源实体字段描述', + }, + resourceEntityStructRank:{ + type: DataTypes.INTEGER, + comment: '资源实体字段排序', + default:0, + }, + resourceEntityStructStorageType:{ + type: DataTypes.INTEGER, + allowNull: false, + comment: '资源实体字段在数据库中存储的类型', + }, + resourceEntityStructStorageLength:{ + type: DataTypes.INTEGER, + allowNull: false, + comment: '资源实体字段在数据库中存储的长度', + defaultValue: 20, + }, + resourceEntityStructDisplayType:{ + type: DataTypes.INTEGER, + allowNull: false, + comment: '资源实体字段显示类型', + defaultValue: 0, + }, + resourceEntityStructIsGather:{ + type: DataTypes.BOOLEAN, + allowNull: false, + comment: '资源实体字段是否采集(0是采集、1是不采集)', + defaultValue: 0, + }, + resourceEntityStructAppIsShow:{ + type: DataTypes.BOOLEAN, + allowNull: false, + comment: '资源实体字段是否显示在APP上(0是显示、1是不显示)', + defaultValue: 0, + }, + resourceEntityStructWebIsShow:{ + type: DataTypes.BOOLEAN, + allowNull: false, + comment: '资源实体字段是否显示在Web上(0是显示、1是不显示)', + defaultValue: 0, + }, + resourceEntityStructAppNickname:{ + type: DataTypes.STRING, + comment: '资源实体字段APP别名', + }, + resourceEntityStructWebNickname:{ + type: DataTypes.STRING, + comment: '资源实体字段Web别名', + }, + resourceEntityStructRelationType:{ + type: DataTypes.INTEGER, + comment: '资源实体字段关联类型', + }, + resourceEntityStructRelationValue:{ + type: DataTypes.INTEGER, + comment: '资源实体字段关联值', + }, + creator:{ + type: DataTypes.STRING, + comment: "创建人" + }, + isDelete:{ + type: DataTypes.STRING(64), + comment: "删除时间" + } + }, { + // 这是其他模型参数 + sequelize, // 我们需要传递连接实例 + modelName: 'ResourceEntityStruct', // 我们需要选择模型名称 + // tableName: 'ResourceEntityStruct', + comment: "资源实体字段结构表", + timestamps: true, // 不要忘记启用时间戳! + createdAt: 'createTimestamp', // 不想要 createdAt + // 想要 updatedAt 但是希望名称叫做 updateTimestamp + updatedAt: 'updateTimestamp', + underscored: true, // 改成下划线格式 + }); + + return ResourceEntityStruct +} diff --git a/src/common/database/index.js b/src/common/database/index.js new file mode 100644 index 0000000..45b97f9 --- /dev/null +++ b/src/common/database/index.js @@ -0,0 +1,60 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: expressgy-web-lauch +// | @文件描述: index.js - +// | @创建时间: 2023-11-28 22:27 +// | @更新时间: 2023-11-28 22:27 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import { Sequelize, DataTypes } from 'sequelize'; + +import { mountAtomModel } from '#dataModels/atomModel.dataModel.js'; +import { mountBaseDict } from '#dataModels/baseDict.dataModel.js'; +import { mountResourceClassBase } from '#dataModels/resourceClassBase.dataModel.js'; +import { mountResourceClassExpandField } from '#dataModels/resourceClassExpandField.dataModel.js'; +import {mountResourceClassRelation} from "#dataModels/resourceClassRelation.dataModel.js"; +import {mountResourceEntityStruct} from "#dataModels/resourceEntityStruct.dataModel.js"; +import {mountResourceEntityRelation} from "#dataModels/resourceEntityRelation.dataModel.js"; + +// import prodConfig from "#root/production.env.js"; +// +// global.config = prodConfig + +export default function createDatabase(logger) { + const { database, username, password, host, port } = + global.config.database.mysql; + console.log(database, username, password, host, port); + const sequelize = new Sequelize(database, username, password, { + host, + dialect: 'mysql', // 根据你的数据库类型修改 + underscored: true, + timezone: '+08:00', // 时区设置为东八区 + dialectOptions: { + dateStrings: true, // 将所有日期字段值转换成字符串格式 + typeCast: true, // 允许将字符串类型的日期字段值自动转换为 Date 类型 + }, + // 以下为一些额外配置选项 + // pool: { + // max: 5, + // min: 0, + // acquire: 30000, + // idle: 10000 + // }, + logging: logger.debug.bind(logger), + }); + + mountAtomModel(sequelize, DataTypes); + mountBaseDict(sequelize, DataTypes); + mountResourceClassBase(sequelize, DataTypes); + mountResourceClassExpandField(sequelize, DataTypes); + mountResourceClassRelation(sequelize, DataTypes) + mountResourceEntityStruct(sequelize,DataTypes) + mountResourceEntityRelation(sequelize,DataTypes) + return sequelize; +} +// createDatabase() diff --git a/src/common/dto/index.js b/src/common/dto/index.js new file mode 100644 index 0000000..001ed61 --- /dev/null +++ b/src/common/dto/index.js @@ -0,0 +1,36 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 15:41 +// | @更新时间: 2023-11-26 15:41 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +import Ajv from 'ajv'; +import addAjvErrors from 'ajv-errors'; + +export default function makeDTO(data, schema) { + const ajv = new Ajv({ + allErrors: true, //多错误消息 + // jsonPointers: true, // 消息写在内部吗?? JSON 指针是一个字符串表示法,用于在 JSON 文档中指定特定的路径。它采用一种类似于文件路径的结构,通过使用斜杠 / 来分隔层级,例如 /path/to/property + coerceTypes: true, // 类型转换 + useDefaults: true + }); + + addAjvErrors(ajv); + const validate = ajv.compile(schema); + const valid = validate(data); + const message = { + status: true, + error: null, + }; + if (!valid) { + message.status = false; + message.error = validate.errors; + } + return message; +} diff --git a/src/common/logger/index.js b/src/common/logger/index.js new file mode 100644 index 0000000..55579ce --- /dev/null +++ b/src/common/logger/index.js @@ -0,0 +1,91 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 14:51 +// | @更新时间: 2023-11-26 14:51 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import winston from "winston"; +import "winston-daily-rotate-file" + + +// 自定义日志等级和颜色 +const myCustomLevels = { + levels:{ + fatal: 0, + error: 1, + warn: 2, + info: 3, + debug: 4, + trace: 5 + }, +// 字体样式:bold, dim,italic, underline, inverse, hidden, strikethrough +// 字体背景颜色:black, red, green, yellow, blue, magenta紫色, cyan青色, white, gray, grey +// 背景颜色:blackBG, redBG, greenBG, yellowBG, blueBG, magentaBG, cyanBG, whiteBG + levelsColor:{ + fatal: 'bold red cyanBG italic underline', + error: 'bold magenta', + warn: 'yellow', + info: 'green', + debug: 'cyan', + trace: 'white' + } +} +// 创建颜色方法 +export const colorizer = winston.format.colorize(); +colorizer.addColors(myCustomLevels.levelsColor) + +export const logger = winston.createLogger({ + level: 'trace', // 日志打印等级 + levels: myCustomLevels.levels,// 日志等级列表 + exitOnError: false,// 如果为false,处理异常不会导致process.exit + silent: false, // 如果为true,所有日志被抑制 + format: winston.format.combine( + winston.format.errors({ stack: true }), + winston.format.json(), + winston.format.timestamp({ format: "YYYY-MM-DD HH:mm:ss:SSS" }), + // winston.format.printf( + // (i) => { + // // const splatList = Array.from(Object.getOwnPropertySymbols(i)) + // // const splat = splatList && splatList.filter(item => item.toString() === 'Symbol(splat)') + // // const splatName = splat.length == 1 ? splat[0] : null + // // const data = splatName ? JSON.stringify([i.message, ...i[splatName]]) : JSON.stringify({message:i.message}) + // return `${i.timestamp} [${i.level.padEnd(5, ' ').toUpperCase()}] ${i.message}` + // }, + // ), + ), + transports: [ + new winston.transports.DailyRotateFile({ + filename: "winston-logs/%DATE%-INFO--winston.log", + level: "info", + datePattern: "YYYY-MM-DD", + zippedArchive: true,// 启用压缩 + maxSize: "10m",// 单文件大小 + maxFiles: "30d",// 存储时间 + }), + new winston.transports.DailyRotateFile({ + filename: "winston-logs/%DATE%-ERROR-winston.log", + level: "error", + datePattern: "YYYY-MM-DD", + zippedArchive: true, + maxSize: "10m", + maxFiles: "365d", + }), + ], + // winston可以捕获和记录异常 + // exceptionHandlers: [ + // new winston.transports.File({ filename: 'winston-logs/winston-exceptions.log' }) + // ], + // 捕获uncaughtRejection事件 + // rejectionHandlers: [ + // new winston.transports.File({ filename: 'winston-logs/rejections.log' }) + // ] +}); +// 后续加入记录器,这里可以加入环境变量的判断,当为生产模式时,取消控制台的打印操作。 + diff --git a/src/common/tools/getArrayPage.js b/src/common/tools/getArrayPage.js new file mode 100644 index 0000000..7f801d1 --- /dev/null +++ b/src/common/tools/getArrayPage.js @@ -0,0 +1,20 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: getArrayPage.js - +// | @创建时间: 2023-12-01 22:48 +// | @更新时间: 2023-12-01 22:48 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +export default function getPage(array, pageSize, pageNumber){ + const startIndex = (pageNumber - 1) * pageSize; + + // 使用 slice() 方法获取分页内容 + const pageContent = array.slice(startIndex, startIndex + pageSize); + return pageContent +} diff --git a/src/common/tools/getNoSpacesStr.js b/src/common/tools/getNoSpacesStr.js new file mode 100644 index 0000000..139a779 --- /dev/null +++ b/src/common/tools/getNoSpacesStr.js @@ -0,0 +1,16 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: getNoSpacesStr.js - +// | @创建时间: 2023-12-01 22:54 +// | @更新时间: 2023-12-01 22:54 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +export default function getNoSpacesStr(str){ + return str.replace(/\s/g, ''); +} diff --git a/src/routes/graphResource2/atomModel/index.dto.js b/src/routes/graphResource2/atomModel/index.dto.js new file mode 100644 index 0000000..bf2d915 --- /dev/null +++ b/src/routes/graphResource2/atomModel/index.dto.js @@ -0,0 +1,180 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.dto.js - +// | @创建时间: 2023-12-01 18:13 +// | @更新时间: 2023-12-01 18:13 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import makeDTO from '#common/dto/index.js'; + +export function CreateAtomModelItemDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelName: { + type: 'string', + minLength: 1, + maxLength: 255, + pattern: "^[a-zA-Z\\s]+$", + errorMessage: { + type: '元分类/模型名称必须是一个字符串', + maxLength: '元分类/模型名称长度超出限制255', + minLength: '元分类/模型名称长度过短', + pattern: '元分类/模型名称必须为纯英文' + }, + }, + atomModelDescribe: { + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '元分类/模型描述必须是一个字符串', + maxLength: '元分类/模型描述长度超出限制2048', + minLength: '元分类/模型描述长度过短', + }, + }, + }, + required: ['atomModelName', 'atomModelDescribe'], + errorMessage: { + required: { + atomModelName: '元分类/模型名称为必填项', + atomModelDescribe: '元分类/模型描述为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +export function DeleteAtomModelItemDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: 'integer', + errorMessage: { + type: '元分类/模型id必须是整数', + }, + }, + }, + required: ['atomModelId'], + errorMessage: { + required: { + atomModelId: '元分类/模型ID为为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +export function EditAtomModelItemDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: 'integer', + errorMessage: { + type: '元分类/模型id必须是整数', + }, + }, + atomModelName: { + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '元分类/模型名称必须是一个字符串', + maxLength: '元分类/模型名称长度超出限制255', + minLength: '元分类/模型名称长度过短', + }, + }, + atomModelDescribe: { + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '元分类/模型描述必须是一个字符串', + maxLength: '元分类/模型描述长度超出限制2048', + minLength: '元分类/模型描述长度过短', + }, + }, + }, + required: ['atomModelName', 'atomModelDescribe', 'atomModelId'], + errorMessage: { + required: { + atomModelName: '元分类/模型名称为必填项', + atomModelDescribe: '元分类/模型描述为必填项', + atomModelId: '元分类/模型ID为为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +export function CheckAtomModelItemNameDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelName: { + type: 'string', + minLength: 1, + maxLength: 255, + pattern: "^[a-zA-Z\\s]+$", + errorMessage: { + type: '元分类/模型名称必须是一个字符串', + maxLength: '元分类/模型名称长度超出限制255', + minLength: '元分类/模型名称长度过短', + pattern: '元分类/模型名称必须为纯英文' + }, + }, + }, + required: ['atomModelName'], + errorMessage: { + required: { + atomModelName: '元分类/模型名称为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + +export function GetAtomModelPageDTO(data) { + const schema = { + type: 'object', + properties: { + pageSize: { + type: 'integer', + minimum: 1, + maximum: 200, + default:10, + errorMessage: { + type: '每页数量必须是一个数字', + minimum: '每页数量最少是1', + maximum: '每页数量最多是200', + }, + }, + pageNum: { + type: 'integer', + minimum:1, + default: 1, + errorMessage: { + type: '页码必须是数字类型', + minimum: '页码最小是1', + }, + }, + searchData: { + type: 'string', + maxLength: 255, + errorMessage: { + type: '查询内容必须是一个字符串', + maxLength: '查询内容长度超出限制255', + }, + }, + }, + }; + return makeDTO(data, schema); +} diff --git a/src/routes/graphResource2/atomModel/index.js b/src/routes/graphResource2/atomModel/index.js new file mode 100644 index 0000000..7f2d805 --- /dev/null +++ b/src/routes/graphResource2/atomModel/index.js @@ -0,0 +1,180 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.js - +// | @创建时间: 2023-12-01 17:50 +// | @更新时间: 2023-12-01 17:50 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router'; + +import { + CheckAtomModelItemNameDTO, + CreateAtomModelItemDTO, + DeleteAtomModelItemDTO, + EditAtomModelItemDTO, + GetAtomModelPageDTO, +} from '#routes/graphResource2/atomModel/index.dto.js'; +import getPage from '#common/tools/getArrayPage.js'; +import getNoSpacesStr from '#common/tools/getNoSpacesStr.js'; + +const atomModel = new Router(); + +// @ 获取元分类模型页 +atomModel.get('/getAtomModelPage', async (ctx, next) => { + const verif = GetAtomModelPageDTO(ctx.query); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + let list = resourceCache.atomModelPool.data; + if (ctx.query.searchData) { + const searchData = ctx.query.searchData; + list = list.filter((i) => { + return (i.atomModelName + i.atomModelDescribe).includes(searchData); + }); + } + const total = list.length; + list = getPage(list, ctx.query.pageSize, ctx.query.pageNum); + ctx.body = { + total, + data: list, + }; +}); + +// @ 获取元分类列表 +atomModel.get('/getAtomModelList', async (ctx, next) => { + ctx.body = resourceCache.atomModelPool.data.map((i) => ({ + atomModelId: i.atomModelId, + atomModelName: i.atomModelName, + })); +}); + +// @ 新建元分类 +atomModel.post('/createAtomModelItem', async (ctx, next) => { + const verif = CreateAtomModelItemDTO(ctx.request.body); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + let { atomModelName, atomModelDescribe } = ctx.request.body; + atomModelName = getNoSpacesStr(atomModelName).toUpperCase(); + if (checkName(atomModelName) == -1) { + const newAtomModel = await ctx.sequelize.models.AtomModel.create({ + atomModelName, + atomModelDescribe, + }); + resourceCache.atomModelPool.data.push(newAtomModel.dataValues); + resourceCache.atomModelPool.length++; + resourceCache.atomModelPool.updatetime = new Date().getTime(); + ctx.body = { + message: '新建元分类成功。', + data: newAtomModel.dataValues, + }; + } else { + ctx.throw(400, { e: `元分类/模型重名: ${atomModelName}` }); + } +}); + +// @ 编辑元分类 +atomModel.post('/editAtomModelItem', async (ctx, next) => { + const verif = EditAtomModelItemDTO(ctx.request.body); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + let { atomModelName, atomModelDescribe, atomModelId } = ctx.request.body; + console.log(atomModelName) + atomModelName = getNoSpacesStr(atomModelName).toUpperCase() + const index= checkName(atomModelName) + if([-1, atomModelId].includes(resourceCache.atomModelPool.data[index].atomModelId)){ + if(resourceCache.atomModelPool.data[index].atomModelDescribe == atomModelDescribe && resourceCache.atomModelPool.data[index].atomModelName == atomModelName){ + ctx.body = { + message: '编辑元分类/模型成功', + }; + return + } + resourceCache.atomModelPool.data[index].atomModelDescribe = atomModelDescribe; + resourceCache.atomModelPool.data[index].atomModelName = atomModelName + resourceCache.atomModelPool.updatetime = new Date().getTime(); + ctx.body = { + message: '编辑元分类/模型成功', + }; + await next(); + await ctx.sequelize.models.AtomModel.update( + { atomModelName, atomModelDescribe, }, + { where: { atomModelId } }, + ); + }else{ + ctx.throw(400, {e: '元分类/模型名称重复'}) + } + +}); + +// @ 查重元分类名称 +atomModel.get('/checkAtomModelItemName', async (ctx, next) => { + const verif = CheckAtomModelItemNameDTO(ctx.query); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + let { atomModelName } = ctx.query; + atomModelName = getNoSpacesStr(atomModelName).toUpperCase(); + if (checkName(atomModelName) == -1) { + ctx.body = { message: '元分类/模型名称可用' }; + } else { + ctx.throw(400, { e: '元分类/模型名称重复' }); + } +}); + +// @ 删除元分类 +atomModel.delete('/deleteAtomModelItem', async (ctx, next) => { + const verif = DeleteAtomModelItemDTO(ctx.query); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + const { atomModelId } = ctx.query; + let index = -1; + for (let i in resourceCache.atomModelPool.data) { + if (resourceCache.atomModelPool.data[i].atomModelId == atomModelId) { + index = i; + break; + } + } + if (index == -1) { + ctx.throw(400, { e: '不存在此元分类/模型记录。' }); + return; + } + resourceCache.atomModelPool.data.splice(index, 1); + resourceCache.atomModelPool.length--; + resourceCache.atomModelPool.updatetime = new Date().getTime(); + ctx.body = { message: '删除元分类/模型成功。' }; + await next(); + await ctx.sequelize.models.AtomModel.update( + { isDelete: new Date().toISOString() }, + { where: { atomModelId } }, + ); +}); + +export default atomModel; + +// = 函数名: checkName +// = 描述: 查重模型名称 +// = 参数: None +// = 返回值: undefined +// = 创建人: expressgy +// = 创建时间: 2023-12-01 22:56:12 - +function checkName(name) { + for (let i in resourceCache.atomModelPool.data) { + if (name == resourceCache.atomModelPool.data[i].atomModelName) { + return i; + } + } + return -1; +} diff --git a/src/routes/graphResource2/baseDict/index.dto.js b/src/routes/graphResource2/baseDict/index.dto.js new file mode 100644 index 0000000..aae3d25 --- /dev/null +++ b/src/routes/graphResource2/baseDict/index.dto.js @@ -0,0 +1,206 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.dto.js - +// | @创建时间: 2023-12-02 00:21 +// | @更新时间: 2023-12-02 00:21 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import makeDTO from '#common/dto/index.js'; + +export function GetBaseDictTreeDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer', 'null'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + }, + }; + return makeDTO(data, schema); +} + +export function GetBaseDictListDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer', 'null'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + searchData: { + type: 'string', + maxLength: 255, + errorMessage: { + type: '查询内容必须是一个字符串', + maxLength: '查询内容长度超出限制255', + }, + }, + }, + }; + return makeDTO(data, schema); +} + + +export function GetBaseDictStructForBaseDictIdDTO(data) { + const schema = { + type: 'object', + properties: { + baseDictId: { + type: 'integer', + minimum: 0, + errorMessage: { + type: '字典ID必须是整数', + minimum: '字典ID是一个正整数', + }, + }, + }, + required: ['baseDictId'], + errorMessage: { + required: { + baseDictId: '字典ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + + + +export function DeleteBaseDictItemDTO(data) { + const schema = { + type: 'object', + properties: { + baseDictId: { + type: 'integer', + minimum: 0, + errorMessage: { + type: '字典ID必须是整数', + minimum: '字典ID是一个正整数', + }, + }, + }, + required: ['baseDictId'], + errorMessage: { + required: { + baseDictId: '字典ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} + + + + +export function CreateBaseDictItemDTO(data) { + const schema = { + type: 'object', + properties: { + atomModelId: { + type: ['integer', 'null'], + minimum: 0, + errorMessage: { + type: '元分类/模型ID必须是整数', + minimum: '元分类/模型ID是一个正整数', + }, + }, + baseDictName:{ + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '字典项名称必须是一个字符串', + maxLength: '字典项名称长度超出限制255', + minLength: '字典项名称长度过短', + }, + }, + baseDictFather:{ + type: ['integer', 'null'], + minimum: 0, + default: 0, + errorMessage: { + type: '字典项父ID必须是整数', + minimum: '字典项父ID是一个正整数', + }, + }, + baseDictDescribe:{ + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '字典项名称必须是一个字符串', + maxLength: '字典项名称长度超出限制2048', + minLength: '字典项名称长度过短', + }, + } + }, + required: ['baseDictName', 'baseDictDescribe'], + errorMessage: { + required: { + baseDictName: '字典项名称为必填项', + baseDictDescribe: '字典项描述为必填项' + }, + }, + }; + return makeDTO(data, schema); +} + +export function EditBaseDictItemDTO(data) { + const schema = { + type: 'object', + properties: { + baseDictId: { + type: 'integer', + minimum: 0, + errorMessage: { + type: '字典ID必须是整数', + minimum: '字典ID是一个正整数', + }, + }, + baseDictName:{ + type: 'string', + minLength: 1, + maxLength: 255, + errorMessage: { + type: '字典项名称必须是一个字符串', + maxLength: '字典项名称长度超出限制255', + minLength: '字典项名称长度过短', + }, + }, + baseDictDescribe:{ + type: 'string', + minLength: 1, + maxLength: 2048, + errorMessage: { + type: '字典项名称必须是一个字符串', + maxLength: '字典项名称长度超出限制2048', + minLength: '字典项名称长度过短', + }, + } + }, + required: ['baseDictName', 'baseDictDescribe', 'baseDictId'], + errorMessage: { + required: { + baseDictName: '字典项名称为必填项', + baseDictDescribe: '字典项描述为必填项', + baseDictId: '字典ID为必填项', + }, + }, + }; + return makeDTO(data, schema); +} diff --git a/src/routes/graphResource2/baseDict/index.js b/src/routes/graphResource2/baseDict/index.js new file mode 100644 index 0000000..ead3518 --- /dev/null +++ b/src/routes/graphResource2/baseDict/index.js @@ -0,0 +1,93 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.js - +// | @创建时间: 2023-12-02 00:15 +// | @更新时间: 2023-12-02 00:15 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router'; +import { + CreateBaseDictItemDTO, + DeleteBaseDictItemDTO, EditBaseDictItemDTO, + GetBaseDictListDTO, + GetBaseDictStructForBaseDictIdDTO, + GetBaseDictTreeDTO +} from '#routes/graphResource2/baseDict/index.dto.js'; +import {DeleteAtomModelItemDTO} from "#routes/graphResource2/atomModel/index.dto.js"; + +const baseDict = new Router(); + +// @ 获取字典树 +baseDict.get('/getBaseDictTree', async (ctx, next) => { + const data = ctx.query; + const verif = GetBaseDictTreeDTO(data); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + ctx.body = 1 +}); + +// @ 获取字典名列表 +baseDict.get('/getBaseDictList', async (ctx, next) => { + const data = ctx.query; + console.log(data) + const verif = GetBaseDictListDTO(data); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + ctx.body = 2 +}); + +// @ 通过字典ID获取完整字典结构 +baseDict.get('/getBaseDictStructForBaseDictId', async (ctx, next) => { + const data = ctx.query; + const verif = GetBaseDictStructForBaseDictIdDTO(data); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + ctx.body = 3 +}); + +// @ 删除字典项 +baseDict.delete('/deleteBaseDictItem', async (ctx, next) => { + const data = ctx.query; + const verif = DeleteBaseDictItemDTO(data); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + ctx.body = 4 +}); + +// @ 新建字典项 +baseDict.post('/createBaseDictItem', async (ctx, next) => { + const data = ctx.request.body; + const verif = CreateBaseDictItemDTO(data); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + ctx.body = 5 +}); + +// @ 编辑字典项 +baseDict.post('/editBaseDictItem', async (ctx, next) => { + const data = ctx.request.body; + const verif = EditBaseDictItemDTO(data); + if (!verif.status) { + ctx.throw(400, { e: verif.error.map((i) => i.message) }); + return; + } + ctx.body = 6 +}); + +export default baseDict; diff --git a/src/routes/graphResource2/index.js b/src/routes/graphResource2/index.js new file mode 100644 index 0000000..d09b785 --- /dev/null +++ b/src/routes/graphResource2/index.js @@ -0,0 +1,63 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: graphResource2 +// | @文件描述: index.js - +// | @创建时间: 2023-12-01 17:48 +// | @更新时间: 2023-12-01 17:48 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router'; +import atomModel from "#routes/graphResource2/atomModel/index.js"; +import testDTO from "#routes/index.dto.js"; +import rootRouter from "#routes/index.js"; +import baseDict from "#routes/graphResource2/baseDict/index.js"; + +const graphResource2 = new Router(); + +graphResource2.get('/', async (ctx) => { + const data = testDTO({ + name: 'hexi', + age: 32, + email: 'expressgy', + }); + console.log(data); + ctx.body = 'Hello graphResource2!'; +}); +graphResource2.use('/atomModel', atomModel.routes()); +graphResource2.use('/baseDict', baseDict.routes()); + + +// graphResource2.use(async (ctx, next) => { +// +// console.log(1) +// await next() +// console.log(2) +// }) +// +// graphResource2.get('/', async ctx => { +// ctx.body = 'USER' +// }) +// +// +// graphResource2.get('/:id', async ctx => { +// console.log(ctx.params) +// console.log(ctx.query) +// ctx.body = 'USER' +// }) +// +// graphResource2.post('/:id/create', async ctx => { +// console.log(ctx.params) +// console.log(ctx.query) +// console.log(ctx.request.body) +// ctx.body = 'USER' +// }) + + + + +export default graphResource2 diff --git a/src/routes/index.dto.js b/src/routes/index.dto.js new file mode 100644 index 0000000..7cc85b9 --- /dev/null +++ b/src/routes/index.dto.js @@ -0,0 +1,28 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.dto.js - +// | @创建时间: 2023-11-26 15:10 +// | @更新时间: 2023-11-26 15:10 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import makeDTO from "#common/dto/index.js"; + +export default function testDTO(data){ + const schema = { + "type": "object", + "properties": { + "name": { "type": "string" }, + "age": { "type": "number" }, + "email": { "type": "string", + "pattern": "^\\S+@\\S+\\.\\S+$" } + }, + "required": ["name", "age"] + } + return makeDTO(data, schema) +} diff --git a/src/routes/index.js b/src/routes/index.js new file mode 100644 index 0000000..6c015a2 --- /dev/null +++ b/src/routes/index.js @@ -0,0 +1,41 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: index.js - +// | @创建时间: 2023-11-26 01:34 +// | @更新时间: 2023-11-26 01:34 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ + +import Router from 'koa-router'; + +import graphResource2 from "#routes/graphResource2/index.js"; +import testDTO from '#routes/index.dto.js'; + +// const rootRouter = new Router({ +// prefix: '/api', // 添加前缀 +// }); + +// const apiRouter = new Router(); +// apiRouter.get('/', async (ctx) => { +// ctx.body = 'Hello /API!'; +// }); +// apiRouter.use('/user', userRouter.routes()); + +const rootRouter = new Router(); +rootRouter.get('/', async (ctx) => { + const data = testDTO({ + name: 'hexi', + age: 32, + email: 'expressgy', + }); + console.log(data); + ctx.body = 'Hello World!'; +}); +rootRouter.use('/graphResource2', graphResource2.routes()); + +export default rootRouter; diff --git a/test/ajvTest.js b/test/ajvTest.js new file mode 100644 index 0000000..ebcc887 --- /dev/null +++ b/test/ajvTest.js @@ -0,0 +1,82 @@ +// | ------------------------------------------------------------ +// | @版本: version 0.1 +// | @创建人: 【Nie-x7129】 +// | @E-mail: x71291@outlook.com +// | @所在项目: initkoa +// | @文件描述: ajvTest.js - +// | @创建时间: 2023-11-25 21:59 +// | @更新时间: 2023-11-25 21:59 +// | @修改记录: +// | -*-*-*- (时间--修改人--修改说明) -*-*-*- +// | = +// | ------------------------------------------------------------ +const Ajv = require('ajv'); +const ajv = new Ajv({ allErrors: true }); + +const schema = { + type: 'object', + properties: { + name: { type: 'string' }, + age: { type: 'integer', minimum: 18 }, + }, + required: ['name', 'age'], + errorMessage: { + type: '数据应该是一个对象', // 整体 schema 错误消息 + required: '对象缺少必要属性', // 缺少必要属性错误消息 + properties: { + name: '姓名应该是一个字符串', + age: '年龄应该是一个大于或等于 18 的整数', + }, + }, +}; + +const validate = ajv.compile(schema); + +const data = { + name: 123, + age: 17, +}; + +validate(data); +if (validate.errors) { + console.log(validate.errors); // 输出自定义错误消息 +} + +// ================================ + +const Ajv = require('ajv'); +const ajv = new Ajv({ allErrors: true }); + +// 添加自定义关键字 +ajv.addKeyword('isOldEnough', { + validate: function (schema, data) { + ajv.errors = [ + { + keyword: 'isOldEnough', + message: '年龄必须大于18岁', + params: { keyword: 'isOldEnough' }, + }, + ]; + return data >= 18; + }, + errors: true, // 使用自定义的错误列表 +}); + +const schema = { + type: 'object', + properties: { + age: { type: 'integer', isOldEnough: true }, + }, + required: ['age'], +}; + +const validate = ajv.compile(schema); + +const data = { + age: 17, +}; + +validate(data); +if (validate.errors) { + console.log(validate.errors); // 输出自定义错误消息 +} diff --git a/test/koa-body使用.md b/test/koa-body使用.md new file mode 100644 index 0000000..ce2162f --- /dev/null +++ b/test/koa-body使用.md @@ -0,0 +1,286 @@ +`koa-body` 是一个流行的 Koa 请求体解析中间件,支持解析常见的请求体数据类型,包括 JSON 数据、表单数据,以及文件上传。下面是 `koa-body` 的详细配置和使用方式: + +## 安装 + +使用 npm 安装 `koa-body` 中间件: + +``` +npm install koa-body --save +``` + +## 使用 + +要使用 `koa-body` 中间件,只需要在 Koa 应用程序中使用 `app.use` 方法将其注册,然后可以在请求处理程序和中间件中使用 `ctx.request.body` 来访问已解析的请求体数据。 + +以下是一个使用 `koa-body` 中间件的示例: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +// 将 koaBody 中间件注册到应用程序中 +app.use( + koaBody({ + multipart: true, + formidable: { + maxFileSize: 100 * 1024 * 1024, + }, + }) +); + +// 处理请求 +app.use((ctx) => { + // 访问已解析的请求体数据 + console.log(ctx.request.body); + ctx.body = 'Hello Koa'; +}); + +// 启动应用程序 +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们将 `koa-body` 中间件注册到应用程序中,并通过参数对象配置解析器。其中,`multipart` 选项是用于启用文件上传支持的选项,`formidable` 对象包括有关文件上传的配置选项,例如 `maxFileSize`,用于限制文件的大小。 + +在请求处理程序中,我们可以使用 `ctx.request.body` 访问已解析的请求体数据。 + +## 配置选项 + +下面是 `koa-body` 可用的配置选项及其默认值: + +- `form`:是否解析 `application/x-www-form-urlencoded` 格式的请求体数据,默认为 `true` +- `json`:是否解析 `application/json` 格式的请求体数据,默认为 `true` +- `text`:是否解析 `text/*` 格式的请求体数据,默认为 `true` +- `encoding`:请求体的编码方式,默认为 `'utf-8'` +- `xml`:是否解析 `application/xml` 和 `text/xml` 格式的请求体数据,默认为 `false` +- `jsonLimit`:限制解析 `application/json` 格式请求体数据的大小(以字节为单位),默认为 `1mb` +- `formLimit`:限制解析 `application/x-www-form-urlencoded` 格式的请求体数据大小(以字节为单位),默认为 `56kb` +- `textLimit`:限制解析 `text/*` 格式的请求体数据大小(以字节为单位),默认为 `56kb` +- `xmlLimit`:限制解析 `application/xml` 和 `text/xml` 格式的请求体数据大小(以字节为单位),默认为 `1mb` +- `multipart`:是否解析 `multipart/*` 格式的请求体数据(用于文件上传),默认为 `false` +- `multiples`:是否解析多个文件上传,默认为 `false` +- `onError`:错误处理程序,用于处理请求体解析错误,默认为 `ctx.throw` +- `includeUnparsed`:是否将未解析的请求体数据存储在 `ctx.request.body` 中,默认为 `false` +- `textLimit`:限制解析 `text/*` 格式的请求体数据大小(以字节为单位),默认为 `56kb` + +## 示例 + +### 解析表单数据和 JSON 数据 + +以下示例演示如何将 `koa-body` 中间件配置为仅解析表单数据和 JSON 数据: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +// 仅解析表单数据和 JSON 数据 +app.use(koaBody({ form: true, json: true })); + +app.use((ctx) => { + console.log(ctx.request.body); + ctx.body = 'Hello Koa'; +}); + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们将 `koa-body` 中间件配置为仅解析表单数据和 JSON 数据。我们可以在请求处理程序中使用 `ctx.request.body` 访问已解析的请求体数据。 + +### 解析文件上传 + +以下示例演示如何使用 `koa-body` 中间件解析文件上传: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +// 启用文件上传支持 +app.use( + koaBody({ + multipart: true, + formidable: { + maxFileSize: 100 * 1024 * 1024, + }, + }) +); + +app.use((ctx) => { + // 文件上传信息存储在 ctx.request.files 中 + console.log(ctx.request.files); + ctx.body = 'Hello Koa'; +}); + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们将 `koa-body` 中间件配置为启用文件上传支持,并使用 `formidable` 对象配置文件上传选项。在请求处理程序中,我们可以使用 `ctx.request.files` 访问文件上传信息。 + +### 错误处理 + +`koa-body` 中间件的默认错误处理程序是 `ctx.throw`,它会抛出一个 HTTP 400 错误响应。你可以自定义一个错误处理程序来处理请求体解析错误。 + +以下示例演示如何自定义错误处理程序: + +```javascript +const Koa = require('koa'); +const koaBody = require('koa-body'); + +const app = new Koa(); + +app.use( + koaBody({ + onError: (err, ctx) => { + ctx.throw('Body parse error', 422); + }, + }) +); + +app.use((ctx) => { + console.log(ctx.request.body); + ctx.body = 'Hello Koa'; +}); + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上面的示例中,我们自定义了一个错误处理程序,当发生请求体解析错误时,它会抛出一个 HTTP 422 错误响应。 + +## 总结 + +`koa-body` 是一个流行的 Koa 请求体解析中间件,它支持解析常见的请求体数据类型,包括 JSON 数据、表单数据,以及文件上传。你可以通过配置选项来自定义解析器的行为,并使用 `ctx.request.body` 和 `ctx.request.files` 在请求处理程序中访问已解析的请求体数据和上传的文件信息。同时,你也可以自定义错误处理程序来处理请求体解析错误。 + + + + + + + + + + + + + + +一、需求 +之前使用 koa2 的时候,处理 post 请求使用的是 koa-bodyparser,同时如果是图片上传使用的是 koa-multer。 + +这两者的组合没什么问题,不过 koa-multer 和 koa-route(注意不是 koa-router) 存在不兼容的问题。 + +这个问题已经在这篇文章中说明了: + +使用koa-multer实现文件上传并自定义文件名和目录 +关于 koa-bodyparser 的使用,见下面文章: + +手动实现koa2 body-parser中间件及koa-boayparser的使用 +但是这两者可以通过 koa-body 代替,并且只是用 koa-body 即可。 + +koa-body 主要是下面两个依赖: + +"co-body": "^5.1.1", +"formidable": "^1.1.1" +具体的实现可以在 github 上查看 : https://github.com/dlau/koa-body + +二、koa-body 的基本使用 +在 koa2 中使用 koa-body,我使用的是全局引入,而不是路由级别的引入,因为考虑到很多地方都有 post 请求或者是文件上传请求,没必要只在路由级别引入。 + +1、安装依赖 +yarn add koa-body +## npm i koa-body -S +2、app.js +省略了 koa 的一些基本代码 + +const koaBody = require('koa-body'); +const app = new koa(); +app.use(koaBody({ +multipart:true, // 支持文件上传 +encoding:'gzip', +formidable:{ +uploadDir:path.join(__dirname,'public/upload/'), // 设置文件上传目录 +keepExtensions: true, // 保持文件的后缀 +maxFieldsSize:2 * 1024 * 1024, // 文件上传大小 +onFileBegin:(name,file) => { // 文件上传前的设置 +// console.log(`name: ${name}`); +// console.log(file); +}, +} +})); +3、有用的参数 +1)koa-body 的基本参数 + +参数名 描述 类型 默认值 +patchNode 将请求体打到原生 node.js 的ctx.req中 Boolean false +patchKoa 将请求体打到 koa 的 ctx.request 中 Boolean true +jsonLimit JSON 数据体的大小限制 String / Integer 1mb +formLimit 限制表单请求体的大小 String / Integer 56kb +textLimit 限制 text body 的大小 String / Integer 56kb +encoding 表单的默认编码 String utf-8 +multipart 是否支持 multipart-formdate 的表单 Boolean false +urlencoded 是否支持 urlencoded 的表单 Boolean true +text 是否解析 text/plain 的表单 Boolean true +json 是否解析 json 请求体 Boolean true +jsonStrict 是否使用 json 严格模式,true 会只处理数组和对象 Boolean true +formidable 配置更多的关于 multipart 的选项 Object {} +onError 错误处理 Function function(){} +stict 严格模式,启用后不会解析 GET, HEAD, DELETE 请求 Boolean true +2)formidable 的相关配置参数 + +参数名 描述 类型 默认值 +maxFields 限制字段的数量 Integer 1000 +maxFieldsSize 限制字段的最大大小 Integer 2 * 1024 * 1024 +uploadDir 文件上传的文件夹 String os.tmpDir() +keepExtensions 保留原来的文件后缀 Boolean false +hash 如果要计算文件的 hash,则可以选择 md5/sha1 String false +multipart 是否支持多文件上传 Boolean true +onFileBegin 文件上传前的一些设置操作 Function function(name,file){} +关于 onFileBegin 的更多信息可以查看: + +https://github.com/felixge/node-formidable#filebegin +4、获取文件上传后的信息 +这些代码是在路由中体现的 + +需要注意的是,如果是获取上传后文件的信息,则需要在 ctx.request.files 中获取。 + +如果是获取其他的表单字段,则需要在 ctx.request.body 中获取,这是由 co-body 决定的(默认情况)。 + +router.get('/', async (ctx) => { +await ctx.render('index'); +}); + +router.post('/',async (ctx)=>{ +console.log(ctx.request.files); +console.log(ctx.request.body); +ctx.body = JSON.stringify(ctx.request.files); +}); +三、结果 + + +因为默认开启多个文件上传,因此 ctx.request.files 是一个对象, + +而且是通过表单的 name=photo 属性作为对象的 key,值便是一个 File 对象,有用的字段如下: + +字段名 描述 +size 文件大小 +path 文件上传后的目录 +name 文件的原始名称 +type 文件类型 +lastModifiedDate 上次更新的时间 + + +http://www.ptbird.cn/koa-body.html +———————————————— +版权声明:本文为CSDN博主「after you」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 +原文链接:https://blog.csdn.net/gwdgwd123/article/details/103561817 diff --git a/test/koa-compress说明.md b/test/koa-compress说明.md new file mode 100644 index 0000000..4e23269 --- /dev/null +++ b/test/koa-compress说明.md @@ -0,0 +1,104 @@ + + +koa-compress 是一个 Koa 中间件,用于压缩 HTTP 响应。使用该中间件可减少 HTTP 响应的大小,从而提升应用程序的性能。 + +下面是使用 koa-compress 的简单示例: + +```javascript +const Koa = require('koa'); +const compress = require('koa-compress'); + +const app = new Koa(); + +// 注册中间件 +app.use(compress()); + +// 定义路由 +app.use(async (ctx) => { + ctx.body = 'Hello, world!'; +}); + +app.listen(3000, () => { + console.log('Server started on 3000'); +}); +``` + +在上面的示例中,我们首先通过 `require` 引入了 Koa 和 koa-compress,然后创建了一个 Koa 应用程序实例。 + +在注册中间件时,我们使用了 `compress()` 函数来创建 koa-compress 中间件的实例,并将其添加到应用程序中间件栈中。 + +最后,我们定义了一个非常简单的路由,在该路由中,我们设置了响应的正文内容为 "Hello, world!"。由于我们已经注册了 koa-compress 中间件,因此响应的内容将被压缩后返回给客户端。 + +需要注意的是,koa-compress 的默认配置已经适用于大多数情况。如果需要对其进行个性化配置,请参阅 koa-compress 的文档。 + + +虽然 koa-compress 是一个非常有用的中间件,但它也有一些缺点,包括: + +1. CPU 开销:压缩和解压缩数据需要消耗一定的 CPU 资源。对于大量并发请求的应用程序,尤其是在处理大型响应时,这可能会占用大量的 CPU 时间,并可能成为性能瓶颈。 + +2. 内存消耗:压缩和解压缩数据可能会占用一定的内存。对于包含大量压缩数据的响应,这可能会导致应用程序的内存占用增加。 + +3. 配置复杂性:虽然 koa-compress 的默认配置适用于大多数情况,但某些情况下可能需要进行个性化的配置。配置复杂性可能会增加,特别是在需要针对不同的响应类型或路径进行不同的压缩设置时。 + +4. 不适用于动态内容:由于压缩是在响应生成后进行的,因此对于动态内容(如实时数据或流式响应)无法实时压缩。这可能会导致传输过程中的数据量较大,影响网络传输速度。 + +总体来说,koa-compress 是一个功能强大的中间件,可以提高应用程序的性能和网络传输效率。然而,在使用它时,需要权衡使用压缩所带来的性能消耗和配置复杂性,以确保最佳的应用程序性能和用户体验。 + +koa-compress 提供了一系列的配置选项,可以根据需要进行个性化的配置。下面是常用的一些选项: + +- `filter`:指定哪些 HTTP 响应需要被压缩。可以是一个布尔值、字符串、正则表达式或一个自定义函数。默认为压缩所有响应。 + +- `threshold`:指定响应正文的大小下限,只有当响应正文大小超过指定值时才会进行压缩。默认为 `1024` 字节。 + +- `gzip`:指定是否启用 Gzip 压缩。默认为 `true`。 + +- `deflate`:指定是否启用 Deflate 压缩。默认为 `true`。 + +- `br`:指定是否启用 Brotli 压缩。默认为 `false`。 + +- `chunkSize`:指定压缩块的大小。默认为 `16 * 1024` 字节。 + +- `mimeTypes`:指定要压缩的 MIME 类型。默认为 `['text/*']`。 + +- `enableTypes`:指定要启用压缩的 MIME 类型。默认为所有 MIME 类型。 + +- `skip`:指定一个自定义函数,以跳过指定的请求或响应。默认为 `null`。 + +下面是一个配置示例: + +```javascript +const Koa = require('koa'); +const compress = require('koa-compress'); + +const app = new Koa(); + +// 注册中间件并进行个性化配置 +app.use(compress({ + filter (content_type) { + return /text/i.test(content_type) + }, + threshold: 1024, + gzip: true, + deflate: false, + br: false, + chunkSize: 16 * 1024, + mimeTypes: ['text/plain', 'application/json'], + enableTypes: ['text/plain', 'application/json'], + skip (ctx) { + return ctx.path === '/healthcheck'; + } +})); + +// 定义路由 +app.use(async (ctx) => { + ctx.body = 'Hello, world!'; +}); + +app.listen(3000, () => { + console.log('Server started on 3000'); +}); +``` + +在上面的示例中,我们使用了一些常见的配置选项。我们指定了只对文本类型的响应进行压缩,并且启用了 Gzip 压缩。我们还指定了要启用的 MIME 类型和要跳过的路径,以及其他一些选项。 + +需要注意的是,配置选项可以根据需要进行个性化的调整。可以根据实际情况进行选择。在使用 koa-compress 时,确保在经过测试和评估后再进行个性化的配置。 diff --git a/test/koa-ratelimit限制批量请求工具的应用.md b/test/koa-ratelimit限制批量请求工具的应用.md new file mode 100644 index 0000000..8f682ce --- /dev/null +++ b/test/koa-ratelimit限制批量请求工具的应用.md @@ -0,0 +1,33 @@ +要限制同一个客户端的请求数量,可以使用 `koa-ratelimit` 插件。该插件可以按照一定的速率限制客户端的请求数量。以下是使用 `koa-ratelimit` 的示例代码: + +```javascript +const Koa = require('koa'); +const ratelimit = require('koa-ratelimit'); + +const app = new Koa(); + +app.use(ratelimit({ + driver: 'memory', // 存储限流数据的驱动,这里使用内存驱动 + db: new Map(), // 存储被限制的客户端信息的数据结构 + duration: 60000, // 时间窗口,单位毫秒 + max: 10, // 时间窗口内允许的最大请求数量 + id: ctx => ctx.ip, // 提取每个请求的唯一标识符,默认使用请求的 IP 地址 +})); + +// 添加其他中间件和路由 + +app.listen(3000, () => { + console.log('Server started on http://localhost:3000'); +}); +``` + +在上述代码中,我们使用 `koa-ratelimit` 插件来限制同一个客户端的请求数量。插件配置中的关键参数如下: +- `driver`:存储限流数据的驱动,可以选择内存 (`memory`)、Redis (`redis`)、MongoDB (`mongodb`) 等。在示例中我们使用内存驱动。 +- `db`:存储被限制的客户端信息的数据结构,这里我们使用 `Map`。 +- `duration`:时间窗口的持续时间,单位为毫秒。 +- `max`:时间窗口内允许的最大请求数量。 +- `id`:提取每个请求的唯一标识符,默认使用请求的 IP 地址。 + +当某个客户端超过设定的最大请求数量时,该插件会返回 HTTP 状态码 429 Too Many Requests,并且设置 `Retry-After` 头部,表示重新尝试请求的时间。 + +通过使用 `koa-ratelimit` 插件,可以有效地限制同一个客户端的请求数量,从而保护服务器免受过多的请求负载。同时,你也可以根据实际需求调整时间窗口和最大请求数量的配置。 diff --git a/test/koa-send方法.md b/test/koa-send方法.md new file mode 100644 index 0000000..29bca8d --- /dev/null +++ b/test/koa-send方法.md @@ -0,0 +1,46 @@ +`koa-send` 是一个 Koa 中间件,用于发送文件或目录响应给客户端。它提供了一种简单的方式来处理静态文件的发送。下面是一个使用示例: + +```javascript +const Koa = require('koa'); +const send = require('koa-send'); +const app = new Koa(); + +app.use(async (ctx, next) => { + // 使用 koa-send 发送文件 + await send(ctx, 'path/to/file.txt'); +}); + +app.listen(3000, () => { + console.log('Server started on 3000'); +}); +``` + +在上面的示例中,`koa-send` 中间件用于处理所有的请求,并将文件 `path/to/file.txt` 发送给客户端。 + +除了发送单个文件外,你还可以发送整个目录: + +```javascript +app.use(async (ctx, next) => { + // 使用 koa-send 发送目录 + await send(ctx, 'path/to/directory'); +}); +``` + +这将发送指定目录下的文件,可以在请求的 URL 中指定特定的文件。 + +`koa-send` 还提供了一些选项,用于设置发送文件时的行为。例如,你可以指定根目录、设置缓存控制头、设置内容类型等。以下是一个使用选项的示例: + +```javascript +app.use(async (ctx, next) => { + await send(ctx, 'path/to/file.txt', { + root: 'public', // 设置根目录 + maxage: 1 * 24 * 60 * 60 * 1000, // 设置缓存时间 + immutable: true, // 设置不可变性(immutable) + contentType: 'text/plain' // 设置内容类型 + }); +}); +``` + +在上面的示例中,我们将根目录设置为 `public`,将缓存时间设置为 1 天,启用不可变性,并设置内容类型为 `text/plain`。 + +通过这些选项,你可以对发送的文件进行更细致的控制。更多的选项和详细的使用方式可以查看 `koa-send` 的文档。 diff --git a/test/koa修改code.md b/test/koa修改code.md new file mode 100644 index 0000000..9257db2 --- /dev/null +++ b/test/koa修改code.md @@ -0,0 +1,39 @@ +要在 Koa 中修改 HTTP 响应的状态码(code),可以简单地通过 ctx.status 属性进行修改。例如,将响应状态码修改为 404: + +```js +app.use(async (ctx, next) => { + ctx.status = 404; + // 继续执行后续中间件,并在之后对响应进行修改 + await next(); +}); +``` + +在上述代码中,我们将响应状态码设置为 404,并在之后继续执行后续中间件。这意味着你可以在后续中间件中进一步修改响应内容,比如设置响应体、设置 headers 等。 + +如果你想要在响应发送之前中止中间件的执行,可以通过 ctx.throw 方法或在抛出一个 Error 对象,同时设置其 status 或者 statusCode 属性: + +```js +app.use(async (ctx, next) => { + if (someCondition) { + ctx.throw(400, 'Bad Request'); + } else { + await next(); + } +}); +``` + +或者: + +```js +app.use(async (ctx, next) => { + if (someCondition) { + const err = new Error('Bad Request'); + err.status = 400; + throw err; + } else { + await next(); + } +}); +``` + +在上述代码中,当 someCondition 符合时,我们通过 ctx.throw 或抛出 Error 对象来中止中间件执行,并将响应状态码设置为 400。