backbone.eventrouter
Advanced tools
Comparing version 1.0.1 to 1.1.0
@@ -0,1 +1,4 @@ | ||
#### v1.1.0 | ||
* Support destroying the eventrouter | ||
#### v1.0.1 | ||
@@ -2,0 +5,0 @@ * Updated underscore peer dependency |
/** | ||
* backbone.eventrouter - A highly opinionated, simplistic Backbone.Router coupled with a Backbone.Radio.Channel | ||
* @version v1.0.1 | ||
* @version v1.1.0 | ||
* @link https://github.com/RoundingWellOS/backbone.eventrouter | ||
@@ -41,2 +41,4 @@ * @license MIT | ||
this.cid = _.uniqueId('bber'); | ||
this._ch = Backbone.Radio.channel(_.result(this, 'channelName')); | ||
@@ -148,3 +150,5 @@ | ||
if (_.isFunction(name) || !callback) { | ||
return bbRoute.call(this, _route, name, callback); | ||
_route = bbRoute.call(this, _route, name, callback); | ||
Backbone.history.handlers[0].cid = this.cid; | ||
return _route; | ||
} | ||
@@ -164,3 +168,5 @@ | ||
return bbRoute.call(this, _route, name, wrappedCallback); | ||
_route = bbRoute.call(this, _route, name, wrappedCallback); | ||
Backbone.history.handlers[0].cid = this.cid; | ||
return _route; | ||
}, | ||
@@ -224,3 +230,3 @@ | ||
return arguments.length === _.union(arguments, this.currentRoute).length; | ||
return arguments.length === _.union(arguments, currentRoute).length; | ||
}, | ||
@@ -308,2 +314,18 @@ | ||
return _.reduce(eventArgs, this._replaceParam, route); | ||
}, | ||
/** | ||
* Destroys the eventrouter and removes any registered route handlers. | ||
* | ||
* @public | ||
* @method destroy | ||
* @memberOf EventRouter | ||
* @returns {EventRouter} | ||
*/ | ||
destroy: function destroy() { | ||
Backbone.history.handlers = _.reject(Backbone.history.handlers, { cid: this.cid }); | ||
this.stopListening(); | ||
this.trigger('destroy', this); | ||
return this; | ||
} | ||
@@ -310,0 +332,0 @@ }); |
/** | ||
* backbone.eventrouter - A highly opinionated, simplistic Backbone.Router coupled with a Backbone.Radio.Channel | ||
* @version v1.0.1 | ||
* @version v1.1.0 | ||
* @link https://github.com/RoundingWellOS/backbone.eventrouter | ||
* @license MIT | ||
*/ | ||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("underscore"),require("backbone"),require("backbone.radio")):"function"==typeof define&&define.amd?define(["underscore","backbone","backbone.radio"],e):(t.Backbone=t.Backbone||{},t.Backbone.EventRouter=e(t._,t.Backbone,t.Radio))}(this,function(t,e,r){"use strict";t="default"in t?t.default:t,e="default"in e?e.default:e;var i=/(\(\?)?:\w+/,n=e.EventRouter=e.Router.extend({constructor:function(r){t.extend(this,t.pick(r,["channelName","routeTriggers"])),this._ch=e.Radio.channel(t.result(this,"channelName")),this.listenTo(this._ch,"all",this.navigateFromEvent),e.Router.apply(this,arguments),this._initRoutes()},channelName:"event-router",getChannel:function(){return this._ch},_initRoutes:function(){this._routeTriggers=t.result(this,"routeTriggers",{}),t.each(this._routeTriggers,this._addRouteTrigger,this)},_addRouteTrigger:function(e,r){e=t.isArray(e)?e:[e],t.each(e,function(e){this.route(e,r,t.bind(this._ch.trigger,this._ch,r))},this)},addRouteTrigger:function(t,e){return this._routeTriggers[e]=t,this._addRouteTrigger(t,e),this},route:function(r,i,n){var o=e.Router.prototype.route;if(t.isFunction(i)||!n)return o.call(this,r,i,n);var u=t.bind(function(){var e=t.drop(arguments,0);this.trigger("before:route",i,e),this.trigger.apply(this,["before:route:"+i].concat(e)),this._storeRouteTrigger([i].concat(e)),n.apply(this,e),this._clearRouteTrigger()},this);return o.call(this,r,i,u)},_storeRouteTrigger:function(t){this._routeArgs=this._routeArgs||[],this._routeArgs.push(t)},_getCurrentRouteTrigger:function(){return t.last(this._routeArgs)||[]},_clearRouteTrigger:function(){this._routeArgs.pop()},_isTriggeredFromRoute:function(){var e=this._getCurrentRouteTrigger();return arguments.length===e.length&&arguments.length===t.union(arguments,this.currentRoute).length},navigateFromEvent:function(e){var r=this.getDefaultRoute(e);if(!r){var i=t.drop(arguments,0);return this.trigger.apply(this,["noMatch"].concat(i)),this}if(this._isTriggeredFromRoute.apply(this,arguments))return this;var n=t.drop(arguments,1),o=this.translateRoute(r,n);return this.navigate(o,{trigger:!1})},getDefaultRoute:function(e){var r=this._routeTriggers[e];return t.isArray(r)?r[0]:r},_replaceParam:function(t,e){return t.replace(i,e)},translateRoute:function(e,r){return t.reduce(r,this._replaceParam,e)}});return n}); | ||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("underscore"),require("backbone"),require("backbone.radio")):"function"==typeof define&&define.amd?define(["underscore","backbone","backbone.radio"],e):(t.Backbone=t.Backbone||{},t.Backbone.EventRouter=e(t._,t.Backbone,t.Radio))}(this,function(t,e,r){"use strict";t="default"in t?t.default:t,e="default"in e?e.default:e;var i=/(\(\?)?:\w+/,n=e.EventRouter=e.Router.extend({constructor:function(r){t.extend(this,t.pick(r,["channelName","routeTriggers"])),this.cid=t.uniqueId("bber"),this._ch=e.Radio.channel(t.result(this,"channelName")),this.listenTo(this._ch,"all",this.navigateFromEvent),e.Router.apply(this,arguments),this._initRoutes()},channelName:"event-router",getChannel:function(){return this._ch},_initRoutes:function(){this._routeTriggers=t.result(this,"routeTriggers",{}),t.each(this._routeTriggers,this._addRouteTrigger,this)},_addRouteTrigger:function(e,r){e=t.isArray(e)?e:[e],t.each(e,function(e){this.route(e,r,t.bind(this._ch.trigger,this._ch,r))},this)},addRouteTrigger:function(t,e){return this._routeTriggers[e]=t,this._addRouteTrigger(t,e),this},route:function(r,i,n){var o=e.Router.prototype.route;if(t.isFunction(i)||!n)return r=o.call(this,r,i,n),e.history.handlers[0].cid=this.cid,r;var s=t.bind(function(){var e=t.drop(arguments,0);this.trigger("before:route",i,e),this.trigger.apply(this,["before:route:"+i].concat(e)),this._storeRouteTrigger([i].concat(e)),n.apply(this,e),this._clearRouteTrigger()},this);return r=o.call(this,r,i,s),e.history.handlers[0].cid=this.cid,r},_storeRouteTrigger:function(t){this._routeArgs=this._routeArgs||[],this._routeArgs.push(t)},_getCurrentRouteTrigger:function(){return t.last(this._routeArgs)||[]},_clearRouteTrigger:function(){this._routeArgs.pop()},_isTriggeredFromRoute:function(){var e=this._getCurrentRouteTrigger();return arguments.length===e.length&&arguments.length===t.union(arguments,e).length},navigateFromEvent:function(e){var r=this.getDefaultRoute(e);if(!r){var i=t.drop(arguments,0);return this.trigger.apply(this,["noMatch"].concat(i)),this}if(this._isTriggeredFromRoute.apply(this,arguments))return this;var n=t.drop(arguments,1),o=this.translateRoute(r,n);return this.navigate(o,{trigger:!1})},getDefaultRoute:function(e){var r=this._routeTriggers[e];return t.isArray(r)?r[0]:r},_replaceParam:function(t,e){return t.replace(i,e)},translateRoute:function(e,r){return t.reduce(r,this._replaceParam,e)},destroy:function(){return e.history.handlers=t.reject(e.history.handlers,{cid:this.cid}),this.stopListening(),this.trigger("destroy",this),this}});return n}); | ||
//# sourceMappingURL=backbone.eventrouter.min.js.map |
{ | ||
"name": "backbone.eventrouter", | ||
"version": "1.0.1", | ||
"version": "1.1.0", | ||
"description": "A highly opinionated, simplistic Backbone.Router coupled with a Backbone.Radio.Channel", | ||
@@ -5,0 +5,0 @@ "main": "./dist/backbone.eventrouter.js", |
@@ -27,2 +27,4 @@ import _ from 'underscore'; | ||
this.cid = _.uniqueId('bber'); | ||
this._ch = Backbone.Radio.channel(_.result(this, 'channelName')); | ||
@@ -129,3 +131,5 @@ | ||
if(_.isFunction(name) || !callback) { | ||
return bbRoute.call(this, route, name, callback); | ||
route = bbRoute.call(this, route, name, callback); | ||
Backbone.history.handlers[0].cid = this.cid; | ||
return route; | ||
} | ||
@@ -145,3 +149,5 @@ | ||
return bbRoute.call(this, route, name, wrappedCallback); | ||
route = bbRoute.call(this, route, name, wrappedCallback); | ||
Backbone.history.handlers[0].cid = this.cid; | ||
return route; | ||
}, | ||
@@ -202,3 +208,3 @@ | ||
return (arguments.length === _.union(arguments, this.currentRoute).length); | ||
return (arguments.length === _.union(arguments, currentRoute).length); | ||
}, | ||
@@ -282,2 +288,17 @@ | ||
return _.reduce(eventArgs, this._replaceParam, route); | ||
}, | ||
/** | ||
* Destroys the eventrouter and removes any registered route handlers. | ||
* | ||
* @public | ||
* @method destroy | ||
* @memberOf EventRouter | ||
* @returns {EventRouter} | ||
*/ | ||
destroy() { | ||
Backbone.history.handlers = _.reject(Backbone.history.handlers, { cid: this.cid }); | ||
this.stopListening(); | ||
this.trigger('destroy', this); | ||
return this; | ||
} | ||
@@ -287,1 +308,2 @@ }); | ||
export default EventRouter; | ||
@@ -128,2 +128,53 @@ describe('Backbone.Eventrouter Events', function() { | ||
}); | ||
describe('when a router is destroyed', function() { | ||
describe('when a route is removed', function() { | ||
beforeEach(function() { | ||
this.beforeRouteStub = this.sinon.stub(); | ||
this.routeStub = this.sinon.stub(); | ||
this.beforeRouteNameStub = this.sinon.stub(); | ||
this.routeNameStub = this.sinon.stub(); | ||
this.myEventRouter.on('before:route', this.beforeRouteStub); | ||
this.myEventRouter.on('route', this.routeStub); | ||
this.myEventRouter.on('before:route:testevent:bar', this.beforeRouteNameStub); | ||
this.myEventRouter.on('route:testevent:bar', this.routeNameStub); | ||
this.myEventRouter.addRouteTrigger('test/url/:foo', 'testevent:bar'); | ||
this.myEventRouter.destroy(); | ||
this.myEventRouter.navigate('test/url/baz', { trigger: true }); | ||
}); | ||
it('should not throw a before:route event', function() { | ||
expect(this.beforeRouteStub).to.not.have.been.calledOnce; | ||
}); | ||
}); | ||
describe('when a route is removed and added to a new router', function() { | ||
beforeEach(function() { | ||
this.beforeRouteStub = this.sinon.stub(); | ||
this.beforeRouteOtherStub = this.sinon.stub(); | ||
this.myEventRouter.on('before:route', this.beforeRouteStub); | ||
this.myEventRouter.addRouteTrigger('test/url/:foo', 'testevent:bar'); | ||
this.myEventRouter.navigate('test/url/baz', { trigger: true }); | ||
this.myEventRouter.destroy(); | ||
this.myEventRouter.navigate('test/url/baz2', { trigger: true }); | ||
this.myOtherEventRouter = new Backbone.EventRouter(); | ||
this.myOtherEventRouter.on('before:route', this.beforeRouteOtherStub); | ||
this.myOtherEventRouter.addRouteTrigger('test/url/:foo', 'testevent:bar'); | ||
this.myOtherEventRouter.navigate('test/url/baz3', { trigger: true }); | ||
it('should throw a before:route event', function() { | ||
expect(this.beforeRouteStub).to.have.been.calledOnce; | ||
}); | ||
it('should throw a before:route event', function() { | ||
expect(this.beforeRouteOtherStub).to.have.been.calledOnce; | ||
}); | ||
}); | ||
}); | ||
}); | ||
}); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
317015
27
1246
1