/*! * Express - router - Route * Copyright(c) 2010 TJ Holowaychuk * 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' ); }