UNPKG

safe-json-value

Version:

⛑️ JSON serialization should never fail

66 lines (39 loc) 803 B
import normalizeException from"normalize-exception"; import{isObject}from"./is_object.js"; export const callToJSON=(value,changes,path)=>{ if(!hasToJSON(value)){ return value } try{ const toJSONResult=triggerToJSON(value); changes.push({ path, oldValue:value, newValue:toJSONResult, reason:"unresolvedToJSON" }); return toJSONResult }catch(error){ changes.push({ path, oldValue:value, newValue:undefined, reason:"unsafeToJSON", error:normalizeException(error) }) } }; const hasToJSON=(value)=> isObject(value)&& "toJSON"in value&& typeof value.toJSON==="function"&& !TO_JSON_RECURSION.has(value); const triggerToJSON=(object)=>{ TO_JSON_RECURSION.add(object); try{ return object.toJSON() }finally{ TO_JSON_RECURSION.delete(object) } }; const TO_JSON_RECURSION=new WeakSet([]);