Skip to content

Commit 7743ccb

Browse files
committed
Support errors with multiple properties, Fix #227
1 parent 5c211b1 commit 7743ccb

File tree

7 files changed

+52
-25
lines changed

7 files changed

+52
-25
lines changed

examples/nodejs/index2.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Logger, BaseLogger } from "../../src/index.js";
2-
import { NodeRuntime } from "../../src/index.js";
2+
import { Runtime } from "../../src/index.js";
33

44
const defaultLogObject: {
55
name: string;
@@ -23,7 +23,7 @@ logger.fatal("test1 %s test3", "test2");
2323

2424
console.log("###############");
2525

26-
const baseLogger = new BaseLogger(NodeRuntime, {}, defaultLogObject);
26+
const baseLogger = new BaseLogger(Runtime, {}, defaultLogObject);
2727

2828
baseLogger.log(0, "test", "test base logger", { haha: true, password: "123456" }, ["SECRET"]);
2929

examples/nodejs/mongodb/package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

examples/nodejs/mongodb/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"type": "module",
77
"dependencies": {
88
"mongodb": "^4.4.0",
9-
"tslog": "^4.8.2",
9+
"tslog": "^4.8.7",
1010
"typescript": "^5.1.6"
1111
},
1212
"scripts": {

src/BaseLogger.ts

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -287,22 +287,13 @@ export class BaseLogger<LogObj> {
287287
}
288288

289289
private _cloneError<T extends Error>(error: T): T {
290-
type ErrorProperties = keyof Error;
291-
const ErrorConstructor = error.constructor as new (...args: unknown[]) => T;
292-
const errorProperties = Object.getOwnPropertyNames(error) as ErrorProperties[];
293-
const errorArgs = errorProperties.map((propName) => error[propName]);
294-
295-
const newError = new ErrorConstructor(...errorArgs);
296-
Object.assign(newError, error);
297-
298-
for (const propName of errorProperties) {
299-
const propDesc = Object.getOwnPropertyDescriptor(newError, propName);
300-
if (propDesc) {
301-
propDesc.writable = true;
302-
Object.defineProperty(newError, propName, propDesc);
303-
}
304-
}
305-
return newError;
290+
const cloned = new (error.constructor as { new (): T })();
291+
292+
Object.getOwnPropertyNames(error).forEach((key) => {
293+
(cloned as any)[key] = (error as any)[key];
294+
});
295+
296+
return cloned;
306297
}
307298

308299
private _toErrorObject(error: Error): IErrorObject {

src/runtime/browser/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,14 @@ export function prettyFormatErrorObj<LogObj>(error: Error, settings: ISettings<L
123123

124124
const placeholderValuesError = {
125125
errorName: ` ${error.name} `,
126-
errorMessage: error.message,
126+
errorMessage: Object.getOwnPropertyNames(error)
127+
.reduce((result: string[], key) => {
128+
if (key !== "stack") {
129+
result.push((error as any)[key]);
130+
}
131+
return result;
132+
}, [])
133+
.join(", "),
127134
errorStack: errorStackStr.join("\n"),
128135
};
129136
return formatTemplate(settings, settings.prettyErrorTemplate, placeholderValuesError);

src/runtime/nodejs/index.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { normalize as fileNormalize } from "path";
33
import { types, formatWithOptions, InspectOptions } from "util";
44
import { Runtime, ILogObjMeta, ISettings, IStackFrame } from "../../interfaces.js";
55
import { formatTemplate } from "../../formatTemplate.js";
6+
import { stdout } from "process";
67
export { InspectOptions };
78

89
export default {
@@ -132,7 +133,14 @@ export function prettyFormatErrorObj<LogObj>(error: Error, settings: ISettings<L
132133

133134
const placeholderValuesError = {
134135
errorName: ` ${error.name} `,
135-
errorMessage: error.message,
136+
errorMessage: Object.getOwnPropertyNames(error)
137+
.reduce((result: string[], key) => {
138+
if (key !== "stack") {
139+
result.push((error as any)[key]);
140+
}
141+
return result;
142+
}, [])
143+
.join(", "),
136144
errorStack: errorStackStr.join("\n"),
137145
};
138146
return formatTemplate(settings, settings.prettyErrorTemplate, placeholderValuesError);

tests/Nodejs/5_pretty_Log_Types.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@ import { Logger } from "../../src";
33
import { getConsoleLog, mockConsoleLog } from "./helper.js";
44
import { stdout } from "process";
55

6+
class CustomError extends Error {
7+
constructor(message: string, public extraInfo: string) {
8+
super(message);
9+
Object.setPrototypeOf(this, CustomError.prototype);
10+
}
11+
}
12+
613
describe("Pretty: Log Types", () => {
714
beforeEach(() => {
815
mockConsoleLog(true, false);
@@ -117,6 +124,20 @@ describe("Pretty: Log Types", () => {
117124
expect((errorLog?.stack as any)[0]?.fileName).toBe("5_pretty_Log_Types.test.ts");
118125
});
119126

127+
test("Error with multiple parameters", (): void => {
128+
const logger = new Logger({ type: "pretty" });
129+
const errorLog = logger.log(1234, "testLevel", new CustomError("Something went wrong", "Additional info"));
130+
expect(getConsoleLog()).toContain("Something went wrong");
131+
expect(getConsoleLog()).toContain("Additional info");
132+
expect(getConsoleLog()).toContain("Error");
133+
expect(getConsoleLog()).toContain("test");
134+
expect(getConsoleLog()).toContain("error stack:\n");
135+
expect(getConsoleLog()).toContain("5_pretty_Log_Types.test.ts");
136+
expect(getConsoleLog()).toContain("Object.<anonymous>");
137+
expect(errorLog?.nativeError).toBeInstanceOf(Error);
138+
expect((errorLog?.stack as any)[0]?.fileName).toBe("5_pretty_Log_Types.test.ts");
139+
});
140+
120141
test("string and Error", (): void => {
121142
const logger = new Logger({ type: "pretty" });
122143
const errorLog = logger.log(1234, "testLevel", "test", new Error("test"));

0 commit comments

Comments
 (0)