Skip to content

Commit a5a0ac2

Browse files
committed
Clone errors before masking and make fields writable, fix #217
1 parent 6352c32 commit a5a0ac2

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

examples/nodejs/index2.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,18 @@ const log = new Logger({
9494
log.info(error);
9595

9696
////////////////////////////
97+
98+
function createReadonlyError(message: string, property: string) {
99+
const error = new Error(message);
100+
Object.defineProperty(error, "property", {
101+
value: property,
102+
writable: false,
103+
enumerable: true,
104+
configurable: false,
105+
});
106+
return error;
107+
}
108+
109+
const e = createReadonlyError("message", "property");
110+
111+
logger.error(e);

src/BaseLogger.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ export class BaseLogger<LogObj> {
217217
? this.settings.maskPlaceholder
218218
: this._recursiveCloneAndMaskValuesOfKeys((source as { [key: string]: unknown })[prop], keys, seen);
219219
return o;
220-
}, source)
220+
}, this._cloneError(source as Error))
221221
: source != null && typeof source === "object"
222222
? Object.getOwnPropertyNames(source).reduce((o, prop) => {
223223
// mask
@@ -275,6 +275,21 @@ export class BaseLogger<LogObj> {
275275
return clonedLogObj;
276276
}
277277

278+
private _cloneError<T extends Error>(error: T): T {
279+
const ErrorConstructor = error.constructor as new (message?: string) => T;
280+
const newError = new ErrorConstructor(error.message);
281+
Object.assign(newError, error);
282+
const propertyNames = Object.getOwnPropertyNames(newError);
283+
for (const propName of propertyNames) {
284+
const propDesc = Object.getOwnPropertyDescriptor(newError, propName);
285+
if (propDesc) {
286+
propDesc.writable = true;
287+
Object.defineProperty(newError, propName, propDesc);
288+
}
289+
}
290+
return newError;
291+
}
292+
278293
private _toErrorObject(error: Error): IErrorObject {
279294
return {
280295
nativeError: error,

0 commit comments

Comments
 (0)