Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

deps: path-to-regexp@6.2.0 #102

Closed
wants to merge 7 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions HISTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
This incorporates all changes after 1.3.5 up to 1.3.7.

* Add support for returned, rejected Promises to `router.param`
* deps: path-to-regexp@6.2.0
- Support for **named capturing groups** in paths using `RegExp`, i.e.: `/\/(?<group>.+)/` would result in `req.params.group` being populated.
- Custom **prefix and suffix groups** using `{}`, e.g.: `/:entity{-:action}?` would match `/user` and `/user-delete`.
- Unbalanced patterns now produce an error: `/test(foo` previously worked, but now it expects `(` to be escaped for the previous behavior, e.g. `/test\\(foo`.
dougwilson marked this conversation as resolved.
Show resolved Hide resolved
- Just like with parentheses since `2.0.0-beta.1`, bracket literals now require escaping, i.e.: `/user{:id}` no longer matches `/user{42}` as before unless written as `/user\\{:id\\}`.

2.0.0-beta.1 / 2020-03-29
=========================
Expand Down
4 changes: 2 additions & 2 deletions lib/layer.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
*/

var isPromise = require('is-promise')
var pathRegexp = require('path-to-regexp')
var pathToRegexp = require('path-to-regexp').pathToRegexp

/**
* Module variables.
Expand Down Expand Up @@ -41,7 +41,7 @@ function Layer (path, options, fn) {
this.name = fn.name || '<anonymous>'
this.params = undefined
this.path = undefined
this.regexp = pathRegexp((opts.strict ? path : loosen(path)), this.keys, opts)
this.regexp = pathToRegexp((opts.strict ? path : loosen(path)), this.keys, opts)

// set fast path flags
this.regexp._slash = path === '/' && opts.end === false
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"is-promise": "4.0.0",
"methods": "~1.1.2",
"parseurl": "~1.3.3",
"path-to-regexp": "3.2.0",
"path-to-regexp": "6.2.0",
"setprototypeof": "1.2.0",
"utils-merge": "1.0.1"
},
Expand Down
182 changes: 181 additions & 1 deletion test/route.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ var shouldHitHandle = utils.shouldHitHandle
var shouldNotHaveBody = utils.shouldNotHaveBody
var shouldNotHitHandle = utils.shouldNotHitHandle

var describeNamedCaptureGroups = supportsRegExp('(?<foo>.)') ? describe : describe.skip
var describePromises = global.Promise ? describe : describe.skip

describe('Router', function () {
Expand Down Expand Up @@ -687,7 +688,7 @@ describe('Router', function () {
.expect(200, { 0: 's', user: 'tj', op: 'edit' }, cb)
})

it('should work inside literal paranthesis', function (done) {
it('should work inside literal parenthesis', function (done) {
var router = new Router()
var route = router.route('/:user\\(:op\\)')
var server = createServer(router)
Expand All @@ -699,6 +700,27 @@ describe('Router', function () {
.expect(200, { user: 'tj', op: 'edit' }, done)
})

it('should allow matching literal parenthesis within a group', function (done) {
var cb = after(3, done)
var router = new Router()
var route = router.route('/:user([a-z\\(\\)]+)')
dougwilson marked this conversation as resolved.
Show resolved Hide resolved
var server = createServer(router)

route.all(sendParams)

request(server)
.get('/1234')
.expect(404, cb)

request(server)
.get('/foo')
.expect(200, { user: 'foo' }, cb)

request(server)
.get('/(foo)')
.expect(200, { user: '(foo)' }, cb)
})

it('should work within arrays', function (done) {
var cb = after(2, done)
var router = new Router()
Expand Down Expand Up @@ -860,6 +882,54 @@ describe('Router', function () {
})
})

describe('using "{<prefix>:name}"', function () {
it('should allow defining custom prefixes', function (done) {
var cb = after(3, done)
var router = new Router()
var route = router.route('/{$:foo}{$:bar}?')
var server = createServer(router)

route.all(sendParams)

request(server)
.get('/bar')
.expect(404, cb)

request(server)
.get('/$bar')
.expect(200, { foo: 'bar' }, cb)

request(server)
.get('/$bar$fizz')
.expect(200, { foo: 'bar', bar: 'fizz' }, cb)
})

it('should work in any segment', function (done) {
var cb = after(4, done)
var router = new Router()
var route = router.route('/user/:foo?{-:bar}?{-:baz}?')
var server = createServer(router)

route.all(sendParams)

request(server)
.get('/user')
.expect(200, cb)

request(server)
.get('/user/delete')
.expect(200, { foo: 'delete' }, cb)

request(server)
.get('/user/delete-fizz')
.expect(200, { foo: 'delete', bar: 'fizz' }, cb)

request(server)
.get('/user/delete-fizz-buzz')
.expect(200, { foo: 'delete', bar: 'fizz', baz: 'buzz' }, cb)
})
})

describe('using "(regexp)"', function () {
it('should add capture group using regexp', function (done) {
var cb = after(2, done)
Expand Down Expand Up @@ -898,6 +968,108 @@ describe('Router', function () {
.get('/foo:n42')
.expect(200, { 0: 'foo:n42' }, cb)
})

it('should allow optional capturing group', function (done) {
var cb = after(4, done)
var router = new Router()
var route = router.route('/user(s)?/:foo')
var server = createServer(router)

route.all(sendParams)

request(server)
.get('/user')
.expect(404, cb)

request(server)
.get('/users')
.expect(404, cb)

request(server)
.get('/user/bar')
.expect(200, { foo: 'bar' }, cb)

request(server)
.get('/users/bar')
.expect(200, { 0: 's', foo: 'bar' }, cb)
})

it('should work in any segment', function (done) {
var cb = after(4, done)
var router = new Router()
var route = router.route('/users/image(s)?/:foo')
var server = createServer(router)

route.all(sendParams)

request(server)
.get('/users/image')
.expect(404, cb)

request(server)
.get('/users/images')
.expect(404, cb)

request(server)
.get('/users/image/1234')
.expect(200, { foo: '1234' }, cb)

request(server)
.get('/users/images/1234')
.expect(200, { 0: 's', foo: '1234' }, cb)
})
})

describeNamedCaptureGroups('using "(?<name>)"', function () {
it('should allow defining capturing groups using regexps', function (done) {
var cb = after(3, done)
var router = new Router()
var route = router.route(/\/(?<name>.+)/)
var server = createServer(router)

route.all(sendParams)

request(server)
.get('/')
.expect(404, cb)

request(server)
.get('/foo/bar')
.expect(200, { name: 'foo/bar' }, cb)

request(server)
.get('/foo')
.expect(200, { name: 'foo' }, cb)
})

it('should work with multiple named groups in the same segment', function (done) {
var cb = after(5, done)
var router = new Router()
var route = router.route(/\/(?<filename>.*).(?<ext>html|pdf|json)/)
var server = createServer(router)

route.all(sendParams)

request(server)
.get('/foo')
.expect(404, cb)

request(server)
.get('/foo.xml')
.expect(404, cb)

request(server)
.get('/foo.html')
.expect(200, { filename: 'foo', ext: 'html' }, cb)

request(server)
.get('/bar.pdf')
.expect(200, { filename: 'bar', ext: 'pdf' }, cb)

request(server)
.get('/baz.json')
.expect(200, { filename: 'baz', ext: 'json' }, cb)
})
})
})
})
Expand All @@ -921,3 +1093,11 @@ function sendParams (req, res) {
res.setHeader('Content-Type', 'application/json')
res.end(JSON.stringify(req.params))
}

function supportsRegExp (source) {
try {
return RegExp(source).source !== ''
} catch (e) {
return false
}
}