delorean.js
Advanced tools
Comparing version 0.6.0 to 0.6.1
{ | ||
"name": "delorean.js", | ||
"version": "0.6.0", | ||
"version": "0.6.1", | ||
"homepage": "http://deloreanjs.com", | ||
@@ -5,0 +5,0 @@ "authors": [ |
@@ -1,2 +0,2 @@ | ||
/*! delorean.js - v0.5.0-18 - 2014-09-01 */ | ||
/*! delorean.js - v0.6.0 - 2014-09-03 */ | ||
(function (DeLorean) { | ||
@@ -16,12 +16,7 @@ 'use strict'; | ||
function __argsShift(args, from) { | ||
return Array.prototype.slice.call(args, from); | ||
} | ||
function __findDispatcher(view) { | ||
if (!view.props.dispatcher) { | ||
return __findDispatcher(view._owner); | ||
} else { | ||
return view.props.dispatcher; | ||
} | ||
return view.props.dispatcher; | ||
} | ||
@@ -31,2 +26,13 @@ | ||
Dispatcher = (function () { | ||
var __rollbackListener = function (stores) { | ||
var __listener = function () { | ||
for (var i in stores) { | ||
stores[i].listener.emit('__rollback'); | ||
} | ||
}; | ||
for (var j in stores) { | ||
stores[j].listener.on('rollback', __listener); | ||
} | ||
}; | ||
function Dispatcher(stores) { | ||
@@ -36,2 +42,5 @@ var self = this; | ||
this.stores = stores; | ||
__rollbackListener(Object.keys(stores).map(function (key) { | ||
return stores[key]; | ||
})); | ||
} | ||
@@ -62,3 +71,3 @@ | ||
Dispatcher.prototype.waitFor = function (stores) { | ||
var self = this, promises; | ||
var self = this, promises, __rollbackListener; | ||
promises = (function () { | ||
@@ -98,2 +107,6 @@ var __promises = [], __promiseGenerator, promise; | ||
Dispatcher.prototype.emit = function () { | ||
return this.listener.emit.apply(this.listener, arguments); | ||
}; | ||
return Dispatcher; | ||
@@ -105,3 +118,3 @@ }()); | ||
function Store(store) { | ||
function Store(store, args) { | ||
if (typeof store !== 'object') { | ||
@@ -115,3 +128,2 @@ throw 'Stores should be defined by passing the definition to the constructor'; | ||
if (typeof store.initialize === 'function') { | ||
var args = __argsShift(arguments, 1); | ||
store.initialize.apply(this.store, args); | ||
@@ -125,2 +137,5 @@ } | ||
this.store.emit = this.listener.emit.bind(this.listener); | ||
this.store.emitChange = this.listener.emit.bind(this.listener, 'change'); | ||
this.store.emitRollback = this.listener.emit.bind(this.listener, 'rollback'); | ||
this.store.rollback = this.listener.on.bind(this.listener, '__rollback'); | ||
this.store.listenChanges = this.listenChanges.bind(this); | ||
@@ -169,3 +184,3 @@ | ||
return function () { | ||
return new Store(factoryDefinition); | ||
return new Store(factoryDefinition, arguments); | ||
}; | ||
@@ -172,0 +187,0 @@ }, |
@@ -1,2 +0,2 @@ | ||
!function(DeLorean){"use strict";function a(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function b(a){return"action:"+a}function c(a,b){return Array.prototype.slice.call(a,b)}function d(a){return a.props.dispatcher?a.props.dispatcher:d(a._owner)}var Dispatcher,Store;Dispatcher=function(){function Dispatcher(a){this.listener=new DeLorean.EventEmitter,this.stores=a}return Dispatcher.prototype.dispatch=function(a,b){var c,d,e=this;c=function(){var a,b=[];for(var c in e.stores){if(a=e.stores[c],!a instanceof Store)throw"Given store is not a store instance";b.push(a)}return b}(),d=this.waitFor(c);for(var f in e.stores)e.stores[f].dispatchAction(a,b);return d},Dispatcher.prototype.waitFor=function(a){var b,c=this;return b=function(){var b,c,d=[];b=function(a){return new DeLorean.Promise(function(b){a.listener.once("change",b)})};for(var e in a)c=b(a[e]),d.push(c);return d}(),DeLorean.Promise.all(b).then(function(){c.listener.emit("change:all")})},Dispatcher.prototype.registerAction=function(a,b){if("function"!=typeof b)throw"Action callback should be a function.";this[a]=b.bind(this.stores)},Dispatcher.prototype.on=function(){return this.listener.on.apply(this.listener,arguments)},Dispatcher.prototype.off=function(){return this.listener.removeListener.apply(this.listener,arguments)},Dispatcher}(),Store=function(){function Store(a){if("object"!=typeof a)throw"Stores should be defined by passing the definition to the constructor";if(this.listener=new DeLorean.EventEmitter,this.store=a,this.bindActions(),"function"==typeof a.initialize){var b=c(arguments,1);a.initialize.apply(this.store,b)}}return Store.prototype.bindActions=function(){var c;this.store.emit=this.listener.emit.bind(this.listener),this.store.listenChanges=this.listenChanges.bind(this);for(var d in this.store.actions)if(a(this.store.actions,d)){if(c=this.store.actions[d],"function"!=typeof this.store[c])throw"Callback should be a method!";this.listener.on(b(d),this.store[c].bind(this.store))}},Store.prototype.dispatchAction=function(a,c){this.listener.emit(b(a),c)},Store.prototype.onChange=function(a){this.listener.on("change",a)},Store.prototype.listenChanges=function(a){var b,c=this;return Object.observe?(b=Array.isArray(a)?Array.observe:Object.observe,void b(a,function(){c.listener.emit("change")})):void console.error("Store#listenChanges method uses Object.observe, you should fire changes manually.")},Store}(),DeLorean.Flux={createStore:function(a){return function(){return new Store(a)}},createDispatcher:function(b){var c,d,e;"function"==typeof b.getStores&&(c=b.getStores()),d=new Dispatcher(c||{});for(var f in b)a(b,f)&&"getStores"!==f&&(e=b[f],d.registerAction(f,e.bind(d)));return d},define:function(a,b){DeLorean[a]=b}},DeLorean.Dispatcher=Dispatcher,DeLorean.Store=Store,DeLorean.Flux.mixins={storeListener:{componentDidMount:function(){var b,c,d=this;c=function(a,b){return function(){var c;d.storeDidChange&&d.storeDidChange(b),"function"==typeof a.store.getState&&(c=a.store.getState(),d.state.stores[b]=c,d.forceUpdate())}};for(var e in this.stores)a(this.stores,e)&&(b=this.stores[e],b.onChange(c(b,e)))},getInitialState:function(){var b,c=this;this.dispatcher=d(this),this.storesDidChange&&this.dispatcher.on("change:all",function(){c.storesDidChange()}),this.stores=this.dispatcher.stores,b={stores:{}};for(var e in this.stores)a(this.stores,e)&&this.stores[e]&&this.stores[e].store&&this.stores[e].store.getState&&(b.stores[e]=this.stores[e].store.getState());return b}}},"undefined"!=typeof module&&"undefined"!=typeof module.exports?(DeLorean.Flux.define("EventEmitter",require("events").EventEmitter),DeLorean.Flux.define("Promise",require("es6-promise").Promise),module.exports=DeLorean):"function"==typeof define&&define.amd?define([],function(){return DeLorean}):window.DeLorean=DeLorean}({}),function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";var d=a("./promise/promise").Promise,e=a("./promise/polyfill").polyfill;c.Promise=d,c.polyfill=e},{"./promise/polyfill":5,"./promise/promise":6}],2:[function(a,b,c){"use strict";function d(a){var b=this;if(!e(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){e(a,b)}}function e(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;j<a.length;j++)g=a[j],g&&f(g.then)?g.then(d(j),c):e(j,g)})}var e=a("./utils").isArray,f=a("./utils").isFunction;c.all=d},{"./utils":10}],3:[function(a,b,c){(function(a,b){"use strict";function d(){return function(){a.nextTick(g)}}function e(){var a=0,b=new k(g),c=document.createTextNode("");return b.observe(c,{characterData:!0}),function(){c.data=a=++a%2}}function f(){return function(){l.setTimeout(g,1)}}function g(){for(var a=0;a<m.length;a++){var b=m[a],c=b[0],d=b[1];c(d)}m=[]}function h(a,b){var c=m.push([a,b]);1===c&&i()}var i,j="undefined"!=typeof window?window:{},k=j.MutationObserver||j.WebKitMutationObserver,l="undefined"!=typeof b?b:void 0===this?window:this,m=[];i="undefined"!=typeof a&&"[object process]"==={}.toString.call(a)?d():k?e():f(),c.asap=h}).call(this,a("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:12}],4:[function(a,b,c){"use strict";function d(a,b){return 2!==arguments.length?e[a]:void(e[a]=b)}var e={instrument:!1};c.config=e,c.configure=d},{}],5:[function(a,b,c){(function(b){"use strict";function d(){var a;a="undefined"!=typeof b?b:"undefined"!=typeof window&&window.document?window:self;var c="Promise"in a&&"resolve"in a.Promise&&"reject"in a.Promise&&"all"in a.Promise&&"race"in a.Promise&&function(){var b;return new a.Promise(function(a){b=a}),f(b)}();c||(a.Promise=e)}var e=a("./promise").Promise,f=a("./utils").isFunction;c.polyfill=d}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./promise":6,"./utils":10}],6:[function(a,b,c){"use strict";function d(a){if(!q(a))throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(!(this instanceof d))throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this._subscribers=[],e(a,this)}function e(a,b){function c(a){j(b,a)}function d(a){l(b,a)}try{a(c,d)}catch(e){d(e)}}function f(a,b,c,d){var e,f,g,h,k=q(c);if(k)try{e=c(d),g=!0}catch(m){h=!0,f=m}else e=d,g=!0;i(b,e)||(k&&g?j(b,e):h?l(b,f):a===y?j(b,e):a===z&&l(b,e))}function g(a,b,c,d){var e=a._subscribers,f=e.length;e[f]=b,e[f+y]=c,e[f+z]=d}function h(a,b){for(var c,d,e=a._subscribers,g=a._detail,h=0;h<e.length;h+=3)c=e[h],d=e[h+b],f(b,c,d,g);a._subscribers=null}function i(a,b){var c,d=null;try{if(a===b)throw new TypeError("A promises callback cannot return that same promise.");if(p(b)&&(d=b.then,q(d)))return d.call(b,function(d){return c?!0:(c=!0,void(b!==d?j(a,d):k(a,d)))},function(b){return c?!0:(c=!0,void l(a,b))}),!0}catch(e){return c?!0:(l(a,e),!0)}return!1}function j(a,b){a===b?k(a,b):i(a,b)||k(a,b)}function k(a,b){a._state===w&&(a._state=x,a._detail=b,o.async(m,a))}function l(a,b){a._state===w&&(a._state=x,a._detail=b,o.async(n,a))}function m(a){h(a,a._state=y)}function n(a){h(a,a._state=z)}var o=a("./config").config,p=(a("./config").configure,a("./utils").objectOrFunction),q=a("./utils").isFunction,r=(a("./utils").now,a("./all").all),s=a("./race").race,t=a("./resolve").resolve,u=a("./reject").reject,v=a("./asap").asap;o.async=v;var w=void 0,x=0,y=1,z=2;d.prototype={constructor:d,_state:void 0,_detail:void 0,_subscribers:void 0,then:function(a,b){var c=this,d=new this.constructor(function(){});if(this._state){var e=arguments;o.async(function(){f(c._state,d,e[c._state-1],c._detail)})}else g(this,d,a,b);return d},"catch":function(a){return this.then(null,a)}},d.all=r,d.race=s,d.resolve=t,d.reject=u,c.Promise=d},{"./all":2,"./asap":3,"./config":4,"./race":7,"./reject":8,"./resolve":9,"./utils":10}],7:[function(a,b,c){"use strict";function d(a){var b=this;if(!e(a))throw new TypeError("You must pass an array to race.");return new b(function(b,c){for(var d,e=0;e<a.length;e++)d=a[e],d&&"function"==typeof d.then?d.then(b,c):b(d)})}var e=a("./utils").isArray;c.race=d},{"./utils":10}],8:[function(a,b,c){"use strict";function d(a){var b=this;return new b(function(b,c){c(a)})}c.reject=d},{}],9:[function(a,b,c){"use strict";function d(a){if(a&&"object"==typeof a&&a.constructor===this)return a;var b=this;return new b(function(b){b(a)})}c.resolve=d},{}],10:[function(a,b,c){"use strict";function d(a){return e(a)||"object"==typeof a&&null!==a}function e(a){return"function"==typeof a}function f(a){return"[object Array]"===Object.prototype.toString.call(a)}var g=Date.now||function(){return(new Date).getTime()};c.objectOrFunction=d,c.isFunction=e,c.isArray=f,c.now=g},{}],11:[function(a,b){function c(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function d(a){return"function"==typeof a}function e(a){return"number"==typeof a}function f(a){return"object"==typeof a&&null!==a}function g(a){return void 0===a}b.exports=c,c.EventEmitter=c,c.prototype._events=void 0,c.prototype._maxListeners=void 0,c.defaultMaxListeners=10,c.prototype.setMaxListeners=function(a){if(!e(a)||0>a||isNaN(a))throw TypeError("n must be a positive number");return this._maxListeners=a,this},c.prototype.emit=function(a){var b,c,e,h,i,j;if(this._events||(this._events={}),"error"===a&&(!this._events.error||f(this._events.error)&&!this._events.error.length))throw b=arguments[1],b instanceof Error?b:TypeError('Uncaught, unspecified "error" event.');if(c=this._events[a],g(c))return!1;if(d(c))switch(arguments.length){case 1:c.call(this);break;case 2:c.call(this,arguments[1]);break;case 3:c.call(this,arguments[1],arguments[2]);break;default:for(e=arguments.length,h=new Array(e-1),i=1;e>i;i++)h[i-1]=arguments[i];c.apply(this,h)}else if(f(c)){for(e=arguments.length,h=new Array(e-1),i=1;e>i;i++)h[i-1]=arguments[i];for(j=c.slice(),e=j.length,i=0;e>i;i++)j[i].apply(this,h)}return!0},c.prototype.addListener=function(a,b){var e;if(!d(b))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",a,d(b.listener)?b.listener:b),this._events[a]?f(this._events[a])?this._events[a].push(b):this._events[a]=[this._events[a],b]:this._events[a]=b,f(this._events[a])&&!this._events[a].warned){var e;e=g(this._maxListeners)?c.defaultMaxListeners:this._maxListeners,e&&e>0&&this._events[a].length>e&&(this._events[a].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[a].length),"function"==typeof console.trace&&console.trace())}return this},c.prototype.on=c.prototype.addListener,c.prototype.once=function(a,b){function c(){this.removeListener(a,c),e||(e=!0,b.apply(this,arguments))}if(!d(b))throw TypeError("listener must be a function");var e=!1;return c.listener=b,this.on(a,c),this},c.prototype.removeListener=function(a,b){var c,e,g,h;if(!d(b))throw TypeError("listener must be a function");if(!this._events||!this._events[a])return this;if(c=this._events[a],g=c.length,e=-1,c===b||d(c.listener)&&c.listener===b)delete this._events[a],this._events.removeListener&&this.emit("removeListener",a,b);else if(f(c)){for(h=g;h-->0;)if(c[h]===b||c[h].listener&&c[h].listener===b){e=h;break}if(0>e)return this;1===c.length?(c.length=0,delete this._events[a]):c.splice(e,1),this._events.removeListener&&this.emit("removeListener",a,b)}return this},c.prototype.removeAllListeners=function(a){var b,c;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[a]&&delete this._events[a],this;if(0===arguments.length){for(b in this._events)"removeListener"!==b&&this.removeAllListeners(b);return this.removeAllListeners("removeListener"),this._events={},this}if(c=this._events[a],d(c))this.removeListener(a,c);else for(;c.length;)this.removeListener(a,c[c.length-1]);return delete this._events[a],this},c.prototype.listeners=function(a){var b;return b=this._events&&this._events[a]?d(this._events[a])?[this._events[a]]:this._events[a].slice():[]},c.listenerCount=function(a,b){var c;return c=a._events&&a._events[b]?d(a._events[b])?1:a._events[b].length:0}},{}],12:[function(a,b){function c(){}var d=b.exports={};d.nextTick=function(){var a="undefined"!=typeof window&&window.setImmediate,b="undefined"!=typeof window&&window.postMessage&&window.addEventListener;if(a)return function(a){return window.setImmediate(a)};if(b){var c=[];return window.addEventListener("message",function(a){var b=a.source;if((b===window||null===b)&&"process-tick"===a.data&&(a.stopPropagation(),c.length>0)){var d=c.shift();d()}},!0),function(a){c.push(a),window.postMessage("process-tick","*")}}return function(a){setTimeout(a,0)}}(),d.title="browser",d.browser=!0,d.env={},d.argv=[],d.on=c,d.addListener=c,d.once=c,d.off=c,d.removeListener=c,d.removeAllListeners=c,d.emit=c,d.binding=function(){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(){throw new Error("process.chdir is not supported")}},{}],13:[function(a){DeLorean.Flux.define("EventEmitter",a("events").EventEmitter),DeLorean.Flux.define("Promise",a("es6-promise").Promise)},{"es6-promise":1,events:11}]},{},[13]); | ||
!function(DeLorean){"use strict";function a(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function b(a){return"action:"+a}function c(a){return a.props.dispatcher?a.props.dispatcher:c(a._owner)}var Dispatcher,Store;Dispatcher=function(){function Dispatcher(b){this.listener=new DeLorean.EventEmitter,this.stores=b,a(Object.keys(b).map(function(a){return b[a]}))}var a=function(a){var b=function(){for(var b in a)a[b].listener.emit("__rollback")};for(var c in a)a[c].listener.on("rollback",b)};return Dispatcher.prototype.dispatch=function(a,b){var c,d,e=this;c=function(){var a,b=[];for(var c in e.stores){if(a=e.stores[c],!a instanceof Store)throw"Given store is not a store instance";b.push(a)}return b}(),d=this.waitFor(c);for(var f in e.stores)e.stores[f].dispatchAction(a,b);return d},Dispatcher.prototype.waitFor=function(a){var b,c=this;return b=function(){var b,c,d=[];b=function(a){return new DeLorean.Promise(function(b){a.listener.once("change",b)})};for(var e in a)c=b(a[e]),d.push(c);return d}(),DeLorean.Promise.all(b).then(function(){c.listener.emit("change:all")})},Dispatcher.prototype.registerAction=function(a,b){if("function"!=typeof b)throw"Action callback should be a function.";this[a]=b.bind(this.stores)},Dispatcher.prototype.on=function(){return this.listener.on.apply(this.listener,arguments)},Dispatcher.prototype.off=function(){return this.listener.removeListener.apply(this.listener,arguments)},Dispatcher.prototype.emit=function(){return this.listener.emit.apply(this.listener,arguments)},Dispatcher}(),Store=function(){function Store(a,b){if("object"!=typeof a)throw"Stores should be defined by passing the definition to the constructor";this.listener=new DeLorean.EventEmitter,this.store=a,this.bindActions(),"function"==typeof a.initialize&&a.initialize.apply(this.store,b)}return Store.prototype.bindActions=function(){var c;this.store.emit=this.listener.emit.bind(this.listener),this.store.emitChange=this.listener.emit.bind(this.listener,"change"),this.store.emitRollback=this.listener.emit.bind(this.listener,"rollback"),this.store.rollback=this.listener.on.bind(this.listener,"__rollback"),this.store.listenChanges=this.listenChanges.bind(this);for(var d in this.store.actions)if(a(this.store.actions,d)){if(c=this.store.actions[d],"function"!=typeof this.store[c])throw"Callback should be a method!";this.listener.on(b(d),this.store[c].bind(this.store))}},Store.prototype.dispatchAction=function(a,c){this.listener.emit(b(a),c)},Store.prototype.onChange=function(a){this.listener.on("change",a)},Store.prototype.listenChanges=function(a){var b,c=this;return Object.observe?(b=Array.isArray(a)?Array.observe:Object.observe,void b(a,function(){c.listener.emit("change")})):void console.error("Store#listenChanges method uses Object.observe, you should fire changes manually.")},Store}(),DeLorean.Flux={createStore:function(a){return function(){return new Store(a,arguments)}},createDispatcher:function(b){var c,d,e;"function"==typeof b.getStores&&(c=b.getStores()),d=new Dispatcher(c||{});for(var f in b)a(b,f)&&"getStores"!==f&&(e=b[f],d.registerAction(f,e.bind(d)));return d},define:function(a,b){DeLorean[a]=b}},DeLorean.Dispatcher=Dispatcher,DeLorean.Store=Store,DeLorean.Flux.mixins={storeListener:{componentDidMount:function(){var b,c,d=this;c=function(a,b){return function(){var c;d.storeDidChange&&d.storeDidChange(b),"function"==typeof a.store.getState&&(c=a.store.getState(),d.state.stores[b]=c,d.forceUpdate())}};for(var e in this.stores)a(this.stores,e)&&(b=this.stores[e],b.onChange(c(b,e)))},getInitialState:function(){var b,d=this;this.dispatcher=c(this),this.storesDidChange&&this.dispatcher.on("change:all",function(){d.storesDidChange()}),this.stores=this.dispatcher.stores,b={stores:{}};for(var e in this.stores)a(this.stores,e)&&this.stores[e]&&this.stores[e].store&&this.stores[e].store.getState&&(b.stores[e]=this.stores[e].store.getState());return b}}},"undefined"!=typeof module&&"undefined"!=typeof module.exports?(DeLorean.Flux.define("EventEmitter",require("events").EventEmitter),DeLorean.Flux.define("Promise",require("es6-promise").Promise),module.exports=DeLorean):"function"==typeof define&&define.amd?define([],function(){return DeLorean}):window.DeLorean=DeLorean}({}),function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c?c:a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";var d=a("./promise/promise").Promise,e=a("./promise/polyfill").polyfill;c.Promise=d,c.polyfill=e},{"./promise/polyfill":5,"./promise/promise":6}],2:[function(a,b,c){"use strict";function d(a){var b=this;if(!e(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){e(a,b)}}function e(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;j<a.length;j++)g=a[j],g&&f(g.then)?g.then(d(j),c):e(j,g)})}var e=a("./utils").isArray,f=a("./utils").isFunction;c.all=d},{"./utils":10}],3:[function(a,b,c){(function(a,b){"use strict";function d(){return function(){a.nextTick(g)}}function e(){var a=0,b=new k(g),c=document.createTextNode("");return b.observe(c,{characterData:!0}),function(){c.data=a=++a%2}}function f(){return function(){l.setTimeout(g,1)}}function g(){for(var a=0;a<m.length;a++){var b=m[a],c=b[0],d=b[1];c(d)}m=[]}function h(a,b){var c=m.push([a,b]);1===c&&i()}var i,j="undefined"!=typeof window?window:{},k=j.MutationObserver||j.WebKitMutationObserver,l="undefined"!=typeof b?b:void 0===this?window:this,m=[];i="undefined"!=typeof a&&"[object process]"==={}.toString.call(a)?d():k?e():f(),c.asap=h}).call(this,a("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:12}],4:[function(a,b,c){"use strict";function d(a,b){return 2!==arguments.length?e[a]:void(e[a]=b)}var e={instrument:!1};c.config=e,c.configure=d},{}],5:[function(a,b,c){(function(b){"use strict";function d(){var a;a="undefined"!=typeof b?b:"undefined"!=typeof window&&window.document?window:self;var c="Promise"in a&&"resolve"in a.Promise&&"reject"in a.Promise&&"all"in a.Promise&&"race"in a.Promise&&function(){var b;return new a.Promise(function(a){b=a}),f(b)}();c||(a.Promise=e)}var e=a("./promise").Promise,f=a("./utils").isFunction;c.polyfill=d}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./promise":6,"./utils":10}],6:[function(a,b,c){"use strict";function d(a){if(!q(a))throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(!(this instanceof d))throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this._subscribers=[],e(a,this)}function e(a,b){function c(a){j(b,a)}function d(a){l(b,a)}try{a(c,d)}catch(e){d(e)}}function f(a,b,c,d){var e,f,g,h,k=q(c);if(k)try{e=c(d),g=!0}catch(m){h=!0,f=m}else e=d,g=!0;i(b,e)||(k&&g?j(b,e):h?l(b,f):a===y?j(b,e):a===z&&l(b,e))}function g(a,b,c,d){var e=a._subscribers,f=e.length;e[f]=b,e[f+y]=c,e[f+z]=d}function h(a,b){for(var c,d,e=a._subscribers,g=a._detail,h=0;h<e.length;h+=3)c=e[h],d=e[h+b],f(b,c,d,g);a._subscribers=null}function i(a,b){var c,d=null;try{if(a===b)throw new TypeError("A promises callback cannot return that same promise.");if(p(b)&&(d=b.then,q(d)))return d.call(b,function(d){return c?!0:(c=!0,void(b!==d?j(a,d):k(a,d)))},function(b){return c?!0:(c=!0,void l(a,b))}),!0}catch(e){return c?!0:(l(a,e),!0)}return!1}function j(a,b){a===b?k(a,b):i(a,b)||k(a,b)}function k(a,b){a._state===w&&(a._state=x,a._detail=b,o.async(m,a))}function l(a,b){a._state===w&&(a._state=x,a._detail=b,o.async(n,a))}function m(a){h(a,a._state=y)}function n(a){h(a,a._state=z)}var o=a("./config").config,p=(a("./config").configure,a("./utils").objectOrFunction),q=a("./utils").isFunction,r=(a("./utils").now,a("./all").all),s=a("./race").race,t=a("./resolve").resolve,u=a("./reject").reject,v=a("./asap").asap;o.async=v;var w=void 0,x=0,y=1,z=2;d.prototype={constructor:d,_state:void 0,_detail:void 0,_subscribers:void 0,then:function(a,b){var c=this,d=new this.constructor(function(){});if(this._state){var e=arguments;o.async(function(){f(c._state,d,e[c._state-1],c._detail)})}else g(this,d,a,b);return d},"catch":function(a){return this.then(null,a)}},d.all=r,d.race=s,d.resolve=t,d.reject=u,c.Promise=d},{"./all":2,"./asap":3,"./config":4,"./race":7,"./reject":8,"./resolve":9,"./utils":10}],7:[function(a,b,c){"use strict";function d(a){var b=this;if(!e(a))throw new TypeError("You must pass an array to race.");return new b(function(b,c){for(var d,e=0;e<a.length;e++)d=a[e],d&&"function"==typeof d.then?d.then(b,c):b(d)})}var e=a("./utils").isArray;c.race=d},{"./utils":10}],8:[function(a,b,c){"use strict";function d(a){var b=this;return new b(function(b,c){c(a)})}c.reject=d},{}],9:[function(a,b,c){"use strict";function d(a){if(a&&"object"==typeof a&&a.constructor===this)return a;var b=this;return new b(function(b){b(a)})}c.resolve=d},{}],10:[function(a,b,c){"use strict";function d(a){return e(a)||"object"==typeof a&&null!==a}function e(a){return"function"==typeof a}function f(a){return"[object Array]"===Object.prototype.toString.call(a)}var g=Date.now||function(){return(new Date).getTime()};c.objectOrFunction=d,c.isFunction=e,c.isArray=f,c.now=g},{}],11:[function(a,b){function c(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function d(a){return"function"==typeof a}function e(a){return"number"==typeof a}function f(a){return"object"==typeof a&&null!==a}function g(a){return void 0===a}b.exports=c,c.EventEmitter=c,c.prototype._events=void 0,c.prototype._maxListeners=void 0,c.defaultMaxListeners=10,c.prototype.setMaxListeners=function(a){if(!e(a)||0>a||isNaN(a))throw TypeError("n must be a positive number");return this._maxListeners=a,this},c.prototype.emit=function(a){var b,c,e,h,i,j;if(this._events||(this._events={}),"error"===a&&(!this._events.error||f(this._events.error)&&!this._events.error.length))throw b=arguments[1],b instanceof Error?b:TypeError('Uncaught, unspecified "error" event.');if(c=this._events[a],g(c))return!1;if(d(c))switch(arguments.length){case 1:c.call(this);break;case 2:c.call(this,arguments[1]);break;case 3:c.call(this,arguments[1],arguments[2]);break;default:for(e=arguments.length,h=new Array(e-1),i=1;e>i;i++)h[i-1]=arguments[i];c.apply(this,h)}else if(f(c)){for(e=arguments.length,h=new Array(e-1),i=1;e>i;i++)h[i-1]=arguments[i];for(j=c.slice(),e=j.length,i=0;e>i;i++)j[i].apply(this,h)}return!0},c.prototype.addListener=function(a,b){var e;if(!d(b))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",a,d(b.listener)?b.listener:b),this._events[a]?f(this._events[a])?this._events[a].push(b):this._events[a]=[this._events[a],b]:this._events[a]=b,f(this._events[a])&&!this._events[a].warned){var e;e=g(this._maxListeners)?c.defaultMaxListeners:this._maxListeners,e&&e>0&&this._events[a].length>e&&(this._events[a].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[a].length),"function"==typeof console.trace&&console.trace())}return this},c.prototype.on=c.prototype.addListener,c.prototype.once=function(a,b){function c(){this.removeListener(a,c),e||(e=!0,b.apply(this,arguments))}if(!d(b))throw TypeError("listener must be a function");var e=!1;return c.listener=b,this.on(a,c),this},c.prototype.removeListener=function(a,b){var c,e,g,h;if(!d(b))throw TypeError("listener must be a function");if(!this._events||!this._events[a])return this;if(c=this._events[a],g=c.length,e=-1,c===b||d(c.listener)&&c.listener===b)delete this._events[a],this._events.removeListener&&this.emit("removeListener",a,b);else if(f(c)){for(h=g;h-->0;)if(c[h]===b||c[h].listener&&c[h].listener===b){e=h;break}if(0>e)return this;1===c.length?(c.length=0,delete this._events[a]):c.splice(e,1),this._events.removeListener&&this.emit("removeListener",a,b)}return this},c.prototype.removeAllListeners=function(a){var b,c;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[a]&&delete this._events[a],this;if(0===arguments.length){for(b in this._events)"removeListener"!==b&&this.removeAllListeners(b);return this.removeAllListeners("removeListener"),this._events={},this}if(c=this._events[a],d(c))this.removeListener(a,c);else for(;c.length;)this.removeListener(a,c[c.length-1]);return delete this._events[a],this},c.prototype.listeners=function(a){var b;return b=this._events&&this._events[a]?d(this._events[a])?[this._events[a]]:this._events[a].slice():[]},c.listenerCount=function(a,b){var c;return c=a._events&&a._events[b]?d(a._events[b])?1:a._events[b].length:0}},{}],12:[function(a,b){function c(){}var d=b.exports={};d.nextTick=function(){var a="undefined"!=typeof window&&window.setImmediate,b="undefined"!=typeof window&&window.postMessage&&window.addEventListener;if(a)return function(a){return window.setImmediate(a)};if(b){var c=[];return window.addEventListener("message",function(a){var b=a.source;if((b===window||null===b)&&"process-tick"===a.data&&(a.stopPropagation(),c.length>0)){var d=c.shift();d()}},!0),function(a){c.push(a),window.postMessage("process-tick","*")}}return function(a){setTimeout(a,0)}}(),d.title="browser",d.browser=!0,d.env={},d.argv=[],d.on=c,d.addListener=c,d.once=c,d.off=c,d.removeListener=c,d.removeAllListeners=c,d.emit=c,d.binding=function(){throw new Error("process.binding is not supported")},d.cwd=function(){return"/"},d.chdir=function(){throw new Error("process.chdir is not supported")}},{}],13:[function(a){DeLorean.Flux.define("EventEmitter",a("events").EventEmitter),DeLorean.Flux.define("Promise",a("es6-promise").Promise)},{"es6-promise":1,events:11}]},{},[13]); | ||
//# sourceMappingURL=delorean.min.js.map |
@@ -71,5 +71,15 @@ # Stores | ||
### `emitChange()` or `emit('change')` | ||
When your data changes, you need to call `emitChange()` or `emit('change')` to publish | ||
change signal for views. | ||
### `emitRollback(bool:noChange)` or `emit('rollback', bool:noChange)` | ||
When something goes wrong with your store, you may want to call a `rollback` event. When | ||
you call it, it informs other stores related to itself to be rolled back. | ||
#### Using `Array.observe` and `Object.observe`, or `listenChanges` | ||
You don't have to call `emit('change')` everytime. You may use **`observe`** feature | ||
You don't have to call `emitChange()` or `emit('change')` everytime. You may use **`observe`** feature | ||
of **ES.next**. | ||
@@ -121,1 +131,40 @@ | ||
``` | ||
### Protect your state from failures using `rollback` | ||
Sometimes stores may fail and you want your data back. In these cases, you'll need | ||
a rollback mechanism. When a store says it needs to be rolled back, **every sibling | ||
store on same dispatcher will be warned about it**. | ||
```javascript | ||
... | ||
todos: [], | ||
initialize: function (url) { | ||
var self = this; | ||
this.rollback(function () { | ||
// bring old todos back, also it will tell another stores | ||
// to be rolled back. | ||
self.todos = self.oldTodos.slice(0); | ||
}); | ||
}, | ||
addTodo: function (data) { | ||
// Let's backup the data | ||
self.oldTodos = self.todos.slice(0); | ||
// Now apply the view | ||
self.todos.push({text: data}); | ||
self.emitChange(); | ||
// Now try to react to the server | ||
$.post('/todos', {text: data}, function (response) { | ||
if (response.status === false) { | ||
// if something goes wrong with the server, emit rollback. | ||
self.emitRollback(); | ||
} | ||
}, 'json'); | ||
} | ||
... | ||
``` |
{ | ||
"name": "delorean.js", | ||
"version": "0.6.0", | ||
"version": "0.6.1", | ||
"description": "Flux Library", | ||
@@ -5,0 +5,0 @@ "main": "src/delorean.js", |
@@ -5,3 +5,3 @@ # DeLorean.js | ||
[![NPM version](https://badge.fury.io/js/delorean.js.svg)](http://badge.fury.io/js/delorean.js) | ||
![Coverage](http://progressed.io/bar/86?title=coverage) | ||
![Coverage](http://progressed.io/bar/85?title=coverage) | ||
@@ -8,0 +8,0 @@ DeLorean is a tiny Flux pattern implementation. |
@@ -15,12 +15,7 @@ (function (DeLorean) { | ||
function __argsShift(args, from) { | ||
return Array.prototype.slice.call(args, from); | ||
} | ||
function __findDispatcher(view) { | ||
if (!view.props.dispatcher) { | ||
return __findDispatcher(view._owner); | ||
} else { | ||
return view.props.dispatcher; | ||
} | ||
return view.props.dispatcher; | ||
} | ||
@@ -30,2 +25,13 @@ | ||
Dispatcher = (function () { | ||
var __rollbackListener = function (stores) { | ||
var __listener = function () { | ||
for (var i in stores) { | ||
stores[i].listener.emit('__rollback'); | ||
} | ||
}; | ||
for (var j in stores) { | ||
stores[j].listener.on('rollback', __listener); | ||
} | ||
}; | ||
function Dispatcher(stores) { | ||
@@ -35,2 +41,5 @@ var self = this; | ||
this.stores = stores; | ||
__rollbackListener(Object.keys(stores).map(function (key) { | ||
return stores[key]; | ||
})); | ||
} | ||
@@ -61,3 +70,3 @@ | ||
Dispatcher.prototype.waitFor = function (stores) { | ||
var self = this, promises; | ||
var self = this, promises, __rollbackListener; | ||
promises = (function () { | ||
@@ -97,2 +106,6 @@ var __promises = [], __promiseGenerator, promise; | ||
Dispatcher.prototype.emit = function () { | ||
return this.listener.emit.apply(this.listener, arguments); | ||
}; | ||
return Dispatcher; | ||
@@ -104,3 +117,3 @@ }()); | ||
function Store(store) { | ||
function Store(store, args) { | ||
if (typeof store !== 'object') { | ||
@@ -114,3 +127,2 @@ throw 'Stores should be defined by passing the definition to the constructor'; | ||
if (typeof store.initialize === 'function') { | ||
var args = __argsShift(arguments, 1); | ||
store.initialize.apply(this.store, args); | ||
@@ -124,2 +136,5 @@ } | ||
this.store.emit = this.listener.emit.bind(this.listener); | ||
this.store.emitChange = this.listener.emit.bind(this.listener, 'change'); | ||
this.store.emitRollback = this.listener.emit.bind(this.listener, 'rollback'); | ||
this.store.rollback = this.listener.on.bind(this.listener, '__rollback'); | ||
this.store.listenChanges = this.listenChanges.bind(this); | ||
@@ -168,3 +183,3 @@ | ||
return function () { | ||
return new Store(factoryDefinition); | ||
return new Store(factoryDefinition, arguments); | ||
}; | ||
@@ -171,0 +186,0 @@ }, |
Sorry, the diff of this file is not supported yet
1580564
37367