You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
2.0 KiB
88 lines
2.0 KiB
|
|
/*! |
|
* Express - router - Route |
|
* Copyright(c) 2010 TJ Holowaychuk <tj@vision-media.ca> |
|
* MIT Licensed |
|
*/ |
|
|
|
/** |
|
* Expose `Route`. |
|
*/ |
|
|
|
module.exports = Route; |
|
|
|
/** |
|
* Initialize `Route` with the given HTTP `method`, `path`, |
|
* and an array of `callbacks` and `options`. |
|
* |
|
* Options: |
|
* |
|
* - `sensitive` enable case-sensitive routes |
|
* - `strict` enable strict matching for trailing slashes |
|
* |
|
* @param {String} method |
|
* @param {String} path |
|
* @param {Array} callbacks |
|
* @param {Object} options. |
|
* @api private |
|
*/ |
|
|
|
function Route(method, path, callbacks, options) { |
|
options = options || {}; |
|
this.path = path; |
|
this.method = method; |
|
this.callbacks = callbacks; |
|
this.regexp = normalize(path |
|
, this.keys = [] |
|
, options.sensitive |
|
, options.strict); |
|
} |
|
|
|
/** |
|
* Check if this route matches `path` and return captures made. |
|
* |
|
* @param {String} path |
|
* @return {Array} |
|
* @api private |
|
*/ |
|
|
|
Route.prototype.match = function(path){ |
|
return this.regexp.exec(path); |
|
}; |
|
|
|
/** |
|
* Normalize the given path string, |
|
* returning a regular expression. |
|
* |
|
* An empty array should be passed, |
|
* which will contain the placeholder |
|
* key names. For example "/user/:id" will |
|
* then contain ["id"]. |
|
* |
|
* @param {String|RegExp} path |
|
* @param {Array} keys |
|
* @param {Boolean} sensitive |
|
* @param {Boolean} strict |
|
* @return {RegExp} |
|
* @api private |
|
*/ |
|
|
|
function normalize(path, keys, sensitive, strict) { |
|
if (path instanceof RegExp) return path; |
|
path = path |
|
.concat(strict ? '' : '/?') |
|
.replace(/\/\(/g, '(?:/') |
|
.replace(/(\/)?(\.)?:(\w+)(?:(\(.*?\)))?(\?)?/g, function(_, slash, format, key, capture, optional){ |
|
keys.push({ name: key, optional: !! optional }); |
|
slash = slash || ''; |
|
return '' |
|
+ (optional ? '' : slash) |
|
+ '(?:' |
|
+ (optional ? slash : '') |
|
+ (format || '') + (capture || (format && '([^/.]+?)' || '([^/]+?)')) + ')' |
|
+ (optional || ''); |
|
}) |
|
.replace(/([\/.])/g, '\\$1') |
|
.replace(/\*/g, '(.*)'); |
|
return new RegExp('^' + path + '$', sensitive ? '' : 'i'); |
|
}
|
|
|