twreporter-react
Version:
React-Redux site for The Reporter Foundation in Taiwan
154 lines (116 loc) • 4.65 kB
JavaScript
;
exports.__esModule = true;
exports.arrayOf = arrayOf;
exports.valuesOf = valuesOf;
exports.normalize = normalize;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _EntitySchema = require('./EntitySchema');
var _EntitySchema2 = _interopRequireDefault(_EntitySchema);
var _IterableSchema = require('./IterableSchema');
var _IterableSchema2 = _interopRequireDefault(_IterableSchema);
var _lodashLangIsObject = require('lodash/lang/isObject');
var _lodashLangIsObject2 = _interopRequireDefault(_lodashLangIsObject);
var _lodashLangIsEqual = require('lodash/lang/isEqual');
var _lodashLangIsEqual2 = _interopRequireDefault(_lodashLangIsEqual);
var _lodashObjectMapValues = require('lodash/object/mapValues');
var _lodashObjectMapValues2 = _interopRequireDefault(_lodashObjectMapValues);
function defaultAssignEntity(normalized, key, entity) {
normalized[key] = entity;
}
function visitObject(obj, schema, bag, options) {
var _options$assignEntity = options.assignEntity;
var assignEntity = _options$assignEntity === undefined ? defaultAssignEntity : _options$assignEntity;
var normalized = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var entity = visit(obj[key], schema[key], bag, options);
assignEntity.call(null, normalized, key, entity);
}
}
return normalized;
}
function defaultMapper(iterableSchema, itemSchema, bag, options) {
return function (obj) {
return visit(obj, itemSchema, bag, options);
};
}
function polymorphicMapper(iterableSchema, itemSchema, bag, options) {
return function (obj) {
var schemaKey = iterableSchema.getSchemaKey(obj);
var result = visit(obj, itemSchema[schemaKey], bag, options);
return { id: result, schema: schemaKey };
};
}
function visitIterable(obj, iterableSchema, bag, options) {
var isPolymorphicSchema = iterableSchema.isPolymorphicSchema();
var itemSchema = iterableSchema.getItemSchema();
var itemMapper = isPolymorphicSchema ? polymorphicMapper : defaultMapper;
var curriedItemMapper = itemMapper(iterableSchema, itemSchema, bag, options);
if (Array.isArray(obj)) {
return obj.map(curriedItemMapper);
} else {
return _lodashObjectMapValues2['default'](obj, curriedItemMapper);
}
}
function defaultMergeIntoEntity(entityA, entityB, entityKey) {
for (var key in entityB) {
if (!entityB.hasOwnProperty(key)) {
continue;
}
if (!entityA.hasOwnProperty(key) || _lodashLangIsEqual2['default'](entityA[key], entityB[key])) {
entityA[key] = entityB[key];
continue;
}
console.warn('When merging two ' + entityKey + ', found unequal data in their "' + key + '" values. Using the earlier value.', entityA[key], entityB[key]);
}
}
function visitEntity(entity, entitySchema, bag, options) {
var _options$mergeIntoEntity = options.mergeIntoEntity;
var mergeIntoEntity = _options$mergeIntoEntity === undefined ? defaultMergeIntoEntity : _options$mergeIntoEntity;
var entityKey = entitySchema.getKey();
var id = entitySchema.getId(entity);
if (!bag.hasOwnProperty(entityKey)) {
bag[entityKey] = {};
}
if (!bag[entityKey].hasOwnProperty(id)) {
bag[entityKey][id] = {};
}
var stored = bag[entityKey][id];
var normalized = visitObject(entity, entitySchema, bag, options);
mergeIntoEntity(stored, normalized, entityKey);
return id;
}
function visit(obj, schema, bag, options) {
if (!_lodashLangIsObject2['default'](obj) || !_lodashLangIsObject2['default'](schema)) {
return obj;
}
if (schema instanceof _EntitySchema2['default']) {
return visitEntity(obj, schema, bag, options);
} else if (schema instanceof _IterableSchema2['default']) {
return visitIterable(obj, schema, bag, options);
} else {
return visitObject(obj, schema, bag, options);
}
}
function arrayOf(schema, options) {
return new _IterableSchema2['default'](schema, options);
}
function valuesOf(schema, options) {
return new _IterableSchema2['default'](schema, options);
}
exports.Schema = _EntitySchema2['default'];
function normalize(obj, schema) {
var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
if (!_lodashLangIsObject2['default'](obj) && !Array.isArray(obj)) {
throw new Error('Normalize accepts an object or an array as its input.');
}
if (!_lodashLangIsObject2['default'](schema) || Array.isArray(schema)) {
throw new Error('Normalize accepts an object for schema.');
}
var bag = {};
var result = visit(obj, schema, bag, options);
return {
entities: bag,
result: result
};
}