diff --git a/extensions/ql-vscode/src/common/errors.ts b/extensions/ql-vscode/src/common/errors.ts new file mode 100644 index 000000000..b42a46cfc --- /dev/null +++ b/extensions/ql-vscode/src/common/errors.ts @@ -0,0 +1,37 @@ +export class RedactableErrorMessage { + constructor( + private readonly strings: TemplateStringsArray, + private readonly values: unknown[], + ) {} + + public toString(): string { + return this.fullMessage; + } + + public get fullMessage(): string { + return this.strings + .map((s, i) => s + (this.hasValue(i) ? this.getValue(i) : "")) + .join(""); + } + + public get redactedMessage(): string { + return this.strings + .map((s, i) => s + (this.hasValue(i) ? "[REDACTED]" : "")) + .join(""); + } + + private getValue(index: number): unknown { + return this.values[index]; + } + + private hasValue(index: number): boolean { + return index < this.values.length; + } +} + +export function errorMessage( + strings: TemplateStringsArray, + ...values: unknown[] +): RedactableErrorMessage { + return new RedactableErrorMessage(strings, values); +} diff --git a/extensions/ql-vscode/test/unit-tests/common/errors.test.ts b/extensions/ql-vscode/test/unit-tests/common/errors.test.ts new file mode 100644 index 000000000..3eb664d6c --- /dev/null +++ b/extensions/ql-vscode/test/unit-tests/common/errors.test.ts @@ -0,0 +1,30 @@ +import { + errorMessage, + RedactableErrorMessage, +} from "../../../src/common/errors"; + +describe("errorMessage", () => { + it("creates a RedactableErrorMessage", () => { + expect(errorMessage`Failed to create database ${"foo"}`).toBeInstanceOf( + RedactableErrorMessage, + ); + }); + + it("toString() matches the given message", () => { + expect(errorMessage`Failed to create database ${"foo"}`.toString()).toEqual( + "Failed to create database foo", + ); + }); + + it("fullMessage matches the given message", () => { + expect( + errorMessage`Failed to create database ${"foo"}`.fullMessage, + ).toEqual("Failed to create database foo"); + }); + + it("redactedMessage redacts the given message", () => { + expect( + errorMessage`Failed to create database ${"foo"}`.redactedMessage, + ).toEqual("Failed to create database [REDACTED]"); + }); +});