| |
| /*! |
| * 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'); |
| } |