serialize-every-error
Version:
This package strives to be an exhaustive alternative to normal error serialization for logging
49 lines (36 loc) • 1.33 kB
JavaScript
const seen = Symbol('base-serializer__circular-ref-seen');
const { toString, hasOwnProperty } = Object.prototype;
export default (err, serializeError) => {
// This array check covers the case where e.g. AggregateError has
// a list of causing errors in `.errors`. This key will be serialized,
// which hits this case, and then each element is serialized.
if(Array.isArray(err)) {
return err.map(serializeError);
}
// This early-outs for primitive types that need to serialization
if(typeof err !== 'object') {
return err;
}
// Mark if we have seen an object before, and avoid re-serializing circular references.
err[seen] = undefined;
const serialized = {
type: toString.call(err.constructor) === '[object Function]' ? err.constructor.name : err.name,
};
for (const key of Object.getOwnPropertyNames(err)) {
if (serialized[key] !== undefined) {
continue;
}
const value = err[key];
if(value === null || value === undefined) {
continue;
}
if(typeof value === 'object' && hasOwnProperty.call(value, seen)) {
continue;
}
serialized[key] = serializeError(err[key]);
}
// Clean up circular reference check
delete err[seen];
return serialized;
};
export const canHandle = () => true;