export { parse }; import { types } from './types'; function parse(str) { // We don't use the reviver option in `JSON.parse(str, reviver)` because it doesn't support `undefined` values const value = JSON.parse(str); return modifier(value); } function modifier(value) { if (typeof value === 'string') { return reviver(value); } if (typeof value === 'object' && value !== null) { Object.entries(value).forEach(([key, val]) => { ; value[key] = modifier(val); }); } return value; } function reviver(value) { for (const { match, deserialize } of types) { if (match(value)) { return deserialize(value, parse); } } return value; }