verror-0
Version:
VError without dependencies on top of nodejs standart library
43 lines (42 loc) • 1.38 kB
JavaScript
import { isError } from './is-error.js';
export const cause = (err) => {
if (!isError(err)) {
throw new Error('err must be an Error');
}
if ('jse_cause' in err) {
return isError(err.jse_cause) ? err.jse_cause : null;
}
return isError(err.cause) ? err.cause : null;
};
export function findCause(err, name) {
if (!isError(err)) {
throw new Error('err must be an Error');
}
if ((typeof name === 'string' && name.length === 0) ||
(Array.isArray(name) && name.length === 0) ||
(name instanceof Set && name.size === 0)) {
throw new Error('name cannot be empty');
}
const nameSet = typeof name === 'string' ? new Set([name]) : Array.isArray(name) ? new Set(name) : name;
for (let c = err; c !== null; c = cause(c)) {
if (nameSet.has(c.name))
return c;
}
return null;
}
export function hasCause(err, name) {
const result = typeof name === 'string'
? findCause(err, name)
: Array.isArray(name)
? findCause(err, name)
: name instanceof Set
? findCause(err, name)
: null;
if (result === null) {
if (typeof name === 'string' || Array.isArray(name) || name instanceof Set) {
return false;
}
throw new Error('Invalid type for name');
}
return true;
}