diff --git a/distribution/deep-model.js b/distribution/deep-model.js
index 5307ffc..93784b3 100644
--- a/distribution/deep-model.js
+++ b/distribution/deep-model.js
@@ -1,7 +1,7 @@
/*jshint expr:true eqnull:true */
/**
*
- * Backbone.DeepModel v0.10.4
+ * Backbone.DeepModel v0.11.0
*
* Copyright (c) 2013 Charles Davison, Pow Media Ltd
*
@@ -14,7 +14,18 @@
*
* Based on https://gist.github.com/echong/3861963
*/
-(function() {
+;(function(factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD
+ define(['underscore', 'backbone'], factory);
+ } else if (typeof exports === 'object') {
+ // CommonJS
+ module.exports = factory(require('underscore'), require('backbone'));
+ } else {
+ // globals
+ factory(_, Backbone);
+ }
+}(function(_, Backbone) {
var arrays, basicObjects, deepClone, deepExtend, deepExtendCouple, isBasicObject,
__slice = [].slice;
@@ -26,6 +37,9 @@
if (obj instanceof Backbone.Collection || obj instanceof Backbone.Model) {
return obj;
}
+ if (_.isElement(obj)) {
+ return obj;
+ }
if (_.isDate(obj)) {
return new Date(obj.getTime());
}
@@ -117,7 +131,7 @@
deepExtend: deepExtend
});
-}).call(this);
+}));
/**
* Main source
@@ -127,12 +141,15 @@
if (typeof define === 'function' && define.amd) {
// AMD
define(['underscore', 'backbone'], factory);
+ } else if (typeof exports === 'object') {
+ // CommonJS
+ module.exports = factory(require('underscore'), require('backbone'));
} else {
// globals
factory(_, Backbone);
}
}(function(_, Backbone) {
-
+
/**
* Takes a nested object and returns a shallow object keyed with the path names
* e.g. { "level1.level2": "value" }
@@ -147,7 +164,7 @@
for (var key in obj) {
var val = obj[key];
- if (val && val.constructor === Object && !_.isEmpty(val)) {
+ if (val && (val.constructor === Object || val.constructor === Array) && !_.isEmpty(val)) {
//Recursion for embedded objects
var obj2 = objToPaths(val);
@@ -172,7 +189,7 @@
function getNested(obj, path, return_exists) {
var separator = DeepModel.keyPathSeparator;
- var fields = path.split(separator);
+ var fields = path ? path.split(separator) : [];
var result = obj;
return_exists || (return_exists === false);
for (var i = 0, n = fields.length; i < n; i++) {
@@ -184,7 +201,7 @@
if (result == null && i < n - 1) {
result = {};
}
-
+
if (typeof result === 'undefined') {
if (return_exists)
{
@@ -212,7 +229,7 @@
var separator = DeepModel.keyPathSeparator;
- var fields = path.split(separator);
+ var fields = path ? path.split(separator) : [];
var result = obj;
for (var i = 0, n = fields.length; i < n && result !== undefined ; i++) {
var field = fields[i];
@@ -223,7 +240,10 @@
} else {
//Create the child object if it doesn't exist, or isn't an object
if (typeof result[field] === 'undefined' || ! _.isObject(result[field])) {
- result[field] = {};
+ var nextField = fields[i+1];
+
+ // create array if next field is integer, else create object
+ result[field] = /^\d+$/.test(nextField) ? [] : {};
}
//Move onto the next part of the path
@@ -274,7 +294,7 @@
set: function(key, val, options) {
var attr, attrs, unset, changes, silent, changing, prev, current;
if (key == null) return this;
-
+
// Handle both `"key", value` and `{key: value}` -style arguments.
if (typeof key === 'object') {
attrs = key;
@@ -284,7 +304,7 @@
}
options || (options = {});
-
+
// Run validation.
if (!this._validate(attrs, options)) return false;
@@ -329,11 +349,15 @@
//
var separator = DeepModel.keyPathSeparator;
+ var alreadyTriggered = {}; // * @restorer
for (var i = 0, l = changes.length; i < l; i++) {
var key = changes[i];
- this.trigger('change:' + key, this, getNested(current, key), options);
+ if (!alreadyTriggered.hasOwnProperty(key) || !alreadyTriggered[key]) { // * @restorer
+ alreadyTriggered[key] = true; // * @restorer
+ this.trigger('change:' + key, this, getNested(current, key), options);
+ } // * @restorer
var fields = key.split(separator);
@@ -342,7 +366,17 @@
var parentKey = _.first(fields, n).join(separator),
wildcardKey = parentKey + separator + '*';
- this.trigger('change:' + wildcardKey, this, getNested(current, parentKey), options);
+ if (!alreadyTriggered.hasOwnProperty(wildcardKey) || !alreadyTriggered[wildcardKey]) { // * @restorer
+ alreadyTriggered[wildcardKey] = true; // * @restorer
+ this.trigger('change:' + wildcardKey, this, getNested(current, parentKey), options);
+ } // * @restorer
+
+ // + @restorer
+ if (!alreadyTriggered.hasOwnProperty(parentKey) || !alreadyTriggered[parentKey]) {
+ alreadyTriggered[parentKey] = true;
+ this.trigger('change:' + parentKey, this, getNested(current, parentKey), options);
+ }
+ // - @restorer
}
//
}
@@ -388,7 +422,7 @@
//
var old = this._changing ? this._previousAttributes : this.attributes;
-
+
//
diff = objToPaths(diff);
old = objToPaths(old);
@@ -431,7 +465,7 @@
//For use in NodeJS
if (typeof module != 'undefined') module.exports = DeepModel;
-
+
return Backbone;
}));
diff --git a/distribution/deep-model.min.js b/distribution/deep-model.min.js
index e488ad5..b620763 100644
--- a/distribution/deep-model.min.js
+++ b/distribution/deep-model.min.js
@@ -1,7 +1,7 @@
/*jshint expr:true eqnull:true */
/**
*
- * Backbone.DeepModel v0.10.4
+ * Backbone.DeepModel v0.11.0
*
* Copyright (c) 2013 Charles Davison, Pow Media Ltd
*
@@ -9,4 +9,4 @@
* Licensed under the MIT License
*/
-(function(){var e,t,n,r,i,s,o=[].slice;n=function(e){var t,r;return!_.isObject(e)||_.isFunction(e)?e:e instanceof Backbone.Collection||e instanceof Backbone.Model?e:_.isDate(e)?new Date(e.getTime()):_.isRegExp(e)?new RegExp(e.source,e.toString().replace(/.*\//,"")):(r=_.isArray(e||_.isArguments(e)),t=function(e,t,i){return r?e.push(n(t)):e[i]=n(t),e},_.reduce(e,t,r?[]:{}))},s=function(e){return e==null?!1:(e.prototype==={}.prototype||e.prototype===Object.prototype)&&_.isObject(e)&&!_.isArray(e)&&!_.isFunction(e)&&!_.isDate(e)&&!_.isRegExp(e)&&!_.isArguments(e)},t=function(e){return _.filter(_.keys(e),function(t){return s(e[t])})},e=function(e){return _.filter(_.keys(e),function(t){return _.isArray(e[t])})},i=function(n,r,s){var o,u,a,f,l,c,h,p,d,v;s==null&&(s=20);if(s<=0)return console.warn("_.deepExtend(): Maximum depth of recursion hit."),_.extend(n,r);c=_.intersection(t(n),t(r)),u=function(e){return r[e]=i(n[e],r[e],s-1)};for(h=0,d=c.length;h0)e=i(e,n(r.shift()),t);return e},_.mixin({deepClone:n,isBasicObject:s,basicObjects:t,arrays:e,deepExtend:r})}).call(this),function(e){typeof define=="function"&&define.amd?define(["underscore","backbone"],e):e(_,Backbone)}(function(e,t){function n(t){var r={},i=o.keyPathSeparator;for(var s in t){var u=t[s];if(u&&u.constructor===Object&&!e.isEmpty(u)){var a=n(u);for(var f in a){var l=a[f];r[s+i+f]=l}}else r[s]=u}return r}function r(t,n,r){var i=o.keyPathSeparator,s=n.split(i),u=t;r||r===!1;for(var a=0,f=s.length;a0;E--){var S=e.first(w,E).join(g),x=S+g+"*";this.trigger("change:"+x,this,r(m,S),a)}}}if(d)return this;if(!p)while(this._pending)this._pending=!1,this.trigger("change",this,a);return this._pending=!1,this._changing=!1,this},clear:function(t){var r={},i=n(this.attributes);for(var s in i)r[s]=void 0;return this.set(r,e.extend({},t,{unset:!0}))},hasChanged:function(t){return t==null?!e.isEmpty(this.changed):r(this.changed,t)!==undefined},changedAttributes:function(t){if(!t)return this.hasChanged()?n(this.changed):!1;var r=this._changing?this._previousAttributes:this.attributes;t=n(t),r=n(r);var i,s=!1;for(var o in t){if(e.isEqual(r[o],i=t[o]))continue;(s||(s={}))[o]=i}return s},previous:function(e){return e==null||!this._previousAttributes?null:r(this._previousAttributes,e)},previousAttributes:function(){return e.deepClone(this._previousAttributes)}});return o.keyPathSeparator=".",t.DeepModel=o,typeof module!="undefined"&&(module.exports=o),t})
+(function(e){typeof define=="function"&&define.amd?define(["underscore","backbone"],e):typeof exports=="object"?module.exports=e(require("underscore"),require("backbone")):e(_,Backbone)})(function(e,t){var n,r,i,s,o,u,a=[].slice;i=function(n){var r,s;return!e.isObject(n)||e.isFunction(n)?n:n instanceof t.Collection||n instanceof t.Model?n:e.isElement(n)?n:e.isDate(n)?new Date(n.getTime()):e.isRegExp(n)?new RegExp(n.source,n.toString().replace(/.*\//,"")):(s=e.isArray(n||e.isArguments(n)),r=function(e,t,n){return s?e.push(i(t)):e[n]=i(t),e},e.reduce(n,r,s?[]:{}))},u=function(t){return t==null?!1:(t.prototype==={}.prototype||t.prototype===Object.prototype)&&e.isObject(t)&&!e.isArray(t)&&!e.isFunction(t)&&!e.isDate(t)&&!e.isRegExp(t)&&!e.isArguments(t)},r=function(t){return e.filter(e.keys(t),function(e){return u(t[e])})},n=function(t){return e.filter(e.keys(t),function(n){return e.isArray(t[n])})},o=function(t,i,s){var u,a,f,l,c,h,p,d,v,m;s==null&&(s=20);if(s<=0)return console.warn("_.deepExtend(): Maximum depth of recursion hit."),e.extend(t,i);h=e.intersection(r(t),r(i)),a=function(e){return i[e]=o(t[e],i[e],s-1)};for(p=0,v=h.length;p0)t=o(t,i(r.shift()),n);return t},e.mixin({deepClone:i,isBasicObject:u,basicObjects:r,arrays:n,deepExtend:s})}),function(e){typeof define=="function"&&define.amd?define(["underscore","backbone"],e):typeof exports=="object"?module.exports=e(require("underscore"),require("backbone")):e(_,Backbone)}(function(e,t){function n(t){var r={},i=o.keyPathSeparator;for(var s in t){var u=t[s];if(u&&(u.constructor===Object||u.constructor===Array)&&!e.isEmpty(u)){var a=n(u);for(var f in a){var l=a[f];r[s+i+f]=l}}else r[s]=u}return r}function r(t,n,r){var i=o.keyPathSeparator,s=n?n.split(i):[],u=t;r||r===!1;for(var a=0,f=s.length;a0;S--){var x=e.first(E,S).join(g),T=x+g+"*";if(!y.hasOwnProperty(T)||!y[T])y[T]=!0,this.trigger("change:"+T,this,r(m,x),a);if(!y.hasOwnProperty(x)||!y[x])y[x]=!0,this.trigger("change:"+x,this,r(m,x),a)}}}if(d)return this;if(!p)while(this._pending)this._pending=!1,this.trigger("change",this,a);return this._pending=!1,this._changing=!1,this},clear:function(t){var r={},i=n(this.attributes);for(var s in i)r[s]=void 0;return this.set(r,e.extend({},t,{unset:!0}))},hasChanged:function(t){return t==null?!e.isEmpty(this.changed):r(this.changed,t)!==undefined},changedAttributes:function(t){if(!t)return this.hasChanged()?n(this.changed):!1;var r=this._changing?this._previousAttributes:this.attributes;t=n(t),r=n(r);var i,s=!1;for(var o in t){if(e.isEqual(r[o],i=t[o]))continue;(s||(s={}))[o]=i}return s},previous:function(e){return e==null||!this._previousAttributes?null:r(this._previousAttributes,e)},previousAttributes:function(){return e.deepClone(this._previousAttributes)}});return o.keyPathSeparator=".",t.DeepModel=o,typeof module!="undefined"&&(module.exports=o),t})
diff --git a/index.js b/index.js
index bb0a78f..6dc504b 100644
--- a/index.js
+++ b/index.js
@@ -1 +1 @@
-module.exports = require('./src/deep-model');
+module.exports = require('./distribution/deep-model');
diff --git a/lib/underscore.mixin.deepExtend.js b/lib/underscore.mixin.deepExtend.js
index 94b893f..8f41bf1 100644
--- a/lib/underscore.mixin.deepExtend.js
+++ b/lib/underscore.mixin.deepExtend.js
@@ -3,7 +3,18 @@
*
* Based on https://gist.github.com/echong/3861963
*/
-(function(_, Backbone) {
+;(function(factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD
+ define(['underscore', 'backbone'], factory);
+ } else if (typeof exports === 'object') {
+ // CommonJS
+ module.exports = factory(require('underscore'), require('backbone'));
+ } else {
+ // globals
+ factory(_, Backbone);
+ }
+}(function(_, Backbone) {
var arrays, basicObjects, deepClone, deepExtend, deepExtendCouple, isBasicObject,
__slice = [].slice;
@@ -109,4 +120,4 @@
deepExtend: deepExtend
});
-}).call(this, _, Backbone);
+}));