prantlf/backbone.composite-model

View on GitHub
backbone.composite-model.min.js

Summary

Maintainability
A
0 mins
Test Coverage
(function(e,t){"use strict";if(typeof define==="function"&&define.amd){define(["underscore","backbone"],t)}else if(typeof module==="object"&&module.exports){module.exports=t(require("underscore"),require("backbone"))}else{e.returnExports=t(e._,e.Backbone)}})(this,function(a,c){"use strict";c.mixinCompositeModel=function(s){var n=s.set,t=s.toJSON;return a.extend(s,{makeComposite:function(e){e=a.extend({create:true},e);this._compositeMap=this._createCompositeMap(e);this._updateComposite(this.attributes,e);return this},set:function(e,t,o){var i;if(e==null){return this}if(typeof e==="object"){i=e;o=t}else{(i={})[e]=t}o||(o={});var r=n.call(this,i,o);if(r&&this._compositeMap){this._updateComposite(i,o)}return r},toJSON:function(e){var i=t.call(this,e);if(this._compositeMap){a.each(this._compositeMap,function(e,t){var o=this[e.property];if(o){i[t]=o.toJSON()}},this)}return i},_createCompositeMap:function(e){var t=this.composite,o=e.composite;if(typeof t==="function"){t=t.call(this,e)}if(typeof o==="function"){o=o.call(this,e)}if(t&&typeof t!=="object"||o&&typeof o!=="object"){throw new Error("Invalid composite configuration")}var i=a.extend({},t,o);return a.reduce(i,function(e,t,o){var i,r,n;if(t.prototype instanceof c.Model||t.prototype instanceof c.Collection){i=o}else{if(typeof t!=="object"){throw new Error("Invalid composite child descriptor")}i=t.property||o;r=t.parse;if(r!=null&&typeof r!=="function"){throw new Error("Invalid child model data parse function")}n=t.method;t=t.type;if(!(t.prototype instanceof c.Model||t.prototype instanceof c.Collection)){throw new Error("Invalid composite child model")}}if(s[i]){throw new Error("Property conflict in the composite prototype")}if(!n){n=t.prototype instanceof c.Model?"set":"add"}if(!t.prototype[n]){throw new Error("Invalid chidl model data updating method")}e[o]={model:t,property:i,parse:r,method:n};return e},{})},_updateComposite:function(i,r){function n(e,t){var o=a.extend({},e.options,r);this[e.property]=new e.model(t,o)}function s(e){var t=this[e.property];if(t){if(r.unset||r.parse&&!r.validate){if(t instanceof c.Model){t.clear(r)}else{t.reset(undefined,r)}}}else if(r.create){n.call(this,e)}}function p(e,t){if(e.parse){t=e.parse.call(this,t,r)}var o=this[e.property];if(o){if(r.parse&&!r.validate){if(o instanceof c.Model){var i=a.omit(o.attributes,a.keys(t));o.set(i,{unset:true,silent:true})}else{o.reset(undefined,{silent:true})}}o[e.method](t,r)}else{n.call(this,e,t)}}a.each(this._compositeMap,function(e,t){if(a.has(i,t)){var o=i[t];if(o!=null){p.call(this,e,o)}else{s.call(this,e)}}else{s.call(this,e)}},this)}})};return c.mixinCompositeModel});