Skip to content

Commit

Permalink
Provide invariant.debug as wrapper for console.debug (#155)
Browse files Browse the repository at this point in the history
Messages logged with invariant.debug will be hidden by default, but can
be exposed by calling setVerbosity("debug").
  • Loading branch information
benjamn committed Jul 12, 2021
1 parent d38c44a commit be3bfe4
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 8 deletions.
16 changes: 10 additions & 6 deletions packages/ts-invariant/src/invariant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,20 +28,24 @@ export function invariant(
}
}

const verbosityLevels = ["log", "warn", "error", "silent"] as const;
type VerbosityLevel = (typeof verbosityLevels)[number];
type ConsoleMethodName = Exclude<VerbosityLevel, "silent">;
const verbosityLevels = ["debug", "log", "warn", "error", "silent"] as const;
export type VerbosityLevel = (typeof verbosityLevels)[number];
export type ConsoleMethodName = Exclude<VerbosityLevel, "silent">;
let verbosityLevel = verbosityLevels.indexOf("log");

function wrapConsoleMethod<M extends ConsoleMethodName>(method: M) {
function wrapConsoleMethod<M extends ConsoleMethodName>(name: M) {
return function () {
if (verbosityLevels.indexOf(method) >= verbosityLevel) {
return console[method].apply(console, arguments as any);
if (verbosityLevels.indexOf(name) >= verbosityLevel) {
// Default to console.log if this host environment happens not to provide
// all the console.* methods we need.
const method = console[name] || console.log;
return method.apply(console, arguments as any);
}
} as (typeof console)[M];
}

export namespace invariant {
export const debug = wrapConsoleMethod("debug");
export const log = wrapConsoleMethod("log");
export const warn = wrapConsoleMethod("warn");
export const error = wrapConsoleMethod("error");
Expand Down
21 changes: 19 additions & 2 deletions packages/ts-invariant/src/tests.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import assert from "assert";
import defaultExport, {
ConsoleMethodName,
invariant,
InvariantError,
setVerbosity,
Expand Down Expand Up @@ -80,7 +81,7 @@ describe("ts-invariant", function () {
});

function checkConsoleMethod(
name: "log" | "warn" | "error",
name: ConsoleMethodName,
expectOutput: boolean,
) {
const argsReceived: any[][] = [];
Expand All @@ -103,6 +104,10 @@ describe("ts-invariant", function () {
}
}

it("invariant.debug", function () {
checkConsoleMethod("debug", false);
});

it("invariant.log", function () {
checkConsoleMethod("log", true);
});
Expand All @@ -116,30 +121,42 @@ describe("ts-invariant", function () {
});

it("setVerbosity", function () {
checkConsoleMethod("debug", false);
checkConsoleMethod("log", true);
checkConsoleMethod("warn", true);
checkConsoleMethod("error", true);

assert.strictEqual(setVerbosity("warn"), "log");

checkConsoleMethod("debug", false);
checkConsoleMethod("log", false);
checkConsoleMethod("warn", true);
checkConsoleMethod("error", true);

assert.strictEqual(setVerbosity("error"), "warn");

checkConsoleMethod("debug", false);
checkConsoleMethod("log", false);
checkConsoleMethod("warn", false);
checkConsoleMethod("error", true);

assert.strictEqual(setVerbosity("silent"), "error");
assert.strictEqual(setVerbosity("debug"), "error");

checkConsoleMethod("debug", true);
checkConsoleMethod("log", true);
checkConsoleMethod("warn", true);
checkConsoleMethod("error", true);

assert.strictEqual(setVerbosity("silent"), "debug");

checkConsoleMethod("debug", false);
checkConsoleMethod("log", false);
checkConsoleMethod("warn", false);
checkConsoleMethod("error", false);

assert.strictEqual(setVerbosity("log"), "silent");

checkConsoleMethod("debug", false);
checkConsoleMethod("log", true);
checkConsoleMethod("warn", true);
checkConsoleMethod("error", true);
Expand Down

0 comments on commit be3bfe4

Please sign in to comment.