From d8b0525223bf5b465c122c756cee9421ec294975 Mon Sep 17 00:00:00 2001 From: Eugene Terehov Date: Tue, 15 Dec 2020 14:29:49 +0200 Subject: [PATCH 1/4] Fix #74 --- src/LoggerHelper.ts | 9 ++++++--- src/LoggerWithoutCallSite.ts | 4 +++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/LoggerHelper.ts b/src/LoggerHelper.ts index 2fcbd32e..769b8b12 100644 --- a/src/LoggerHelper.ts +++ b/src/LoggerHelper.ts @@ -278,17 +278,20 @@ export class LoggerHelper { public static cloneObjectRecursively( obj: T, - maskValuesFn: (key: number | string, value: unknown) => unknown, + maskValuesFn?: (key: number | string, value: unknown) => unknown, done: unknown[] = [], clonedObject: T = Object.create(Object.getPrototypeOf(obj)) as T ): T { done.push(obj); - Object.keys(obj).forEach((currentKey: string | number) => { + Object.getOwnPropertyNames(obj).forEach((currentKey: string | number) => { if (!done.includes(obj[currentKey])) { if (obj[currentKey] == null) { clonedObject[currentKey] = obj[currentKey]; } else if (typeof obj[currentKey] !== "object") { - clonedObject[currentKey] = maskValuesFn(currentKey, obj[currentKey]); + clonedObject[currentKey] = + maskValuesFn != null + ? maskValuesFn(currentKey, obj[currentKey]) + : obj[currentKey]; } else { clonedObject[currentKey] = LoggerHelper.cloneObjectRecursively( obj[currentKey], diff --git a/src/LoggerWithoutCallSite.ts b/src/LoggerWithoutCallSite.ts index ee0db8a5..15e0aa5d 100644 --- a/src/LoggerWithoutCallSite.ts +++ b/src/LoggerWithoutCallSite.ts @@ -444,7 +444,9 @@ export class LoggerWithoutCallSite { relevantCallSites.length = stackLimit; } - const errorObject: IErrorObject = JSON.parse(JSON.stringify(error)); + const errorObject: IErrorObject = (LoggerHelper.cloneObjectRecursively( + error + ) as unknown) as IErrorObject; errorObject.nativeError = error; errorObject.details = { ...error }; errorObject.name = errorObject.name ?? "Error"; From 26c630d37390d2e7a52fcc10e9c4cf10500a3aff Mon Sep 17 00:00:00 2001 From: Eugene Terehov Date: Tue, 15 Dec 2020 14:38:55 +0200 Subject: [PATCH 2/4] Fix #71 --- src/LoggerHelper.ts | 15 +++++++------- src/LoggerWithoutCallSite.ts | 40 +++++++++++++++++++++--------------- src/interfaces.ts | 20 +++++++++--------- 3 files changed, 40 insertions(+), 35 deletions(-) diff --git a/src/LoggerHelper.ts b/src/LoggerHelper.ts index 769b8b12..2ef10e5f 100644 --- a/src/LoggerHelper.ts +++ b/src/LoggerHelper.ts @@ -77,12 +77,12 @@ export class LoggerHelper { filePath: LoggerHelper.cleanUpFilePath(filePath) ?? "", fullFilePath: filePath ?? "", fileName: fileBasename(stackFrame.getFileName() ?? ""), - lineNumber: stackFrame.getLineNumber(), - columnNumber: stackFrame.getColumnNumber(), - isConstructor: stackFrame.isConstructor(), - functionName: stackFrame.getFunctionName(), - typeName: stackFrame.getTypeName(), - methodName: stackFrame.getMethodName(), + lineNumber: stackFrame.getLineNumber() ?? undefined, + columnNumber: stackFrame.getColumnNumber() ?? undefined, + isConstructor: stackFrame.isConstructor() ?? undefined, + functionName: stackFrame.getFunctionName() ?? undefined, + typeName: stackFrame.getTypeName() ?? undefined, + methodName: stackFrame.getMethodName() ?? undefined, }; } @@ -223,8 +223,7 @@ export class LoggerHelper { public static _getCodeFrame( filePath: string, lineNumber: number, - // eslint-disable-next-line @rushstack/no-new-null - columnNumber: number | null, + columnNumber: number | undefined, linesBeforeAndAfter: number ): ICodeFrame | undefined { const lineNumberMinusOne: number = lineNumber - 1; diff --git a/src/LoggerWithoutCallSite.ts b/src/LoggerWithoutCallSite.ts index 15e0aa5d..f6af8454 100644 --- a/src/LoggerWithoutCallSite.ts +++ b/src/LoggerWithoutCallSite.ts @@ -369,12 +369,14 @@ export class LoggerWithoutCallSite { const relevantCallSites: NodeJS.CallSite[] = callSites.splice( this.settings.ignoreStackLevels ); - const stackFrame: NodeJS.CallSite = this._callSiteWrapper( - relevantCallSites[0] - ); - const stackFrameObject: IStackFrame = LoggerHelper.toStackFrameObject( - stackFrame - ); + const stackFrame: NodeJS.CallSite | undefined = + relevantCallSites[0] != null + ? this._callSiteWrapper(relevantCallSites[0]) + : undefined; + const stackFrameObject: IStackFrame | undefined = + stackFrame != null + ? LoggerHelper.toStackFrameObject(stackFrame) + : undefined; const requestId: string | undefined = this.settings.requestId instanceof Function @@ -389,15 +391,15 @@ export class LoggerWithoutCallSite { date: new Date(), logLevel: logLevel, logLevelId: this._logLevels.indexOf(logLevel) as TLogLevelId, - filePath: stackFrameObject.filePath, - fullFilePath: stackFrameObject.fullFilePath, - fileName: stackFrameObject.fileName, - lineNumber: stackFrameObject.lineNumber, - columnNumber: stackFrameObject.columnNumber, - isConstructor: stackFrameObject.isConstructor, - functionName: stackFrameObject.functionName, - typeName: stackFrameObject.typeName, - methodName: stackFrameObject.methodName, + filePath: stackFrameObject?.filePath, + fullFilePath: stackFrameObject?.fullFilePath, + fileName: stackFrameObject?.fileName, + lineNumber: stackFrameObject?.lineNumber, + columnNumber: stackFrameObject?.columnNumber, + isConstructor: stackFrameObject?.isConstructor, + functionName: stackFrameObject?.functionName, + typeName: stackFrameObject?.typeName, + methodName: stackFrameObject?.methodName, argumentsArray: [], toJSON: () => this._logObjectToJson(logObject), }; @@ -457,11 +459,14 @@ export class LoggerWithoutCallSite { this._callSiteWrapper(relevantCallSites[0]) ); if (exposeErrorCodeFrame && errorCallSite.lineNumber != null) { - if (errorCallSite.fullFilePath.indexOf("node_modules") < 0) { + if ( + errorCallSite.fullFilePath != null && + errorCallSite.fullFilePath.indexOf("node_modules") < 0 + ) { errorObject.codeFrame = LoggerHelper._getCodeFrame( errorCallSite.fullFilePath, errorCallSite.lineNumber, - errorCallSite.columnNumber, + errorCallSite?.columnNumber, this.settings.exposeErrorCodeFrameLinesBeforeAndAfter ); } @@ -576,6 +581,7 @@ export class LoggerWithoutCallSite { if ( this.settings.displayFilePath === "displayAll" || (this.settings.displayFilePath === "hideNodeModulesOnly" && + logObject.filePath != null && logObject.filePath.indexOf("node_modules") < 0) ) { fileLocation = `${logObject.filePath}:${logObject.lineNumber}`; diff --git a/src/interfaces.ts b/src/interfaces.ts index 077b2224..89bad630 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -215,23 +215,23 @@ export interface IStd { */ export interface IStackFrame { /** Relative path based on the main folder */ - filePath: string; + filePath: string | undefined; /** Full path */ - fullFilePath: string; + fullFilePath: string | undefined; /** Name of the file */ - fileName: string; + fileName: string | undefined; /** Line number */ - lineNumber: number | null; + lineNumber: number | undefined; /** Column Name */ - columnNumber: number | null; + columnNumber: number | undefined; /** Called from constructor */ - isConstructor: boolean | null; + isConstructor: boolean | undefined; /** Name of the function */ - functionName: string | null; + functionName: string | undefined; /** Name of the class */ - typeName: string | null; + typeName: string | undefined; /** Name of the Method */ - methodName: string | null; + methodName: string | undefined; } /** @@ -390,7 +390,7 @@ export interface IHighlightStyles { export interface ICodeFrame { firstLineNumber: number; lineNumber: number; - columnNumber: number | null; + columnNumber: number | undefined; linesBefore: string[]; relevantLine: string; linesAfter: string[]; From 6c51db39b70d79656861c334c7dec65e7e8109ba Mon Sep 17 00:00:00 2001 From: Eugene Terehov Date: Tue, 15 Dec 2020 14:41:46 +0200 Subject: [PATCH 3/4] Fix outdated dependencies --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 263973f8..67f0925f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3821,9 +3821,9 @@ "dev": true }, "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "inquirer": { From 8c7c4ac8d7dc025b1189ddeb3a0ccc0b952e6682 Mon Sep 17 00:00:00 2001 From: Eugene Terehov Date: Tue, 15 Dec 2020 14:58:44 +0200 Subject: [PATCH 4/4] Get test coverage back to 100% --- tests/error.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/error.test.ts b/tests/error.test.ts index 5a1327ac..68e300e0 100644 --- a/tests/error.test.ts +++ b/tests/error.test.ts @@ -43,6 +43,13 @@ describe("Logger: Error with details", () => { stdErr = []; }); + test("JSON: Check Error.toJSON()", (): void => { + const error = new TestError("TestError"); + const errorToJson = JSON.stringify(error); + + expect(errorToJson.length).toBeGreaterThan(0); + }); + test("Pretty: Error with details (stdErr)", (): void => { const error = new TestError("TestError"); loggerPretty.warn(error);