@data-client/normalizr
Version:
Normalizes and denormalizes JSON according to schema for Redux and Flux applications
67 lines (66 loc) • 12.2 kB
JavaScript
import { INVALID } from '../denormalize/symbol.js';
export const addEntities = (newEntities, newIndexes, entitiesCopy, indexesCopy, entityMetaCopy, actionMeta) => (schema, processedEntity, id) => {
const schemaKey = schema.key;
// first time we come across this type of entity
if (!newEntities.has(schemaKey)) {
newEntities.set(schemaKey, new Map());
// we will be editing these, so we need to clone them first
entitiesCopy[schemaKey] = {
...entitiesCopy[schemaKey]
};
entityMetaCopy[schemaKey] = {
...entityMetaCopy[schemaKey]
};
}
const newEntitiesKey = newEntities.get(schemaKey);
const existingEntity = newEntitiesKey.get(id);
if (existingEntity) {
newEntitiesKey.set(id, schema.merge(existingEntity, processedEntity));
} else {
const inStoreEntity = entitiesCopy[schemaKey][id];
let inStoreMeta;
// this case we already have this entity in store
if (inStoreEntity && (inStoreMeta = entityMetaCopy[schemaKey][id])) {
newEntitiesKey.set(id, schema.mergeWithStore(inStoreMeta, actionMeta, inStoreEntity, processedEntity));
entityMetaCopy[schemaKey][id] = schema.mergeMetaWithStore(inStoreMeta, actionMeta, inStoreEntity, processedEntity);
} else {
newEntitiesKey.set(id, processedEntity);
entityMetaCopy[schemaKey][id] = actionMeta;
}
}
// update index
if (schema.indexes) {
if (!newIndexes.has(schemaKey)) {
newIndexes.set(schemaKey, new Map());
indexesCopy[schemaKey] = {
...indexesCopy[schemaKey]
};
}
handleIndexes(id, schema.indexes, newIndexes.get(schemaKey), indexesCopy[schemaKey], newEntitiesKey.get(id), entitiesCopy[schemaKey]);
}
// set this after index updates so we know what indexes to remove from
entitiesCopy[schemaKey][id] = newEntitiesKey.get(id);
};
function handleIndexes(id, schemaIndexes, indexes, storeIndexes, entity, storeEntities) {
for (const index of schemaIndexes) {
if (!indexes.has(index)) {
indexes.set(index, storeIndexes[index] = {});
}
const indexMap = indexes.get(index);
if (storeEntities[id]) {
delete indexMap[storeEntities[id][index]];
}
// entity already in cache but the index changed
if (storeEntities && storeEntities[id] && storeEntities[id][index] !== entity[index]) {
indexMap[storeEntities[id][index]] = INVALID;
}
if (index in entity) {
indexMap[entity[index]] = id;
} /* istanbul ignore next */else if (process.env.NODE_ENV !== 'production') {
console.warn(`Index not found in entity. Indexes must be top-level members of your entity.
Index: ${index}
Entity: ${JSON.stringify(entity, undefined, 2)}`);
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJJTlZBTElEIiwiYWRkRW50aXRpZXMiLCJuZXdFbnRpdGllcyIsIm5ld0luZGV4ZXMiLCJlbnRpdGllc0NvcHkiLCJpbmRleGVzQ29weSIsImVudGl0eU1ldGFDb3B5IiwiYWN0aW9uTWV0YSIsInNjaGVtYSIsInByb2Nlc3NlZEVudGl0eSIsImlkIiwic2NoZW1hS2V5Iiwia2V5IiwiaGFzIiwic2V0IiwiTWFwIiwibmV3RW50aXRpZXNLZXkiLCJnZXQiLCJleGlzdGluZ0VudGl0eSIsIm1lcmdlIiwiaW5TdG9yZUVudGl0eSIsImluU3RvcmVNZXRhIiwibWVyZ2VXaXRoU3RvcmUiLCJtZXJnZU1ldGFXaXRoU3RvcmUiLCJpbmRleGVzIiwiaGFuZGxlSW5kZXhlcyIsInNjaGVtYUluZGV4ZXMiLCJzdG9yZUluZGV4ZXMiLCJlbnRpdHkiLCJzdG9yZUVudGl0aWVzIiwiaW5kZXgiLCJpbmRleE1hcCIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsImNvbnNvbGUiLCJ3YXJuIiwiSlNPTiIsInN0cmluZ2lmeSIsInVuZGVmaW5lZCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub3JtYWxpenIvYWRkRW50aXRpZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSU5WQUxJRCB9IGZyb20gJy4uL2Rlbm9ybWFsaXplL3N5bWJvbC5qcyc7XG5pbXBvcnQgdHlwZSB7IEVudGl0eUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZS5qcyc7XG5cbmV4cG9ydCBjb25zdCBhZGRFbnRpdGllcyA9XG4gIChcbiAgICBuZXdFbnRpdGllczogTWFwPHN0cmluZywgTWFwPHN0cmluZywgYW55Pj4sXG4gICAgbmV3SW5kZXhlczogTWFwPHN0cmluZywgTWFwPHN0cmluZywgYW55Pj4sXG4gICAgZW50aXRpZXNDb3B5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGluZGV4ZXNDb3B5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGVudGl0eU1ldGFDb3B5OiB7XG4gICAgICBbZW50aXR5S2V5OiBzdHJpbmddOiB7XG4gICAgICAgIFtwazogc3RyaW5nXToge1xuICAgICAgICAgIGRhdGU6IG51bWJlcjtcbiAgICAgICAgICBleHBpcmVzQXQ6IG51bWJlcjtcbiAgICAgICAgICBmZXRjaGVkQXQ6IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgIH07XG4gICAgfSxcbiAgICBhY3Rpb25NZXRhOiB7IGZldGNoZWRBdDogbnVtYmVyOyBkYXRlOiBudW1iZXI7IGV4cGlyZXNBdDogbnVtYmVyIH0sXG4gICkgPT5cbiAgKHNjaGVtYTogRW50aXR5SW50ZXJmYWNlLCBwcm9jZXNzZWRFbnRpdHk6IGFueSwgaWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHNjaGVtYUtleSA9IHNjaGVtYS5rZXk7XG4gICAgLy8gZmlyc3QgdGltZSB3ZSBjb21lIGFjcm9zcyB0aGlzIHR5cGUgb2YgZW50aXR5XG4gICAgaWYgKCFuZXdFbnRpdGllcy5oYXMoc2NoZW1hS2V5KSkge1xuICAgICAgbmV3RW50aXRpZXMuc2V0KHNjaGVtYUtleSwgbmV3IE1hcCgpKTtcbiAgICAgIC8vIHdlIHdpbGwgYmUgZWRpdGluZyB0aGVzZSwgc28gd2UgbmVlZCB0byBjbG9uZSB0aGVtIGZpcnN0XG4gICAgICBlbnRpdGllc0NvcHlbc2NoZW1hS2V5XSA9IHsgLi4uZW50aXRpZXNDb3B5W3NjaGVtYUtleV0gfTtcbiAgICAgIGVudGl0eU1ldGFDb3B5W3NjaGVtYUtleV0gPSB7IC4uLmVudGl0eU1ldGFDb3B5W3NjaGVtYUtleV0gfTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdFbnRpdGllc0tleSA9IG5ld0VudGl0aWVzLmdldChzY2hlbWFLZXkpIGFzIE1hcDxzdHJpbmcsIGFueT47XG4gICAgY29uc3QgZXhpc3RpbmdFbnRpdHkgPSBuZXdFbnRpdGllc0tleS5nZXQoaWQpO1xuICAgIGlmIChleGlzdGluZ0VudGl0eSkge1xuICAgICAgbmV3RW50aXRpZXNLZXkuc2V0KGlkLCBzY2hlbWEubWVyZ2UoZXhpc3RpbmdFbnRpdHksIHByb2Nlc3NlZEVudGl0eSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpblN0b3JlRW50aXR5ID0gZW50aXRpZXNDb3B5W3NjaGVtYUtleV1baWRdO1xuICAgICAgbGV0IGluU3RvcmVNZXRhOiB7XG4gICAgICAgIGRhdGU6IG51bWJlcjtcbiAgICAgICAgZXhwaXJlc0F0OiBudW1iZXI7XG4gICAgICAgIGZldGNoZWRBdDogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIC8vIHRoaXMgY2FzZSB3ZSBhbHJlYWR5IGhhdmUgdGhpcyBlbnRpdHkgaW4gc3RvcmVcbiAgICAgIGlmIChpblN0b3JlRW50aXR5ICYmIChpblN0b3JlTWV0YSA9IGVudGl0eU1ldGFDb3B5W3NjaGVtYUtleV1baWRdKSkge1xuICAgICAgICBuZXdFbnRpdGllc0tleS5zZXQoXG4gICAgICAgICAgaWQsXG4gICAgICAgICAgc2NoZW1hLm1lcmdlV2l0aFN0b3JlKFxuICAgICAgICAgICAgaW5TdG9yZU1ldGEsXG4gICAgICAgICAgICBhY3Rpb25NZXRhLFxuICAgICAgICAgICAgaW5TdG9yZUVudGl0eSxcbiAgICAgICAgICAgIHByb2Nlc3NlZEVudGl0eSxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgICAgICBlbnRpdHlNZXRhQ29weVtzY2hlbWFLZXldW2lkXSA9IHNjaGVtYS5tZXJnZU1ldGFXaXRoU3RvcmUoXG4gICAgICAgICAgaW5TdG9yZU1ldGEsXG4gICAgICAgICAgYWN0aW9uTWV0YSxcbiAgICAgICAgICBpblN0b3JlRW50aXR5LFxuICAgICAgICAgIHByb2Nlc3NlZEVudGl0eSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5ld0VudGl0aWVzS2V5LnNldChpZCwgcHJvY2Vzc2VkRW50aXR5KTtcbiAgICAgICAgZW50aXR5TWV0YUNvcHlbc2NoZW1hS2V5XVtpZF0gPSBhY3Rpb25NZXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHVwZGF0ZSBpbmRleFxuICAgIGlmIChzY2hlbWEuaW5kZXhlcykge1xuICAgICAgaWYgKCFuZXdJbmRleGVzLmhhcyhzY2hlbWFLZXkpKSB7XG4gICAgICAgIG5ld0luZGV4ZXMuc2V0KHNjaGVtYUtleSwgbmV3IE1hcCgpKTtcbiAgICAgICAgaW5kZXhlc0NvcHlbc2NoZW1hS2V5XSA9IHsgLi4uaW5kZXhlc0NvcHlbc2NoZW1hS2V5XSB9O1xuICAgICAgfVxuICAgICAgaGFuZGxlSW5kZXhlcyhcbiAgICAgICAgaWQsXG4gICAgICAgIHNjaGVtYS5pbmRleGVzLFxuICAgICAgICBuZXdJbmRleGVzLmdldChzY2hlbWFLZXkpIGFzIE1hcDxzdHJpbmcsIGFueT4sXG4gICAgICAgIGluZGV4ZXNDb3B5W3NjaGVtYUtleV0sXG4gICAgICAgIG5ld0VudGl0aWVzS2V5LmdldChpZCksXG4gICAgICAgIGVudGl0aWVzQ29weVtzY2hlbWFLZXldLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gc2V0IHRoaXMgYWZ0ZXIgaW5kZXggdXBkYXRlcyBzbyB3ZSBrbm93IHdoYXQgaW5kZXhlcyB0byByZW1vdmUgZnJvbVxuICAgIGVudGl0aWVzQ29weVtzY2hlbWFLZXldW2lkXSA9IG5ld0VudGl0aWVzS2V5LmdldChpZCk7XG4gIH07XG5cbmZ1bmN0aW9uIGhhbmRsZUluZGV4ZXMoXG4gIGlkOiBzdHJpbmcsXG4gIHNjaGVtYUluZGV4ZXM6IHN0cmluZ1tdLFxuICBpbmRleGVzOiBNYXA8c3RyaW5nLCBhbnk+LFxuICBzdG9yZUluZGV4ZXM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGVudGl0eTogYW55LFxuICBzdG9yZUVudGl0aWVzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuKSB7XG4gIGZvciAoY29uc3QgaW5kZXggb2Ygc2NoZW1hSW5kZXhlcykge1xuICAgIGlmICghaW5kZXhlcy5oYXMoaW5kZXgpKSB7XG4gICAgICBpbmRleGVzLnNldChpbmRleCwgKHN0b3JlSW5kZXhlc1tpbmRleF0gPSB7fSkpO1xuICAgIH1cbiAgICBjb25zdCBpbmRleE1hcCA9IGluZGV4ZXMuZ2V0KGluZGV4KTtcbiAgICBpZiAoc3RvcmVFbnRpdGllc1tpZF0pIHtcbiAgICAgIGRlbGV0ZSBpbmRleE1hcFtzdG9yZUVudGl0aWVzW2lkXVtpbmRleF1dO1xuICAgIH1cbiAgICAvLyBlbnRpdHkgYWxyZWFkeSBpbiBjYWNoZSBidXQgdGhlIGluZGV4IGNoYW5nZWRcbiAgICBpZiAoXG4gICAgICBzdG9yZUVudGl0aWVzICYmXG4gICAgICBzdG9yZUVudGl0aWVzW2lkXSAmJlxuICAgICAgc3RvcmVFbnRpdGllc1tpZF1baW5kZXhdICE9PSBlbnRpdHlbaW5kZXhdXG4gICAgKSB7XG4gICAgICBpbmRleE1hcFtzdG9yZUVudGl0aWVzW2lkXVtpbmRleF1dID0gSU5WQUxJRDtcbiAgICB9XG4gICAgaWYgKGluZGV4IGluIGVudGl0eSkge1xuICAgICAgaW5kZXhNYXBbZW50aXR5W2luZGV4XV0gPSBpZDtcbiAgICB9IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovIGVsc2UgaWYgKFxuICAgICAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJ1xuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKGBJbmRleCBub3QgZm91bmQgaW4gZW50aXR5LiBJbmRleGVzIG11c3QgYmUgdG9wLWxldmVsIG1lbWJlcnMgb2YgeW91ciBlbnRpdHkuXG5JbmRleDogJHtpbmRleH1cbkVudGl0eTogJHtKU09OLnN0cmluZ2lmeShlbnRpdHksIHVuZGVmaW5lZCwgMil9YCk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLE9BQU8sUUFBUSwwQkFBMEI7QUFHbEQsT0FBTyxNQUFNQyxXQUFXLEdBQ3RCQSxDQUNFQyxXQUEwQyxFQUMxQ0MsVUFBeUMsRUFDekNDLFlBQWlDLEVBQ2pDQyxXQUFnQyxFQUNoQ0MsY0FRQyxFQUNEQyxVQUFrRSxLQUVwRSxDQUFDQyxNQUF1QixFQUFFQyxlQUFvQixFQUFF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