@ticatec/common-express-server 0.0.1

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 (37) hide show
  1. package/.idea/common-express-server.iml +9 -0
  2. package/.idea/misc.xml +6 -0
  3. package/.idea/modules.xml +8 -0
  4. package/.idea/vcs.xml +6 -0
  5. package/.idea/workspace.xml +74 -0
  6. package/lib/BaseServer.d.ts +76 -0
  7. package/lib/BaseServer.js +128 -0
  8. package/lib/BaseServer.js.map +1 -0
  9. package/lib/CommonRouterHelper.d.ts +40 -0
  10. package/lib/CommonRouterHelper.js +104 -0
  11. package/lib/CommonRouterHelper.js.map +1 -0
  12. package/lib/CommonRoutes.d.ts +10 -0
  13. package/lib/CommonRoutes.js +23 -0
  14. package/lib/CommonRoutes.js.map +1 -0
  15. package/lib/LoggedUser.d.ts +37 -0
  16. package/lib/LoggedUser.js +3 -0
  17. package/lib/LoggedUser.js.map +1 -0
  18. package/lib/common/AdminBaseController.d.ts +26 -0
  19. package/lib/common/AdminBaseController.js +38 -0
  20. package/lib/common/AdminBaseController.js.map +1 -0
  21. package/lib/common/AdminSearchController.d.ts +8 -0
  22. package/lib/common/AdminSearchController.js +21 -0
  23. package/lib/common/AdminSearchController.js.map +1 -0
  24. package/lib/common/BaseController.d.ts +12 -0
  25. package/lib/common/BaseController.js +20 -0
  26. package/lib/common/BaseController.js.map +1 -0
  27. package/lib/common/CommonController.d.ts +70 -0
  28. package/lib/common/CommonController.js +104 -0
  29. package/lib/common/CommonController.js.map +1 -0
  30. package/lib/common/TenantBaseController.d.ts +25 -0
  31. package/lib/common/TenantBaseController.js +40 -0
  32. package/lib/common/TenantBaseController.js.map +1 -0
  33. package/lib/common/TenantSearchController.d.ts +8 -0
  34. package/lib/common/TenantSearchController.js +22 -0
  35. package/lib/common/TenantSearchController.js.map +1 -0
  36. package/package.json +42 -0
  37. package/tsconfig.json +13 -0
@@ -0,0 +1,9 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <module type="JAVA_MODULE" version="4">
3
+ <component name="NewModuleRootManager" inherit-compiler-output="true">
4
+ <exclude-output />
5
+ <content url="file://$MODULE_DIR$" />
6
+ <orderEntry type="inheritedJdk" />
7
+ <orderEntry type="sourceFolder" forTests="false" />
8
+ </component>
9
+ </module>
package/.idea/misc.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="jbr-17" project-jdk-type="JavaSDK">
4
+ <output url="file://$PROJECT_DIR$/out" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ProjectModuleManager">
4
+ <modules>
5
+ <module fileurl="file://$PROJECT_DIR$/.idea/common-express-server.iml" filepath="$PROJECT_DIR$/.idea/common-express-server.iml" />
6
+ </modules>
7
+ </component>
8
+ </project>
package/.idea/vcs.xml ADDED
@@ -0,0 +1,6 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="VcsDirectoryMappings">
4
+ <mapping directory="" vcs="Git" />
5
+ </component>
6
+ </project>
@@ -0,0 +1,74 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <project version="4">
3
+ <component name="ChangeListManager">
4
+ <list default="true" id="9b016121-d0d5-4be3-bbd2-0c1749841a7a" name="Changes" comment="" />
5
+ <option name="SHOW_DIALOG" value="false" />
6
+ <option name="HIGHLIGHT_CONFLICTS" value="true" />
7
+ <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
8
+ <option name="LAST_RESOLUTION" value="IGNORE" />
9
+ </component>
10
+ <component name="Git.Settings">
11
+ <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
12
+ </component>
13
+ <component name="GitLabMergeRequestFiltersHistory"><![CDATA[{
14
+ "lastFilter": {
15
+ "state": "OPENED",
16
+ "assignee": {
17
+ "type": "org.jetbrains.plugins.gitlab.mergerequest.ui.filters.GitLabMergeRequestsFiltersValue.MergeRequestsMemberFilterValue.MergeRequestsAssigneeFilterValue",
18
+ "username": "huili_feng",
19
+ "fullname": "冯辉利"
20
+ }
21
+ }
22
+ }]]></component>
23
+ <component name="GitLabMergeRequestsSettings"><![CDATA[{
24
+ "selectedUrlAndAccountId": {
25
+ "first": "http://git.dev.ticatec.cn/open-source/node-library/common-express-server.git",
26
+ "second": "1c6eb983-bbca-437e-924e-79009ce1a5d2"
27
+ }
28
+ }]]></component>
29
+ <component name="KubernetesApiPersistence"><![CDATA[{}]]></component>
30
+ <component name="KubernetesApiProvider"><![CDATA[{
31
+ "isMigrated": true
32
+ }]]></component>
33
+ <component name="ProjectColorInfo"><![CDATA[{
34
+ "associatedIndex": 7
35
+ }]]></component>
36
+ <component name="ProjectId" id="2wpQaB9hwmokK0HhL4K4dlupk1s" />
37
+ <component name="ProjectViewState">
38
+ <option name="hideEmptyMiddlePackages" value="true" />
39
+ <option name="showLibraryContents" value="true" />
40
+ </component>
41
+ <component name="PropertiesComponent"><![CDATA[{
42
+ "keyToString": {
43
+ "RunOnceActivity.ShowReadmeOnStart": "true",
44
+ "dart.analysis.tool.window.visible": "false",
45
+ "git-widget-placeholder": "main",
46
+ "nodejs_package_manager_path": "npm",
47
+ "settings.editor.selected.configurable": "ssh.settings",
48
+ "show.migrate.to.gradle.popup": "false",
49
+ "vue.rearranger.settings.migration": "true"
50
+ }
51
+ }]]></component>
52
+ <component name="SharedIndexes">
53
+ <attachedChunks>
54
+ <set>
55
+ <option value="bundled-jdk-9823dce3aa75-fbdcb00ec9e3-intellij.indexing.shared.core-IU-251.23774.435" />
56
+ <option value="bundled-js-predefined-d6986cc7102b-f27c65a3e318-JavaScript-IU-251.23774.435" />
57
+ </set>
58
+ </attachedChunks>
59
+ </component>
60
+ <component name="TaskManager">
61
+ <task active="true" id="Default" summary="Default task">
62
+ <changelist id="9b016121-d0d5-4be3-bbd2-0c1749841a7a" name="Changes" comment="" />
63
+ <created>1746736096648</created>
64
+ <option name="number" value="Default" />
65
+ <option name="presentableId" value="Default" />
66
+ <updated>1746736096648</updated>
67
+ <workItem from="1746736097766" duration="1000" />
68
+ </task>
69
+ <servers />
70
+ </component>
71
+ <component name="TypeScriptGeneratedFilesManager">
72
+ <option name="version" value="3" />
73
+ </component>
74
+ </project>
@@ -0,0 +1,76 @@
1
+ /// <reference types="node" />
2
+ import { Express } from 'express';
3
+ import CommonRouterHelper from "./CommonRouterHelper";
4
+ import http from "http";
5
+ import { Logger } from "log4js";
6
+ export declare type moduleLoader = () => Promise<any>;
7
+ export default abstract class BaseServer {
8
+ protected logger: Logger;
9
+ protected helper: CommonRouterHelper;
10
+ protected contextRoot: string;
11
+ protected constructor();
12
+ protected abstract getHelper(): CommonRouterHelper;
13
+ /**
14
+ * 读取配置文件
15
+ * @protected
16
+ */
17
+ protected abstract loadConfigFile(): Promise<void>;
18
+ /**
19
+ * 写入监听端口到check.dat文件中
20
+ * @param port
21
+ * @param fileName
22
+ * @protected
23
+ */
24
+ protected writeCheckFile(port: number, fileName?: string): void;
25
+ protected abstract getLogger(): Logger;
26
+ startup(): Promise<void>;
27
+ /**
28
+ * web服务器创建后的拦截函数
29
+ * @param server
30
+ * @protected
31
+ */
32
+ protected postServerCreated(server: http.Server): Promise<void>;
33
+ protected abstract getWebConf(): any;
34
+ /**
35
+ * 启动前的拦截函数
36
+ * @protected
37
+ */
38
+ protected beforeStart(): Promise<void>;
39
+ protected getHealthCheckPath(): string;
40
+ /**
41
+ *
42
+ * @param app
43
+ * @protected
44
+ */
45
+ protected addHealthCheck(app: Express): void;
46
+ protected startWebServer(webConf: any): Promise<unknown>;
47
+ /**
48
+ * 绑定静态站点
49
+ * @protected
50
+ */
51
+ protected bindStaticSite(app: Express): Promise<void>;
52
+ /**
53
+ * 初始化express
54
+ * @param app
55
+ * @protected
56
+ */
57
+ protected setupExpress(app: Express): void;
58
+ /**
59
+ * 绑定一个路由
60
+ * @param app
61
+ * @param path
62
+ * @param loader
63
+ * @protected
64
+ */
65
+ protected bindRoutes(app: Express, path: string, loader: moduleLoader): Promise<void>;
66
+ /**
67
+ * 设定路由
68
+ * @protected
69
+ */
70
+ protected abstract setupRoutes(app: Express): Promise<void>;
71
+ /**
72
+ * 启动服务器
73
+ * @param server
74
+ */
75
+ static startup(server: BaseServer): void;
76
+ }
@@ -0,0 +1,128 @@
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 express_1 = __importDefault(require("express"));
7
+ const express_exception_1 = require("@ticatec/express-exception");
8
+ const fs_1 = __importDefault(require("fs"));
9
+ class BaseServer {
10
+ constructor() {
11
+ }
12
+ /**
13
+ * 写入监听端口到check.dat文件中
14
+ * @param port
15
+ * @param fileName
16
+ * @protected
17
+ */
18
+ writeCheckFile(port, fileName = './check.dat') {
19
+ try {
20
+ this.logger.debug('端口', port);
21
+ fs_1.default.writeFileSync(fileName, `${port}`);
22
+ }
23
+ catch (err) {
24
+ this.logger.error('写入端口发送错误', err);
25
+ }
26
+ }
27
+ async startup() {
28
+ this.helper = this.getHelper();
29
+ await this.loadConfigFile();
30
+ this.logger = this.getLogger();
31
+ try {
32
+ await this.beforeStart();
33
+ let webConf = this.getWebConf();
34
+ this.writeCheckFile(webConf.port);
35
+ this.contextRoot = webConf.contextRoot;
36
+ await this.startWebServer(webConf);
37
+ }
38
+ catch (err) {
39
+ this.logger.error('启动失败,原因:', err);
40
+ }
41
+ }
42
+ /**
43
+ * web服务器创建后的拦截函数
44
+ * @param server
45
+ * @protected
46
+ */
47
+ async postServerCreated(server) {
48
+ }
49
+ /**
50
+ * 启动前的拦截函数
51
+ * @protected
52
+ */
53
+ async beforeStart() {
54
+ }
55
+ getHealthCheckPath() {
56
+ return '/health-check';
57
+ }
58
+ /**
59
+ *
60
+ * @param app
61
+ * @protected
62
+ */
63
+ addHealthCheck(app) {
64
+ let path = this.getHealthCheckPath();
65
+ this.logger.debug('加载系统健康检测', path);
66
+ if (path) {
67
+ app.get(path, (req, res) => { res.send(''); });
68
+ }
69
+ }
70
+ async startWebServer(webConf) {
71
+ let app = (0, express_1.default)();
72
+ app.disable("x-powered-by");
73
+ app.use(this.helper.setNoCache);
74
+ this.addHealthCheck(app);
75
+ this.setupExpress(app);
76
+ await this.bindStaticSite(app);
77
+ await this.setupRoutes(app);
78
+ app.use(this.helper.actionNotFound());
79
+ app.use((err, req, res, next) => {
80
+ this.logger.debug("系统异常", err);
81
+ (0, express_exception_1.handleError)(err, req, res);
82
+ });
83
+ return new Promise(resolve => {
84
+ let server = app.listen(webConf.port, webConf.ip, () => {
85
+ this.logger.info(`Web服务启动成功,监听IP:${webConf.ip},端口:${webConf.port}`);
86
+ this.postServerCreated(server);
87
+ resolve(server);
88
+ });
89
+ });
90
+ }
91
+ /**
92
+ * 绑定静态站点
93
+ * @protected
94
+ */
95
+ async bindStaticSite(app) {
96
+ }
97
+ /**
98
+ * 初始化express
99
+ * @param app
100
+ * @protected
101
+ */
102
+ setupExpress(app) {
103
+ }
104
+ /**
105
+ * 绑定一个路由
106
+ * @param app
107
+ * @param path
108
+ * @param loader
109
+ * @protected
110
+ */
111
+ async bindRoutes(app, path, loader) {
112
+ let clazz = (await loader()).default;
113
+ let router = new clazz(this.helper);
114
+ router.bindRouter(app, `${this.contextRoot}${path}`);
115
+ }
116
+ /**
117
+ * 启动服务器
118
+ * @param server
119
+ */
120
+ static startup(server) {
121
+ server.startup().then(() => {
122
+ }).catch(ex => {
123
+ console.error('服务器启动异常', ex);
124
+ });
125
+ }
126
+ }
127
+ exports.default = BaseServer;
128
+ //# sourceMappingURL=BaseServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseServer.js","sourceRoot":"src/","sources":["BaseServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { Request, Response } from "express";
2
+ export declare type RestfulFunction = (req: any) => any;
3
+ export declare type ControlFunction = (req: any, res: any) => any;
4
+ export default class CommonRouterHelper {
5
+ protected readonly logger: any;
6
+ /**
7
+ * 设置Http Response的header为JSON格式
8
+ * @param req
9
+ * @param res
10
+ * @param next
11
+ */
12
+ setJsonHeader(req: Request, res: Response, next: any): void;
13
+ /**
14
+ * 设置response不使用cache
15
+ * @param req
16
+ * @param res
17
+ * @param next
18
+ * @returns {Promise<void>}
19
+ */
20
+ setNoCache(req: Request, res: Response, next: any): void;
21
+ /**
22
+ * 调用一个restful的操作,将结果封装成json格式返回请求端
23
+ * @param func
24
+ */
25
+ invokeRestfulAction(func: RestfulFunction): any;
26
+ /**
27
+ * 调用异步函数并处理返回的错误
28
+ * @param func
29
+ */
30
+ invokeController(func: ControlFunction): (req: Request, res: Response) => Promise<void>;
31
+ /**
32
+ *
33
+ */
34
+ /**
35
+ * 处理无效的请求路径
36
+ */
37
+ actionNotFound(): (req: Request, res: Response, next: any) => void;
38
+ protected retrieveUser(req: Request): void;
39
+ checkLoggedUser(): (req: Request, res: Response, next: any) => void;
40
+ }
@@ -0,0 +1,104 @@
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 express_exception_1 = require("@ticatec/express-exception");
7
+ const singleton_log4js_1 = __importDefault(require("@ticatec/singleton-log4js"));
8
+ class CommonRouterHelper {
9
+ constructor() {
10
+ this.logger = singleton_log4js_1.default.getLogger("CommonRouterHelper");
11
+ }
12
+ /**
13
+ * 设置Http Response的header为JSON格式
14
+ * @param req
15
+ * @param res
16
+ * @param next
17
+ */
18
+ setJsonHeader(req, res, next) {
19
+ res.header('Content-Type', 'application/json');
20
+ next();
21
+ }
22
+ /**
23
+ * 设置response不使用cache
24
+ * @param req
25
+ * @param res
26
+ * @param next
27
+ * @returns {Promise<void>}
28
+ */
29
+ setNoCache(req, res, next) {
30
+ res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
31
+ res.header('Expires', '-1');
32
+ res.header('Pragma', 'no-cache');
33
+ next();
34
+ }
35
+ /**
36
+ * 调用一个restful的操作,将结果封装成json格式返回请求端
37
+ * @param func
38
+ */
39
+ invokeRestfulAction(func) {
40
+ return async (req, res) => {
41
+ try {
42
+ let result = await func(req);
43
+ if (result != null) {
44
+ res.json(result);
45
+ }
46
+ else {
47
+ res.status(204).send();
48
+ }
49
+ }
50
+ catch (ex) {
51
+ (0, express_exception_1.handleError)(ex, req, res);
52
+ }
53
+ };
54
+ }
55
+ /**
56
+ * 调用异步函数并处理返回的错误
57
+ * @param func
58
+ */
59
+ invokeController(func) {
60
+ return async (req, res) => {
61
+ try {
62
+ await func(req, res);
63
+ }
64
+ catch (ex) {
65
+ (0, express_exception_1.handleError)(ex, req, res);
66
+ }
67
+ };
68
+ }
69
+ /**
70
+ *
71
+ */
72
+ /**
73
+ * 处理无效的请求路径
74
+ */
75
+ actionNotFound() {
76
+ return (req, res, next) => {
77
+ (0, express_exception_1.handleError)(new express_exception_1.ActionNotFoundError(), req, res);
78
+ };
79
+ }
80
+ retrieveUser(req) {
81
+ let userStr = req.headers['user'];
82
+ if (userStr != null) {
83
+ try {
84
+ req['user'] = JSON.parse(decodeURIComponent(userStr));
85
+ }
86
+ catch (ex) {
87
+ this.logger.debug('无效的user头', userStr);
88
+ }
89
+ }
90
+ }
91
+ checkLoggedUser() {
92
+ return (req, res, next) => {
93
+ this.retrieveUser(req);
94
+ if (req['user'] == null) {
95
+ (0, express_exception_1.handleError)(new express_exception_1.UnauthenticatedError(), req, res);
96
+ }
97
+ else {
98
+ next();
99
+ }
100
+ };
101
+ }
102
+ }
103
+ exports.default = CommonRouterHelper;
104
+ //# sourceMappingURL=CommonRouterHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommonRouterHelper.js","sourceRoot":"src/","sources":["CommonRouterHelper.ts"],"names":[],"mappings":";;;;;AACA,kEAAkG;AAClG,iFAA+C;AAM/C,MAAqB,kBAAkB;IAAvC;QAEuB,WAAM,GAAG,0BAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IAkGvE,CAAC;IAhGG;;;;;OAKG;IACH,aAAa,CAAC,GAAY,EAAE,GAAa,EAAE,IAAQ;QAC/C,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC;IACX,CAAC;IAGD;;;;;;OAMG;IACH,UAAU,CAAC,GAAY,EAAE,GAAa,EAAE,IAAQ;QAC5C,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC,CAAC;QAC5E,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC5B,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC;IACX,CAAC;IAED;;;OAGG;IACH,mBAAmB,CAAC,IAAqB;QACrC,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;YACxD,IAAI;gBACA,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7B,IAAI,MAAM,IAAI,IAAI,EAAE;oBAChB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;iBACpB;qBAAM;oBACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;iBAC1B;aACJ;YAAC,OAAO,EAAE,EAAE;gBACT,IAAA,+BAAW,EAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aAC7B;QACL,CAAC,CAAA;IACL,CAAC;IAED;;;OAGG;IACH,gBAAgB,CAAC,IAAqB;QAClC,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;YACxD,IAAI;gBACA,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;aACxB;YAAC,OAAO,EAAE,EAAE;gBACT,IAAA,+BAAW,EAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aAC7B;QACL,CAAC,CAAA;IACL,CAAC;IAED;;OAEG;IAEH;;OAEG;IACH,cAAc;QACV,OAAO,CAAC,GAAW,EAAE,GAAY,EAAE,IAAQ,EAAE,EAAE;YAC3C,IAAA,+BAAW,EAAC,IAAI,uCAAmB,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC,CAAA;IACL,CAAC;IAGS,YAAY,CAAC,GAAY;QAC/B,IAAI,OAAO,GAAW,GAAG,CAAC,OAAO,CAAC,MAAM,CAAW,CAAC;QACpD,IAAI,OAAO,IAAI,IAAI,EAAE;YACjB,IAAI;gBACA,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;aACzD;YAAC,OAAO,EAAE,EAAE;gBACT,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;aAC1C;SACJ;IACL,CAAC;IAGD,eAAe;QACX,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAQ,EAAE,EAAE;YAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE;gBACrB,IAAA,+BAAW,EAAC,IAAI,wCAAoB,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;aACrD;iBAAM;gBACH,IAAI,EAAE,CAAC;aACV;QACL,CAAC,CAAA;IACL,CAAC;CAEJ;AApGD,qCAoGC"}
@@ -0,0 +1,10 @@
1
+ import { Express } from "express";
2
+ import CommonRouterHelper from "./CommonRouterHelper";
3
+ import { Logger } from "log4js";
4
+ export default abstract class CommonRoutes {
5
+ readonly router: any;
6
+ protected helper: CommonRouterHelper;
7
+ protected logger: Logger;
8
+ protected constructor(helper: CommonRouterHelper, checkUser?: boolean);
9
+ bindRouter(app: Express, path: string): void;
10
+ }
@@ -0,0 +1,23 @@
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 express_1 = require("express");
7
+ const singleton_log4js_1 = __importDefault(require("@ticatec/singleton-log4js"));
8
+ class CommonRoutes {
9
+ constructor(helper, checkUser = true) {
10
+ this.router = (0, express_1.Router)();
11
+ this.helper = helper;
12
+ this.logger = singleton_log4js_1.default.getLogger(this.constructor.name);
13
+ if (checkUser) {
14
+ this.logger.debug('检查用户是否登录');
15
+ this.router.all('/', helper.checkLoggedUser());
16
+ }
17
+ }
18
+ bindRouter(app, path) {
19
+ app.use(path, this.router);
20
+ }
21
+ }
22
+ exports.default = CommonRoutes;
23
+ //# sourceMappingURL=CommonRoutes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommonRoutes.js","sourceRoot":"src/","sources":["CommonRoutes.ts"],"names":[],"mappings":";;;;;AAAA,qCAAwC;AAGxC,iFAA+C;AAE/C,MAA8B,YAAY;IAKtC,YAAsB,MAA0B,EAAE,YAAqB,IAAI;QACvE,IAAI,CAAC,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,0BAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,SAAS,EAAE;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;YAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;SAClD;IACL,CAAC;IAED,UAAU,CAAC,GAAY,EAAE,IAAY;QACjC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;CACJ;AAlBD,+BAkBC"}
@@ -0,0 +1,37 @@
1
+ export interface CommonUser {
2
+ /**
3
+ *
4
+ */
5
+ id: string;
6
+ /**
7
+ * 编码
8
+ */
9
+ code: string;
10
+ /**
11
+ * 姓名
12
+ */
13
+ name: string;
14
+ /**
15
+ * 部门
16
+ */
17
+ dept: {
18
+ id: string;
19
+ name: string;
20
+ };
21
+ /**
22
+ * 租户
23
+ */
24
+ tenant: {
25
+ code: string;
26
+ name: string;
27
+ };
28
+ }
29
+ /**
30
+ * 当前登陆的用户
31
+ */
32
+ export default interface LoggedUser extends CommonUser {
33
+ /**
34
+ * 扮演用户
35
+ */
36
+ actAs?: CommonUser;
37
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=LoggedUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LoggedUser.js","sourceRoot":"src/","sources":["LoggedUser.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { ValidationRules } from "@ticatec/bean-validator";
2
+ import CommonController from "./CommonController";
3
+ /**
4
+ * 和租户无关的平台管理接口的基础类
5
+ */
6
+ export default abstract class AdminBaseController<T> extends CommonController<T> {
7
+ /**
8
+ * 构造方法
9
+ * @param service
10
+ * @param rules 实体检验规则
11
+ * @protected
12
+ */
13
+ protected constructor(service: T, rules: ValidationRules);
14
+ /**
15
+ * 新增的参数
16
+ * @param req
17
+ * @protected
18
+ */
19
+ protected getCreateNewArguments(req: any): Array<any>;
20
+ /**
21
+ * 更新方法的参数
22
+ * @param req
23
+ * @protected
24
+ */
25
+ protected getUpdateArguments(req: any): any[];
26
+ }
@@ -0,0 +1,38 @@
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 CommonController_1 = __importDefault(require("./CommonController"));
7
+ /**
8
+ * 和租户无关的平台管理接口的基础类
9
+ */
10
+ class AdminBaseController extends CommonController_1.default {
11
+ /**
12
+ * 构造方法
13
+ * @param service
14
+ * @param rules 实体检验规则
15
+ * @protected
16
+ */
17
+ constructor(service, rules) {
18
+ super(service, rules);
19
+ }
20
+ /**
21
+ * 新增的参数
22
+ * @param req
23
+ * @protected
24
+ */
25
+ getCreateNewArguments(req) {
26
+ return [req.body];
27
+ }
28
+ /**
29
+ * 更新方法的参数
30
+ * @param req
31
+ * @protected
32
+ */
33
+ getUpdateArguments(req) {
34
+ return [req.body];
35
+ }
36
+ }
37
+ exports.default = AdminBaseController;
38
+ //# sourceMappingURL=AdminBaseController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminBaseController.js","sourceRoot":"src/","sources":["common/AdminBaseController.ts"],"names":[],"mappings":";;;;;AACA,0EAAkD;AAElD;;GAEG;AACH,MAA8B,mBAAuB,SAAQ,0BAAmB;IAE5E;;;;;OAKG;IACH,YAAsB,OAAU,EAAE,KAAsB;QACpD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACO,qBAAqB,CAAC,GAAQ;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;IAED;;;;OAIG;IACO,kBAAkB,CAAC,GAAQ;QACjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACrB,CAAC;CACJ;AA7BD,sCA6BC"}
@@ -0,0 +1,8 @@
1
+ import { Request } from "express";
2
+ import AdminBaseController from "./AdminBaseController";
3
+ /**
4
+ * 和租户无关的代查询的平台管理接口的基础类
5
+ */
6
+ export default abstract class AdminSearchController<T> extends AdminBaseController<T> {
7
+ search(): (req: Request) => Promise<any>;
8
+ }
@@ -0,0 +1,21 @@
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 AdminBaseController_1 = __importDefault(require("./AdminBaseController"));
7
+ const BaseController_1 = __importDefault(require("./BaseController"));
8
+ /**
9
+ * 和租户无关的代查询的平台管理接口的基础类
10
+ */
11
+ class AdminSearchController extends AdminBaseController_1.default {
12
+ search() {
13
+ return (req) => {
14
+ let query = req.query;
15
+ BaseController_1.default.debugEnabled && this.logger.debug(`path: ${req.path}, query by criteria:`, query);
16
+ return this.invokeServiceInterface('search', [query]);
17
+ };
18
+ }
19
+ }
20
+ exports.default = AdminSearchController;
21
+ //# sourceMappingURL=AdminSearchController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminSearchController.js","sourceRoot":"src/","sources":["common/AdminSearchController.ts"],"names":[],"mappings":";;;;;AACA,gFAAwD;AACxD,sEAA8C;AAE9C;;GAEG;AACH,MAA8B,qBAAyB,SAAQ,6BAAsB;IAEjF,MAAM;QACF,OAAO,CAAC,GAAW,EAAE,EAAE;YACnB,IAAI,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;YACtB,wBAAc,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,sBAAsB,EAAE,KAAK,CAAC,CAAC;YACjG,OAAO,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAA;IACL,CAAC;CACJ;AATD,wCASC"}
@@ -0,0 +1,12 @@
1
+ import { Logger } from "log4js";
2
+ export default abstract class BaseController<T> {
3
+ static debugEnabled: boolean;
4
+ protected readonly service: T;
5
+ protected readonly logger: Logger;
6
+ /**
7
+ * 构造方法
8
+ * @param service
9
+ * @protected
10
+ */
11
+ protected constructor(service: T);
12
+ }
@@ -0,0 +1,20 @@
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 singleton_log4js_1 = __importDefault(require("@ticatec/singleton-log4js"));
7
+ class BaseController {
8
+ /**
9
+ * 构造方法
10
+ * @param service
11
+ * @protected
12
+ */
13
+ constructor(service) {
14
+ this.logger = singleton_log4js_1.default.getLogger(this.constructor.name);
15
+ this.service = service;
16
+ }
17
+ }
18
+ exports.default = BaseController;
19
+ BaseController.debugEnabled = false;
20
+ //# sourceMappingURL=BaseController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseController.js","sourceRoot":"src/","sources":["common/BaseController.ts"],"names":[],"mappings":";;;;;AAAA,iFAA+C;AAG/C,MAA8B,cAAc;IAMxC;;;;OAIG;IACH,YAAsB,OAAU;QAC5B,IAAI,CAAC,MAAM,GAAG,0BAAM,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IAC3B,CAAC;;AAdL,iCAeC;AAbU,2BAAY,GAAY,KAAK,CAAC"}
@@ -0,0 +1,70 @@
1
+ import BaseController from "./BaseController";
2
+ import { ValidationRules } from "@ticatec/bean-validator";
3
+ import { RestfulFunction } from "../CommonRouterHelper";
4
+ /**
5
+ * 实现了增/删/改的控制类
6
+ */
7
+ export default abstract class CommonController<T> extends BaseController<T> {
8
+ /**
9
+ * 实体检验规则
10
+ * @protected
11
+ */
12
+ protected readonly rules: ValidationRules;
13
+ protected constructor(service: T, rules?: ValidationRules);
14
+ /**
15
+ * 验证实体
16
+ * @param data
17
+ * @protected
18
+ */
19
+ protected validateEntity(data: any): void;
20
+ /**
21
+ * 新增实体接口
22
+ */
23
+ createNew(): RestfulFunction;
24
+ /**
25
+ * 更新实体接口
26
+ */
27
+ update(): RestfulFunction;
28
+ /**
29
+ * 删除实体接口
30
+ */
31
+ del(): RestfulFunction;
32
+ protected checkInterface(name: string): void;
33
+ /**
34
+ * 根据名称调用服务接口
35
+ * @param name
36
+ * @param args
37
+ * @protected
38
+ */
39
+ protected invokeServiceInterface(name: string, args?: Array<any>): Promise<any>;
40
+ /**
41
+ * 新建实体
42
+ * @param req
43
+ * @protected
44
+ */
45
+ protected _createNew(req: any): Promise<any>;
46
+ /**
47
+ * 更新实体
48
+ * @param req
49
+ * @protected
50
+ */
51
+ protected _update(req: any): Promise<any>;
52
+ /**
53
+ * 删除实体
54
+ * @param req
55
+ * @protected
56
+ */
57
+ protected _del(req: any): Promise<any>;
58
+ /**
59
+ * 新增实体的参数
60
+ * @param req
61
+ * @protected
62
+ */
63
+ protected abstract getCreateNewArguments(req: any): Array<any>;
64
+ /**
65
+ * 更新实体的参数
66
+ * @param req
67
+ * @protected
68
+ */
69
+ protected abstract getUpdateArguments(req: any): Array<any>;
70
+ }
@@ -0,0 +1,104 @@
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 express_exception_1 = require("@ticatec/express-exception");
7
+ const BaseController_1 = __importDefault(require("./BaseController"));
8
+ const bean_validator_1 = __importDefault(require("@ticatec/bean-validator"));
9
+ /**
10
+ * 实现了增/删/改的控制类
11
+ */
12
+ class CommonController extends BaseController_1.default {
13
+ constructor(service, rules = null) {
14
+ super(service);
15
+ this.rules = rules;
16
+ }
17
+ /**
18
+ * 验证实体
19
+ * @param data
20
+ * @protected
21
+ */
22
+ validateEntity(data) {
23
+ let result = bean_validator_1.default.validate(data, this.rules);
24
+ if (!result.valid) {
25
+ BaseController_1.default.debugEnabled && this.logger.debug(`invalid data: ${result.errorMessage}`);
26
+ throw new express_exception_1.IllegalParameterError(result.errorMessage);
27
+ }
28
+ }
29
+ /**
30
+ * 新增实体接口
31
+ */
32
+ createNew() {
33
+ return async (req) => {
34
+ return this._createNew(req);
35
+ };
36
+ }
37
+ /**
38
+ * 更新实体接口
39
+ */
40
+ update() {
41
+ return async (req) => {
42
+ return this._update(req);
43
+ };
44
+ }
45
+ /**
46
+ * 删除实体接口
47
+ */
48
+ del() {
49
+ return async (req) => {
50
+ return this._del(req);
51
+ };
52
+ }
53
+ checkInterface(name) {
54
+ if (this.service[name] == null) {
55
+ this.logger.warn(`当前服务没有新增接口:${name}`);
56
+ throw new express_exception_1.ActionNotFoundError(`当前服务没有新增接口:${name}`);
57
+ }
58
+ }
59
+ /**
60
+ * 根据名称调用服务接口
61
+ * @param name
62
+ * @param args
63
+ * @protected
64
+ */
65
+ async invokeServiceInterface(name, args = []) {
66
+ return await this.service[name](...args);
67
+ }
68
+ /**
69
+ * 新建实体
70
+ * @param req
71
+ * @protected
72
+ */
73
+ _createNew(req) {
74
+ let data = req.body;
75
+ BaseController_1.default.debugEnabled && this.logger.debug(`${req.method} ${req.originalUrl} 申请创建一个实体`, data);
76
+ this.checkInterface('createNew');
77
+ this.validateEntity(data);
78
+ return this.invokeServiceInterface('createNew', this.getCreateNewArguments(req));
79
+ }
80
+ /**
81
+ * 更新实体
82
+ * @param req
83
+ * @protected
84
+ */
85
+ _update(req) {
86
+ let data = req.body;
87
+ BaseController_1.default.debugEnabled && this.logger.debug(`${req.method} ${req.originalUrl} 申请更新一个实体,`, data);
88
+ this.checkInterface('update');
89
+ this.validateEntity(data);
90
+ return this.invokeServiceInterface('update', this.getUpdateArguments(req));
91
+ }
92
+ /**
93
+ * 删除实体
94
+ * @param req
95
+ * @protected
96
+ */
97
+ _del(req) {
98
+ //请在子类实现删除接口,否则会抛出系统异常
99
+ this.logger.warn('当前服务没有删除接口');
100
+ throw new express_exception_1.ActionNotFoundError('当前服务没有删除接口');
101
+ }
102
+ }
103
+ exports.default = CommonController;
104
+ //# sourceMappingURL=CommonController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommonController.js","sourceRoot":"src/","sources":["common/CommonController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import CommonController from "./CommonController";
2
+ import { ValidationRules } from "@ticatec/bean-validator";
3
+ /**
4
+ * 租户的基础接口
5
+ */
6
+ export default abstract class TenantBaseController<T> extends CommonController<T> {
7
+ protected constructor(service: any, rules: ValidationRules);
8
+ /**
9
+ * 获取当前登录用户,如果有扮演,获取扮演用户
10
+ * @param req
11
+ */
12
+ protected getLoggedUser: (req: any) => any;
13
+ /**
14
+ * 获取新增接口的参数,第一个参数为登录用户,第二个参数为请求数据
15
+ * @param req
16
+ * @protected
17
+ */
18
+ protected getCreateNewArguments(req: any): Array<any>;
19
+ /**
20
+ * 获取更新接口的参数,第一个参数为登录用户,第二个参数为请求数据
21
+ * @param req
22
+ * @protected
23
+ */
24
+ protected getUpdateArguments(req: any): any[];
25
+ }
@@ -0,0 +1,40 @@
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 CommonController_1 = __importDefault(require("./CommonController"));
7
+ /**
8
+ * 租户的基础接口
9
+ */
10
+ class TenantBaseController extends CommonController_1.default {
11
+ constructor(service, rules) {
12
+ super(service, rules);
13
+ /**
14
+ * 获取当前登录用户,如果有扮演,获取扮演用户
15
+ * @param req
16
+ */
17
+ this.getLoggedUser = (req) => {
18
+ let user = req.user;
19
+ return user.actAs || user;
20
+ };
21
+ }
22
+ /**
23
+ * 获取新增接口的参数,第一个参数为登录用户,第二个参数为请求数据
24
+ * @param req
25
+ * @protected
26
+ */
27
+ getCreateNewArguments(req) {
28
+ return [this.getLoggedUser(req), req.body];
29
+ }
30
+ /**
31
+ * 获取更新接口的参数,第一个参数为登录用户,第二个参数为请求数据
32
+ * @param req
33
+ * @protected
34
+ */
35
+ getUpdateArguments(req) {
36
+ return [this.getLoggedUser(req), req.body];
37
+ }
38
+ }
39
+ exports.default = TenantBaseController;
40
+ //# sourceMappingURL=TenantBaseController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantBaseController.js","sourceRoot":"src/","sources":["common/TenantBaseController.ts"],"names":[],"mappings":";;;;;AACA,0EAAkD;AAGlD;;GAEG;AACH,MAA8B,oBAAwB,SAAQ,0BAAmB;IAE7E,YAAsB,OAAY,EAAE,KAAsB;QACtD,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAG1B;;;WAGG;QACO,kBAAa,GAAG,CAAC,GAAG,EAAE,EAAE;YAC9B,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YACpB,OAAO,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;QAC9B,CAAC,CAAA;IATD,CAAC;IAWD;;;;OAIG;IACO,qBAAqB,CAAC,GAAQ;QACpC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;IAED;;;;OAIG;IACO,kBAAkB,CAAC,GAAQ;QACjC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC;CAEJ;AAjCD,uCAiCC"}
@@ -0,0 +1,8 @@
1
+ import { Request } from "express";
2
+ import TenantBaseController from "./TenantBaseController";
3
+ /**
4
+ * 供租户使用带查询的接口
5
+ */
6
+ export default abstract class TenantSearchController<T> extends TenantBaseController<T> {
7
+ search(): (req: Request) => Promise<any>;
8
+ }
@@ -0,0 +1,22 @@
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 TenantBaseController_1 = __importDefault(require("./TenantBaseController"));
7
+ const BaseController_1 = __importDefault(require("./BaseController"));
8
+ /**
9
+ * 供租户使用带查询的接口
10
+ */
11
+ class TenantSearchController extends TenantBaseController_1.default {
12
+ search() {
13
+ return async (req) => {
14
+ let query = req.query;
15
+ BaseController_1.default.debugEnabled && this.logger.debug(`path: ${req.path}, query by criteria:`, query);
16
+ this.checkInterface('search');
17
+ return await this.invokeServiceInterface('search', [this.getLoggedUser(req), query]);
18
+ };
19
+ }
20
+ }
21
+ exports.default = TenantSearchController;
22
+ //# sourceMappingURL=TenantSearchController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantSearchController.js","sourceRoot":"src/","sources":["common/TenantSearchController.ts"],"names":[],"mappings":";;;;;AACA,kFAA0D;AAC1D,sEAA8C;AAE9C;;GAEG;AACH,MAA8B,sBAA0B,SAAQ,8BAAuB;IAEnF,MAAM;QACF,OAAO,KAAK,EAAE,GAAW,EAAe,EAAE;YACtC,IAAI,KAAK,GAAO,GAAG,CAAC,KAAK,CAAC;YAC1B,wBAAc,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,sBAAsB,EAAE,KAAK,CAAC,CAAC;YACjG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9B,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QACzF,CAAC,CAAA;IACL,CAAC;CAEJ;AAXD,yCAWC"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@ticatec/common-express-server",
3
+ "version": "0.0.1",
4
+ "description": "A set of common classes for node express apps.",
5
+ "main": "lib/index.js",
6
+ "types": "lib/index.d.ts",
7
+ "scripts": {
8
+ "test": "echo \"Error: no test specified\" && exit 1",
9
+ "build": "rm -rf ./lib && tsc",
10
+ "publish-public": "npm publish --access public"
11
+ },
12
+ "keywords": [
13
+ "ticatec",
14
+ "common",
15
+ "database",
16
+ "utils"
17
+ ],
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/ticatec/common-express-server.git"
21
+ },
22
+ "author": "Henry Feng",
23
+ "license": "MIT",
24
+ "bugs": {
25
+ "url": "https://github.com/ticatec/common-express-server/issues"
26
+ },
27
+ "homepage": "https://github.com/ticatec/common-express-server",
28
+ "devDependencies": {
29
+ "@ticatec/singleton-log4js": "^0.0.5",
30
+ "@types/express": "^5.0.1",
31
+ "@types/node": "^22.8.6",
32
+ "log4js": "^6.7.0"
33
+ },
34
+ "dependencies": {
35
+ "@ticatec/bean-validator": "^0.0.1",
36
+ "@ticatec/express-exception": "^1.1.1",
37
+ "express": "^5.1.0"
38
+ },
39
+ "peerDependencies": {
40
+ "express": "^5.1.0"
41
+ }
42
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "module": "commonjs",
4
+ "esModuleInterop": true,
5
+ "target": "es2017",
6
+ "moduleResolution": "node",
7
+ "sourceMap": true,
8
+ "declaration": true,
9
+ "outDir": "lib",
10
+ "sourceRoot": "src"
11
+ },
12
+ "lib": ["es2017"]
13
+ }