mas-server 3.0.0 → 3.0.2
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.
- package/dist/index.js +27 -2
- package/dist/utils/getRouterInfo.js +27 -0
- package/package.json +1 -1
- package/src/index.ts +4 -2
- package/src/utils/getRouterInfo.ts +26 -1
- package/src/utils/logs.ts +21 -21
- package/src/utils/printLog.ts +12 -12
- package/test/main.ts +1 -1
- package/test/src/apiDoc.ts +33 -0
- package/test/src/debug.ts +2 -1
- package/tsconfig-build.json +20 -20
package/dist/index.js
CHANGED
|
@@ -1,9 +1,32 @@
|
|
|
1
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
26
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
27
|
};
|
|
5
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.validType = exports.createToken = exports.validToken = exports.moment = exports.readApi = void 0;
|
|
29
|
+
exports.getApiRouter = exports.validType = exports.createToken = exports.validToken = exports.moment = exports.readApi = void 0;
|
|
7
30
|
exports.getApp = getApp;
|
|
8
31
|
require("module-alias/register");
|
|
9
32
|
const express_1 = __importDefault(require("express"));
|
|
@@ -25,7 +48,8 @@ Object.defineProperty(exports, "validToken", { enumerable: true, get: function (
|
|
|
25
48
|
const validType_1 = __importDefault(require("./utils/validType"));
|
|
26
49
|
exports.validType = validType_1.default;
|
|
27
50
|
const createRouter_1 = __importDefault(require("./utils/createRouter"));
|
|
28
|
-
const getRouterInfo_1 =
|
|
51
|
+
const getRouterInfo_1 = __importStar(require("./utils/getRouterInfo"));
|
|
52
|
+
Object.defineProperty(exports, "getApiRouter", { enumerable: true, get: function () { return getRouterInfo_1.getApiRouter; } });
|
|
29
53
|
const logs_1 = __importDefault(require("./utils/logs"));
|
|
30
54
|
const apiLimit_1 = __importDefault(require("./utils/apiLimit"));
|
|
31
55
|
// =================================================================
|
|
@@ -39,6 +63,7 @@ beforeMounted) {
|
|
|
39
63
|
state_1.state.config = config;
|
|
40
64
|
// new express
|
|
41
65
|
const app = (0, express_1.default)();
|
|
66
|
+
beforeMounted && beforeMounted(app);
|
|
42
67
|
// ip限制
|
|
43
68
|
if ((_a = config.apiLimit) === null || _a === void 0 ? void 0 : _a.open) {
|
|
44
69
|
(0, apiLimit_1.default)(app, config.apiLimit || {});
|
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getApiRouter = void 0;
|
|
6
7
|
exports.default = getRouterInfo;
|
|
7
8
|
const state_1 = require("../state");
|
|
8
9
|
const readApi_1 = __importDefault(require("./readApi"));
|
|
@@ -27,3 +28,29 @@ function getRouterInfo(apiDir, defaullConfigDir) {
|
|
|
27
28
|
state_1.state.Router = apiConfig;
|
|
28
29
|
return apiConfig;
|
|
29
30
|
}
|
|
31
|
+
const getApiRouter = () => {
|
|
32
|
+
const router = JSON.stringify(state_1.state.Router, (key, value) => {
|
|
33
|
+
if (typeof value === "function") {
|
|
34
|
+
return value.toString().replace(/function\s+(\w+)\(\)\s+\{.*\}/, "$1");
|
|
35
|
+
}
|
|
36
|
+
return value;
|
|
37
|
+
});
|
|
38
|
+
const newRouter = JSON.parse(router);
|
|
39
|
+
// 有的描述没有类型,尝试从validFormat里取
|
|
40
|
+
for (const key in newRouter) {
|
|
41
|
+
const item = newRouter[key];
|
|
42
|
+
if (item.validFormat && item.validFormatDes) {
|
|
43
|
+
for (const validFormatDesItem of item.validFormatDes) {
|
|
44
|
+
if (!validFormatDesItem.type &&
|
|
45
|
+
item.validFormat[validFormatDesItem.name]) {
|
|
46
|
+
validFormatDesItem.type = item.validFormat[validFormatDesItem.name];
|
|
47
|
+
}
|
|
48
|
+
else if (!validFormatDesItem.type) {
|
|
49
|
+
validFormatDesItem.type = "String";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return newRouter;
|
|
55
|
+
};
|
|
56
|
+
exports.getApiRouter = getApiRouter;
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -21,7 +21,7 @@ moment.locale("zh-cn");
|
|
|
21
21
|
import { createToken, validToken } from "./utils/meaToken";
|
|
22
22
|
import validType from "./utils/validType";
|
|
23
23
|
import createRouter from "./utils/createRouter";
|
|
24
|
-
import getRouterInfo from "./utils/getRouterInfo";
|
|
24
|
+
import getRouterInfo, { getApiRouter } from "./utils/getRouterInfo";
|
|
25
25
|
import getLogs from "./utils/logs";
|
|
26
26
|
import apiLimit from "./utils/apiLimit";
|
|
27
27
|
|
|
@@ -48,6 +48,7 @@ export function getApp(
|
|
|
48
48
|
state.config = config;
|
|
49
49
|
// new express
|
|
50
50
|
const app = express();
|
|
51
|
+
beforeMounted && beforeMounted(app);
|
|
51
52
|
// ip限制
|
|
52
53
|
if (config.apiLimit?.open) {
|
|
53
54
|
apiLimit(app, config.apiLimit || {});
|
|
@@ -92,5 +93,6 @@ export function getApp(
|
|
|
92
93
|
}, config.debugTime || 1000);
|
|
93
94
|
return app;
|
|
94
95
|
}
|
|
95
|
-
|
|
96
|
+
|
|
97
|
+
export { readApi, moment, validToken, createToken, validType, getApiRouter };
|
|
96
98
|
export type { MasReq, MasRes, ApiConfigType, ConfigType, ApiConfigTypeItem };
|
|
@@ -7,7 +7,6 @@ export default function getRouterInfo(apiDir: string, defaullConfigDir) {
|
|
|
7
7
|
const apiConfig = {};
|
|
8
8
|
const routerDir = readFilesRecursively(apiDir, "api");
|
|
9
9
|
const defaullConfig = require(defaullConfigDir).config;
|
|
10
|
-
|
|
11
10
|
// 遍历api路由
|
|
12
11
|
for (const item of routerDir) {
|
|
13
12
|
const filePath = path.join(apiDir, "..", item) + ".ts";
|
|
@@ -22,3 +21,29 @@ export default function getRouterInfo(apiDir: string, defaullConfigDir) {
|
|
|
22
21
|
state.Router = apiConfig;
|
|
23
22
|
return apiConfig;
|
|
24
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
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
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;
|
|
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;
|
package/src/utils/printLog.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import fs from "fs";
|
|
2
|
-
import { state } from "../state";
|
|
3
|
-
import moment from "moment";
|
|
4
|
-
|
|
5
|
-
export default (req, res, next) => {
|
|
6
|
-
const date = moment().format("YYYY-MM-DD HH:mm:ss");
|
|
7
|
-
const data = `${date} ${req.method} ${req.ipInfo.ip} ${req.url} ${
|
|
8
|
-
req.body ? JSON.stringify(req.body) : ""
|
|
9
|
-
}\n`;
|
|
10
|
-
console.info(data);
|
|
11
|
-
next();
|
|
12
|
-
};
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import { state } from "../state";
|
|
3
|
+
import moment from "moment";
|
|
4
|
+
|
|
5
|
+
export default (req, res, next) => {
|
|
6
|
+
const date = moment().format("YYYY-MM-DD HH:mm:ss");
|
|
7
|
+
const data = `${date} ${req.method} ${req.ipInfo.ip} ${req.url} ${
|
|
8
|
+
req.body ? JSON.stringify(req.body) : ""
|
|
9
|
+
}\n`;
|
|
10
|
+
console.info(data);
|
|
11
|
+
next();
|
|
12
|
+
};
|
package/test/main.ts
CHANGED
|
@@ -12,6 +12,7 @@ const app = getApp(
|
|
|
12
12
|
},
|
|
13
13
|
(eapp) => {
|
|
14
14
|
eapp.use((req, res: MasRes, next) => {
|
|
15
|
+
console.log(req.path, "加工之前的111");
|
|
15
16
|
next();
|
|
16
17
|
});
|
|
17
18
|
}
|
|
@@ -25,5 +26,4 @@ app.all("*", (_req: MasReq, res: MasRes) => {
|
|
|
25
26
|
});
|
|
26
27
|
app.listen(8087, () => {
|
|
27
28
|
console.log("http://localhost:8087");
|
|
28
|
-
console.log("http://localhost:8087/apidoc");
|
|
29
29
|
});
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// import type { Express } from "express";
|
|
2
|
+
// import { MasReq, MasRes } from "@/index";
|
|
3
|
+
// export default (app: Express) => {
|
|
4
|
+
// const router = JSON.stringify(state.Router, (key, value) => {
|
|
5
|
+
// if (typeof value === "function") {
|
|
6
|
+
// return value.toString().replace(/function\s+(\w+)\(\)\s+\{.*\}/, "$1");
|
|
7
|
+
// }
|
|
8
|
+
// return value;
|
|
9
|
+
// });
|
|
10
|
+
// const newRouter = JSON.parse(router);
|
|
11
|
+
// // 有的描述没有类型,尝试从validFormat里取
|
|
12
|
+
// for (const key in newRouter) {
|
|
13
|
+
// const item = newRouter[key];
|
|
14
|
+
// if (item.validFormat && item.validFormatDes) {
|
|
15
|
+
// for (const validFormatDesItem of item.validFormatDes) {
|
|
16
|
+
// if (
|
|
17
|
+
// !validFormatDesItem.type &&
|
|
18
|
+
// item.validFormat[validFormatDesItem.name]
|
|
19
|
+
// ) {
|
|
20
|
+
// validFormatDesItem.type = item.validFormat[validFormatDesItem.name];
|
|
21
|
+
// } else if (!validFormatDesItem.type) {
|
|
22
|
+
// validFormatDesItem.type = "String";
|
|
23
|
+
// }
|
|
24
|
+
// }
|
|
25
|
+
// }
|
|
26
|
+
// }
|
|
27
|
+
// app.post("/apidoc/router", (req: masReq, res: masRes) => {
|
|
28
|
+
// res.return(newRouter);
|
|
29
|
+
// });
|
|
30
|
+
// app.post("/apidoc/cn", (req: masReq, res: masRes) => {
|
|
31
|
+
// res.return(state.apiCN);
|
|
32
|
+
// });
|
|
33
|
+
// };
|
package/test/src/debug.ts
CHANGED
package/tsconfig-build.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "./tsconfigschema.json",
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"strict": false,
|
|
5
|
-
"module": "commonjs",
|
|
6
|
-
"moduleResolution": "node",
|
|
7
|
-
"esModuleInterop": true,
|
|
8
|
-
"baseUrl": "./",
|
|
9
|
-
"rootDir": "src",
|
|
10
|
-
"outDir": "dist",
|
|
11
|
-
"paths": {
|
|
12
|
-
"@/*": ["src/*"],
|
|
13
|
-
"@@/*": ["./*"]
|
|
14
|
-
},
|
|
15
|
-
"target": "es6",
|
|
16
|
-
"lib": ["ES2021", "dom"],
|
|
17
|
-
"resolveJsonModule": true
|
|
18
|
-
},
|
|
19
|
-
"exclude": ["node_modules", "dist", "test", ".temp","beforebuild.js"]
|
|
20
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./tsconfigschema.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"strict": false,
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"moduleResolution": "node",
|
|
7
|
+
"esModuleInterop": true,
|
|
8
|
+
"baseUrl": "./",
|
|
9
|
+
"rootDir": "src",
|
|
10
|
+
"outDir": "dist",
|
|
11
|
+
"paths": {
|
|
12
|
+
"@/*": ["src/*"],
|
|
13
|
+
"@@/*": ["./*"]
|
|
14
|
+
},
|
|
15
|
+
"target": "es6",
|
|
16
|
+
"lib": ["ES2021", "dom"],
|
|
17
|
+
"resolveJsonModule": true
|
|
18
|
+
},
|
|
19
|
+
"exclude": ["node_modules", "dist", "test", ".temp","beforebuild.js"]
|
|
20
|
+
}
|