Debugging

BackendTooling

Lightweight debugging. Wraps the amazing debug library to provide additional functionality.

Installation#

yarn add @boost/debug

Environment variables#

  • BOOSTJS_DEBUG_NAMESPACE (string) - A prefix for all debugger namespaces when created with createDebugger().
  • BOOSTJS_DEBUG_VERBOSE (boolean) - Print verbose messages logged from debugger.verbose(), otherwise they are hidden.

Debugging#

Like logging, a "debugger" is a collection of functions that write to process.stderr. The key difference is that debug messages are only displayed if the DEBUG environment variable is set and contains the debugger's namespace (logic provided by the debug package). The namespace can be defined when instantiating a debugger using createDebugger.

import { createDebugger } from '@boost/debug';
const debug = createDebugger('boost');
process.env.DEBUG = 'boost:*';
debug('Something is broken!');

A namespace can either be a string or an array of strings.

Each debug function that logs (excluding invariants) requires a message string as the 1st argument, and an optional rest of arguments to interpolate into the message using util.format().

debug('Name: %s %s', user.first_name, user.last_name);
debug('Object: %O', data);

Invariant messages#

Invariant debugging logs either a success or a failure message, depending on the truthy evaluation of a condition. This can be achieved with debugger.invariant(condition: boolean, message: string, pass: string, fail: string), which requires the condition to evaluate, a message to always display, and a success and failure message.

debug.invariant(fs.existsSync(filePath), 'Does file exist?', 'Yes!', 'No');

Verbose output#

Debug messages are already hidden behind the DEBUG environment variable, but Boost takes it a step further to support verbose debugging. Messages logged with debugger.verbose(message: string, ...args: any[]) will not be displayed unless the BOOSTJS_DEBUG_VERBOSE environment variable is set -- even if DEBUG is set.

// Will not write!
debug.verbose('We need extra information');
process.env.BOOSTJS_DEBUG_VERBOSE = 'true';
// Will write!
debug.verbose('We need extra information (again)');

Silencing output#

By default, all logged messages are immediately written when DEBUG contains the debugger namespace. To silence output for a specific debugger, call the debugger.disable() function, and to re-enable, call debugger.enable().

debug.disable();
// Will not write!
debug('Something is broken!');

Messages that are logged while silenced are lost and are not buffered.

Test utilities#

The following Jest utilities are available in the @boost/debug/test module.

mockDebugger#

mockDebugger(): Debugger

Returns a Jest spy that matches the return value shape of createDebugger.

import { mockDebugger } from '@boost/debug/test';
it('calls the debugger', () => {
const debug = mockDebugger();
debug('Something is broken!');
expect(debug).toHaveBeenCalled();
});