/* backbone-nestify 0.6.0 2015-08-14 * http://revelytix.github.io/backbone-nestify/ * Copyright 2015 Teradata, Inc. All rights reserved. */ !function(a){"object"==typeof module?module.exports=a(require("underscore"),require("backbone")):"function"==typeof define&&define.amd?define(["underscore","backbone"],a):this.nestify=a(this._,this.Backbone)}(function(a,b){var c=Array.prototype.slice,d={existy:function(a){return null!=a},defaultOpts:{coll:"at",delim:"|"},lookupPath:function(c,d){return a.reduce(c,function(c,d){var e;return c&&(e=a.isNumber(d)?c instanceof b.Collection?c.at(d):c[d]:c instanceof b.Model?c.attributes[d]:c[d]),e},d)},properNum:function(a){return/^([0-9]+)$/.test(a)?parseInt(a,10):a},withProperNums:function(b){return a.map(b,d.properNum)},delimitedStringToArray:function(b,c){var e=c.delim;return d.existy(b)?a.isArray(b)?b:a.isString(b)&&b.indexOf(e)>-1?d.withProperNums(b.split(e)):[b]:[]},toObj:function(b,c){var d;return a.isObject(b)&&!a.isArray(b)?d=b:(a.isArray(b)||a.isString(b))&&(b=a.isArray(b)?b:[b],d=a.reduceRight(b,function(b,c){var d;return d=a.isNumber(c)?[]:{},d[c]=b,d},c)),d},coerceArray:function(a){return d.existy(a)||(a=[]),a},assertArray:function(b){a.isArray(b)||console.log("**WARNING**! expected array but found: "+JSON.stringify(b))},prepAttributes:function(b,c,d){return d=d||{},c=a.reduce(c,function(a,c,e){var g=this.attributes&&this.attributes[e],h=f.findContainerFn(b,e,c,g,d);return a[e]=h(c,g,d,e,this),a},{},this)},hasChangedDeep:function(c,d,e){var f=b.Model.prototype.hasChanged.call(this,e);return!f&&d&&(f=a.reduce(this.attributes,function(a,e,f){return a||(e instanceof b.Model?a=c.call(e,c,d):e instanceof b.Collection&&(a=e.reduce(function(a,b){return a||c.call(b,c,d)},a))),a},f)),f}},e={stringMatcher:function(a,b){return a===b},regexMatcher:function(a,b){return a.test(b)},matchAll:function(){return!0},useUnmodified:function(a,b,c,e){return this.isModel(a,b)||this.isCollection(a,b)||e.unset&&!d.existy(b)},isModel:function(a,c){return c instanceof b.Model},isExistingModel:function(a,c,d){return d instanceof b.Model},isCollection:function(a,c){return c instanceof b.Collection},isExistingCollection:function(a,c,d){return d instanceof b.Collection},isArray:function(b,c){return a.isArray(c)},isArrayOfObjects:function(b,c){return a.isArray(c)&&a.every(c,a.isObject)},isExistingArray:function(b,c,d){return a.isArray(d)},isObject:function(b,c){return a.isObject(c)},isExistingObject:function(b,c,d){return a.isObject(d)},and:function(){var b=c.call(arguments);return function(){var d=c.call(arguments);return a.reduce(b,function(a,b){return a&&b.apply(this,d)},!0,this)}},or:function(){var b=c.call(arguments);return function(){var d=c.call(arguments);return a.reduce(b,function(a,b){return a||b.apply(this,d)},!1,this)}},not:function(a){return function(){return!a.apply(this,arguments)}}};a.bindAll(e,"useUnmodified");var f={determineType:function(c){var d;return c instanceof b.Model?d="model":c instanceof b.Collection?d="collection":a.isArray(c)?d="array":a.isObject(c)&&(d="object"),d},isBackbone:function(b){return a.contains(["model","collection"],b)},findContainerFn:function(b,c,d,e,f){var g=a.find(b,function(a){return a._matcherFn(c,d,e,f)});return g._containerFn},object:{merge:function(b,c){return a.extend({},b,c)},reset:function(a,b){return b}},array:{merge:function(b,c){return a.map(a.zip(c,b),a.compose(a.first,a.compact))},reset:function(a,b){return b}},model:{merge:function(a,b,c){return a.set(b,c),a},reset:function(a,b,c){return a.clear(),a.set(b,c),a}},collection:{reset:function(b,c,e){c=d.coerceArray(c),d.assertArray(c);var f=b.model;return b.reset(a.map(c,function(a){return new f(a,e)}),e),b},smartMerge:function(b,c,e){c=d.coerceArray(c),d.assertArray(c);var f=b.model;return b.set(a.map(c,function(a){return new f(a,e)}),e),b},merge:function(b,c,e){c=d.coerceArray(c),d.assertArray(c);var f=b.model,g=a.zip(b.models,c),h=a.map(g,function(a){var b=a[0],c=a[1],d=b;return c&&(b?b.set(c,e):d=new f(c,e)),d});return b.set(h,e),b}}},g={defaults:{object:"reset",array:"reset",collection:"merge",model:"merge"},object:{reset:f.object.reset,merge:f.object.merge,smart:f.object.merge},array:{reset:f.array.reset,merge:f.array.merge,smart:f.array.merge},model:{reset:f.model.reset,merge:f.model.merge,smart:f.model.merge},collection:{reset:f.collection.reset,merge:f.collection.merge,smart:f.collection.smartMerge}},h={determineTypeFromConstructor:function(a){var c;return a===b.Model||a.prototype instanceof b.Model?c="model":a===b.Collection||a.prototype instanceof b.Collection?c="collection":a===Array?c="array":a===Object&&(c="object"),c},compileConstructorFn:function(b,c){var e=d.existy(c),g=f.isBackbone(c);return function(c,d,f,h){var j=e?g?new b.constructor(b.args,d):new b.constructor:b.constructor(b.args,d,f,h);return b.spec&&a.extend(j,i(b.spec)),j}},compileContainerFn:function(b){b=a.isFunction(b)?{constructor:b}:b;var c=this.determineTypeFromConstructor(b.constructor),d=this.compileConstructorFn(b,c);return function(e,h,i){i=b.opts?a.extend({},i,b.opts):i;var j=h?h:d(e,i);c=c||f.determineType(j);var k=i.update||g.defaults[c],l=g[c];return l[k](j,e,i)}},compileExistingContainerFn:function(a){var b=g[a],c=g.defaults[a];return function(a,d,e){var f=e.update||c;return b[f](d,a,e)}},compile:function(b,c){var d,f;return d=a.isArray(b)?b:a.isObject(b)?[{hash:b}]:[],f=[{_matcherFn:e.useUnmodified,_containerFn:a.identity}],f=a.reduce(d,function(b,c){if(c.hash)a.each(c.hash,function(c,d){b.push({_matcherFn:a.partial(e.stringMatcher,d),_containerFn:this.compileContainerFn(c)})},this);else{var d={_containerFn:this.compileContainerFn(c.container)};a.isRegExp(c.match)?d._matcherFn=a.partial(e.regexMatcher,c.match):a.isString(c.match)?d._matcherFn=a.partial(e.stringMatcher,c.match):a.isFunction(c.match)?d._matcherFn=c.match:d._matcherFn=e.matchAll,b.push(d)}return b},f,this),f.push({_matcherFn:e.isExistingCollection,_containerFn:this.compileExistingContainerFn("collection")},{_matcherFn:e.isExistingModel,_containerFn:this.compileExistingContainerFn("model")},{_matcherFn:e.isExistingArray,_containerFn:this.compileExistingContainerFn("array")},{_matcherFn:e.isExistingObject,_containerFn:this.compileExistingContainerFn("object")}),f.push({_matcherFn:e.matchAll,_containerFn:a.identity}),c.compiled=f,f}},i=a.extend(function(c,e){var f=a.extend({},d.defaultOpts,e);return c=h.compile(c,f),{get:function(b,c){return c=a.extend({},f,c),b=d.delimitedStringToArray(b,c),d.lookupPath(b,this)},set:function(e,g,h){var i;return!a.isArray(e)&&a.isObject(e)?(h=a.extend({},f,g),i=e instanceof b.Model?e.attributes:e):(h=a.extend({},f,h),e=d.delimitedStringToArray(e,h),i=d.toObj(e,g)),!a.isObject(i)||h instanceof b.Model||(i=d.prepAttributes.call(this,c,i,h)),b.Model.prototype.set.call(this,i,h)},hasChanged:function(b,c){a.isObject(b)&&!a.isArray(b)?(c=a.extend({},f,b),b=[]):(c=a.extend({},f,c),b=d.delimitedStringToArray(b,c));var e=a.initial(b),g=d.lookupPath(e,this);return g?d.hasChangedDeep.call(g,d.hasChangedDeep,c.nested===!0,a.last(b)):!1}}},{auto:function(c){c=c||{};var d=b.Model.extend(c.extend),f=b.Collection.extend({model:d}),g=[{match:e.isArrayOfObjects,container:f},{match:e.and(e.isObject,e.not(e.isArray)),container:a.extend({constructor:d},c)}],h=i(g,c);return a.extend(d.prototype,h),h},instance:function(c,d,e){if(c instanceof b.Model){a.extend(c,d||i(e));var f=c.attributes;c.attributes={},c.set(f,e)}return c},_pathToObject:d.toObj,_properNum:d.properNum});return i});