Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
closes #4321
  • Loading branch information
dougwilson committed Dec 17, 2021
1 parent c7d528c commit 1574925
Show file tree
Hide file tree
Showing 5 changed files with 97 additions and 208 deletions.
13 changes: 13 additions & 0 deletions History.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,19 @@

This incorporates all changes after 4.17.1 up to 4.17.2.

* deps: [email protected]
- Add new `?`, `*`, and `+` parameter modifiers
- Internalize private `router.process_params` method
- Matching group expressions are only RegExp syntax
- Named matching groups no longer available by position in `req.params`
- Regular expressions can only be used in a matching group
- Remove `debug` dependency
- Special `*` path segment behavior removed
- deps: [email protected]
- deps: parseurl@~1.3.3
- deps: [email protected]
- deps: [email protected]

5.0.0-alpha.8 / 2020-03-25
==========================

Expand Down
2 changes: 1 addition & 1 deletion examples/downloads/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ app.get('/', function(req, res){

// /files/* is accessed via req.params[0]
// but here we name it :file
app.get('/files/:file(*)', function(req, res, next){
app.get('/files/:file+', function (req, res, next) {
var filePath = path.join(__dirname, 'files', req.params.file);

res.download(filePath, function (err) {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
"proxy-addr": "~2.0.7",
"qs": "6.9.6",
"range-parser": "~1.2.1",
"router": "2.0.0-alpha.1",
"router": "2.0.0-beta.1",
"safe-buffer": "5.2.1",
"send": "0.17.2",
"serve-static": "1.14.2",
Expand Down
18 changes: 0 additions & 18 deletions test/Router.js
Original file line number Diff line number Diff line change
Expand Up @@ -344,24 +344,6 @@ describe('Router', function(){
assert.equal(count, methods.length);
done();
})

it('should be called for any URL when "*"', function (done) {
var cb = after(4, done)
var router = new Router()

function no () {
throw new Error('should not be called')
}

router.all('*', function (req, res) {
res.end()
})

router.handle({ url: '/', method: 'GET' }, { end: cb }, no)
router.handle({ url: '/foo', method: 'GET' }, { end: cb }, no)
router.handle({ url: 'foo', method: 'GET' }, { end: cb }, no)
router.handle({ url: '*', method: 'GET' }, { end: cb }, no)
})
})

describe('.use', function() {
Expand Down
270 changes: 82 additions & 188 deletions test/app.router.js
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ describe('app.router', function(){
.expect('editing user 10', done);
})

it.skip('should ensure regexp matches path prefix', function (done) {
it('should ensure regexp matches path prefix', function (done) {
var app = express()
var p = []

Expand Down Expand Up @@ -315,7 +315,7 @@ describe('app.router', function(){
var app = express();
var router = new express.Router({ mergeParams: true });

router.get('/*.*', function(req, res){
router.get('/(.*).(.*)', function (req, res) {
var keys = Object.keys(req.params).sort();
res.send(keys.map(function(k){ return [k, req.params[k]] }));
});
Expand All @@ -331,7 +331,7 @@ describe('app.router', function(){
var app = express();
var router = new express.Router({ mergeParams: true });

router.get('/*', function(req, res){
router.get('/(.*)', function (req, res) {
var keys = Object.keys(req.params).sort();
res.send(keys.map(function(k){ return [k, req.params[k]] }));
});
Expand Down Expand Up @@ -553,23 +553,6 @@ describe('app.router', function(){
})
})

it('should allow escaped regexp', function(done){
var app = express();

app.get('/user/\\d+', function(req, res){
res.end('woot');
});

request(app)
.get('/user/10')
.expect(200, function (err) {
if (err) return done(err)
request(app)
.get('/user/tj')
.expect(404, done);
});
})

it('should allow literal "."', function(done){
var app = express();

Expand All @@ -585,171 +568,6 @@ describe('app.router', function(){
.expect('users from 1 to 50', done);
})

describe('*', function(){
it('should capture everything', function (done) {
var app = express()

app.get('*', function (req, res) {
res.end(req.params[0])
})

request(app)
.get('/user/tobi.json')
.expect('/user/tobi.json', done)
})

it('should decode the capture', function (done) {
var app = express()

app.get('*', function (req, res) {
res.end(req.params[0])
})

request(app)
.get('/user/tobi%20and%20loki.json')
.expect('/user/tobi and loki.json', done)
})

it('should denote a greedy capture group', function(done){
var app = express();

app.get('/user/*.json', function(req, res){
res.end(req.params[0]);
});

request(app)
.get('/user/tj.json')
.expect('tj', done);
})

it('should work with several', function(done){
var app = express();

app.get('/api/*.*', function(req, res){
var resource = req.params[0]
, format = req.params[1];
res.end(resource + ' as ' + format);
});

request(app)
.get('/api/users/foo.bar.json')
.expect('users/foo.bar as json', done);
})

it('should work cross-segment', function(done){
var app = express();

app.get('/api*', function(req, res){
res.send(req.params[0]);
});

request(app)
.get('/api')
.expect('', function(){
request(app)
.get('/api/hey')
.expect('/hey', done);
});
})

it('should allow naming', function(done){
var app = express();

app.get('/api/:resource(*)', function(req, res){
var resource = req.params.resource;
res.end(resource);
});

request(app)
.get('/api/users/0.json')
.expect('users/0.json', done);
})

it('should not be greedy immediately after param', function(done){
var app = express();

app.get('/user/:user*', function(req, res){
res.end(req.params.user);
});

request(app)
.get('/user/122')
.expect('122', done);
})

it('should eat everything after /', function(done){
var app = express();

app.get('/user/:user*', function(req, res){
res.end(req.params.user);
});

request(app)
.get('/user/122/aaa')
.expect('122', done);
})

it('should span multiple segments', function(done){
var app = express();

app.get('/file/*', function(req, res){
res.end(req.params[0]);
});

request(app)
.get('/file/javascripts/jquery.js')
.expect('javascripts/jquery.js', done);
})

it('should be optional', function(done){
var app = express();

app.get('/file/*', function(req, res){
res.end(req.params[0]);
});

request(app)
.get('/file/')
.expect('', done);
})

it('should require a preceding /', function(done){
var app = express();

app.get('/file/*', function(req, res){
res.end(req.params[0]);
});

request(app)
.get('/file')
.expect(404, done);
})

it('should keep correct parameter indexes', function(done){
var app = express();

app.get('/*/user/:id', function (req, res) {
res.send(req.params);
});

request(app)
.get('/1/user/2')
.expect(200, '{"0":"1","id":"2"}', done);
})

it('should work within arrays', function(done){
var app = express();

app.get(['/user/:id', '/foo/*', '/:bar'], function (req, res) {
res.send(req.params.bar);
});

request(app)
.get('/test')
.expect(200, 'test', done);
})
})

describe(':name', function(){
it('should denote a capture group', function(done){
var app = express();
Expand Down Expand Up @@ -791,7 +609,7 @@ describe('app.router', function(){
var app = express();
var cb = after(2, done);

app.get('/user(s)?/:user/:op', function(req, res){
app.get('/user(s?)/:user/:op', function(req, res){
res.end(req.params.op + 'ing ' + req.params.user + (req.params[0] ? ' (old)' : ''));
});

Expand Down Expand Up @@ -862,6 +680,82 @@ describe('app.router', function(){
})
})

describe(':name*', function () {
it('should match one segment', function (done) {
var app = express()

app.get('/user/:user*', function (req, res) {
res.end(req.params.user)
})

request(app)
.get('/user/122')
.expect('122', done)
})

it('should match many segments', function (done) {
var app = express()

app.get('/user/:user*', function (req, res) {
res.end(req.params.user)
})

request(app)
.get('/user/1/2/3/4')
.expect('1/2/3/4', done)
})

it('should match zero segments', function (done) {
var app = express()

app.get('/user/:user*', function (req, res) {
res.end(req.params.user)
})

request(app)
.get('/user')
.expect('', done)
})
})

describe(':name+', function () {
it('should match one segment', function (done) {
var app = express()

app.get('/user/:user+', function (req, res) {
res.end(req.params.user)
})

request(app)
.get('/user/122')
.expect(200, '122', done)
})

it('should match many segments', function (done) {
var app = express()

app.get('/user/:user+', function (req, res) {
res.end(req.params.user)
})

request(app)
.get('/user/1/2/3/4')
.expect(200, '1/2/3/4', done)
})

it('should not match zero segments', function (done) {
var app = express()

app.get('/user/:user+', function (req, res) {
res.end(req.params.user)
})

request(app)
.get('/user')
.expect(404, done)
})
})

describe('.:name', function(){
it('should denote a format', function(done){
var app = express();
Expand Down Expand Up @@ -1199,7 +1093,7 @@ describe('app.router', function(){
var app = express();
var path = [];

app.get('*', function(req, res, next){
app.get('/:path+', function (req, res, next) {
path.push(0);
next();
});
Expand All @@ -1219,7 +1113,7 @@ describe('app.router', function(){
next();
});

app.get('*', function(req, res, next){
app.get('/(.*)', function (req, res, next) {
path.push(4);
next();
});
Expand Down

0 comments on commit 1574925

Please sign in to comment.