safe-json-value
Version:
⛑️ JSON serialization should never fail
66 lines (39 loc) • 803 B
JavaScript
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([]);