mobx-decorated-models
Advanced tools
Comparing version 0.8.3 to 0.9.0
@@ -194,3 +194,3 @@ (function (global, factory) { | ||
if (model) { | ||
serializr.getDefaultModelSchema(parentModel).props[propName] = cb(model, options, propName); | ||
serializr.getDefaultModelSchema(parentModel).props[propName] = cb(model, propName, options); | ||
} else { | ||
@@ -246,28 +246,56 @@ serializr.getDefaultModelSchema(parentModel).props[propName] = objectSerializer(); | ||
function associationSerializers(modelClass, propName, options) { | ||
return { | ||
serializer: options.serializer || modelClass.serialize || serializr.object(serializr.getDefaultModelSchema(modelClass)).serializer, | ||
deserializer: options.deserializer || modelClass.deserializer || function (attrs, context) { | ||
var model = void 0; | ||
if (attrs instanceof modelClass) { | ||
model = attrs; | ||
} else { | ||
model = setupModel(Object.assign({}, options, { attrs: attrs, modelClass: modelClass })); | ||
} | ||
if (options.inverseOf) { | ||
markNonserializable(model, options.inverseOf); | ||
model[options.inverseOf + '_association_name'] = propName; | ||
model[options.inverseOf] = context.target; | ||
} | ||
return model; | ||
} | ||
}; | ||
} | ||
var Associations = { | ||
hasMany: function hasMany(modelKlass, options) { | ||
var defaultSerializer = serializr.list(serializr.object(modelKlass)); | ||
return Object.assign(defaultSerializer, options, { | ||
model: modelKlass | ||
hasMany: function hasMany(modelClass, propName, options) { | ||
var _associationSerialize = associationSerializers(modelClass, propName, options), | ||
_deserializer = _associationSerialize.deserializer, | ||
_serializer = _associationSerialize.serializer; | ||
return Object.assign(options, { | ||
model: modelClass, | ||
deserializer: function deserializer(collection, cb, context) { | ||
var value = collection && collection.map ? collection.map(function (attrs) { | ||
return _deserializer(attrs, context); | ||
}) : collection; | ||
cb(null, value); | ||
}, | ||
serializer: function serializer(collection, name, parent) { | ||
if (!isSerializable(parent, name)) { | ||
return serializr.SKIP; | ||
} | ||
return collection && collection.map ? collection.map(function (model) { | ||
return _serializer(model, name, parent); | ||
}) : collection; | ||
} | ||
}); | ||
}, | ||
belongsTo: function belongsTo(modelKlass, options, propName) { | ||
var defaultSerializer = serializr.object(serializr.getDefaultModelSchema(modelKlass)); | ||
var serializerFn = modelKlass.serialize || defaultSerializer.serializer; | ||
belongsTo: function belongsTo(modelClass, propName, options) { | ||
var _associationSerialize2 = associationSerializers(modelClass, propName, options), | ||
_deserializer2 = _associationSerialize2.deserializer, | ||
_serializer2 = _associationSerialize2.serializer; | ||
return Object.assign(options, { | ||
model: modelKlass, | ||
deserializer: function deserializer(value, cb, context) { | ||
var setter = function setter(err, model) { | ||
if (!err && options.inverseOf) { | ||
markNonserializable(model, options.inverseOf); | ||
model[options.inverseOf + '_association_name'] = propName; | ||
model[options.inverseOf] = context.target; | ||
} | ||
cb(err, model); | ||
}; | ||
if (value instanceof modelKlass) { | ||
setter(null, value); | ||
} else { | ||
setter(null, setupModel(Object.assign({}, options, { attrs: value, modelClass: modelKlass }))); | ||
} | ||
model: modelClass, | ||
deserializer: function deserializer(attrs, cb, context) { | ||
cb(null, _deserializer2(attrs, context)); | ||
}, | ||
@@ -278,3 +306,3 @@ serializer: function serializer(belongsTo, name, parent) { | ||
} | ||
return serializerFn(belongsTo); // defaultSerializer.serializer(belongsTo); | ||
return _serializer2(belongsTo, name, parent); | ||
} | ||
@@ -317,6 +345,7 @@ }); | ||
// eslint-disable-next-line new-cap | ||
serializr.createModelSchema(model, serializeSchema, function (_ref2) { | ||
var json = _ref2.json; | ||
return new model(json); | ||
}); // eslint-disable-line new-cap | ||
}); | ||
schema.forEach(function (_ref3, name) { | ||
@@ -340,3 +369,3 @@ var type = _ref3.type, | ||
var parentModelSchema = serializr.getDefaultModelSchema(parentModel); | ||
parentModelSchema.props[propName] = cb(referencedModel, options, propName); | ||
parentModelSchema.props[propName] = cb(referencedModel, propName, options); | ||
PendingLookups.splice(i, 1); | ||
@@ -343,0 +372,0 @@ } |
@@ -191,3 +191,3 @@ import { SKIP, createModelSchema, custom, deserialize, getDefaultModelSchema, identifier, list, object, primitive, serialize, update } from 'serializr'; | ||
if (model) { | ||
getDefaultModelSchema(parentModel).props[propName] = cb(model, options, propName); | ||
getDefaultModelSchema(parentModel).props[propName] = cb(model, propName, options); | ||
} else { | ||
@@ -243,28 +243,56 @@ getDefaultModelSchema(parentModel).props[propName] = objectSerializer(); | ||
function associationSerializers(modelClass, propName, options) { | ||
return { | ||
serializer: options.serializer || modelClass.serialize || object(getDefaultModelSchema(modelClass)).serializer, | ||
deserializer: options.deserializer || modelClass.deserializer || function (attrs, context) { | ||
var model = void 0; | ||
if (attrs instanceof modelClass) { | ||
model = attrs; | ||
} else { | ||
model = setupModel(Object.assign({}, options, { attrs: attrs, modelClass: modelClass })); | ||
} | ||
if (options.inverseOf) { | ||
markNonserializable(model, options.inverseOf); | ||
model[options.inverseOf + '_association_name'] = propName; | ||
model[options.inverseOf] = context.target; | ||
} | ||
return model; | ||
} | ||
}; | ||
} | ||
var Associations = { | ||
hasMany: function hasMany(modelKlass, options) { | ||
var defaultSerializer = list(object(modelKlass)); | ||
return Object.assign(defaultSerializer, options, { | ||
model: modelKlass | ||
hasMany: function hasMany(modelClass, propName, options) { | ||
var _associationSerialize = associationSerializers(modelClass, propName, options), | ||
_deserializer = _associationSerialize.deserializer, | ||
_serializer = _associationSerialize.serializer; | ||
return Object.assign(options, { | ||
model: modelClass, | ||
deserializer: function deserializer(collection, cb, context) { | ||
var value = collection && collection.map ? collection.map(function (attrs) { | ||
return _deserializer(attrs, context); | ||
}) : collection; | ||
cb(null, value); | ||
}, | ||
serializer: function serializer(collection, name, parent) { | ||
if (!isSerializable(parent, name)) { | ||
return SKIP; | ||
} | ||
return collection && collection.map ? collection.map(function (model) { | ||
return _serializer(model, name, parent); | ||
}) : collection; | ||
} | ||
}); | ||
}, | ||
belongsTo: function belongsTo(modelKlass, options, propName) { | ||
var defaultSerializer = object(getDefaultModelSchema(modelKlass)); | ||
var serializerFn = modelKlass.serialize || defaultSerializer.serializer; | ||
belongsTo: function belongsTo(modelClass, propName, options) { | ||
var _associationSerialize2 = associationSerializers(modelClass, propName, options), | ||
_deserializer2 = _associationSerialize2.deserializer, | ||
_serializer2 = _associationSerialize2.serializer; | ||
return Object.assign(options, { | ||
model: modelKlass, | ||
deserializer: function deserializer(value, cb, context) { | ||
var setter = function setter(err, model) { | ||
if (!err && options.inverseOf) { | ||
markNonserializable(model, options.inverseOf); | ||
model[options.inverseOf + '_association_name'] = propName; | ||
model[options.inverseOf] = context.target; | ||
} | ||
cb(err, model); | ||
}; | ||
if (value instanceof modelKlass) { | ||
setter(null, value); | ||
} else { | ||
setter(null, setupModel(Object.assign({}, options, { attrs: value, modelClass: modelKlass }))); | ||
} | ||
model: modelClass, | ||
deserializer: function deserializer(attrs, cb, context) { | ||
cb(null, _deserializer2(attrs, context)); | ||
}, | ||
@@ -275,3 +303,3 @@ serializer: function serializer(belongsTo, name, parent) { | ||
} | ||
return serializerFn(belongsTo); // defaultSerializer.serializer(belongsTo); | ||
return _serializer2(belongsTo, name, parent); | ||
} | ||
@@ -314,6 +342,7 @@ }); | ||
// eslint-disable-next-line new-cap | ||
createModelSchema(model, serializeSchema, function (_ref2) { | ||
var json = _ref2.json; | ||
return new model(json); | ||
}); // eslint-disable-line new-cap | ||
}); | ||
schema.forEach(function (_ref3, name) { | ||
@@ -337,3 +366,3 @@ var type = _ref3.type, | ||
var parentModelSchema = getDefaultModelSchema(parentModel); | ||
parentModelSchema.props[propName] = cb(referencedModel, options, propName); | ||
parentModelSchema.props[propName] = cb(referencedModel, propName, options); | ||
PendingLookups.splice(i, 1); | ||
@@ -340,0 +369,0 @@ } |
@@ -29,3 +29,3 @@ import { | ||
if (model) { | ||
getDefaultModelSchema(parentModel).props[propName] = cb(model, options, propName); | ||
getDefaultModelSchema(parentModel).props[propName] = cb(model, propName, options); | ||
} else { | ||
@@ -75,17 +75,20 @@ getDefaultModelSchema(parentModel).props[propName] = objectSerializer(); | ||
const Associations = { | ||
hasMany(modelKlass, options) { | ||
const defaultSerializer = list(object(modelKlass)); | ||
return Object.assign(defaultSerializer, options, { | ||
model: modelKlass, | ||
}); | ||
}, | ||
belongsTo(modelKlass, options, propName) { | ||
const defaultSerializer = object(getDefaultModelSchema(modelKlass)); | ||
const serializerFn = modelKlass.serialize || defaultSerializer.serializer; | ||
return Object.assign(options, { | ||
model: modelKlass, | ||
deserializer(value, cb, context) { | ||
const setter = (err, model) => { | ||
if (!err && options.inverseOf) { | ||
function associationSerializers(modelClass, propName, options) { | ||
return { | ||
serializer: options.serializer || | ||
modelClass.serialize || | ||
object(getDefaultModelSchema(modelClass)).serializer, | ||
deserializer: options.deserializer || | ||
modelClass.deserializer || | ||
( | ||
(attrs, context) => { | ||
let model; | ||
if (attrs instanceof modelClass) { | ||
model = attrs; | ||
} else { | ||
model = setupModel( | ||
Object.assign({}, options, { attrs, modelClass }), | ||
); | ||
} | ||
if (options.inverseOf) { | ||
markNonserializable(model, options.inverseOf); | ||
@@ -95,15 +98,45 @@ model[`${options.inverseOf}_association_name`] = propName; | ||
} | ||
cb(err, model); | ||
}; | ||
if (value instanceof modelKlass) { | ||
setter(null, value); | ||
} else { | ||
setter(null, setupModel(Object.assign( | ||
{}, options, { attrs: value, modelClass: modelKlass }, | ||
))); | ||
return model; | ||
} | ||
), | ||
}; | ||
} | ||
const Associations = { | ||
hasMany(modelClass, propName, options) { | ||
const { | ||
deserializer, | ||
serializer, | ||
} = associationSerializers(modelClass, propName, options); | ||
return Object.assign(options, { | ||
model: modelClass, | ||
deserializer(collection, cb, context) { | ||
const value = collection && collection.map ? | ||
collection.map(attrs => deserializer(attrs, context)) : collection; | ||
cb(null, value); | ||
}, | ||
serializer(collection, name, parent) { | ||
if (!isSerializable(parent, name)) { return SKIP; } | ||
return collection && collection.map ? | ||
collection.map(model => serializer(model, name, parent)) : collection; | ||
}, | ||
}); | ||
}, | ||
belongsTo(modelClass, propName, options) { | ||
const { | ||
deserializer, | ||
serializer, | ||
} = associationSerializers(modelClass, propName, options); | ||
return Object.assign(options, { | ||
model: modelClass, | ||
deserializer(attrs, cb, context) { | ||
cb(null, deserializer(attrs, context)); | ||
}, | ||
serializer(belongsTo, name, parent) { | ||
if (!isSerializable(parent, name)) { return SKIP; } | ||
return serializerFn(belongsTo); // defaultSerializer.serializer(belongsTo); | ||
return serializer(belongsTo, name, parent); | ||
}, | ||
@@ -144,3 +177,4 @@ }); | ||
createModelSchema(model, serializeSchema, ({ json }) => new model(json)); // eslint-disable-line new-cap | ||
// eslint-disable-next-line new-cap | ||
createModelSchema(model, serializeSchema, ({ json }) => new model(json)); | ||
schema.forEach(({ type, options }, name) => { | ||
@@ -156,3 +190,3 @@ if (Associations[type] || options.model) { | ||
const parentModelSchema = getDefaultModelSchema(parentModel); | ||
parentModelSchema.props[propName] = cb(referencedModel, options, propName); | ||
parentModelSchema.props[propName] = cb(referencedModel, propName, options); | ||
PendingLookups.splice(i, 1); | ||
@@ -159,0 +193,0 @@ } |
@@ -12,3 +12,3 @@ import { observable, intercept } from 'mobx'; | ||
change, | ||
{ modelClass, defaultAttributes, inverseOf, parentModel, parentModelProp } | ||
{ modelClass, defaultAttributes, inverseOf, parentModel, parentModelProp }, | ||
) { | ||
@@ -15,0 +15,0 @@ change.newValue = setupModel({ |
{ | ||
"name": "mobx-decorated-models", | ||
"version": "0.8.3", | ||
"version": "0.9.0", | ||
"description": "Decorators to make using Mobx for model type structures easier", | ||
@@ -5,0 +5,0 @@ "main": "dist/build.full.js", |
@@ -165,12 +165,16 @@ import { autorun } from 'mobx'; | ||
const boat = Ship.deserialize({ name: 'Boaty', cargoCount: 3 }); | ||
boat.registration = '8550W'; | ||
expect(boat.registration).toBeInstanceOf(Registration); | ||
expect(boat.serialize()).toMatchObject({ registration: '8550W' }); | ||
boat.homePorts.push(1234); | ||
expect(boat.homePorts.length).toEqual(1); | ||
expect(boat.homePorts[0]).toBeInstanceOf(Registration); | ||
expect(boat.homePorts[0].id).toEqual(1234); | ||
expect(boat.serialize()).toMatchObject({ homePorts: [1234] }); | ||
expect(boat.name).toEqual('Boaty'); | ||
const customBoat = Ship.deserialize({ | ||
registration: [1, 2, 3], | ||
}); | ||
customBoat.homePorts.push('home'); | ||
expect(customBoat.registration).toBeInstanceOf(Registration); | ||
expect(customBoat.registration.id).toEqual([1, 2, 3]); | ||
expect(customBoat.serialize()).toMatchObject({ registration: [1, 2, 3] }); | ||
expect(customBoat.serialize()).toMatchObject({ homePorts: ['home'] }); | ||
}); | ||
@@ -177,0 +181,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
290023
1969