mas-server 3.0.42 → 4.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +8 -7
  2. package/dist/getApp/apiHandler.d.ts +21 -0
  3. package/dist/getApp/apiHandler.d.ts.map +1 -0
  4. package/dist/getApp/config.d.ts +22 -0
  5. package/dist/getApp/config.d.ts.map +1 -0
  6. package/dist/getApp/docTransform.d.ts +41 -0
  7. package/dist/getApp/docTransform.d.ts.map +1 -0
  8. package/dist/getApp/fsRoutes.d.ts +17 -0
  9. package/dist/getApp/fsRoutes.d.ts.map +1 -0
  10. package/dist/getApp/getApp.d.ts +11 -0
  11. package/dist/getApp/getApp.d.ts.map +1 -0
  12. package/dist/getApp/logs.d.ts +29 -0
  13. package/dist/getApp/logs.d.ts.map +1 -0
  14. package/dist/index.d.ts +5 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +1 -121
  17. package/dist/middleware/openCors.d.ts +9 -0
  18. package/dist/middleware/openCors.d.ts.map +1 -0
  19. package/dist/type.d.ts +150 -0
  20. package/dist/type.d.ts.map +1 -0
  21. package/dist/utils/mas-encrypt.min.d.ts +6 -0
  22. package/dist/utils/mas-encrypt.min.d.ts.map +1 -0
  23. package/dist/utils/quickSend.d.ts +8 -0
  24. package/dist/utils/quickSend.d.ts.map +1 -0
  25. package/dist/utils/tokenUtils.d.ts +54 -0
  26. package/dist/utils/tokenUtils.d.ts.map +1 -0
  27. package/dist/utils/typeFromValidFormat.d.ts +69 -0
  28. package/dist/utils/typeFromValidFormat.d.ts.map +1 -0
  29. package/dist/utils/validType.d.ts +17 -0
  30. package/dist/utils/validType.d.ts.map +1 -0
  31. package/package.json +43 -46
  32. package/.temp/.keep +0 -0
  33. package/.temp/getRouteByApiSrc.ts +0 -55
  34. package/.temp/merge/a.ts +0 -4
  35. package/.temp/merge/as.ts +0 -1
  36. package/.temp/merge/b.ts +0 -3
  37. package/.temp/merge/i.js +0 -103
  38. package/.temp/merge/logs/.keep +0 -0
  39. package/.temp/merge/test.ts +0 -2
  40. package/.temp/merge/validType copy.ts +0 -149
  41. package/.temp/merge/validType.ts +0 -98
  42. package/.temp/merge/validTypeOptimize.ts +0 -98
  43. package/.temp/updateRouter.ts +0 -46
  44. package/.vscode/settings.json +0 -3
  45. package/beforebuild.js +0 -9
  46. package/dist/state.js +0 -4
  47. package/dist/typings/index.js +0 -2
  48. package/dist/utils/apiLimit.js +0 -20
  49. package/dist/utils/createRouter.js +0 -81
  50. package/dist/utils/getRouterInfo.js +0 -56
  51. package/dist/utils/logs.js +0 -58
  52. package/dist/utils/mas-encrypt.min.js +0 -1
  53. package/dist/utils/masUtils.js +0 -10
  54. package/dist/utils/meaToken.js +0 -57
  55. package/dist/utils/printLog.js +0 -12
  56. package/dist/utils/quickSend.js +0 -37
  57. package/dist/utils/readApi.js +0 -60
  58. package/dist/utils/validRouteData.js +0 -37
  59. package/dist/utils/validToken.js +0 -24
  60. package/dist/utils/validType.js +0 -84
  61. package/src/index.ts +0 -98
  62. package/src/state.ts +0 -1
  63. package/src/typings/index.ts +0 -113
  64. package/src/utils/apiLimit.ts +0 -15
  65. package/src/utils/createRouter.ts +0 -34
  66. package/src/utils/getRouterInfo.ts +0 -49
  67. package/src/utils/logs.ts +0 -21
  68. package/src/utils/mas-encrypt.min.js +0 -1
  69. package/src/utils/masUtils.ts +0 -7
  70. package/src/utils/meaToken.ts +0 -56
  71. package/src/utils/printLog.ts +0 -12
  72. package/src/utils/quickSend.ts +0 -25
  73. package/src/utils/readApi.ts +0 -28
  74. package/src/utils/validRouteData.ts +0 -45
  75. package/src/utils/validToken.ts +0 -22
  76. package/src/utils/validType.ts +0 -81
  77. package/test/apiTemplate/curd/del.ts +0 -9
  78. package/test/apiTemplate/curd/get.ts +0 -9
  79. package/test/apiTemplate/curd/set.ts +0 -9
  80. package/test/apiTemplate/defaultApi.ts +0 -8
  81. package/test/config/serverConfig/config.ts +0 -29
  82. package/test/config/sqlConfig/createSqlFormData.ts +0 -13
  83. package/test/logs/.keep +0 -0
  84. package/test/main.ts +0 -29
  85. package/test/scripts/beforeCreated.ts +0 -28
  86. package/test/scripts/createApiFile.ts +0 -26
  87. package/test/scripts/createApis.ts +0 -61
  88. package/test/scripts/createSqlForm.ts +0 -5
  89. package/test/scripts/getSqlFormType.ts +0 -23
  90. package/test/scripts/run.ts +0 -4
  91. package/test/src/api/example/ArrValid.ts +0 -11
  92. package/test/src/api/example/per.ts +0 -34
  93. package/test/src/api/example/tip.ts +0 -7
  94. package/test/src/api/example/validReqData.ts +0 -82
  95. package/test/src/api/index.ts +0 -9
  96. package/test/src/apiDoc.ts +0 -34
  97. package/test/src/debug.ts +0 -5
  98. package/test/src/masState.ts +0 -4
  99. package/test/src/sqlform.json +0 -1
  100. package/test/test.ts +0 -1
  101. package/tsconfig-build.json +0 -20
  102. package/tsconfig.json +0 -21
  103. package/tsconfigschema.json +0 -1263
@@ -1,57 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validToken = void 0;
4
- exports.createToken = createToken;
5
- const { decode, isJSON, encode } = require("./mas-encrypt.min.js");
6
- const getTimestamp = () => new Date().getTime();
7
- /**
8
- *
9
- * @param param0 token:解密的token,permission:效验的权限,只要有其中一个就可
10
- * @param key 解密密钥
11
- * @returns
12
- */
13
- const validToken = ({ token, permission = [] }, key = "8087") => {
14
- if (!token)
15
- return { msg: "没有传入token数据", errorCode: 0, status: 0, token };
16
- token = decode(token, key);
17
- if (!token)
18
- return { msg: "token数据错误", errorCode: 1, status: 0, token };
19
- // 鉴权
20
- if (permission.length != 0) {
21
- const tPermission = token._permission;
22
- if (!tPermission) {
23
- return { msg: "权限错误", errorCode: 2, status: 0, token };
24
- }
25
- if (tPermission.filter((value) => permission.includes(value)).length == 0) {
26
- return { msg: "权限错误", errorCode: 2, status: 0, token };
27
- }
28
- }
29
- // 过期时间
30
- if (token._masTime !== 0) {
31
- if (getTimestamp() > token._masTime)
32
- return { msg: "token过期", errorCode: 3, status: 0, token };
33
- }
34
- return Object.assign(Object.assign({}, token), { status: 1 });
35
- };
36
- exports.validToken = validToken;
37
- const getErrorInfo = () => {
38
- return [
39
- { msg: "没有传入token数据", errorCode: 0, status: 0 },
40
- { msg: "token数据错误", errorCode: 1, status: 0 },
41
- { msg: "权限错误", errorCode: 2, status: 0 },
42
- { msg: "token过期", errorCode: 3, status: 0 },
43
- ];
44
- };
45
- /**
46
- *
47
- * @param param0 data:加密的数据,time:过期时间/s(为零则不会过期),permission:权限设置
48
- * @param key 加密密钥
49
- * @returns
50
- */
51
- function createToken({ data = null, time = 0, permission = [] } = {}, key = "8087") {
52
- const token = {};
53
- token.data = data;
54
- permission.length != 0 && (token._permission = permission);
55
- time !== 0 && (token._masTime = time * 1000 + getTimestamp());
56
- return encode(token, key);
57
- }
@@ -1,12 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const moment_1 = __importDefault(require("moment"));
7
- exports.default = (req, res, next) => {
8
- const date = (0, moment_1.default)().format("YYYY-MM-DD HH:mm:ss");
9
- const data = `${date} ${req.method} ${req.ipInfo.ip} ${req.url} ${req.body ? JSON.stringify(req.body) : ""}\n`;
10
- console.info(data);
11
- next();
12
- };
@@ -1,37 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.default = (req, res, next) => {
13
- // req.fields && (req.body = req.fields);
14
- res.return = (data_1, ...args_1) => __awaiter(void 0, [data_1, ...args_1], void 0, function* (data, status = 1, code = 200, msg = "") {
15
- if (data === null || data === undefined) {
16
- status = 0;
17
- }
18
- if (data instanceof Promise)
19
- data = yield data;
20
- // if (typeof data != "string") data = JSON.stringify(data);
21
- res.status(code).send({
22
- msg,
23
- status: !!status ? 1 : 0,
24
- data: data === null || data === undefined ? null : data,
25
- });
26
- });
27
- res.reply = (data_1, ...args_1) => __awaiter(void 0, [data_1, ...args_1], void 0, function* (data, msg = "", code = 200) {
28
- return yield res.return(data, data ? 1 : 0, code, msg);
29
- });
30
- res.success = (data_1, ...args_1) => __awaiter(void 0, [data_1, ...args_1], void 0, function* (data, msg = "成功") {
31
- return yield res.return(data, 1, 200, msg);
32
- });
33
- res.fail = (data_1, ...args_1) => __awaiter(void 0, [data_1, ...args_1], void 0, function* (data, msg = "系统错误,请联系管理员") {
34
- return yield res.return(data, 0, 200, msg);
35
- });
36
- next();
37
- };
@@ -1,60 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.default = readFilesRecursively;
37
- const fs = __importStar(require("fs"));
38
- const path = __importStar(require("path"));
39
- function readFilesRecursively(folderPath, routerPrefix = "") {
40
- const files = [];
41
- fs.readdirSync(folderPath).forEach((fileName) => {
42
- const filePath = path.join(folderPath, fileName);
43
- const stat = fs.statSync(filePath);
44
- if (stat.isDirectory()) {
45
- const directoryPrefix = routerPrefix
46
- ? `${routerPrefix}/${fileName}`
47
- : fileName;
48
- const directoryFiles = readFilesRecursively(filePath, directoryPrefix);
49
- files.push(...directoryFiles);
50
- }
51
- else {
52
- const filePrefix = routerPrefix
53
- ? `${routerPrefix}/${fileName}`
54
- : fileName;
55
- const fileRoute = `/${filePrefix.replace(/\.[^/.]+$/, "")}`;
56
- files.push(fileRoute);
57
- }
58
- });
59
- return files;
60
- }
@@ -1,37 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const state_1 = require("../state");
7
- const validType_1 = __importDefault(require("./validType"));
8
- exports.default = (req, res, next) => {
9
- const Router = state_1.state.Router;
10
- const routerObj = Router[req.path];
11
- if (routerObj) {
12
- if (routerObj.methods != "all" &&
13
- routerObj.methods != req.method.toLowerCase()) {
14
- return res.return(null, 0, 400, "error method!");
15
- }
16
- if (routerObj.header && routerObj.header.length != 0) {
17
- const headerObj = {};
18
- routerObj.header.forEach((item) => {
19
- !item.optional && (headerObj[item.name] = item.type);
20
- });
21
- if (!(0, validType_1.default)(req.headers, headerObj)) {
22
- return res.return(null, 0, 400, "error headers format!");
23
- }
24
- }
25
- if (req.method == "GET" &&
26
- routerObj.validFormat &&
27
- !(0, validType_1.default)(req.query, routerObj.validFormat, !!routerObj.validFormatStrict)) {
28
- return res.return(null, 0, 400, "error data format!");
29
- }
30
- if (req.method == "POST" &&
31
- routerObj.validFormat &&
32
- !(0, validType_1.default)(req.body, routerObj.validFormat, !!routerObj.validFormatStrict)) {
33
- return res.return(null, 0, 400, "error data format!");
34
- }
35
- }
36
- next();
37
- };
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const state_1 = require("../state");
4
- const __1 = require("..");
5
- const masUtils_1 = require("./masUtils");
6
- exports.default = (req, res, next) => {
7
- const r = state_1.state.Router[req.path];
8
- const tokenConfig = state_1.state.config.token;
9
- if ((0, masUtils_1.getType)(r === null || r === void 0 ? void 0 : r.permission) == "array") {
10
- const token = req.headers[tokenConfig.headerParams];
11
- if (!token) {
12
- return res.return(null, 0, 400, "缺少重要参数");
13
- }
14
- let vt = (0, __1.validToken)({ token, permission: r.permission }, tokenConfig.pwd);
15
- if (vt.status === 0) {
16
- return res.return(vt.errorCode, 0, 200, vt.msg);
17
- }
18
- res.token = vt;
19
- next();
20
- }
21
- else {
22
- next();
23
- }
24
- };
@@ -1,84 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = validType;
4
- const masUtils_1 = require("../utils/masUtils");
5
- const vliadBase = (obj, typeMapping) => {
6
- return (0, masUtils_1.getType)(obj) == typeMapping.name.toLowerCase();
7
- };
8
- const validTypeObj = (obj, typeMapping) => {
9
- if (obj === null || obj === undefined)
10
- return false;
11
- let typeT = (0, masUtils_1.getType)(typeMapping);
12
- if (typeT == "function") {
13
- return vliadBase(obj, typeMapping);
14
- }
15
- else if (typeT == "object") {
16
- if ((0, masUtils_1.getType)(obj) !== "object")
17
- return false;
18
- for (let k in typeMapping) {
19
- if (obj[k] === null || obj[k] === undefined)
20
- return false;
21
- if (!validType(obj[k], typeMapping[k]))
22
- return false;
23
- }
24
- }
25
- else if (typeT == "array") {
26
- if ((0, masUtils_1.getType)(obj) != "array")
27
- return false;
28
- if (obj.length === 0)
29
- return false;
30
- const typeMappingArrObj = typeMapping[0];
31
- if (!typeMappingArrObj) {
32
- throw new Error(`非法的效验格式 ${typeMapping} ${typeMappingArrObj}`);
33
- }
34
- if ((0, masUtils_1.getType)(obj) != "array")
35
- return false;
36
- for (let v of obj) {
37
- if (!validTypeObj(v, typeMappingArrObj))
38
- return false;
39
- }
40
- }
41
- return true;
42
- };
43
- const validTypeObjStrict = (obj, typeMapping) => {
44
- if (obj === null || obj === undefined)
45
- return false;
46
- let typeT = (0, masUtils_1.getType)(typeMapping);
47
- if (typeT == "function") {
48
- return vliadBase(obj, typeMapping);
49
- }
50
- else if (typeT == "object") {
51
- if ((0, masUtils_1.getType)(obj) !== "object")
52
- return false;
53
- if (Object.keys(obj).length != Object.keys(typeT).length)
54
- return false;
55
- for (let k in typeMapping) {
56
- if (obj[k] === null || obj[k] === undefined)
57
- return false;
58
- if (!validType(obj[k], typeMapping[k]))
59
- return false;
60
- }
61
- }
62
- else if (typeT == "array") {
63
- if ((0, masUtils_1.getType)(obj) != "array")
64
- return false;
65
- if (obj.length === 0)
66
- return false;
67
- const typeMappingArrObj = typeMapping[0];
68
- if (!typeMappingArrObj) {
69
- throw new Error(`非法的效验格式 ${typeMapping} ${typeMappingArrObj}`);
70
- }
71
- if ((0, masUtils_1.getType)(obj) != "array")
72
- return false;
73
- for (let v of obj) {
74
- if (!validTypeObj(v, typeMappingArrObj))
75
- return false;
76
- }
77
- }
78
- return true;
79
- };
80
- function validType(obj, typeMapping, strict = false) {
81
- return strict
82
- ? validTypeObjStrict(obj, typeMapping)
83
- : validTypeObj(obj, typeMapping);
84
- }
package/src/index.ts DELETED
@@ -1,98 +0,0 @@
1
- import "module-alias/register";
2
- import express from "express";
3
- import type { Express } from "express";
4
- import { state } from "./state";
5
- import printLog from "./utils/printLog";
6
- import quickSend from "./utils/quickSend";
7
- import readApi from "./utils/readApi";
8
- import validRouteData from "./utils/validRouteData";
9
- import validTokenUse from "./utils/validToken";
10
- import type {
11
- MasReq,
12
- MasRes,
13
- ApiConfigType,
14
- ConfigType,
15
- ApiConfigTypeItem,
16
- } from "./typings";
17
- import c from "ansi-colors";
18
- import moment from "moment";
19
- import "moment/locale/zh-cn";
20
- moment.locale("zh-cn");
21
- import { createToken, validToken } from "./utils/meaToken";
22
- import validType from "./utils/validType";
23
- import createRouter from "./utils/createRouter";
24
- import getRouterInfo, { getApiRouter } from "./utils/getRouterInfo";
25
- import getLogs from "./utils/logs";
26
- import apiLimit from "./utils/apiLimit";
27
-
28
- // =================================================================
29
- export function getApp(
30
- proConfig: {
31
- /** 配置路径 */
32
- configPath: string;
33
- /** 接口路径 */
34
- apisPath: string;
35
- /** 兜底接口文件路径 */
36
- defalutApiPath: string;
37
- /** 日志路径 */
38
- logPath: string;
39
- /** 调试文件路径 */
40
- degbugPath: string;
41
- },
42
- /** 接口生成之前 */
43
- beforeMounted?: (app: Express) => void
44
- ) {
45
- const config = require(proConfig.configPath).default;
46
- // 获取路由信息
47
- getRouterInfo(proConfig.apisPath, proConfig.defalutApiPath);
48
- state.config = config;
49
- // new express
50
- const app = express();
51
- beforeMounted && beforeMounted(app);
52
- // ip限制
53
- if (config.apiLimit?.open) {
54
- apiLimit(app, config.apiLimit || {});
55
- }
56
- // 初始化app
57
- app.use(express.urlencoded({ extended: true }));
58
- app.use(express.json());
59
- // 错误处理中间件
60
- app.use((err, req, res, next) => {
61
- if (err.type == "entity.parse.failed") {
62
- req.body._str = err.body;
63
- }
64
- next();
65
- });
66
- //快速return
67
- app.use(quickSend);
68
- // 打印日志
69
- if (config.logs.debug) {
70
- app.use(require("express-ip")().getIpInfoMiddleware);
71
- app.use(printLog);
72
- }
73
- // 存储日志
74
- if (config.logs.open) {
75
- getLogs(app, proConfig.logPath);
76
- }
77
- // 权限管理
78
- if (config.token.open) {
79
- app.use(validTokenUse);
80
- }
81
- // 数据效验
82
- app.use(validRouteData);
83
- // 创建路由
84
- createRouter(app, proConfig.apisPath);
85
- // 运行debug
86
- setTimeout(() => {
87
- try {
88
- require(proConfig.degbugPath);
89
- } catch (error) {
90
- console.info(c.red("debug.js报错!!!"));
91
- console.info(error);
92
- }
93
- }, config.debugTime || 1000);
94
- return app;
95
- }
96
-
97
- export { readApi, moment, validToken, createToken, validType, getApiRouter };
98
- export type { MasReq, MasRes, ApiConfigType, ConfigType, ApiConfigTypeItem };
package/src/state.ts DELETED
@@ -1 +0,0 @@
1
- export const state: any = {};
@@ -1,113 +0,0 @@
1
- import type { Request, Response } from "express";
2
-
3
- type BasicTypeDescriptor =
4
- | StringConstructor
5
- | NumberConstructor
6
- | BooleanConstructor
7
- | ObjectConstructor;
8
- export type TypeDescriptor = BasicTypeDescriptor | Array<any>;
9
-
10
- export interface TypeMapping {
11
- [key: string]:
12
- | TypeDescriptor
13
- | TypeMapping
14
- | Array<TypeDescriptor | TypeMapping>;
15
- }
16
-
17
- export type ApiConfigTypeItem = {
18
- /** 接口名称 */
19
- name?: string;
20
- /** 接口描述 */
21
- des?: string;
22
- /** 接口请求方法 */
23
- methods?: "get" | "post" | "all";
24
- /** 请求头参数 */
25
- header?: {
26
- /** 参数名称 */
27
- name: string;
28
- /** 是否为空 */
29
- optional?: boolean;
30
- /** 请求头描述 */
31
- des?: string;
32
- /** 参数类型 */
33
- type: TypeDescriptor;
34
- }[];
35
- /** 是否启用token,默认关闭 */
36
- token?: boolean;
37
- /** 允许放行的权限,在启用token的情况下才有效 */
38
- permission?: string[];
39
- /** 请求类型 */
40
- "Content-Type"?:
41
- | "multipart/form-data"
42
- | "application/json"
43
- | "application/x-www-form-urlencoded";
44
- /** 请求示例 */
45
- example?: any;
46
- /** 响应示例 */
47
- resExample?: any;
48
- /** 效验数据格式 */
49
- validFormat?: TypeMapping | TypeDescriptor;
50
- /** 效验数据严格模式,默认不开启 */
51
- validFormatStrict?: boolean;
52
- /** 效验数据格式描述 */
53
- validFormatDes?:
54
- | string[]
55
- | {
56
- /** 字段名称 */
57
- name: string;
58
- /** 字段类型,不填会尝试从validFormat里取 */
59
- type?: TypeMapping | TypeDescriptor;
60
- /** 是否为空 */
61
- optional?: boolean;
62
- /** 字段描述 */
63
- des?: string;
64
- }[];
65
- };
66
- export type MasRes = Response & {
67
- /** 响应数据 */
68
- return: (data: any, status?: any, code?: number, msg?: string) => void;
69
- /** token信息 */
70
- token?: { data: any; _permission: string[] };
71
- /** 通用响应方法 */
72
- reply: (data: any, msg?: string, code?: number) => Promise<void>;
73
- /** 成功响应方法 */
74
- success: (data: any, msg?: string) => Promise<void>;
75
- /** 失败响应方法 */
76
- fail: (data: any, msg?: string) => Promise<void>;
77
- };
78
- export type MasReq = Request & {
79
- body: any;
80
- };
81
- export type ConfigType = {
82
- /** 项目名称 */
83
- projectName: string;
84
- /** 端口号 */
85
- port: number;
86
- logs: {
87
- /** 是否保存日志 */
88
- open: boolean;
89
- /** 是否打印访问日志 */
90
- debug: boolean;
91
- };
92
- /** ip请求限制 */
93
- apiLimit: {
94
- /** 是否开启 */
95
- open?: boolean;
96
- /** 同个 ip windowMs ms之内 */
97
- windowMs?: number;
98
- /** 最多max个请求 */
99
- max?: number; //
100
- };
101
- token: {
102
- /** 是否使用token */
103
- open: boolean;
104
- /** token秘钥 */
105
- pwd: string;
106
- /** 参数名 */
107
- headerParams: string;
108
- };
109
- /** debug延时时间 */
110
- debugTime?: number;
111
- };
112
- export type ApiCallback = Promise<(req: MasReq, res: MasRes) => void>;
113
- export type ApiConfigType = { [key: string]: ApiConfigTypeItem };
@@ -1,15 +0,0 @@
1
- import rateLimit from "express-rate-limit";
2
- const apiLimit = (app: any, config?: { windowMs: number; max: number }) => {
3
- // 创建一个速率限制器,限制每个IP地址在一分钟内最多可以发送10个请求
4
- const limiter = rateLimit({
5
- windowMs: config?.windowMs || 60 * 1000, // 1分钟
6
- max: config?.max || 20, // 最多10个请求
7
- // 当达到限制时调用的处理函数
8
- handler: function (req, res: any) {
9
- res.status(502).end();
10
- },
11
- });
12
- // 将速率限制器应用于所有请求
13
- app.use(limiter);
14
- };
15
- export default apiLimit;
@@ -1,34 +0,0 @@
1
- import { state } from "../state";
2
- import path from "path";
3
- import * as fs from "fs";
4
- import c from "ansi-colors";
5
- export default function createRouter(app, apiDir: string) {
6
- const { Router } = state;
7
- // 遍历api路由
8
- for (const item in Router) {
9
- const filePath = path.join(apiDir, "..", item) + ".ts";
10
- let isExist = fs.existsSync(filePath);
11
- if (!isExist) {
12
- console.info(c.red(`${item} not found`));
13
- continue;
14
- }
15
- const apiFunc = require(filePath).default;
16
- if (!apiFunc) {
17
- console.info(c.yellow(`${item} 没有导出函数,已跳过..`));
18
- } else {
19
- apiFunc &&
20
- app[Router[item].methods](item, async (req, res) => {
21
- try {
22
- await apiFunc(req, res);
23
- } catch (error) {
24
- console.log(error, error.toString);
25
- res.return(
26
- { msg: "服务器错误", error: error?.toString?.() || null },
27
- 0,
28
- 500
29
- );
30
- }
31
- });
32
- }
33
- }
34
- }
@@ -1,49 +0,0 @@
1
- import { state } from "../state";
2
- import readFilesRecursively from "./readApi";
3
- import path from "path";
4
- import fs from "fs";
5
- import c from "ansi-colors";
6
- export default function getRouterInfo(apiDir: string, defaullConfigDir) {
7
- const apiConfig = {};
8
- const routerDir = readFilesRecursively(apiDir, "api");
9
- const defaullConfig = require(defaullConfigDir).config;
10
- // 遍历api路由
11
- for (const item of routerDir) {
12
- const filePath = path.join(apiDir, "..", item) + ".ts";
13
- let isExist = fs.existsSync(filePath);
14
- if (!isExist) {
15
- console.info(c.red(`${item} not found`));
16
- continue;
17
- }
18
- const apiItemConfig = require(filePath).config;
19
- apiConfig[item] = apiItemConfig || defaullConfig;
20
- }
21
- state.Router = apiConfig;
22
- return apiConfig;
23
- }
24
- export const getApiRouter = () => {
25
- const router = JSON.stringify(state.Router, (key, value) => {
26
- if (typeof value === "function") {
27
- return value.toString().replace(/function\s+(\w+)\(\)\s+\{.*\}/, "$1");
28
- }
29
- return value;
30
- });
31
- const newRouter = JSON.parse(router);
32
- // 有的描述没有类型,尝试从validFormat里取
33
- for (const key in newRouter) {
34
- const item = newRouter[key];
35
- if (item.validFormat && item.validFormatDes) {
36
- for (const validFormatDesItem of item.validFormatDes) {
37
- if (
38
- !validFormatDesItem.type &&
39
- item.validFormat[validFormatDesItem.name]
40
- ) {
41
- validFormatDesItem.type = item.validFormat[validFormatDesItem.name];
42
- } else if (!validFormatDesItem.type) {
43
- validFormatDesItem.type = "String";
44
- }
45
- }
46
- }
47
- }
48
- return newRouter;
49
- };
package/src/utils/logs.ts DELETED
@@ -1,21 +0,0 @@
1
- import rateLimit from "express-rate-limit";
2
- import morgan from "morgan";
3
- import fs from "fs";
4
- import * as rfs from "rotating-file-stream";
5
- import moment from "moment-timezone";
6
- const getLogs = (app: any, dir: string) => {
7
- // 创建一个日志目录(如果它不存在的话)
8
- const logDirectory = dir;
9
- fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory);
10
- // 创建一个循环日志流
11
- const accessLogStream = rfs.createStream("access.log", {
12
- size: "50M", // 单个文件的最大大小
13
- interval: "1d", // 每天滚动日志
14
- path: logDirectory,
15
- });
16
- morgan.token("date", (req, res, tz) => {
17
- return moment().tz("Asia/Shanghai").format("YYYY-MM-DD HH:mm:ss");
18
- });
19
- app.use(morgan("combined", { stream: accessLogStream }));
20
- };
21
- export default getLogs;