UNPKG

@data-client/normalizr

Version:

Normalizes and denormalizes JSON according to schema for Redux and Flux applications

48 lines (45 loc) 5.5 kB
/** * Helpers to enable Immutable compatibility *without* bringing in * the 'immutable' package as a dependency. */ import { INVALID } from '../denormalize/symbol.js'; /** * Check if an object is immutable by checking if it has a key specific * to the immutable library. * * @param {any} object * @return {bool} */ export function isImmutable(object) { return !!(typeof object.hasOwnProperty === 'function' && (Object.hasOwnProperty.call(object, '__ownerID') || // Immutable.Map object._map && Object.hasOwnProperty.call(object._map, '__ownerID'))); // Immutable.Record } /** * Denormalize an immutable entity. * * @param {Schema} schema * @param {Immutable.Map|Immutable.Record} input * @param {function} unvisit * @param {function} getDenormalizedEntity * @return {Immutable.Map|Immutable.Record} */ export function denormalizeImmutable(schema, input, args, unvisit) { let deleted = false; const obj = Object.keys(schema).reduce((object, key) => { // Immutable maps cast keys to strings on write so we need to ensure // we're accessing them using string keys. const stringKey = `${key}`; const item = unvisit(schema[stringKey], object.get(stringKey)); if (typeof item === 'symbol') { deleted = true; } if (object.has(stringKey)) { return object.set(stringKey, item); } else { return object; } }, input); return deleted ? INVALID : obj; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTlZBTElEIiwiaXNJbW11dGFibGUiLCJvYmplY3QiLCJoYXNPd25Qcm9wZXJ0eSIsIk9iamVjdCIsImNhbGwiLCJfbWFwIiwiZGVub3JtYWxpemVJbW11dGFibGUiLCJzY2hlbWEiLCJpbnB1dCIsImFyZ3MiLCJ1bnZpc2l0IiwiZGVsZXRlZCIsIm9iaiIsImtleXMiLCJyZWR1Y2UiLCJrZXkiLCJzdHJpbmdLZXkiLCJpdGVtIiwiZ2V0IiwiaGFzIiwic2V0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYXMvSW1tdXRhYmxlVXRpbHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIZWxwZXJzIHRvIGVuYWJsZSBJbW11dGFibGUgY29tcGF0aWJpbGl0eSAqd2l0aG91dCogYnJpbmdpbmcgaW5cbiAqIHRoZSAnaW1tdXRhYmxlJyBwYWNrYWdlIGFzIGEgZGVwZW5kZW5jeS5cbiAqL1xuXG5pbXBvcnQgeyBJTlZBTElEIH0gZnJvbSAnLi4vZGVub3JtYWxpemUvc3ltYm9sLmpzJztcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBvYmplY3QgaXMgaW1tdXRhYmxlIGJ5IGNoZWNraW5nIGlmIGl0IGhhcyBhIGtleSBzcGVjaWZpY1xuICogdG8gdGhlIGltbXV0YWJsZSBsaWJyYXJ5LlxuICpcbiAqIEBwYXJhbSAge2FueX0gb2JqZWN0XG4gKiBAcmV0dXJuIHtib29sfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNJbW11dGFibGUob2JqZWN0OiB7fSk6IG9iamVjdCBpcyB7XG4gIGdldChrOiBzdHJpbmcpOiBhbnk7XG4gIFtrOiBzdHJpbmddOiBhbnk7XG59IHtcbiAgcmV0dXJuICEhKFxuICAgIHR5cGVvZiBvYmplY3QuaGFzT3duUHJvcGVydHkgPT09ICdmdW5jdGlvbicgJiZcbiAgICAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCAnX19vd25lcklEJykgfHwgLy8gSW1tdXRhYmxlLk1hcFxuICAgICAgKChvYmplY3QgYXMgYW55KS5fbWFwICYmXG4gICAgICAgIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKChvYmplY3QgYXMgYW55KS5fbWFwLCAnX19vd25lcklEJykpKVxuICApOyAvLyBJbW11dGFibGUuUmVjb3JkXG59XG5cbi8qKlxuICogRGVub3JtYWxpemUgYW4gaW1tdXRhYmxlIGVudGl0eS5cbiAqXG4gKiBAcGFyYW0gIHtTY2hlbWF9IHNjaGVtYVxuICogQHBhcmFtICB7SW1tdXRhYmxlLk1hcHxJbW11dGFibGUuUmVjb3JkfSBpbnB1dFxuICogQHBhcmFtICB7ZnVuY3Rpb259IHVudmlzaXRcbiAqIEBwYXJhbSAge2Z1bmN0aW9ufSBnZXREZW5vcm1hbGl6ZWRFbnRpdHlcbiAqIEByZXR1cm4ge0ltbXV0YWJsZS5NYXB8SW1tdXRhYmxlLlJlY29yZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbm9ybWFsaXplSW1tdXRhYmxlKFxuICBzY2hlbWE6IGFueSxcbiAgaW5wdXQ6IGFueSxcbiAgYXJnczogcmVhZG9ubHkgYW55W10sXG4gIHVudmlzaXQ6IGFueSxcbik6IGFueSB7XG4gIGxldCBkZWxldGVkID0gZmFsc2U7XG4gIGNvbnN0IG9iaiA9IE9iamVjdC5rZXlzKHNjaGVtYSkucmVkdWNlKChvYmplY3QsIGtleSkgPT4ge1xuICAgIC8vIEltbXV0YWJsZSBtYXBzIGNhc3Qga2V5cyB0byBzdHJpbmdzIG9uIHdyaXRlIHNvIHdlIG5lZWQgdG8gZW5zdXJlXG4gICAgLy8gd2UncmUgYWNjZXNzaW5nIHRoZW0gdXNpbmcgc3RyaW5nIGtleXMuXG4gICAgY29uc3Qgc3RyaW5nS2V5ID0gYCR7a2V5fWA7XG5cbiAgICBjb25zdCBpdGVtID0gdW52aXNpdChzY2hlbWFbc3RyaW5nS2V5XSwgb2JqZWN0LmdldChzdHJpbmdLZXkpKTtcbiAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdzeW1ib2wnKSB7XG4gICAgICBkZWxldGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9iamVjdC5oYXMoc3RyaW5nS2V5KSkge1xuICAgICAgcmV0dXJuIG9iamVjdC5zZXQoc3RyaW5nS2V5LCBpdGVtKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICB9XG4gIH0sIGlucHV0KTtcbiAgcmV0dXJuIGRlbGV0ZWQgPyBJTlZBTElEIDogb2JqO1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTQSxPQUFPLFFBQVEsMEJBQTBCOztBQUVsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBU0MsV0FBV0EsQ0FBQ0MsTUFBVSxFQUdwQztFQUNBLE9BQU8sQ0FBQyxFQUNOLE9BQU9BLE1BQU0sQ0FBQ0MsY0FBYyxLQUFLLFVBQVUsS0FDMUNDLE1BQU0sQ0FBQ0QsY0FBYyxDQUFDRSxJQUFJLENBQUNILE1BQU0sRUFBRSxXQUFXLENBQUM7RUFBSTtFQUNoREEsTUFBTSxDQUFTSSxJQUFJLElBQ25CRixNQUFNLENBQUNELGNBQWMsQ0FBQ0UsSUFBSSxDQUFFSCxNQUFNLENBQVNJLElBQUksRUFBRSxXQUFXLENBQUUsQ0FBQyxDQUNwRSxDQUFDLENBQUM7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNDLG9CQUFvQkEsQ0FDbENDLE1BQVcsRUFDWEMsS0FBVSxFQUNWQyxJQUFvQixFQUNwQkMsT0FBWSxFQUNQO0VBQ0wsSUFBSUMsT0FBTyxHQUFHLEtBQUs7RUFDbkIsTUFBTUMsR0FBRyxHQUFHVCxNQUFNLENBQUNVLElBQUksQ0FBQ04sTUFBTSxDQUFDLENBQUNPLE1BQU0sQ0FBQyxDQUFDYixNQUFNLEVBQUVjLEdBQUcsS0FBSztJQUN0RDtJQUNBO0lBQ0EsTUFBTUMsU0FBUyxHQUFHLEdBQUdELEdBQUcsRUFBRTtJQUUxQixNQUFNRSxJQUFJLEdBQUdQLE9BQU8sQ0FBQ0gsTUFBTSxDQUFDUyxTQUFTLENBQUMsRUFBRWYsTUFBTSxDQUFDaUIsR0FBRyxDQUFDRixTQUFTLENBQUMsQ0FBQztJQUM5RCxJQUFJLE9BQU9DLElBQUksS0FBSyxRQUFRLEVBQUU7TUFDNUJOLE9BQU8sR0FBRyxJQUFJO0lBQ2hCO0lBQ0EsSUFBSVYsTUFBTSxDQUFDa0IsR0FBRyxDQUFDSCxTQUFTLENBQUMsRUFBRTtNQUN6QixPQUFPZixNQUFNLENBQUNtQixHQUFHLENBQUNKLFNBQVMsRUFBRUMsSUFBSSxDQUFDO0lBQ3BDLENBQUMsTUFBTTtNQUNMLE9BQU9oQixNQUFNO0lBQ2Y7RUFDRixDQUFDLEVBQUVPLEtBQUssQ0FBQztFQUNULE9BQU9HLE9BQU8sR0FBR1osT0FBTyxHQUFHYSxHQUFHO0FBQ2hDIiwiaWdub3JlTGlzdCI6W119