89 lines
2.0 KiB
JavaScript
89 lines
2.0 KiB
JavaScript
|
|
||
|
/*!
|
||
|
* 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');
|
||
|
}
|