@data-client/normalizr
Version:
Normalizes and denormalizes JSON according to schema for Redux and Flux applications
48 lines (45 loc) • 5.5 kB
JavaScript
/**
* 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