safe-json-value
Version:
⛑️ JSON serialization should never fail
110 lines (83 loc) • 1.44 kB
JavaScript
import{checkCycleThenRecurse}from"./cycle.js";
import{addNotArrayIndexChanges}from"./indices.js";
import{addSize,DEFAULT_MAX_SIZE}from"./size.js";
import{callToJSON}from"./to_json.js";
import{omitInvalidTypes}from"./type.js";
import{handleUnsafeException}from"./uncaught.js";
const safeJsonValue=(
value,
{maxSize=DEFAULT_MAX_SIZE,shallow=false}={})=>
{
const changes=[];
const ancestors=new Set([]);
const{value:newValue}=transformValue({
value,
changes,
ancestors,
path:[],
size:0,
maxSize,
shallow
});
return{value:newValue,changes}
};
export default safeJsonValue;
const transformValue=({
value,
changes,
ancestors,
path,
size,
maxSize,
shallow
})=>{
try{
const valueA=callToJSON(value,changes,path);
const valueB=omitInvalidTypes(valueA,changes,path);
addNotArrayIndexChanges(valueB,changes,path);
return checkSizeThenRecurse({
value:valueB,
changes,
ancestors,
path,
size,
maxSize,
shallow
})
}catch(error){
return handleUnsafeException({value,changes,path,error,size})
}
};
const checkSizeThenRecurse=({
value,
changes,
ancestors,
path,
size,
maxSize,
shallow
})=>{
const{size:newSize,stop}=addSize({
type:"value",
size,
maxSize,
changes,
path,
context:value
});
if(stop){
return{value:undefined,size}
}
const recurse=shallow?identity:transformValue;
return checkCycleThenRecurse({
value,
changes,
ancestors,
path,
size,
newSize,
maxSize,
recurse
})
};
const identity=({value,changes})=>({value,changes});