|
1 | 1 | var debug = require('debug')('koa-router');
|
2 | 2 | var pathToRegExp = require('path-to-regexp');
|
| 3 | +var uri = require('urijs'); |
3 | 4 |
|
4 | 5 | module.exports = Layer;
|
5 | 6 |
|
@@ -112,27 +113,42 @@ Layer.prototype.captures = function (path) {
|
112 | 113 | * @private
|
113 | 114 | */
|
114 | 115 |
|
115 |
| -Layer.prototype.url = function (params) { |
| 116 | +Layer.prototype.url = function (params, options) { |
116 | 117 | var args = params;
|
117 | 118 | var url = this.path.replace('\(\.\*\)', '');
|
118 | 119 | var toPath = pathToRegExp.compile(url);
|
| 120 | + var replaced; |
119 | 121 |
|
120 |
| - // argument is of form { key: val } |
121 | 122 | if (typeof params != 'object') {
|
122 | 123 | args = Array.prototype.slice.call(arguments);
|
| 124 | + if (typeof args[args.length - 1] == 'object') { |
| 125 | + options = args[args.length - 1]; |
| 126 | + args = args.slice(0, args.length - 1); |
| 127 | + } |
123 | 128 | }
|
124 | 129 |
|
| 130 | + var tokens = pathToRegExp.parse(url); |
| 131 | + var replace = {}; |
| 132 | + |
125 | 133 | if (args instanceof Array) {
|
126 |
| - var tokens = pathToRegExp.parse(url); |
127 |
| - var replace = {}; |
128 | 134 | for (var len = tokens.length, i=0, j=0; i<len; i++) {
|
129 | 135 | if (tokens[i].name) replace[tokens[i].name] = args[j++];
|
130 | 136 | }
|
131 |
| - return toPath(replace); |
| 137 | + } else if (tokens.some(token => token.name)) { |
| 138 | + replace = params; |
| 139 | + } else { |
| 140 | + options = params; |
132 | 141 | }
|
133 |
| - else { |
134 |
| - return toPath(params); |
| 142 | + |
| 143 | + replaced = toPath(replace); |
| 144 | + |
| 145 | + if (options && options.query) { |
| 146 | + var replaced = new uri(replaced) |
| 147 | + replaced.search(options.query); |
| 148 | + return replaced.toString(); |
135 | 149 | }
|
| 150 | + |
| 151 | + return replaced; |
136 | 152 | };
|
137 | 153 |
|
138 | 154 | /**
|
|
0 commit comments