This commit introduces a custom error object to provide additional context for errors throwing during parsing and compiling operations, improving troubleshooting. By integrating error context handling, the error messages become more informative and user-friendly, providing sequence of trace with context to aid in troubleshooting. Changes include: - Introduce custom error object that extends errors with contextual information. This replaces previous usages of `AggregateError` which is not displayed well by browsers when logged. - Improve parsing functions to encapsulate error context with more details. - Increase unit test coverage and refactor the related code to be more testable.
43 lines
1.1 KiB
TypeScript
43 lines
1.1 KiB
TypeScript
import { CustomError } from '@/application/Common/CustomError';
|
|
|
|
export interface ErrorWithContextWrapper {
|
|
(
|
|
error: Error,
|
|
additionalContext: string,
|
|
): Error;
|
|
}
|
|
|
|
export const wrapErrorWithAdditionalContext: ErrorWithContextWrapper = (
|
|
error: Error,
|
|
additionalContext: string,
|
|
) => {
|
|
return (error instanceof ContextualError ? error : new ContextualError(error))
|
|
.withAdditionalContext(additionalContext);
|
|
};
|
|
|
|
/* AggregateError is similar but isn't well-serialized or displayed by browsers */
|
|
class ContextualError extends CustomError {
|
|
private readonly additionalContext = new Array<string>();
|
|
|
|
constructor(
|
|
public readonly innerError: Error,
|
|
) {
|
|
super();
|
|
}
|
|
|
|
public withAdditionalContext(additionalContext: string): this {
|
|
this.additionalContext.push(additionalContext);
|
|
return this;
|
|
}
|
|
|
|
public get message(): string { // toString() is not used when Chromium logs it on console
|
|
return [
|
|
'\n',
|
|
this.innerError.message,
|
|
'\n',
|
|
'Additional context:',
|
|
...this.additionalContext.map((context, index) => `${index + 1}: ${context}`),
|
|
].join('\n');
|
|
}
|
|
}
|