@tsed/platform-log-middleware 8.11.1 → 8.11.2-rc.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.
- package/lib/esm/domain/PlatformLogMiddlewareSettings.js +0 -1
- package/lib/esm/index.js +0 -1
- package/lib/esm/middlewares/PlatformLogMiddleware.js +0 -1
- package/package.json +8 -7
- package/lib/esm/domain/PlatformLogMiddlewareSettings.js.map +0 -1
- package/lib/esm/index.js.map +0 -1
- package/lib/esm/middlewares/PlatformLogMiddleware.js.map +0 -1
- package/src/domain/PlatformLogMiddlewareSettings.ts +0 -26
- package/src/index.ts +0 -5
- package/src/middlewares/PlatformLogMiddleware.spec.ts +0 -262
- package/src/middlewares/PlatformLogMiddleware.ts +0 -160
- package/vitest.config.mts +0 -21
package/lib/esm/index.js
CHANGED
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@tsed/platform-log-middleware",
|
|
3
3
|
"description": "Log request middleware module for Ts.ED Framework (deprecated)",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"version": "8.11.1",
|
|
5
|
+
"version": "8.11.2-rc.1",
|
|
6
6
|
"source": "./src/index.ts",
|
|
7
7
|
"main": "./lib/esm/index.js",
|
|
8
8
|
"module": "./lib/esm/index.js",
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
"tslib": "2.7.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@tsed/barrels": "8.11.1",
|
|
30
|
-
"@tsed/di": "8.11.1",
|
|
31
|
-
"@tsed/platform-middlewares": "8.11.1",
|
|
32
|
-
"@tsed/platform-params": "8.11.1",
|
|
33
|
-
"@tsed/typescript": "8.11.1",
|
|
29
|
+
"@tsed/barrels": "8.11.2-rc.1",
|
|
30
|
+
"@tsed/di": "8.11.2-rc.1",
|
|
31
|
+
"@tsed/platform-middlewares": "8.11.2-rc.1",
|
|
32
|
+
"@tsed/platform-params": "8.11.2-rc.1",
|
|
33
|
+
"@tsed/typescript": "8.11.2-rc.1",
|
|
34
34
|
"eslint": "9.12.0",
|
|
35
35
|
"typescript": "5.4.5",
|
|
36
36
|
"vitest": "3.1.4"
|
|
@@ -52,7 +52,8 @@
|
|
|
52
52
|
}
|
|
53
53
|
},
|
|
54
54
|
"publishConfig": {
|
|
55
|
-
"distTag": "deprecated"
|
|
55
|
+
"distTag": "deprecated",
|
|
56
|
+
"tag": "rc"
|
|
56
57
|
},
|
|
57
58
|
"repository": "https://github.com/tsedio/tsed",
|
|
58
59
|
"bugs": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformLogMiddlewareSettings.js","sourceRoot":"","sources":["../../../src/domain/PlatformLogMiddlewareSettings.ts"],"names":[],"mappings":""}
|
package/lib/esm/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,cAAc,2CAA2C,CAAC;AAC1D,cAAc,wCAAwC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PlatformLogMiddleware.js","sourceRoot":"","sources":["../../../src/middlewares/PlatformLogMiddleware.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,YAAY,CAAC;AACvC,OAAO,EAAC,QAAQ,EAAC,MAAM,UAAU,CAAC;AAClC,OAAO,EAAC,UAAU,EAAoB,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAC,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAI9C;;;GAGG;AAEI,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAgBhC,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,GAAG,CAAY,GAAY;QAChC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAErB,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,GAAY;QACnB,MAAM,EAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QACrD,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC;QAE/B,IAAI,MAAM,IAAI,OAAO,EAAE,CAAC;YACtB,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG,EAAE,CAAC;gBACnC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAwB,CAAC;gBAC3C,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;oBACf,KAAK,EAAE,aAAa;oBACpB,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU;oBAC/B,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAC5C,KAAK,EAAE,IAAI;oBACX,GAAG,WAAW,CAAC;wBACb,UAAU,EAAE,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI;wBACtC,aAAa,EAAE,KAAK,EAAE,OAAO;wBAC7B,YAAY,EAAE,KAAK,EAAE,MAAM;wBAC3B,WAAW,EAAE,KAAK,EAAE,KAAK;wBACzB,UAAU,EAAE,KAAK,EAAE,IAAI;wBACvB,aAAa,EAAE,KAAK,EAAE,OAAO;qBAC9B,CAAC;iBACH,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACzB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;wBACf,KAAK,EAAE,aAAa;wBACpB,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU;wBAC/B,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;wBAC5C,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAC;gBACL,CAAC;qBAAM,IAAI,UAAU,EAAE,CAAC;oBACtB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;wBACd,KAAK,EAAE,aAAa;wBACpB,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU;wBAC/B,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC;wBAC5C,KAAK,EAAE,IAAI;qBACZ,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACO,UAAU,CAAC,GAAY;QAC/B,MAAM,EAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEvD,GAAG,CAAC,UAAU,GAAG,IAAI,CAAC;QAEtB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACzB,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;oBACf,KAAK,EAAE,eAAe;iBACvB,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,UAAU,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,eAAe;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACO,gBAAgB,CAAC,GAAY;QACrC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YACnD,QAAQ,KAAK,EAAE,CAAC;gBACd,KAAK,MAAM;oBACT,OAAO,EAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAC,CAAC;gBACrD,KAAK,OAAO;oBACV,OAAO,EAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAC,CAAC;gBAChD;oBACE,OAAO,EAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,GAAG,EAAC,CAAC;YAClD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACO,eAAe,CAAC,GAAY;QACpC,MAAM,EAAC,OAAO,EAAC,GAAG,GAAG,CAAC;QAEtB,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG;YACnC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACO,oBAAoB,CAAC,GAAY;QACzC,MAAM,EAAC,aAAa,EAAC,GAAG,IAAI,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEvC,OAAO,aAAc,CAAC,MAAM,CAAC,CAAC,GAAQ,EAAE,GAAW,EAAE,EAAE;YACrD,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YAErB,OAAO,GAAG,CAAC;QACb,CAAC,EAAE,EAAE,CAAC,CAAC;IACT,CAAC;CACF,CAAA;AAjJW;IADT,QAAQ,CAAC,sBAAsB,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;;4DACrC;AAGnC;IADT,QAAQ,CAAC,mBAAmB,EAAE,IAAI,CAAC;;yDACN;AAGpB;IADT,QAAQ,CAAC,iBAAiB,EAAE,IAAI,CAAC;;uDACN;AAGlB;IADT,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC;;qDACN;AAGhB;IADT,QAAQ,CAAC,cAAc,CAAC;;uDACE;AASpB;IAAK,WAAA,OAAO,EAAE,CAAA;;;;gDAKpB;AA5BU,qBAAqB;IADjC,UAAU,EAAE;GACA,qBAAqB,CAmJjC"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
export type LoggerRequestFields = ("reqId" | "method" | "url" | "headers" | "body" | "query" | "params" | "duration" | string)[];
|
|
2
|
-
|
|
3
|
-
export interface PlatformLogMiddlewareSettings {
|
|
4
|
-
/**
|
|
5
|
-
* Fields displayed when a request is logged. Possible values: `reqId`, `method`, `url`, `headers`, `body`, `query`,`params`, `duration`.
|
|
6
|
-
*/
|
|
7
|
-
requestFields?: LoggerRequestFields;
|
|
8
|
-
/**
|
|
9
|
-
* Log all incoming request. By default, is true and print the configured `logger.requestFields`.
|
|
10
|
-
*/
|
|
11
|
-
logRequest?: boolean;
|
|
12
|
-
/**
|
|
13
|
-
* Log start of all incoming request. By default, is false
|
|
14
|
-
*/
|
|
15
|
-
logStart?: boolean;
|
|
16
|
-
/**
|
|
17
|
-
* Log end of all incoming request. By default, is true
|
|
18
|
-
*/
|
|
19
|
-
logEnd?: boolean;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
declare global {
|
|
23
|
-
namespace TsED {
|
|
24
|
-
interface LoggerConfiguration extends Partial<PlatformLogMiddlewareSettings> {}
|
|
25
|
-
}
|
|
26
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
import "../domain/PlatformLogMiddlewareSettings.js";
|
|
2
|
-
|
|
3
|
-
import {PlatformTest} from "@tsed/platform-http/testing";
|
|
4
|
-
import {PlatformHandlerMetadata} from "@tsed/platform-router";
|
|
5
|
-
|
|
6
|
-
import {PlatformLogMiddleware} from "./PlatformLogMiddleware.js";
|
|
7
|
-
|
|
8
|
-
async function createMiddlewareFixture({statusCode = 200, error}: {statusCode?: number; error?: any} = {}) {
|
|
9
|
-
const middleware = await PlatformTest.invoke<PlatformLogMiddleware>(PlatformLogMiddleware);
|
|
10
|
-
|
|
11
|
-
const ctx = PlatformTest.createRequestContext({
|
|
12
|
-
event: {
|
|
13
|
-
request: PlatformTest.createRequest({
|
|
14
|
-
method: "GET",
|
|
15
|
-
url: "url",
|
|
16
|
-
originalUrl: undefined
|
|
17
|
-
}),
|
|
18
|
-
response: PlatformTest.createResponse({
|
|
19
|
-
statusCode,
|
|
20
|
-
error
|
|
21
|
-
})
|
|
22
|
-
},
|
|
23
|
-
endpoint: new Map()
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
ctx.error = error;
|
|
27
|
-
|
|
28
|
-
ctx.handlerMetadata = new PlatformHandlerMetadata({
|
|
29
|
-
handler: () => {}
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
vi.spyOn(ctx.logger, "info").mockReturnThis();
|
|
33
|
-
vi.spyOn(ctx.logger, "warn").mockReturnThis();
|
|
34
|
-
vi.spyOn(ctx.logger, "trace").mockReturnThis();
|
|
35
|
-
vi.spyOn(ctx.logger, "debug").mockReturnThis();
|
|
36
|
-
vi.spyOn(ctx.logger, "error").mockReturnThis();
|
|
37
|
-
|
|
38
|
-
ctx.logger.maxStackSize = 0;
|
|
39
|
-
ctx.data = "test";
|
|
40
|
-
|
|
41
|
-
ctx.response.getRes().on = vi.fn();
|
|
42
|
-
|
|
43
|
-
return {request: ctx.request.raw, ctx, middleware};
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
describe("PlatformLogMiddleware", () => {
|
|
47
|
-
describe("use()", () => {
|
|
48
|
-
describe("when no debug, logRequest", () => {
|
|
49
|
-
beforeEach(() =>
|
|
50
|
-
PlatformTest.create({
|
|
51
|
-
logger: {
|
|
52
|
-
debug: false,
|
|
53
|
-
logRequest: true
|
|
54
|
-
}
|
|
55
|
-
})
|
|
56
|
-
);
|
|
57
|
-
afterEach(() => PlatformTest.reset());
|
|
58
|
-
it("should configure request and create context logger", async () => {
|
|
59
|
-
// GIVEN
|
|
60
|
-
const {request, ctx, middleware} = await createMiddlewareFixture();
|
|
61
|
-
request.originalUrl = "/originalUrl";
|
|
62
|
-
ctx.handlerMetadata.path = "/:id";
|
|
63
|
-
|
|
64
|
-
// WHEN
|
|
65
|
-
middleware.use(ctx);
|
|
66
|
-
|
|
67
|
-
// THEN
|
|
68
|
-
middleware.onLogEnd(request.$ctx);
|
|
69
|
-
|
|
70
|
-
// THEN
|
|
71
|
-
expect(ctx.logger.info).toHaveBeenCalledWith({
|
|
72
|
-
event: "request.start"
|
|
73
|
-
});
|
|
74
|
-
expect(ctx.logger.info).toHaveBeenCalledWith({
|
|
75
|
-
event: "request.end",
|
|
76
|
-
status: 200,
|
|
77
|
-
status_code: "200",
|
|
78
|
-
state: "OK"
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
});
|
|
82
|
-
describe("when debug, logRequest", () => {
|
|
83
|
-
beforeEach(() =>
|
|
84
|
-
PlatformTest.create({
|
|
85
|
-
logger: {
|
|
86
|
-
level: "debug",
|
|
87
|
-
logRequest: true
|
|
88
|
-
}
|
|
89
|
-
})
|
|
90
|
-
);
|
|
91
|
-
afterEach(() => PlatformTest.reset());
|
|
92
|
-
|
|
93
|
-
it("should configure request and create context logger (debug, logRequest)", async () => {
|
|
94
|
-
// GIVEN
|
|
95
|
-
const {ctx, middleware} = await createMiddlewareFixture();
|
|
96
|
-
|
|
97
|
-
// WHEN
|
|
98
|
-
middleware.use(ctx);
|
|
99
|
-
|
|
100
|
-
// THEN
|
|
101
|
-
middleware.onLogEnd(ctx as any);
|
|
102
|
-
|
|
103
|
-
// THEN
|
|
104
|
-
expect(ctx.logger.debug).toHaveBeenCalledWith(
|
|
105
|
-
expect.objectContaining({
|
|
106
|
-
event: "request.start"
|
|
107
|
-
})
|
|
108
|
-
);
|
|
109
|
-
expect(ctx.logger.debug).toHaveBeenCalledWith(
|
|
110
|
-
expect.objectContaining({
|
|
111
|
-
event: "request.end",
|
|
112
|
-
status: 200,
|
|
113
|
-
status_code: "200",
|
|
114
|
-
data: "test",
|
|
115
|
-
state: "OK"
|
|
116
|
-
})
|
|
117
|
-
);
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
|
-
describe("when no debug, logRequest, logEnd", () => {
|
|
121
|
-
beforeEach(() =>
|
|
122
|
-
PlatformTest.create({
|
|
123
|
-
logger: {debug: false, logRequest: true, logEnd: false}
|
|
124
|
-
})
|
|
125
|
-
);
|
|
126
|
-
afterEach(() => PlatformTest.reset());
|
|
127
|
-
it("should configure request and create context logger ()", async () => {
|
|
128
|
-
// GIVEN
|
|
129
|
-
const {request, ctx, middleware} = await createMiddlewareFixture();
|
|
130
|
-
request.originalUrl = "originalUrl";
|
|
131
|
-
|
|
132
|
-
// WHEN
|
|
133
|
-
middleware.use(ctx);
|
|
134
|
-
|
|
135
|
-
// THEN
|
|
136
|
-
middleware.onLogEnd(request.$ctx as any);
|
|
137
|
-
|
|
138
|
-
// THEN
|
|
139
|
-
expect(ctx.logger.info).toHaveBeenCalledWith(
|
|
140
|
-
expect.objectContaining({
|
|
141
|
-
event: "request.start"
|
|
142
|
-
})
|
|
143
|
-
);
|
|
144
|
-
});
|
|
145
|
-
});
|
|
146
|
-
describe("when no debug, logRequest, logStart", () => {
|
|
147
|
-
beforeEach(() =>
|
|
148
|
-
PlatformTest.create({
|
|
149
|
-
logger: {
|
|
150
|
-
debug: false,
|
|
151
|
-
logRequest: true,
|
|
152
|
-
logStart: false
|
|
153
|
-
}
|
|
154
|
-
})
|
|
155
|
-
);
|
|
156
|
-
afterEach(() => PlatformTest.reset());
|
|
157
|
-
it("should configure request and create context logger (no debug, logRequest, logStart)", async () => {
|
|
158
|
-
// GIVEN
|
|
159
|
-
const {ctx, middleware} = await createMiddlewareFixture();
|
|
160
|
-
|
|
161
|
-
// WHEN
|
|
162
|
-
middleware.use(ctx);
|
|
163
|
-
|
|
164
|
-
// THEN
|
|
165
|
-
vi.mocked(ctx.response.getRes().on).mock.calls[0][1]();
|
|
166
|
-
// middleware.onLogEnd(request.$ctx as any);
|
|
167
|
-
|
|
168
|
-
// THEN
|
|
169
|
-
expect(ctx.logger.info).toHaveBeenCalledWith(
|
|
170
|
-
expect.objectContaining({
|
|
171
|
-
event: "request.end",
|
|
172
|
-
state: "OK",
|
|
173
|
-
status: 200,
|
|
174
|
-
status_code: "200"
|
|
175
|
-
})
|
|
176
|
-
);
|
|
177
|
-
});
|
|
178
|
-
it("should configure request and create context logger (error)", async () => {
|
|
179
|
-
// GIVEN
|
|
180
|
-
const {ctx, middleware} = await createMiddlewareFixture({
|
|
181
|
-
statusCode: 400,
|
|
182
|
-
error: new Error("Test")
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
// WHEN
|
|
186
|
-
middleware.use(ctx);
|
|
187
|
-
|
|
188
|
-
// THEN
|
|
189
|
-
vi.mocked(ctx.response.getRes().on).mock.calls[0][1]();
|
|
190
|
-
// middleware.onLogEnd(request.$ctx as any);
|
|
191
|
-
|
|
192
|
-
// THEN
|
|
193
|
-
expect(ctx.logger.error).toHaveBeenCalledWith(
|
|
194
|
-
expect.objectContaining({
|
|
195
|
-
event: "request.end",
|
|
196
|
-
state: "KO",
|
|
197
|
-
status: 400,
|
|
198
|
-
status_code: "400",
|
|
199
|
-
error_name: "Error",
|
|
200
|
-
error_message: "Test"
|
|
201
|
-
})
|
|
202
|
-
);
|
|
203
|
-
});
|
|
204
|
-
it("should configure request and create context logger (error.code)", async () => {
|
|
205
|
-
// GIVEN
|
|
206
|
-
const error: any = {
|
|
207
|
-
code: "CODE",
|
|
208
|
-
message: "message"
|
|
209
|
-
};
|
|
210
|
-
const {ctx, middleware} = await createMiddlewareFixture({
|
|
211
|
-
statusCode: 400,
|
|
212
|
-
error
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
// WHEN
|
|
216
|
-
middleware.use(ctx);
|
|
217
|
-
|
|
218
|
-
// THEN
|
|
219
|
-
vi.mocked(ctx.response.getRes().on).mock.calls[0][1]();
|
|
220
|
-
// middleware.onLogEnd(request.$ctx as any);
|
|
221
|
-
|
|
222
|
-
// THEN
|
|
223
|
-
expect(ctx.logger.error).toHaveBeenCalledWith(
|
|
224
|
-
expect.objectContaining({
|
|
225
|
-
event: "request.end",
|
|
226
|
-
status: 400,
|
|
227
|
-
state: "KO",
|
|
228
|
-
status_code: "400",
|
|
229
|
-
error_name: "CODE",
|
|
230
|
-
error_message: "message"
|
|
231
|
-
})
|
|
232
|
-
);
|
|
233
|
-
});
|
|
234
|
-
});
|
|
235
|
-
describe("when no debug, log error", () => {
|
|
236
|
-
beforeEach(() =>
|
|
237
|
-
PlatformTest.create({
|
|
238
|
-
logger: {debug: false, logRequest: true}
|
|
239
|
-
})
|
|
240
|
-
);
|
|
241
|
-
afterEach(() => PlatformTest.reset());
|
|
242
|
-
it("should log error", async () => {
|
|
243
|
-
// GIVEN
|
|
244
|
-
const {request, ctx, middleware} = await createMiddlewareFixture();
|
|
245
|
-
request.originalUrl = "originalUrl";
|
|
246
|
-
// WHEN
|
|
247
|
-
middleware.use(ctx);
|
|
248
|
-
|
|
249
|
-
// THEN
|
|
250
|
-
ctx.logger.error({
|
|
251
|
-
event: "event"
|
|
252
|
-
});
|
|
253
|
-
// THEN
|
|
254
|
-
expect(ctx.logger.error).toHaveBeenCalledWith(
|
|
255
|
-
expect.objectContaining({
|
|
256
|
-
event: "event"
|
|
257
|
-
})
|
|
258
|
-
);
|
|
259
|
-
});
|
|
260
|
-
});
|
|
261
|
-
});
|
|
262
|
-
});
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import {cleanObject} from "@tsed/core";
|
|
2
|
-
import {Constant} from "@tsed/di";
|
|
3
|
-
import {Middleware, MiddlewareMethods} from "@tsed/platform-middlewares";
|
|
4
|
-
import {Context} from "@tsed/platform-params";
|
|
5
|
-
|
|
6
|
-
import type {LoggerRequestFields} from "../domain/PlatformLogMiddlewareSettings.js";
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* @middleware
|
|
10
|
-
* @platform
|
|
11
|
-
*/
|
|
12
|
-
@Middleware()
|
|
13
|
-
export class PlatformLogMiddleware implements MiddlewareMethods {
|
|
14
|
-
@Constant("logger.requestFields", ["reqId", "method", "url", "duration", "route"])
|
|
15
|
-
protected requestFields: LoggerRequestFields;
|
|
16
|
-
|
|
17
|
-
@Constant("logger.logRequest", true)
|
|
18
|
-
protected logRequest: boolean;
|
|
19
|
-
|
|
20
|
-
@Constant("logger.logStart", true)
|
|
21
|
-
protected logStart: boolean;
|
|
22
|
-
|
|
23
|
-
@Constant("logger.logEnd", true)
|
|
24
|
-
protected logEnd: boolean;
|
|
25
|
-
|
|
26
|
-
@Constant("logger.level")
|
|
27
|
-
protected logLevel: string;
|
|
28
|
-
|
|
29
|
-
get settings() {
|
|
30
|
-
return this;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Handle the request.
|
|
35
|
-
*/
|
|
36
|
-
public use(@Context() ctx: Context): void {
|
|
37
|
-
this.configureRequest(ctx);
|
|
38
|
-
this.onLogStart(ctx);
|
|
39
|
-
|
|
40
|
-
ctx.response.onEnd(() => this.onLogEnd(ctx));
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Called when the `$onResponse` is called by Ts.ED (through Express.end).
|
|
45
|
-
*/
|
|
46
|
-
onLogEnd(ctx: Context) {
|
|
47
|
-
const {logRequest, logEnd, logLevel} = this.settings;
|
|
48
|
-
const started = ctx.logStarted;
|
|
49
|
-
|
|
50
|
-
if (logEnd && started) {
|
|
51
|
-
if (ctx.response.statusCode >= 400) {
|
|
52
|
-
const error = ctx.error as any | undefined;
|
|
53
|
-
ctx.logger.error({
|
|
54
|
-
event: "request.end",
|
|
55
|
-
status: ctx.response.statusCode,
|
|
56
|
-
status_code: String(ctx.response.statusCode),
|
|
57
|
-
state: "KO",
|
|
58
|
-
...cleanObject({
|
|
59
|
-
error_name: error?.name || error?.code,
|
|
60
|
-
error_message: error?.message,
|
|
61
|
-
error_errors: error?.errors,
|
|
62
|
-
error_stack: error?.stack,
|
|
63
|
-
error_body: error?.body,
|
|
64
|
-
error_headers: error?.headers
|
|
65
|
-
})
|
|
66
|
-
});
|
|
67
|
-
} else {
|
|
68
|
-
if (logLevel === "debug") {
|
|
69
|
-
ctx.logger.debug({
|
|
70
|
-
event: "request.end",
|
|
71
|
-
status: ctx.response.statusCode,
|
|
72
|
-
status_code: String(ctx.response.statusCode),
|
|
73
|
-
data: ctx.data,
|
|
74
|
-
state: "OK"
|
|
75
|
-
});
|
|
76
|
-
} else if (logRequest) {
|
|
77
|
-
ctx.logger.info({
|
|
78
|
-
event: "request.end",
|
|
79
|
-
status: ctx.response.statusCode,
|
|
80
|
-
status_code: String(ctx.response.statusCode),
|
|
81
|
-
state: "OK"
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* The separate onLogStart() function will allow developer to overwrite the initial request log.
|
|
90
|
-
* @param ctx
|
|
91
|
-
*/
|
|
92
|
-
protected onLogStart(ctx: Context) {
|
|
93
|
-
const {logRequest, logLevel, logStart} = this.settings;
|
|
94
|
-
|
|
95
|
-
ctx.logStarted = true;
|
|
96
|
-
|
|
97
|
-
if (logStart) {
|
|
98
|
-
if (logLevel === "debug") {
|
|
99
|
-
ctx.logger.debug({
|
|
100
|
-
event: "request.start"
|
|
101
|
-
});
|
|
102
|
-
} else if (logRequest) {
|
|
103
|
-
ctx.logger.info({
|
|
104
|
-
event: "request.start"
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* Attach all information that will be necessary to log the request. Attach a new `request.log` object.
|
|
112
|
-
*/
|
|
113
|
-
protected configureRequest(ctx: Context) {
|
|
114
|
-
ctx.logger.alterLog((obj: any, level, withRequest) => {
|
|
115
|
-
switch (level) {
|
|
116
|
-
case "info":
|
|
117
|
-
return {...this.minimalRequestPicker(ctx), ...obj};
|
|
118
|
-
case "debug":
|
|
119
|
-
return {...this.requestToObject(ctx), ...obj};
|
|
120
|
-
default:
|
|
121
|
-
return {...this.requestToObject(ctx), ...obj};
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
/**
|
|
127
|
-
* Return complete request info.
|
|
128
|
-
* @returns {Object}
|
|
129
|
-
* @param ctx
|
|
130
|
-
*/
|
|
131
|
-
protected requestToObject(ctx: Context): any {
|
|
132
|
-
const {request} = ctx;
|
|
133
|
-
|
|
134
|
-
return {
|
|
135
|
-
method: request.method,
|
|
136
|
-
url: request.url,
|
|
137
|
-
route: request.route || request.url,
|
|
138
|
-
headers: request.headers,
|
|
139
|
-
body: request.body,
|
|
140
|
-
query: request.query,
|
|
141
|
-
params: request.params
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Return a filtered request from global configuration.
|
|
147
|
-
* @returns {Object}
|
|
148
|
-
* @param ctx
|
|
149
|
-
*/
|
|
150
|
-
protected minimalRequestPicker(ctx: Context): any {
|
|
151
|
-
const {requestFields} = this;
|
|
152
|
-
const info = this.requestToObject(ctx);
|
|
153
|
-
|
|
154
|
-
return requestFields!.reduce((acc: any, key: string) => {
|
|
155
|
-
acc[key] = info[key];
|
|
156
|
-
|
|
157
|
-
return acc;
|
|
158
|
-
}, {});
|
|
159
|
-
}
|
|
160
|
-
}
|
package/vitest.config.mts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// @ts-ignore
|
|
2
|
-
import {presets} from "@tsed/vitest/presets";
|
|
3
|
-
import {defineConfig} from "vitest/config";
|
|
4
|
-
|
|
5
|
-
export default defineConfig(
|
|
6
|
-
{
|
|
7
|
-
...presets,
|
|
8
|
-
test: {
|
|
9
|
-
...presets.test,
|
|
10
|
-
coverage: {
|
|
11
|
-
...presets.test.coverage,
|
|
12
|
-
thresholds: {
|
|
13
|
-
statements: 0,
|
|
14
|
-
branches: 0,
|
|
15
|
-
functions: 0,
|
|
16
|
-
lines: 0
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
);
|