From 7d33b226f8de84ff461b392bad3ab4f17ebe1ff0 Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 18 Apr 2015 17:28:09 -0600 Subject: [PATCH 1/5] Stable Version 2.0.0-beta.1. Fixes #11. --- CHANGELOG.md | 8 ++ bower.json | 2 +- dist/js-data-firebase.js | 258 +++++++++++++++++++++------------- dist/js-data-firebase.min.js | 4 +- dist/js-data-firebase.min.map | 2 +- examples/angular/index.html | 6 +- package.json | 24 ++-- src/index.js | 209 ++++++++++++++++----------- 8 files changed, 313 insertions(+), 200 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ec51dd0..728f3d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +##### 2.0.0-beta.1 - 18 April 2015 + +###### Backwards compatible bug fixes +- #11 - Race condition, tasks need to be atomic + +###### Other +- Updated dependencies + ##### 1.1.1 - 27 March 2015 ###### Backwards compatible bug fixes diff --git a/bower.json b/bower.json index 7da5430..cd683b1 100644 --- a/bower.json +++ b/bower.json @@ -29,7 +29,7 @@ "karma.start.js" ], "dependencies": { - "js-data": ">=1.5.7", + "js-data": ">=2.0.0-beta.3", "firebase": ">=1.1.x" } } diff --git a/dist/js-data-firebase.js b/dist/js-data-firebase.js index b17f13c..69ff247 100644 --- a/dist/js-data-firebase.js +++ b/dist/js-data-firebase.js @@ -1,6 +1,6 @@ /*! * js-data-firebase - * @version 1.1.1 - Homepage + * @version 2.0.0-beta.1 - Homepage * @author Jason Dobry * @copyright (c) 2014-2015 Jason Dobry * @license MIT @@ -63,25 +63,36 @@ return /******/ (function(modules) { // webpackBootstrap /* 0 */ /***/ function(module, exports, __webpack_require__) { - var _interopRequire = function (obj) { return obj && obj.__esModule ? obj["default"] : obj; }; + var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - var _createClass = (function () { function defineProperties(target, props) { for (var key in props) { var prop = props[key]; prop.configurable = true; if (prop.value) prop.writable = true; } Object.defineProperties(target, props); } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }; + var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; - var JSData = _interopRequire(__webpack_require__(1)); + Object.defineProperty(exports, '__esModule', { + value: true + }); - var Firebase = _interopRequire(__webpack_require__(2)); + var _JSData = __webpack_require__(1); - var omit = _interopRequire(__webpack_require__(3)); + var _JSData2 = _interopRequireWildcard(_JSData); - var values = _interopRequire(__webpack_require__(4)); + var _Firebase = __webpack_require__(2); - var emptyStore = new JSData.DS(); - var DSUtils = JSData.DSUtils; + var _Firebase2 = _interopRequireWildcard(_Firebase); + + var _omit = __webpack_require__(3); + + var _omit2 = _interopRequireWildcard(_omit); + + var _values = __webpack_require__(4); + + var _values2 = _interopRequireWildcard(_values); + + var emptyStore = new _JSData2['default'].DS(); + var DSUtils = _JSData2['default'].DSUtils; var deepMixIn = DSUtils.deepMixIn; var removeCircular = DSUtils.removeCircular; - var P = DSUtils.Promise; var forOwn = DSUtils.forOwn; var filter = emptyStore.defaults.defaultFilter; @@ -90,7 +101,44 @@ return /******/ (function(modules) { // webpackBootstrap _classCallCheck(this, Defaults); }; - Defaults.prototype.basePath = ""; + Defaults.prototype.basePath = ''; + + var queue = []; + var taskInProcess = false; + + function enqueue(task) { + queue.push(task); + } + + function dequeue() { + if (queue.length && !taskInProcess) { + taskInProcess = true; + queue[0](); + } + } + + function queueTask(task) { + if (!queue.length) { + enqueue(task); + dequeue(); + } else { + enqueue(task); + } + } + + function createTask(fn) { + return new DSUtils.Promise(fn).then(function (result) { + taskInProcess = false; + queue.shift(); + setTimeout(dequeue, 0); + return result; + }, function (err) { + taskInProcess = false; + queue.shift(); + setTimeout(dequeue, 0); + return DSUtils.Promise.reject(err); + }); + } var DSFirebaseAdapter = (function () { function DSFirebaseAdapter(options) { @@ -99,92 +147,99 @@ return /******/ (function(modules) { // webpackBootstrap options = options || {}; this.defaults = new Defaults(); deepMixIn(this.defaults, options); - this.ref = new Firebase(options.basePath || this.defaults.basePath); + this.ref = new _Firebase2['default'](options.basePath || this.defaults.basePath); } - _createClass(DSFirebaseAdapter, { - getRef: { - value: function getRef(resourceConfig, options) { - options = options || {}; - return this.ref.child(options.endpoint || resourceConfig.endpoint); - } - }, - find: { - value: function find(resourceConfig, id, options) { - var _this = this; - - return new P(function (resolve, reject) { - return _this.getRef(resourceConfig, options).child(id).once("value", function (dataSnapshot) { + _createClass(DSFirebaseAdapter, [{ + key: 'getRef', + value: function getRef(resourceConfig, options) { + options = options || {}; + return this.ref.child(options.endpoint || resourceConfig.endpoint); + } + }, { + key: 'find', + value: function find(resourceConfig, id, options) { + var _this = this; + + return createTask(function (resolve, reject) { + queueTask(function () { + _this.getRef(resourceConfig, options).child(id).once('value', function (dataSnapshot) { var item = dataSnapshot.val(); if (!item) { - reject(new Error("Not Found!")); + reject(new Error('Not Found!')); } else { item[resourceConfig.idAttribute] = item[resourceConfig.idAttribute] || id; resolve(item); } }, reject, _this); }); - } - }, - findAll: { - value: function findAll(resourceConfig, params, options) { - var _this = this; - - return new P(function (resolve, reject) { - return _this.getRef(resourceConfig, options).once("value", function (dataSnapshot) { + }); + } + }, { + key: 'findAll', + value: function findAll(resourceConfig, params, options) { + var _this2 = this; + + return createTask(function (resolve, reject) { + queueTask(function () { + _this2.getRef(resourceConfig, options).once('value', function (dataSnapshot) { var data = dataSnapshot.val(); forOwn(data, function (value, key) { if (!value[resourceConfig.idAttribute]) { - value[resourceConfig.idAttribute] = "/" + key; + value[resourceConfig.idAttribute] = '/' + key; } }); - resolve(filter.call(emptyStore, values(data), resourceConfig.name, params, options)); - }, reject, _this); + resolve(filter.call(emptyStore, _values2['default'](data), resourceConfig.name, params, options)); + }, reject, _this2); }); - } - }, - create: { - value: function create(resourceConfig, attrs, options) { - var _this = this; - - var id = attrs[resourceConfig.idAttribute]; - if (DSUtils.isString(id) || DSUtils.isNumber(id)) { - return this.update(resourceConfig, id, attrs, options); - } else { - return new P(function (resolve, reject) { - var resourceRef = _this.getRef(resourceConfig, options); - var itemRef = resourceRef.push(removeCircular(omit(attrs, resourceConfig.relationFields || [])), function (err) { + }); + } + }, { + key: 'create', + value: function create(resourceConfig, attrs, options) { + var _this3 = this; + + var id = attrs[resourceConfig.idAttribute]; + if (DSUtils.isString(id) || DSUtils.isNumber(id)) { + return this.update(resourceConfig, id, attrs, options); + } else { + return createTask(function (resolve, reject) { + queueTask(function () { + var resourceRef = _this3.getRef(resourceConfig, options); + var itemRef = resourceRef.push(removeCircular(_omit2['default'](attrs, resourceConfig.relationFields || [])), function (err) { if (err) { return reject(err); } else { - var _id = itemRef.toString().replace(resourceRef.toString(), ""); + var _id = itemRef.toString().replace(resourceRef.toString(), ''); itemRef.child(resourceConfig.idAttribute).set(_id, function (err) { if (err) { reject(err); } else { - itemRef.once("value", function (dataSnapshot) { + itemRef.once('value', function (dataSnapshot) { try { resolve(dataSnapshot.val()); } catch (err) { reject(err); } - }, reject, _this); + }, reject, _this3); } }); } }); }); - } + }); } - }, - update: { - value: function update(resourceConfig, id, attrs, options) { - var _this = this; - - attrs = removeCircular(omit(attrs || {}, resourceConfig.relationFields || [])); - return new P(function (resolve, reject) { - var itemRef = _this.getRef(resourceConfig, options).child(id); - itemRef.once("value", function (dataSnapshot) { + } + }, { + key: 'update', + value: function update(resourceConfig, id, attrs, options) { + var _this4 = this; + + return createTask(function (resolve, reject) { + queueTask(function () { + attrs = removeCircular(_omit2['default'](attrs || {}, resourceConfig.relationFields || [])); + var itemRef = _this4.getRef(resourceConfig, options).child(id); + itemRef.once('value', function (dataSnapshot) { try { (function () { var item = dataSnapshot.val() || {}; @@ -217,29 +272,31 @@ return /******/ (function(modules) { // webpackBootstrap } catch (err) { reject(err); } - }, reject, _this); + }, reject, _this4); }); - } - }, - updateAll: { - value: function updateAll(resourceConfig, attrs, params, options) { - var _this = this; - - return this.findAll(resourceConfig, params, options).then(function (items) { - var tasks = []; - DSUtils.forEach(items, function (item) { - tasks.push(_this.update(resourceConfig, item[resourceConfig.idAttribute], attrs, options)); - }); - return P.all(tasks); + }); + } + }, { + key: 'updateAll', + value: function updateAll(resourceConfig, attrs, params, options) { + var _this5 = this; + + return this.findAll(resourceConfig, params, options).then(function (items) { + var tasks = []; + DSUtils.forEach(items, function (item) { + tasks.push(_this5.update(resourceConfig, item[resourceConfig.idAttribute], attrs, options)); }); - } - }, - destroy: { - value: function destroy(resourceConfig, id, options) { - var _this = this; - - return new P(function (resolve, reject) { - _this.getRef(resourceConfig, options).child(id).remove(function (err) { + return DSUtils.Promise.all(tasks); + }); + } + }, { + key: 'destroy', + value: function destroy(resourceConfig, id, options) { + var _this6 = this; + + return createTask(function (resolve, reject) { + queueTask(function () { + _this6.getRef(resourceConfig, options).child(id).remove(function (err) { if (err) { reject(err); } else { @@ -247,27 +304,28 @@ return /******/ (function(modules) { // webpackBootstrap } }); }); - } - }, - destroyAll: { - value: function destroyAll(resourceConfig, params, options) { - var _this = this; - - return this.findAll(resourceConfig, params, options).then(function (items) { - var tasks = []; - DSUtils.forEach(items, function (item) { - tasks.push(_this.destroy(resourceConfig, item[resourceConfig.idAttribute], options)); - }); - return P.all(tasks); + }); + } + }, { + key: 'destroyAll', + value: function destroyAll(resourceConfig, params, options) { + var _this7 = this; + + return this.findAll(resourceConfig, params, options).then(function (items) { + var tasks = []; + DSUtils.forEach(items, function (item) { + tasks.push(_this7.destroy(resourceConfig, item[resourceConfig.idAttribute], options)); }); - } + return DSUtils.Promise.all(tasks); + }); } - }); + }]); return DSFirebaseAdapter; })(); - module.exports = DSFirebaseAdapter; + exports['default'] = DSFirebaseAdapter; + module.exports = exports['default']; /***/ }, /* 1 */ diff --git a/dist/js-data-firebase.min.js b/dist/js-data-firebase.min.js index 7870911..8330e30 100644 --- a/dist/js-data-firebase.min.js +++ b/dist/js-data-firebase.min.js @@ -1,6 +1,6 @@ /*! * js-data-firebase -* @version 1.1.1 - Homepage +* @version 2.0.0-beta.1 - Homepage * @author Jason Dobry * @copyright (c) 2014-2015 Jason Dobry * @license MIT @@ -8,5 +8,5 @@ * @overview Firebase adapter for js-data. */ -!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b(require("js-data"),require("firebase")):"function"==typeof define&&define.amd?define(["js-data","firebase"],b):"object"==typeof exports?exports.DSFirebaseAdapter=b(require("js-data"),require("firebase")):a.DSFirebaseAdapter=b(a.JSData,a.Firebase)}(this,function(a,b){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){var d=function(a){return a&&a.__esModule?a["default"]:a},e=function(){function a(a,b){for(var c in b){var d=b[c];d.configurable=!0,d.value&&(d.writable=!0)}Object.defineProperties(a,b)}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),f=function(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")},g=d(c(1)),h=d(c(2)),i=d(c(3)),j=d(c(4)),k=new g.DS,l=g.DSUtils,m=l.deepMixIn,n=l.removeCircular,o=l.Promise,p=l.forOwn,q=k.defaults.defaultFilter,r=function t(){f(this,t)};r.prototype.basePath="";var s=function(){function a(b){f(this,a),b=b||{},this.defaults=new r,m(this.defaults,b),this.ref=new h(b.basePath||this.defaults.basePath)}return e(a,{getRef:{value:function(a,b){return b=b||{},this.ref.child(b.endpoint||a.endpoint)}},find:{value:function(a,b,c){var d=this;return new o(function(e,f){return d.getRef(a,c).child(b).once("value",function(c){var d=c.val();d?(d[a.idAttribute]=d[a.idAttribute]||b,e(d)):f(new Error("Not Found!"))},f,d)})}},findAll:{value:function(a,b,c){var d=this;return new o(function(e,f){return d.getRef(a,c).once("value",function(d){var f=d.val();p(f,function(b,c){b[a.idAttribute]||(b[a.idAttribute]="/"+c)}),e(q.call(k,j(f),a.name,b,c))},f,d)})}},create:{value:function(a,b,c){var d=this,e=b[a.idAttribute];return l.isString(e)||l.isNumber(e)?this.update(a,e,b,c):new o(function(e,f){var g=d.getRef(a,c),h=g.push(n(i(b,a.relationFields||[])),function(b){if(b)return f(b);var c=h.toString().replace(g.toString(),"");h.child(a.idAttribute).set(c,function(a){a?f(a):h.once("value",function(a){try{e(a.val())}catch(b){f(b)}},f,d)})})})}},update:{value:function(a,b,c,d){var e=this;return c=n(i(c||{},a.relationFields||[])),new o(function(f,g){var h=e.getRef(a,d).child(b);h.once("value",function(b){try{!function(){var d=b.val()||{},e=void 0,i=void 0,j=void 0;if(a.relations)for(e=a.relationFields,i=[],j=0;e.length;j++)i.push(c[e[j]]),delete c[e[j]];if(m(d,c),a.relations)for(e=a.relationFields,j=0;e.length;j++)c[e[j]]=i.shift();h.set(d,function(a){a?g(a):f(d)})}()}catch(d){g(d)}},g,e)})}},updateAll:{value:function(a,b,c,d){var e=this;return this.findAll(a,c,d).then(function(c){var f=[];return l.forEach(c,function(c){f.push(e.update(a,c[a.idAttribute],b,d))}),o.all(f)})}},destroy:{value:function(a,b,c){var d=this;return new o(function(e,f){d.getRef(a,c).child(b).remove(function(a){a?f(a):e()})})}},destroyAll:{value:function(a,b,c){var d=this;return this.findAll(a,b,c).then(function(b){var e=[];return l.forEach(b,function(b){e.push(d.destroy(a,b[a.idAttribute],c))}),o.all(e)})}}}),a}();a.exports=s},function(b){b.exports=a},function(a){a.exports=b},function(a,b,c){function d(a){var b="string"!=typeof arguments[1]?arguments[1]:e(arguments,1),c={};for(var d in a)a.hasOwnProperty(d)&&!f(b,d)&&(c[d]=a[d]);return c}var e=c(5),f=c(6);a.exports=d},function(a,b,c){function d(a){var b=[];return e(a,function(a){b.push(a)}),b}var e=c(7);a.exports=d},function(a){function b(a,b,c){var d=a.length;b=null==b?0:0>b?Math.max(d+b,0):Math.min(b,d),c=null==c?d:0>c?Math.max(d+c,0):Math.min(c,d);for(var e=[];c>b;)e.push(a[b++]);return e}a.exports=b},function(a,b,c){function d(a,b){return-1!==e(a,b)}var e=c(8);a.exports=d},function(a,b,c){function d(a,b,c){f(a,function(d,f){return e(a,f)?b.call(c,a[f],f,a):void 0})}var e=c(9),f=c(10);a.exports=d},function(a){function b(a,b,c){if(c=c||0,null==a)return-1;for(var d=a.length,e=0>c?d+c:c;d>e;){if(a[e]===b)return e;e++}return-1}a.exports=b},function(a){function b(a,b){return Object.prototype.hasOwnProperty.call(a,b)}a.exports=b},function(a,b,c){function d(){h=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],g=!0;for(var a in{toString:null})g=!1}function e(a,b,c){var e,j=0;null==g&&d();for(e in a)if(f(b,a,e,c)===!1)break;if(g)for(var k=a.constructor,l=!!k&&a===k.prototype;(e=h[j++])&&("constructor"===e&&(l||!i(a,e))||a[e]===Object.prototype[e]||f(b,a,e,c)!==!1););}function f(a,b,c,d){return a.call(d,b[c],c,b)}var g,h,i=c(9);a.exports=e}])}); +!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b(require("js-data"),require("firebase")):"function"==typeof define&&define.amd?define(["js-data","firebase"],b):"object"==typeof exports?exports.DSFirebaseAdapter=b(require("js-data"),require("firebase")):a.DSFirebaseAdapter=b(a.JSData,a.Firebase)}(this,function(a,b){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){function d(a){z.push(a)}function e(){z.length&&!A&&(A=!0,z[0]())}function f(a){z.length?d(a):(d(a),e())}function g(a){return new t.Promise(a).then(function(a){return A=!1,z.shift(),setTimeout(e,0),a},function(a){return A=!1,z.shift(),setTimeout(e,0),t.Promise.reject(a)})}var h=function(a){return a&&a.__esModule?a:{"default":a}},i=function(){function a(a,b){for(var c=0;cb?Math.max(d+b,0):Math.min(b,d),c=null==c?d:0>c?Math.max(d+c,0):Math.min(c,d);for(var e=[];c>b;)e.push(a[b++]);return e}a.exports=d},function(a,b,c){function d(a,b){return-1!==e(a,b)}var e=c(8);a.exports=d},function(a,b,c){function d(a,b,c){f(a,function(d,f){return e(a,f)?b.call(c,a[f],f,a):void 0})}var e=c(9),f=c(10);a.exports=d},function(a,b,c){function d(a,b,c){if(c=c||0,null==a)return-1;for(var d=a.length,e=0>c?d+c:c;d>e;){if(a[e]===b)return e;e++}return-1}a.exports=d},function(a,b,c){function d(a,b){return Object.prototype.hasOwnProperty.call(a,b)}a.exports=d},function(a,b,c){function d(){h=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],g=!0;for(var a in{toString:null})g=!1}function e(a,b,c){var e,j=0;null==g&&d();for(e in a)if(f(b,a,e,c)===!1)break;if(g)for(var k=a.constructor,l=!!k&&a===k.prototype;(e=h[j++])&&("constructor"===e&&(l||!i(a,e))||a[e]===Object.prototype[e]||f(b,a,e,c)!==!1););}function f(a,b,c,d){return a.call(d,b[c],c,b)}var g,h,i=c(9);a.exports=e}])}); //# sourceMappingURL=js-data-firebase.min.map \ No newline at end of file diff --git a/dist/js-data-firebase.min.map b/dist/js-data-firebase.min.map index 4e8e96e..498e692 100644 --- a/dist/js-data-firebase.min.map +++ b/dist/js-data-firebase.min.map @@ -1 +1 @@ -{"version":3,"file":"js-data-firebase.min.js","sources":["js-data-firebase.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_1__","__WEBPACK_EXTERNAL_MODULE_2__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","_interopRequire","obj","__esModule","_createClass","defineProperties","target","props","key","prop","configurable","value","writable","Object","Constructor","protoProps","staticProps","prototype","_classCallCheck","instance","TypeError","JSData","Firebase","omit","values","emptyStore","DS","DSUtils","deepMixIn","removeCircular","P","Promise","forOwn","filter","defaults","defaultFilter","Defaults","basePath","DSFirebaseAdapter","options","ref","getRef","resourceConfig","child","endpoint","find","_this","resolve","reject","once","dataSnapshot","item","val","idAttribute","Error","findAll","params","data","name","create","attrs","isString","isNumber","update","resourceRef","itemRef","push","relationFields","err","_id","toString","replace","set","fields","undefined","removed","i","relations","length","shift","updateAll","then","items","tasks","forEach","all","destroy","remove","destroyAll","keys","arguments","slice","out","property","hasOwnProperty","contains","vals","arr","start","end","len","Math","max","min","result","indexOf","fn","thisObj","forIn","hasOwn","fromIndex","checkDontEnum","_dontEnums","_hasDontEnumBug","exec","ctor","constructor","isProto"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"js-data-firebase.min.js","sources":["js-data-firebase.js"],"names":["root","factory","exports","module","require","define","amd","this","__WEBPACK_EXTERNAL_MODULE_1__","__WEBPACK_EXTERNAL_MODULE_2__","modules","__webpack_require__","moduleId","installedModules","id","loaded","call","m","c","p","enqueue","task","queue","push","dequeue","length","taskInProcess","queueTask","createTask","fn","DSUtils","Promise","then","result","shift","setTimeout","err","reject","_interopRequireWildcard","obj","__esModule","default","_createClass","defineProperties","target","props","i","descriptor","enumerable","configurable","writable","Object","defineProperty","key","Constructor","protoProps","staticProps","prototype","_classCallCheck","instance","TypeError","value","_JSData","_JSData2","_Firebase","_Firebase2","_omit","_omit2","_values","_values2","emptyStore","DS","deepMixIn","removeCircular","forOwn","filter","defaults","defaultFilter","Defaults","basePath","DSFirebaseAdapter","options","ref","resourceConfig","child","endpoint","_this","resolve","getRef","once","dataSnapshot","item","val","idAttribute","Error","params","_this2","data","name","attrs","_this3","isString","isNumber","update","resourceRef","itemRef","relationFields","_id","toString","replace","set","_this4","fields","undefined","removed","relations","_this5","findAll","items","tasks","forEach","all","_this6","remove","_this7","destroy","omit","var_keys","keys","arguments","slice","out","property","hasOwnProperty","contains","values","vals","arr","start","end","len","Math","max","min","indexOf","thisObj","forIn","hasOwn","fromIndex","prop","checkDontEnum","_dontEnums","_hasDontEnumBug","exec","ctor","constructor","isProto"],"mappings":"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"} \ No newline at end of file diff --git a/examples/angular/index.html b/examples/angular/index.html index 1dc782d..3ce5783 100644 --- a/examples/angular/index.html +++ b/examples/angular/index.html @@ -9,10 +9,10 @@ - + - + src="https://github.com/js-data/js-data-firebase/releases/download/1.1.1/js-data-firebase.min.js"> + diff --git a/package.json b/package.json index 23d9417..0b8ce69 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "js-data-firebase", "description": "Firebase adapter for js-data.", - "version": "1.1.1", + "version": "2.0.0-beta.1", "homepage": "http://www.js-data.io/docs/dsfirebaseadapter", "repository": { "type": "git", @@ -28,31 +28,31 @@ ], "main": "./dist/js-data-firebase.js", "devDependencies": { - "babel-core": "4.7.16", - "babel-loader": "4.2.0", + "babel-core": "5.1.10", + "babel-loader": "5.0.0", "grunt": "0.4.5", "grunt-contrib-clean": "0.6.0", - "grunt-contrib-uglify": "0.8.0", + "grunt-contrib-uglify": "0.9.1", "grunt-contrib-watch": "0.6.1", "grunt-karma": "0.10.1", "grunt-karma-coveralls": "2.5.3", "grunt-webpack": "1.0.8", "jit-grunt": "0.9.1", - "jshint": "2.6.3", + "jshint": "2.7.0", "jshint-loader": "0.8.3", "karma": "0.12.31", "karma-chai": "0.1.0", - "karma-chrome-launcher": "0.1.7", - "karma-coverage": "0.2.7", + "karma-chrome-launcher": "0.1.8", + "karma-coverage": "0.3.1", "karma-firefox-launcher": "0.1.4", "karma-mocha": "0.1.10", "karma-phantomjs-launcher": "0.1.4", "karma-script-launcher": "0.1.0", "karma-sinon": "1.0.4", - "karma-spec-reporter": "0.0.16", - "time-grunt": "1.1.0", - "webpack": "1.7.3", - "webpack-dev-server": "1.7.0" + "karma-spec-reporter": "0.0.19", + "time-grunt": "1.1.1", + "webpack": "1.8.5", + "webpack-dev-server": "1.8.0" }, "scripts": { "test": "grunt test" @@ -61,7 +61,7 @@ "mout": "0.11.0" }, "peerDependencies": { - "js-data": ">= 1.5.7", + "js-data": ">=2.0.0-beta.3", "firebase": ">= 1.1.x" } } diff --git a/src/index.js b/src/index.js index fedaf22..a74a6b9 100644 --- a/src/index.js +++ b/src/index.js @@ -5,7 +5,7 @@ import values from 'mout/object/values'; let emptyStore = new JSData.DS(); let DSUtils = JSData.DSUtils; -let { deepMixIn, removeCircular, Promise: P, forOwn } = DSUtils; +let { deepMixIn, removeCircular, forOwn } = DSUtils; let filter = emptyStore.defaults.defaultFilter; class Defaults { @@ -14,6 +14,43 @@ class Defaults { Defaults.prototype.basePath = ''; +let queue = []; +let taskInProcess = false; + +function enqueue(task) { + queue.push(task); +} + +function dequeue() { + if (queue.length && !taskInProcess) { + taskInProcess = true; + queue[0](); + } +} + +function queueTask(task) { + if (!queue.length) { + enqueue(task); + dequeue(); + } else { + enqueue(task); + } +} + +function createTask(fn) { + return new DSUtils.Promise(fn).then(result => { + taskInProcess = false; + queue.shift(); + setTimeout(dequeue, 0); + return result; + }, err => { + taskInProcess = false; + queue.shift(); + setTimeout(dequeue, 0); + return DSUtils.Promise.reject(err); + }); +} + class DSFirebaseAdapter { constructor(options) { options = options || {}; @@ -28,30 +65,34 @@ class DSFirebaseAdapter { } find(resourceConfig, id, options) { - return new P((resolve, reject) => { - return this.getRef(resourceConfig, options).child(id).once('value', dataSnapshot => { - let item = dataSnapshot.val(); - if (!item) { - reject(new Error('Not Found!')); - } else { - item[resourceConfig.idAttribute] = item[resourceConfig.idAttribute] || id; - resolve(item); - } - }, reject, this); + return createTask((resolve, reject) => { + queueTask(() => { + this.getRef(resourceConfig, options).child(id).once('value', dataSnapshot => { + let item = dataSnapshot.val(); + if (!item) { + reject(new Error('Not Found!')); + } else { + item[resourceConfig.idAttribute] = item[resourceConfig.idAttribute] || id; + resolve(item); + } + }, reject, this); + }); }); } findAll(resourceConfig, params, options) { - return new P((resolve, reject) => { - return this.getRef(resourceConfig, options).once('value', dataSnapshot => { - let data = dataSnapshot.val(); - forOwn(data, (value, key) => { - if (!value[resourceConfig.idAttribute]) { - value[resourceConfig.idAttribute] = `/${key}`; - } - }); - resolve(filter.call(emptyStore, values(data), resourceConfig.name, params, options)); - }, reject, this); + return createTask((resolve, reject) => { + queueTask(() => { + this.getRef(resourceConfig, options).once('value', dataSnapshot => { + let data = dataSnapshot.val(); + forOwn(data, (value, key) => { + if (!value[resourceConfig.idAttribute]) { + value[resourceConfig.idAttribute] = `/${key}`; + } + }); + resolve(filter.call(emptyStore, values(data), resourceConfig.name, params, options)); + }, reject, this); + }); }); } @@ -60,66 +101,70 @@ class DSFirebaseAdapter { if (DSUtils.isString(id) || DSUtils.isNumber(id)) { return this.update(resourceConfig, id, attrs, options); } else { - return new P((resolve, reject) => { - let resourceRef = this.getRef(resourceConfig, options); - let itemRef = resourceRef.push(removeCircular(omit(attrs, resourceConfig.relationFields || [])), err => { - if (err) { - return reject(err); - } else { - let id = itemRef.toString().replace(resourceRef.toString(), ''); - itemRef.child(resourceConfig.idAttribute).set(id, err => { - if (err) { - reject(err); - } else { - itemRef.once('value', dataSnapshot => { - try { - resolve(dataSnapshot.val()); - } catch (err) { - reject(err); - } - }, reject, this); - } - }); - } + return createTask((resolve, reject) => { + queueTask(() => { + let resourceRef = this.getRef(resourceConfig, options); + var itemRef = resourceRef.push(removeCircular(omit(attrs, resourceConfig.relationFields || [])), err => { + if (err) { + return reject(err); + } else { + let id = itemRef.toString().replace(resourceRef.toString(), ''); + itemRef.child(resourceConfig.idAttribute).set(id, err => { + if (err) { + reject(err); + } else { + itemRef.once('value', dataSnapshot => { + try { + resolve(dataSnapshot.val()); + } catch (err) { + reject(err); + } + }, reject, this); + } + }); + } + }); }); }); } } update(resourceConfig, id, attrs, options) { - attrs = removeCircular(omit(attrs || {}, resourceConfig.relationFields || [])); - return new P((resolve, reject) => { - let itemRef = this.getRef(resourceConfig, options).child(id); - itemRef.once('value', dataSnapshot => { - try { - let item = dataSnapshot.val() || {}; - let fields, removed, i; - if (resourceConfig.relations) { - fields = resourceConfig.relationFields; - removed = []; - for (i = 0; fields.length; i++) { - removed.push(attrs[fields[i]]); - delete attrs[fields[i]]; + return createTask((resolve, reject) => { + queueTask(() => { + attrs = removeCircular(omit(attrs || {}, resourceConfig.relationFields || [])); + let itemRef = this.getRef(resourceConfig, options).child(id); + itemRef.once('value', dataSnapshot => { + try { + let item = dataSnapshot.val() || {}; + let fields, removed, i; + if (resourceConfig.relations) { + fields = resourceConfig.relationFields; + removed = []; + for (i = 0; fields.length; i++) { + removed.push(attrs[fields[i]]); + delete attrs[fields[i]]; + } } - } - deepMixIn(item, attrs); - if (resourceConfig.relations) { - fields = resourceConfig.relationFields; - for (i = 0; fields.length; i++) { - attrs[fields[i]] = removed.shift(); + deepMixIn(item, attrs); + if (resourceConfig.relations) { + fields = resourceConfig.relationFields; + for (i = 0; fields.length; i++) { + attrs[fields[i]] = removed.shift(); + } } + itemRef.set(item, err => { + if (err) { + reject(err); + } else { + resolve(item); + } + }); + } catch (err) { + reject(err); } - itemRef.set(item, err => { - if (err) { - reject(err); - } else { - resolve(item); - } - }); - } catch (err) { - reject(err); - } - }, reject, this); + }, reject, this); + }); }); } @@ -129,18 +174,20 @@ class DSFirebaseAdapter { DSUtils.forEach(items, item => { tasks.push(this.update(resourceConfig, item[resourceConfig.idAttribute], attrs, options)); }); - return P.all(tasks); + return DSUtils.Promise.all(tasks); }); } destroy(resourceConfig, id, options) { - return new P((resolve, reject) => { - this.getRef(resourceConfig, options).child(id).remove(err => { - if (err) { - reject(err); - } else { - resolve(); - } + return createTask((resolve, reject) => { + queueTask(() => { + this.getRef(resourceConfig, options).child(id).remove(err => { + if (err) { + reject(err); + } else { + resolve(); + } + }); }); }); } @@ -151,7 +198,7 @@ class DSFirebaseAdapter { DSUtils.forEach(items, item => { tasks.push(this.destroy(resourceConfig, item[resourceConfig.idAttribute], options)); }); - return P.all(tasks); + return DSUtils.Promise.all(tasks); }); } } From d9a05d2401afbadfb45d585d202f03f7b4406cee Mon Sep 17 00:00:00 2001 From: Jason Dobry Date: Sat, 27 Jun 2015 21:55:29 -0400 Subject: [PATCH 2/5] Stable Version 2.0.0-rc.1. --- CHANGELOG.md | 4 + bower.json | 2 +- dist/js-data-firebase.js | 176 ++++------------------------------ dist/js-data-firebase.min.js | 4 +- dist/js-data-firebase.min.map | 2 +- examples/angular/example.js | 27 +++++- examples/angular/index.html | 31 +++++- examples/react/example.js | 40 ++++++-- examples/react/index.html | 46 ++++++--- package.json | 33 ++++--- src/index.js | 11 +-- 11 files changed, 167 insertions(+), 209 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f0befb..53a605f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +##### 2.0.0-rc.1 - 27 June 2015 + +Stable Version 2.0.0-rc.1 + ##### 2.0.0-beta.1 - 18 April 2015 ###### Backwards compatible bug fixes diff --git a/bower.json b/bower.json index cd683b1..fc6943b 100644 --- a/bower.json +++ b/bower.json @@ -29,7 +29,7 @@ "karma.start.js" ], "dependencies": { - "js-data": ">=2.0.0-beta.3", + "js-data": "2.0.0-rc.1", "firebase": ">=1.1.x" } } diff --git a/dist/js-data-firebase.js b/dist/js-data-firebase.js index da2e355..25d8919 100644 --- a/dist/js-data-firebase.js +++ b/dist/js-data-firebase.js @@ -1,6 +1,6 @@ /*! * js-data-firebase - * @version 2.0.0-beta.1 - Homepage + * @version 2.0.0-rc.1 - Homepage * @author Jason Dobry * @copyright (c) 2014-2015 Jason Dobry * @license MIT @@ -63,34 +63,17 @@ return /******/ (function(modules) { // webpackBootstrap /* 0 */ /***/ function(module, exports, __webpack_require__) { - var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; - var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); - var _classCallCheck = function (instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }; - - Object.defineProperty(exports, '__esModule', { - value: true - }); - - var _JSData = __webpack_require__(1); - - var _JSData2 = _interopRequireWildcard(_JSData); - - var _Firebase = __webpack_require__(2); + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } - var _Firebase2 = _interopRequireWildcard(_Firebase); + var JSData = __webpack_require__(1); + var Firebase = __webpack_require__(2); + var values = __webpack_require__(3); - var _omit = __webpack_require__(3); - - var _omit2 = _interopRequireWildcard(_omit); - - var _values = __webpack_require__(4); - - var _values2 = _interopRequireWildcard(_values); - - var emptyStore = new _JSData2['default'].DS(); - var DSUtils = _JSData2['default'].DSUtils; + var emptyStore = new JSData.DS(); + var DSUtils = JSData.DSUtils; + var omit = DSUtils.omit; var deepMixIn = DSUtils.deepMixIn; var removeCircular = DSUtils.removeCircular; var forOwn = DSUtils.forOwn; @@ -147,7 +130,7 @@ return /******/ (function(modules) { // webpackBootstrap options = options || {}; this.defaults = new Defaults(); deepMixIn(this.defaults, options); - this.ref = new _Firebase2['default'](options.basePath || this.defaults.basePath); + this.ref = new Firebase(options.basePath || this.defaults.basePath); } _createClass(DSFirebaseAdapter, [{ @@ -189,7 +172,7 @@ return /******/ (function(modules) { // webpackBootstrap value[resourceConfig.idAttribute] = '/' + key; } }); - resolve(filter.call(emptyStore, _values2['default'](data), resourceConfig.name, params, options)); + resolve(filter.call(emptyStore, values(data), resourceConfig.name, params, options)); }, reject, _this2); }); }); @@ -206,7 +189,7 @@ return /******/ (function(modules) { // webpackBootstrap return createTask(function (resolve, reject) { queueTask(function () { var resourceRef = _this3.getRef(resourceConfig, options); - var itemRef = resourceRef.push(removeCircular(_omit2['default'](attrs, resourceConfig.relationFields || [])), function (err) { + var itemRef = resourceRef.push(removeCircular(omit(attrs, resourceConfig.relationFields || [])), function (err) { if (err) { return reject(err); } else { @@ -237,7 +220,7 @@ return /******/ (function(modules) { // webpackBootstrap return createTask(function (resolve, reject) { queueTask(function () { - attrs = removeCircular(_omit2['default'](attrs || {}, resourceConfig.relationFields || [])); + attrs = removeCircular(omit(attrs || {}, resourceConfig.relationFields || [])); var itemRef = _this4.getRef(resourceConfig, options).child(id); itemRef.once('value', function (dataSnapshot) { try { @@ -327,8 +310,7 @@ return /******/ (function(modules) { // webpackBootstrap return DSFirebaseAdapter; })(); - exports['default'] = DSFirebaseAdapter; - module.exports = exports['default']; + module.exports = DSFirebaseAdapter; /***/ }, /* 1 */ @@ -346,34 +328,7 @@ return /******/ (function(modules) { // webpackBootstrap /* 3 */ /***/ function(module, exports, __webpack_require__) { - var slice = __webpack_require__(5); - var contains = __webpack_require__(6); - - /** - * Return a copy of the object, filtered to only contain properties except the blacklisted keys. - */ - function omit(obj, var_keys){ - var keys = typeof arguments[1] !== 'string'? arguments[1] : slice(arguments, 1), - out = {}; - - for (var property in obj) { - if (obj.hasOwnProperty(property) && !contains(keys, property)) { - out[property] = obj[property]; - } - } - return out; - } - - module.exports = omit; - - - - -/***/ }, -/* 4 */ -/***/ function(module, exports, __webpack_require__) { - - var forOwn = __webpack_require__(7); + var forOwn = __webpack_require__(4); /** * Get object values @@ -392,68 +347,11 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 5 */ -/***/ function(module, exports, __webpack_require__) { - - - - /** - * Create slice of source array or array-like object - */ - function slice(arr, start, end){ - var len = arr.length; - - if (start == null) { - start = 0; - } else if (start < 0) { - start = Math.max(len + start, 0); - } else { - start = Math.min(start, len); - } - - if (end == null) { - end = len; - } else if (end < 0) { - end = Math.max(len + end, 0); - } else { - end = Math.min(end, len); - } - - var result = []; - while (start < end) { - result.push(arr[start++]); - } - - return result; - } - - module.exports = slice; - - - - -/***/ }, -/* 6 */ -/***/ function(module, exports, __webpack_require__) { - - var indexOf = __webpack_require__(10); - - /** - * If array contains values. - */ - function contains(arr, val) { - return indexOf(arr, val) !== -1; - } - module.exports = contains; - - - -/***/ }, -/* 7 */ +/* 4 */ /***/ function(module, exports, __webpack_require__) { - var hasOwn = __webpack_require__(8); - var forIn = __webpack_require__(9); + var hasOwn = __webpack_require__(5); + var forIn = __webpack_require__(6); /** * Similar to Array/forEach but works over object properties and fixes Don't @@ -474,7 +372,7 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 8 */ +/* 5 */ /***/ function(module, exports, __webpack_require__) { @@ -492,10 +390,10 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, -/* 9 */ +/* 6 */ /***/ function(module, exports, __webpack_require__) { - var hasOwn = __webpack_require__(8); + var hasOwn = __webpack_require__(5); var _hasDontEnumBug, _dontEnums; @@ -573,40 +471,6 @@ return /******/ (function(modules) { // webpackBootstrap -/***/ }, -/* 10 */ -/***/ function(module, exports, __webpack_require__) { - - - - /** - * Array.indexOf - */ - function indexOf(arr, item, fromIndex) { - fromIndex = fromIndex || 0; - if (arr == null) { - return -1; - } - - var len = arr.length, - i = fromIndex < 0 ? len + fromIndex : fromIndex; - while (i < len) { - // we iterate over sparse items since there is no way to make it - // work properly on IE 7-8. see #64 - if (arr[i] === item) { - return i; - } - - i++; - } - - return -1; - } - - module.exports = indexOf; - - - /***/ } /******/ ]) }); diff --git a/dist/js-data-firebase.min.js b/dist/js-data-firebase.min.js index 95a3981..557dcb9 100644 --- a/dist/js-data-firebase.min.js +++ b/dist/js-data-firebase.min.js @@ -1,6 +1,6 @@ /*! * js-data-firebase -* @version 2.0.0-beta.1 - Homepage +* @version 2.0.0-rc.1 - Homepage * @author Jason Dobry * @copyright (c) 2014-2015 Jason Dobry * @license MIT @@ -8,5 +8,5 @@ * @overview Firebase adapter for js-data. */ -!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b(require("js-data"),require("firebase")):"function"==typeof define&&define.amd?define(["js-data","firebase"],b):"object"==typeof exports?exports.DSFirebaseAdapter=b(require("js-data"),require("firebase")):a.DSFirebaseAdapter=b(a.JSData,a.Firebase)}(this,function(a,b){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){function d(a){z.push(a)}function e(){z.length&&!A&&(A=!0,z[0]())}function f(a){z.length?d(a):(d(a),e())}function g(a){return new t.Promise(a).then(function(a){return A=!1,z.shift(),setTimeout(e,0),a},function(a){return A=!1,z.shift(),setTimeout(e,0),t.Promise.reject(a)})}var h=function(a){return a&&a.__esModule?a:{"default":a}},i=function(){function a(a,b){for(var c=0;cb?Math.max(d+b,0):Math.min(b,d),c=null==c?d:0>c?Math.max(d+c,0):Math.min(c,d);for(var e=[];c>b;)e.push(a[b++]);return e}a.exports=d},function(a,b,c){function d(a,b){return-1!==e(a,b)}var e=c(10);a.exports=d},function(a,b,c){function d(a,b,c){f(a,function(d,f){return e(a,f)?b.call(c,a[f],f,a):void 0})}var e=c(8),f=c(9);a.exports=d},function(a,b,c){function d(a,b){return Object.prototype.hasOwnProperty.call(a,b)}a.exports=d},function(a,b,c){function d(){h=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],g=!0;for(var a in{toString:null})g=!1}function e(a,b,c){var e,j=0;null==g&&d();for(e in a)if(f(b,a,e,c)===!1)break;if(g)for(var k=a.constructor,l=!!k&&a===k.prototype;(e=h[j++])&&("constructor"===e&&(l||!i(a,e))||a[e]===Object.prototype[e]||f(b,a,e,c)!==!1););}function f(a,b,c,d){return a.call(d,b[c],c,b)}var g,h,i=c(8);a.exports=e},function(a,b,c){function d(a,b,c){if(c=c||0,null==a)return-1;for(var d=a.length,e=0>c?d+c:c;d>e;){if(a[e]===b)return e;e++}return-1}a.exports=d}])}); +!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b(require("js-data"),require("firebase")):"function"==typeof define&&define.amd?define(["js-data","firebase"],b):"object"==typeof exports?exports.DSFirebaseAdapter=b(require("js-data"),require("firebase")):a.DSFirebaseAdapter=b(a.JSData,a.Firebase)}(this,function(a,b){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){function d(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function e(a){u.push(a)}function f(){u.length&&!v&&(v=!0,u[0]())}function g(a){u.length?e(a):(e(a),f())}function h(a){return new n.Promise(a).then(function(a){return v=!1,u.shift(),setTimeout(f,0),a},function(a){return v=!1,u.shift(),setTimeout(f,0),n.Promise.reject(a)})}var i=function(){function a(a,b){for(var c=0;c - + - + src="https://github.com/js-data/js-data-firebase/releases/download/2.0.0-rc.1/js-data-firebase.min.js"> + @@ -64,7 +64,7 @@

Users

var basePath = 'https://js-data-firebase.firebaseio.com'; DSFirebaseAdapterProvider.defaults.basePath = basePath; }) - .run(function (DS, DSFirebaseAdapter) { + .run(function (DS, DSFirebaseAdapter, User) { // js-data-angular created a new store // automatically and registered it as DS. @@ -75,6 +75,29 @@

Users

DSFirebaseAdapter, { default: true } ); + + // Activate a mostly auto-sync with Firebase + // The only thing missing is auto-sync TO Firebase + // This will be easier with js-data 2.x, but right + // now you still have to do DS.update('user', 1, { foo: 'bar' }), etc. + angular.forEach(DS.definitions, function (Resource) { + var ref = DSFirebaseAdapter.ref.child(Resource.endpoint); + // Inject items into the store when they're added to Firebase + // Update items in the store when they're modified in Firebase + ref.on('child_changed', function (dataSnapshot) { + var data = dataSnapshot.val(); + if (data[Resource.idAttribute]) { + Resource.inject(data); + } + }); + // Eject items from the store when they're removed from Firebase + ref.on('child_removed', function (dataSnapshot) { + var data = dataSnapshot.val(); + if (data[Resource.idAttribute]) { + Resource.eject(data[Resource.idAttribute]); + } + }); + }); }) .factory('User', function (DS) { return DS.defineResource('user'); diff --git a/examples/react/example.js b/examples/react/example.js index c08ee08..5acdcaa 100644 --- a/examples/react/example.js +++ b/examples/react/example.js @@ -1,12 +1,9 @@ var store = new JSData.DS(); +var firebaseAdapter = new DSFirebaseAdapter({ + basePath: 'https://js-data-firebase.firebaseio.com' +}); -store.registerAdapter( - 'firebase', - new DSFirebaseAdapter({ - basePath: 'https://js-data-firebase.firebaseio.com' - }), - { default: true } -); +store.registerAdapter('firebase', firebaseAdapter, { default: true }); // Flux pattern var UserStore = store.defineResource({ @@ -19,6 +16,30 @@ var UserStore = store.defineResource({ } }); +// Activate a mostly auto-sync with Firebase +// The only thing missing is auto-sync TO Firebase +// This will be easier with js-data 2.x, but right +// now you still have to do store.update('user', 1, { foo: 'bar' }), etc. +for (var resourceName in store.definitions) { + var Resource = store.definitions[resourceName]; + var ref = firebaseAdapter.ref.child(Resource.endpoint); + // Inject items into the store when they're added to Firebase + // Update items in the store when they're modified in Firebase + ref.on('child_changed', function (dataSnapshot) { + var data = dataSnapshot.val(); + if (data[Resource.idAttribute]) { + Resource.inject(data); + } + }); + // Eject items from the store when they're removed from Firebase + ref.on('child_removed', function (dataSnapshot) { + var data = dataSnapshot.val(); + if (data[Resource.idAttribute]) { + Resource.eject(data[Resource.idAttribute]); + } + }); +}; + var UserItem = React.createClass({ remove: function () { UserStore.destroy(this.props.user.id); @@ -57,9 +78,12 @@ var UserApp = React.createClass({ UserStore.off('change', this.onChange); }, createUser: function (e) { + var _this = this; e.preventDefault(); UserStore.create({ - name: this.state.name + name: _this.state.name + }).then(function () { + _this.setState({ name: '' }); }); }, render: function () { diff --git a/examples/react/index.html b/examples/react/index.html index 6c99536..412e308 100644 --- a/examples/react/index.html +++ b/examples/react/index.html @@ -10,9 +10,8 @@ - - + + @@ -38,14 +37,11 @@

   var store = new JSData.DS();
+  var firebaseAdapter = new DSFirebaseAdapter({
+    basePath: 'https://js-data-firebase.firebaseio.com'
+  });
 
-  store.registerAdapter(
-    'firebase',
-    new DSFirebaseAdapter({
-      basePath: 'https://js-data-firebase.firebaseio.com'
-    }),
-    { default: true }
-  );
+  store.registerAdapter('firebase', firebaseAdapter, { default: true });
 
   // Flux pattern
   var UserStore = store.defineResource({
@@ -58,6 +54,30 @@ 
     }
   });
 
+  // Activate a mostly auto-sync with Firebase
+  // The only thing missing is auto-sync TO Firebase
+  // This will be easier with js-data 2.x, but right
+  // now you still have to do store.update('user', 1, { foo: 'bar' }), etc.
+  for (var resourceName in store.definitions) {
+    var Resource = store.definitions[resourceName];
+    var ref = firebaseAdapter.ref.child(Resource.endpoint);
+    // Inject items into the store when they're added to Firebase
+    // Update items in the store when they're modified in Firebase
+    ref.on('child_changed', function (dataSnapshot) {
+      var data = dataSnapshot.val();
+      if (data[Resource.idAttribute]) {
+        Resource.inject(data);
+      }
+    });
+    // Eject items from the store when they're removed from Firebase
+    ref.on('child_removed', function (dataSnapshot) {
+      var data = dataSnapshot.val();
+      if (data[Resource.idAttribute]) {
+        Resource.eject(data[Resource.idAttribute]);
+      }
+    });
+  });
+
   var UserItem = React.createClass({
     remove: function () {
       UserStore.destroy(this.props.user.id);
@@ -96,11 +116,13 @@ 
       UserStore.off('change', this.onChange);
     },
     createUser: function (e) {
+      var _this = this;
       e.preventDefault();
       UserStore.create({
-        name: this.state.name
+        name: _this.state.name
+      }).then(function () {
+        _this.setState({ name: '' });
       });
-      this.setState({ users: UserStore.getAll(), name: '' });
     },
     render: function () {
       var users = this.state.users;
diff --git a/package.json b/package.json
index 0b8ce69..c591b57 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "js-data-firebase",
   "description": "Firebase adapter for js-data.",
-  "version": "2.0.0-beta.1",
+  "version": "2.0.0-rc.1",
   "homepage": "http://www.js-data.io/docs/dsfirebaseadapter",
   "repository": {
     "type": "git",
@@ -28,31 +28,30 @@
   ],
   "main": "./dist/js-data-firebase.js",
   "devDependencies": {
-    "babel-core": "5.1.10",
-    "babel-loader": "5.0.0",
+    "babel-core": "5.6.15",
+    "babel-loader": "5.2.2",
     "grunt": "0.4.5",
     "grunt-contrib-clean": "0.6.0",
     "grunt-contrib-uglify": "0.9.1",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-karma": "0.10.1",
+    "grunt-karma": "0.11.1",
     "grunt-karma-coveralls": "2.5.3",
-    "grunt-webpack": "1.0.8",
+    "grunt-webpack": "1.0.10",
     "jit-grunt": "0.9.1",
-    "jshint": "2.7.0",
+    "jshint": "2.8.0",
     "jshint-loader": "0.8.3",
-    "karma": "0.12.31",
+    "karma": "0.12.37",
     "karma-chai": "0.1.0",
-    "karma-chrome-launcher": "0.1.8",
-    "karma-coverage": "0.3.1",
-    "karma-firefox-launcher": "0.1.4",
-    "karma-mocha": "0.1.10",
-    "karma-phantomjs-launcher": "0.1.4",
+    "karma-chrome-launcher": "0.2.0",
+    "karma-coverage": "0.4.2",
+    "karma-firefox-launcher": "0.1.6",
+    "karma-mocha": "0.2.0",
+    "karma-phantomjs-launcher": "0.2.0",
     "karma-script-launcher": "0.1.0",
     "karma-sinon": "1.0.4",
     "karma-spec-reporter": "0.0.19",
-    "time-grunt": "1.1.1",
-    "webpack": "1.8.5",
-    "webpack-dev-server": "1.8.0"
+    "time-grunt": "1.2.1",
+    "webpack-dev-server": "1.10.0"
   },
   "scripts": {
     "test": "grunt test"
@@ -61,7 +60,7 @@
     "mout": "0.11.0"
   },
   "peerDependencies": {
-    "js-data": ">=2.0.0-beta.3",
-    "firebase": ">= 1.1.x"
+    "js-data": "2.0.0-rc.1",
+    "firebase": ">=1.1.x"
   }
 }
diff --git a/src/index.js b/src/index.js
index d76fc3c..d2663f8 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1,11 +1,10 @@
-import JSData from 'js-data';
-import Firebase from 'firebase';
-import omit from 'mout/object/omit';
-import values from 'mout/object/values';
+let JSData = require('js-data');
+let Firebase = require('firebase');
+let values = require('mout/object/values');
 
 let emptyStore = new JSData.DS();
 let DSUtils = JSData.DSUtils;
-let { deepMixIn, removeCircular, forOwn  } = DSUtils;
+let { omit, deepMixIn, removeCircular, forOwn  } = DSUtils;
 let filter = emptyStore.defaults.defaultFilter;
 
 class Defaults {
@@ -206,4 +205,4 @@ class DSFirebaseAdapter {
   }
 }
 
-export default DSFirebaseAdapter;
+module.exports = DSFirebaseAdapter;

From 4c5320ba6cbf3b850f6093ae847aab2819fcab9b Mon Sep 17 00:00:00 2001
From: Jason Dobry 
Date: Sat, 27 Jun 2015 22:02:46 -0400
Subject: [PATCH 3/5] Example link change

---
 examples/react/index.html | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/examples/react/index.html b/examples/react/index.html
index 412e308..cdf839d 100644
--- a/examples/react/index.html
+++ b/examples/react/index.html
@@ -10,8 +10,8 @@
   
   
   
-  
-  
+  
+  
   
 
 

From d780390f48a8f71eaa4641d736e7c3bd16dd6850 Mon Sep 17 00:00:00 2001
From: Jason Dobry 
Date: Sat, 27 Jun 2015 22:03:15 -0400
Subject: [PATCH 4/5] link fix.

---
 examples/react/index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/examples/react/index.html b/examples/react/index.html
index cdf839d..0d972b7 100644
--- a/examples/react/index.html
+++ b/examples/react/index.html
@@ -11,7 +11,7 @@
   
   
   
-  
+  
   
 
 

From b5b557f1dd9355ef58556876f1583924b4436fa8 Mon Sep 17 00:00:00 2001
From: Jason Dobry 
Date: Thu, 2 Jul 2015 16:53:50 -0400
Subject: [PATCH 5/5] Stable Version 2.0.0

---
 CHANGELOG.md                 |  4 ++++
 README.md                    |  2 ++
 bower.json                   |  2 +-
 dist/js-data-firebase.js     |  2 +-
 dist/js-data-firebase.min.js |  2 +-
 package.json                 | 10 +++++-----
 6 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 53a605f..1e8ffc5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+##### 2.0.0 - 02 July 2015
+
+Stable Version 2.0.0
+
 ##### 2.0.0-rc.1 - 27 June 2015
 
 Stable Version 2.0.0-rc.1
diff --git a/README.md b/README.md
index a3e9f8c..b279ad4 100644
--- a/README.md
+++ b/README.md
@@ -47,6 +47,8 @@ store.registerAdapter('firebase', adapter, { default: true });
 [CHANGELOG.md](https://github.com/js-data/js-data-firebase/blob/master/CHANGELOG.md)
 
 ### Community
+- [Gitter Channel](https://gitter.im/js-data/js-data) - Better than IRC!
+- [Announcements](http://www.js-data.io/blog)
 - [Mailing List](https://groups.io/org/groupsio/jsdata) - Ask your questions!
 - [Issues](https://github.com/js-data/js-data-firebase/issues) - Found a bug? Feature request? Submit an issue!
 - [GitHub](https://github.com/js-data/js-data-firebase) - View the source code for js-data.
diff --git a/bower.json b/bower.json
index fc6943b..aaa797e 100644
--- a/bower.json
+++ b/bower.json
@@ -29,7 +29,7 @@
     "karma.start.js"
   ],
   "dependencies": {
-    "js-data": "2.0.0-rc.1",
+    "js-data": ">=2.0.0",
     "firebase": ">=1.1.x"
   }
 }
diff --git a/dist/js-data-firebase.js b/dist/js-data-firebase.js
index 25d8919..c03da66 100644
--- a/dist/js-data-firebase.js
+++ b/dist/js-data-firebase.js
@@ -1,6 +1,6 @@
 /*!
  * js-data-firebase
- * @version 2.0.0-rc.1 - Homepage 
+ * @version 2.0.0 - Homepage 
  * @author Jason Dobry 
  * @copyright (c) 2014-2015 Jason Dobry 
  * @license MIT 
diff --git a/dist/js-data-firebase.min.js b/dist/js-data-firebase.min.js
index 557dcb9..d4144f3 100644
--- a/dist/js-data-firebase.min.js
+++ b/dist/js-data-firebase.min.js
@@ -1,6 +1,6 @@
 /*!
 * js-data-firebase
-* @version 2.0.0-rc.1 - Homepage 
+* @version 2.0.0 - Homepage 
 * @author Jason Dobry 
 * @copyright (c) 2014-2015 Jason Dobry
 * @license MIT 
diff --git a/package.json b/package.json
index c591b57..190f536 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "js-data-firebase",
   "description": "Firebase adapter for js-data.",
-  "version": "2.0.0-rc.1",
+  "version": "2.0.0",
   "homepage": "http://www.js-data.io/docs/dsfirebaseadapter",
   "repository": {
     "type": "git",
@@ -34,9 +34,9 @@
     "grunt-contrib-clean": "0.6.0",
     "grunt-contrib-uglify": "0.9.1",
     "grunt-contrib-watch": "0.6.1",
-    "grunt-karma": "0.11.1",
+    "grunt-karma": "0.11.2",
     "grunt-karma-coveralls": "2.5.3",
-    "grunt-webpack": "1.0.10",
+    "grunt-webpack": "1.0.11",
     "jit-grunt": "0.9.1",
     "jshint": "2.8.0",
     "jshint-loader": "0.8.3",
@@ -51,7 +51,7 @@
     "karma-sinon": "1.0.4",
     "karma-spec-reporter": "0.0.19",
     "time-grunt": "1.2.1",
-    "webpack-dev-server": "1.10.0"
+    "webpack-dev-server": "1.10.1"
   },
   "scripts": {
     "test": "grunt test"
@@ -60,7 +60,7 @@
     "mout": "0.11.0"
   },
   "peerDependencies": {
-    "js-data": "2.0.0-rc.1",
+    "js-data": ">=2.0.0",
     "firebase": ">=1.1.x"
   }
 }