UNPKG

safe-json-value

Version:

⛑️ JSON serialization should never fail

110 lines (83 loc) 1.44 kB
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});