@probe.gl/log
Version:
JavaScript debug logging for browser and Node
106 lines (92 loc) • 2.9 kB
text/typescript
// probe.gl
// SPDX-License-Identifier: MIT
// Copyright (c) vis.gl contributors
import assert from '../utils/assert';
/**
* Get logLevel from first argument:
* - log(logLevel, message, args) => logLevel
* - log(message, args) => 0
* - log({logLevel, ...}, message, args) => logLevel
* - log({logLevel, message, args}) => logLevel
*/
export function normalizeLogLevel(logLevel: unknown): number {
if (!logLevel) {
return 0;
}
let resolvedLevel;
switch (typeof logLevel) {
case 'number':
resolvedLevel = logLevel;
break;
case 'object':
// Backward compatibility
// TODO - deprecate `priority`
// @ts-expect-error
resolvedLevel = logLevel.logLevel || logLevel.priority || 0;
break;
default:
return 0;
}
// 'log level must be a number'
assert(Number.isFinite(resolvedLevel) && resolvedLevel >= 0);
return resolvedLevel;
}
/**
* "Normalizes" the various argument patterns into an object with known types
* - log(logLevel, message, args) => {logLevel, message, args}
* - log(message, args) => {logLevel: 0, message, args}
* - log({logLevel, ...}, message, args) => {logLevel, message, args}
* - log({logLevel, message, args}) => {logLevel, message, args}
*/
export function normalizeArguments(opts: {
logLevel;
message;
collapsed?: boolean;
args?: IArguments | any[] | undefined;
opts?;
}): NormalizedArguments {
const {logLevel, message} = opts;
opts.logLevel = normalizeLogLevel(logLevel);
// We use `arguments` instead of rest parameters (...args) because IE
// does not support the syntax. Rest parameters is transpiled to code with
// perf impact. Doing it here instead avoids constructing args when logging is
// disabled.
// TODO - remove when/if IE support is dropped
const args: any[] = opts.args ? Array.from(opts.args) : [];
// args should only contain arguments that appear after `message`
// eslint-disable-next-line no-empty
while (args.length && args.shift() !== message) {}
switch (typeof logLevel) {
case 'string':
case 'function':
if (message !== undefined) {
args.unshift(message);
}
opts.message = logLevel;
break;
case 'object':
Object.assign(opts, logLevel);
break;
default:
}
// Resolve functions into strings by calling them
if (typeof opts.message === 'function') {
opts.message = opts.message();
}
const messageType = typeof opts.message;
// 'log message must be a string' or object
assert(messageType === 'string' || messageType === 'object');
// original opts + normalized opts + opts arg + fixed up message
return Object.assign(opts, {args}, opts.opts);
}
export type NormalizedArguments = {
logLevel: number;
message: any;
args: any[];
tag?: unknown;
method?: Function;
once?: boolean;
total?: number;
delta?: number;
[key: string]: any;
};