From de4b4e0f921bf7c8005b6d2fc6862269723bd432 Mon Sep 17 00:00:00 2001 From: Jean-Charles Sisk Date: Tue, 12 May 2015 15:44:14 -0400 Subject: [PATCH 1/2] remove reverend in favor of path-to-regexp.compile --- lib/router.js | 29 ++++++++++++++++++++++------- package.json | 3 +-- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/lib/router.js b/lib/router.js index 30a127f..a498834 100644 --- a/lib/router.js +++ b/lib/router.js @@ -7,7 +7,6 @@ var debug = require('debug')('Routr:router'); var pathToRegexp = require('path-to-regexp'); -var reverend = require('reverend'); var METHODS = { GET: 'get' }; @@ -134,12 +133,28 @@ Route.prototype.match = function (url, options) { * @for Route */ Route.prototype.makePath = function (params) { - try { - return reverend(this.config.path, params); - } catch (e) { - debug('Route.makePath failed, e = ', e); - return null; + var route = this.config.path, + compiler, + err; + + if (Array.isArray(route)) { + route = route[0]; } + + if (typeof route === 'string') { + compiler = pathToRegexp.compile(route); + + try { + return compiler(params); + } catch (e) { + err = e; + } + } else { + err = new TypeError('route must be a String path'); + } + + debug('Route.makePath failed, e = ', err); + return null; }; /** @@ -238,4 +253,4 @@ Router.prototype.makePath = function (name, params) { return (name && this._routes[name] && this._routes[name].makePath(params)) || null; }; -module.exports = Router; \ No newline at end of file +module.exports = Router; diff --git a/package.json b/package.json index 111185d..3edbc80 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,7 @@ ], "dependencies": { "debug": "^2.0.0", - "path-to-regexp": "^1.0.0", - "reverend": "^0.3.0" + "path-to-regexp": "^1.1.1" }, "devDependencies": { "chai": "^2.0.0", From 8a831b05308c953d1ad4e89985ba56d972dff25d Mon Sep 17 00:00:00 2001 From: Jean-Charles Sisk Date: Tue, 12 May 2015 16:04:29 -0400 Subject: [PATCH 2/2] adding tests for array and non-string routes --- tests/unit/lib/router.js | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/tests/unit/lib/router.js b/tests/unit/lib/router.js index 6771b15..117d4e8 100644 --- a/tests/unit/lib/router.js +++ b/tests/unit/lib/router.js @@ -44,6 +44,12 @@ var routes = { path: '/case_insensitive', method: 'GET', page: 'viewCaseInsensitive' + }, + array_path: { + path: ['/array_path'] + }, + invalid_path: { + path: 123 } }; var router; @@ -55,7 +61,7 @@ describe('Router', function () { describe('#constructor', function () { it('should init correctly', function () { - expect(Object.keys(router._routes).length).to.equal(7); + expect(Object.keys(router._routes).length).to.equal(9); expect(router._routes.article.name).to.equal('article'); expect(router._routes.article.config.path).to.equal('/:site/:category?/:subcategory?/:alias'); @@ -98,16 +104,26 @@ describe('Router', function () { expect(router._routes.case_insensitive.config.page).to.equal('viewCaseInsensitive'); expect(router._routes.case_insensitive.keys.length).to.equal(0); expect(router._routes.case_insensitive.regexp).to.be.a('RegExp'); + + expect(router._routes.array_path.name).to.equal('array_path'); + expect(router._routes.array_path.config.path[0]).to.equal('/array_path'); + expect(router._routes.array_path.keys.length).to.equal(0); + expect(router._routes.array_path.regexp).to.be.a('RegExp'); + + expect(router._routes.invalid_path.name).to.equal('invalid_path'); + expect(router._routes.invalid_path.config.path).to.equal(123); + expect(router._routes.invalid_path.keys.length).to.equal(0); + expect(router._routes.invalid_path.regexp).to.be.a('RegExp'); }); it('should not freeze in production env', function () { var origEnv = process.env.NODE_ENV; process.env.NODE_ENV = 'production'; var notFrozen = new Router(routes); - expect(Object.keys(notFrozen._routes).length).to.equal(7); + expect(Object.keys(notFrozen._routes).length).to.equal(9); notFrozen._routes.foo = null; expect(notFrozen._routes.foo).to.equal(null); - expect(Object.keys(notFrozen._routes).length).to.equal(8); + expect(Object.keys(notFrozen._routes).length).to.equal(10); var homeRoute = notFrozen._routes.home; expect(homeRoute.name).to.equal('home'); @@ -120,7 +136,7 @@ describe('Router', function () { process.env.NODE_ENV = 'development'; var frozen = new Router(routes); var homeRoute = frozen._routes.home; - expect(Object.keys(frozen._routes).length).to.equal(7); + expect(Object.keys(frozen._routes).length).to.equal(9); expect(homeRoute.name).to.equal('home'); expect(homeRoute.config.path).to.equal('/'); expect(homeRoute.config.method).to.equal('get'); @@ -145,7 +161,7 @@ describe('Router', function () { expect(function () { homeRoute.config.regexp = null; }).to.throw(TypeError); - expect(Object.keys(frozen._routes).length).to.equal(7); + expect(Object.keys(frozen._routes).length).to.equal(9); expect(frozen._routes.foo).to.equal(undefined); expect(homeRoute.keys.length).to.equal(0); expect(homeRoute.name).to.equal('home'); @@ -289,6 +305,14 @@ describe('Router', function () { }); expect(path).to.equal(null); }); + it('array route', function () { + var path = router.makePath('array_path', {}); + expect(path).to.equal('/array_path'); + }); + it('invalid route', function () { + var path = router.makePath('invalid_path', {}); + expect(path).to.equal(null); + }); }); });