path-to-regexp 7.0.0 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +44 -10
- package/dist/index.d.ts +20 -15
- package/dist/index.js +80 -53
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/Readme.md
CHANGED
@@ -32,12 +32,13 @@ The `pathToRegexp` function returns a regular expression with `keys` as a proper
|
|
32
32
|
- **path** A string.
|
33
33
|
- **options** _(optional)_
|
34
34
|
- **sensitive** Regexp will be case sensitive. (default: `false`)
|
35
|
-
- **trailing**
|
35
|
+
- **trailing** Allows optional trailing delimiter to match. (default: `true`)
|
36
|
+
- **strict** Verify patterns are valid and safe to use. (default: `false`, recommended: `true`)
|
36
37
|
- **end** Match to the end of the string. (default: `true`)
|
37
38
|
- **start** Match from the beginning of the string. (default: `true`)
|
38
|
-
- **loose** Allow the delimiter to be repeated
|
39
|
+
- **loose** Allow the delimiter to be arbitrarily repeated, e.g. `/` or `///`. (default: `true`)
|
39
40
|
- **delimiter** The default delimiter for segments, e.g. `[^/]` for `:named` parameters. (default: `'/'`)
|
40
|
-
- **encodePath** A function
|
41
|
+
- **encodePath** A function for encoding input strings. (default: `x => x`, recommended: [`encodeurl`](https://github.com/pillarjs/encodeurl) for unicode encoding)
|
41
42
|
|
42
43
|
```js
|
43
44
|
const regexp = pathToRegexp("/foo/:bar");
|
@@ -164,6 +165,20 @@ regexp.exec("/bar/baz");
|
|
164
165
|
//=> [ '/bar/baz', 'bar/baz', index: 0 ]
|
165
166
|
```
|
166
167
|
|
168
|
+
##### Custom separator
|
169
|
+
|
170
|
+
By default, parameters set the separator as the `prefix + suffix` of the token. Using `;` you can modify this:
|
171
|
+
|
172
|
+
```js
|
173
|
+
const regexp = pathToRegexp("/name{/:parts;-}+");
|
174
|
+
|
175
|
+
regexp.exec("/name");
|
176
|
+
//=> null
|
177
|
+
|
178
|
+
regexp.exec("/bar/1-2-3");
|
179
|
+
//=> [ '/name/1-2-3', '1-2-3', index: 0 ]
|
180
|
+
```
|
181
|
+
|
167
182
|
#### Wildcard
|
168
183
|
|
169
184
|
A wildcard can also be used. It is roughly equivalent to `(.*)`.
|
@@ -188,8 +203,7 @@ The `match` function returns a function for transforming paths into parameters:
|
|
188
203
|
- **decode** Function for decoding strings for params, or `false` to disable entirely. (default: `decodeURIComponent`)
|
189
204
|
|
190
205
|
```js
|
191
|
-
|
192
|
-
const fn = match("/user/:id", { decode: decodeURIComponent });
|
206
|
+
const fn = match("/user/:id");
|
193
207
|
|
194
208
|
fn("/user/123"); //=> { path: '/user/123', index: 0, params: { id: '123' } }
|
195
209
|
fn("/invalid"); //=> false
|
@@ -210,15 +224,14 @@ The `compile` function will return a function for transforming parameters into a
|
|
210
224
|
```js
|
211
225
|
const toPath = compile("/user/:id");
|
212
226
|
|
213
|
-
toPath({ id:
|
227
|
+
toPath({ id: "name" }); //=> "/user/name"
|
214
228
|
toPath({ id: "café" }); //=> "/user/caf%C3%A9"
|
215
|
-
toPath({ id: ":/" }); //=> "/user/%3A%2F"
|
216
229
|
|
217
230
|
// When disabling `encode`, you need to make sure inputs are encoded correctly. No arrays are accepted.
|
218
231
|
const toPathRaw = compile("/user/:id", { encode: false });
|
219
232
|
|
220
233
|
toPathRaw({ id: "%3A%2F" }); //=> "/user/%3A%2F"
|
221
|
-
toPathRaw({ id: ":/" }); //=> "/user/:/"
|
234
|
+
toPathRaw({ id: ":/" }); //=> Throws, "/user/:/" when `validate` is `false`.
|
222
235
|
|
223
236
|
const toPathRepeated = compile("{/:segment}+");
|
224
237
|
|
@@ -235,12 +248,15 @@ toPathRegexp({ id: "123" }); //=> "/user/123"
|
|
235
248
|
- If you are rewriting paths with match and compiler, consider using `encode: false` and `decode: false` to keep raw paths passed around.
|
236
249
|
- To ensure matches work on paths containing characters usually encoded, consider using [encodeurl](https://github.com/pillarjs/encodeurl) for `encodePath`.
|
237
250
|
- If matches are intended to be exact, you need to set `loose: false`, `trailing: false`, and `sensitive: true`.
|
251
|
+
- Enable `strict: true` to detect ReDOS issues.
|
238
252
|
|
239
253
|
### Parse
|
240
254
|
|
241
255
|
A `parse` function is available and returns `TokenData`, the set of tokens and other metadata parsed from the input string. `TokenData` is can passed directly into `pathToRegexp`, `match`, and `compile`. It accepts only two options, `delimiter` and `encodePath`, which makes those options redundant in the above methods.
|
242
256
|
|
243
|
-
###
|
257
|
+
### Tokens
|
258
|
+
|
259
|
+
The `tokens` returned by `TokenData` is an array of strings or keys, represented as objects, with the following properties:
|
244
260
|
|
245
261
|
- `name` The name of the token
|
246
262
|
- `prefix` _(optional)_ The prefix string for the segment (e.g. `"/"`)
|
@@ -249,6 +265,20 @@ A `parse` function is available and returns `TokenData`, the set of tokens and o
|
|
249
265
|
- `modifier` _(optional)_ The modifier character used for the segment (e.g. `?`)
|
250
266
|
- `separator` _(optional)_ The string used to separate repeated parameters
|
251
267
|
|
268
|
+
### Custom path
|
269
|
+
|
270
|
+
In some applications, you may not be able to use the `path-to-regexp` syntax (e.g. file-based routing), but you can still use this library for `match`, `compile`, and `pathToRegexp` by building your own `TokenData` instance. For example:
|
271
|
+
|
272
|
+
```js
|
273
|
+
import { TokenData, match } from "path-to-regexp";
|
274
|
+
|
275
|
+
const tokens = ["/", { name: "foo" }];
|
276
|
+
const path = new TokenData(tokens, "/");
|
277
|
+
const fn = match(path);
|
278
|
+
|
279
|
+
fn("/test"); //=> { path: '/test', index: 0, params: { foo: 'test' } }
|
280
|
+
```
|
281
|
+
|
252
282
|
## Errors
|
253
283
|
|
254
284
|
An effort has been made to ensure ambiguous paths from previous releases throw an error. This means you might be seeing an error when things worked before.
|
@@ -261,7 +291,11 @@ In previous major versions `/` and `.` were used as implicit prefixes of paramet
|
|
261
291
|
- `.:key?` → `{.:key}?` or `.:key*` → `{.:key}*` or `.:key+` → `{.:key}+`
|
262
292
|
- `:key?` → `{:key}?` or `:key*` → `{:key}*` or `:key+` → `{:key}+`
|
263
293
|
|
264
|
-
### Unexpected
|
294
|
+
### Unexpected `;`
|
295
|
+
|
296
|
+
Used as a [custom separator](#custom-separator) for repeated parameters.
|
297
|
+
|
298
|
+
### Unexpected `!`, `@`, or `,`
|
265
299
|
|
266
300
|
These characters have been reserved for future use.
|
267
301
|
|
package/dist/index.d.ts
CHANGED
@@ -8,33 +8,37 @@ export type Encode = (value: string) => string;
|
|
8
8
|
export type Decode = (value: string) => string;
|
9
9
|
export interface ParseOptions {
|
10
10
|
/**
|
11
|
-
*
|
11
|
+
* The default delimiter for segments. (default: `'/'`)
|
12
12
|
*/
|
13
13
|
delimiter?: string;
|
14
14
|
/**
|
15
|
-
*
|
15
|
+
* A function for encoding input strings.
|
16
16
|
*/
|
17
17
|
encodePath?: Encode;
|
18
18
|
}
|
19
19
|
export interface PathToRegexpOptions extends ParseOptions {
|
20
20
|
/**
|
21
|
-
*
|
21
|
+
* Regexp will be case sensitive. (default: `false`)
|
22
22
|
*/
|
23
23
|
sensitive?: boolean;
|
24
24
|
/**
|
25
|
-
* Allow delimiter to be arbitrarily repeated. (default: `true`)
|
25
|
+
* Allow the delimiter to be arbitrarily repeated. (default: `true`)
|
26
26
|
*/
|
27
27
|
loose?: boolean;
|
28
28
|
/**
|
29
|
-
*
|
29
|
+
* Verify patterns are valid and safe to use. (default: `false`)
|
30
30
|
*/
|
31
|
-
|
31
|
+
strict?: boolean;
|
32
32
|
/**
|
33
|
-
*
|
33
|
+
* Match from the beginning of the string. (default: `true`)
|
34
34
|
*/
|
35
35
|
start?: boolean;
|
36
36
|
/**
|
37
|
-
*
|
37
|
+
* Match to the end of the string. (default: `true`)
|
38
|
+
*/
|
39
|
+
end?: boolean;
|
40
|
+
/**
|
41
|
+
* Allow optional trailing delimiter to match. (default: `true`)
|
38
42
|
*/
|
39
43
|
trailing?: boolean;
|
40
44
|
}
|
@@ -46,15 +50,19 @@ export interface MatchOptions extends PathToRegexpOptions {
|
|
46
50
|
}
|
47
51
|
export interface CompileOptions extends ParseOptions {
|
48
52
|
/**
|
49
|
-
*
|
53
|
+
* Regexp will be case sensitive. (default: `false`)
|
50
54
|
*/
|
51
55
|
sensitive?: boolean;
|
52
56
|
/**
|
53
|
-
* Allow delimiter to be arbitrarily repeated. (default: `true`)
|
57
|
+
* Allow the delimiter to be arbitrarily repeated. (default: `true`)
|
54
58
|
*/
|
55
59
|
loose?: boolean;
|
56
60
|
/**
|
57
|
-
*
|
61
|
+
* Verify patterns are valid and safe to use. (default: `false`)
|
62
|
+
*/
|
63
|
+
strict?: boolean;
|
64
|
+
/**
|
65
|
+
* Verifies the function is producing a valid path. (default: `true`)
|
58
66
|
*/
|
59
67
|
validate?: boolean;
|
60
68
|
/**
|
@@ -77,7 +85,7 @@ export declare function parse(str: string, options?: ParseOptions): TokenData;
|
|
77
85
|
/**
|
78
86
|
* Compile a string to a template function for the path.
|
79
87
|
*/
|
80
|
-
export declare function compile<P extends
|
88
|
+
export declare function compile<P extends ParamData = ParamData>(path: Path, options?: CompileOptions): PathFunction<P>;
|
81
89
|
export type ParamData = Partial<Record<string, string | string[]>>;
|
82
90
|
export type PathFunction<P extends ParamData> = (data?: P) => string;
|
83
91
|
/**
|
@@ -119,9 +127,6 @@ export type Token = string | Key;
|
|
119
127
|
* Repeated and simple input types.
|
120
128
|
*/
|
121
129
|
export type Path = string | TokenData;
|
122
|
-
export type PathRegExp = RegExp & {
|
123
|
-
keys: Key[];
|
124
|
-
};
|
125
130
|
/**
|
126
131
|
* Normalize the given path string, returning a regular expression.
|
127
132
|
*
|
package/dist/index.js
CHANGED
@@ -1,9 +1,14 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.
|
3
|
+
exports.TokenData = void 0;
|
4
|
+
exports.parse = parse;
|
5
|
+
exports.compile = compile;
|
6
|
+
exports.match = match;
|
7
|
+
exports.pathToRegexp = pathToRegexp;
|
4
8
|
const DEFAULT_DELIMITER = "/";
|
5
9
|
const NOOP_VALUE = (value) => value;
|
6
10
|
const ID_CHAR = /^\p{XID_Continue}$/u;
|
11
|
+
const DEBUG_URL = "https://git.new/pathToRegexpError";
|
7
12
|
const SIMPLE_TOKENS = {
|
8
13
|
"!": "!",
|
9
14
|
"@": "@",
|
@@ -103,7 +108,7 @@ class Iter {
|
|
103
108
|
if (value !== undefined)
|
104
109
|
return value;
|
105
110
|
const { type: nextType, index } = this.peek();
|
106
|
-
throw new TypeError(`Unexpected ${nextType} at ${index}, expected ${type}:
|
111
|
+
throw new TypeError(`Unexpected ${nextType} at ${index}, expected ${type}: ${DEBUG_URL}`);
|
107
112
|
}
|
108
113
|
text() {
|
109
114
|
let result = "";
|
@@ -114,7 +119,7 @@ class Iter {
|
|
114
119
|
return result;
|
115
120
|
}
|
116
121
|
modifier() {
|
117
|
-
return
|
122
|
+
return this.tryConsume("?") || this.tryConsume("*") || this.tryConsume("+");
|
118
123
|
}
|
119
124
|
}
|
120
125
|
/**
|
@@ -131,7 +136,7 @@ exports.TokenData = TokenData;
|
|
131
136
|
* Parse a string for the raw tokens.
|
132
137
|
*/
|
133
138
|
function parse(str, options = {}) {
|
134
|
-
const {
|
139
|
+
const { encodePath = NOOP_VALUE, delimiter = encodePath(DEFAULT_DELIMITER) } = options;
|
135
140
|
const tokens = [];
|
136
141
|
const it = lexer(str);
|
137
142
|
let key = 0;
|
@@ -148,7 +153,7 @@ function parse(str, options = {}) {
|
|
148
153
|
});
|
149
154
|
const next = it.peek();
|
150
155
|
if (next.type === "*") {
|
151
|
-
throw new TypeError(`Unexpected * at ${next.index}, you probably want \`/*\` or \`{/:foo}*\`:
|
156
|
+
throw new TypeError(`Unexpected * at ${next.index}, you probably want \`/*\` or \`{/:foo}*\`: ${DEBUG_URL}`);
|
152
157
|
}
|
153
158
|
continue;
|
154
159
|
}
|
@@ -156,7 +161,7 @@ function parse(str, options = {}) {
|
|
156
161
|
if (asterisk) {
|
157
162
|
tokens.push({
|
158
163
|
name: String(key++),
|
159
|
-
pattern: `
|
164
|
+
pattern: `(?:(?!${escape(delimiter)}).)*`,
|
160
165
|
modifier: "*",
|
161
166
|
separator: delimiter,
|
162
167
|
});
|
@@ -168,7 +173,7 @@ function parse(str, options = {}) {
|
|
168
173
|
const name = it.tryConsume("NAME");
|
169
174
|
const pattern = it.tryConsume("PATTERN");
|
170
175
|
const suffix = it.text();
|
171
|
-
const separator = it.tryConsume(";")
|
176
|
+
const separator = it.tryConsume(";") && it.text();
|
172
177
|
it.consume("}");
|
173
178
|
const modifier = it.modifier();
|
174
179
|
tokens.push({
|
@@ -186,7 +191,6 @@ function parse(str, options = {}) {
|
|
186
191
|
} while (true);
|
187
192
|
return new TokenData(tokens, delimiter);
|
188
193
|
}
|
189
|
-
exports.parse = parse;
|
190
194
|
/**
|
191
195
|
* Compile a string to a template function for the path.
|
192
196
|
*/
|
@@ -194,7 +198,6 @@ function compile(path, options = {}) {
|
|
194
198
|
const data = path instanceof TokenData ? path : parse(path, options);
|
195
199
|
return compileTokens(data, options);
|
196
200
|
}
|
197
|
-
exports.compile = compile;
|
198
201
|
/**
|
199
202
|
* Convert a single token into a path building function.
|
200
203
|
*/
|
@@ -205,7 +208,7 @@ function tokenToFunction(token, encode) {
|
|
205
208
|
const encodeValue = encode || NOOP_VALUE;
|
206
209
|
const repeated = token.modifier === "+" || token.modifier === "*";
|
207
210
|
const optional = token.modifier === "?" || token.modifier === "*";
|
208
|
-
const { prefix = "", suffix = "", separator =
|
211
|
+
const { prefix = "", suffix = "", separator = suffix + prefix } = token;
|
209
212
|
if (encode && repeated) {
|
210
213
|
const stringify = (value, index) => {
|
211
214
|
if (typeof value !== "string") {
|
@@ -257,17 +260,16 @@ function tokenToFunction(token, encode) {
|
|
257
260
|
* Transform tokens into a path building function.
|
258
261
|
*/
|
259
262
|
function compileTokens(data, options) {
|
260
|
-
const { encode = encodeURIComponent, loose = true, validate = true, } = options;
|
261
|
-
const
|
263
|
+
const { encode = encodeURIComponent, loose = true, validate = true, strict = false, } = options;
|
264
|
+
const flags = toFlags(options);
|
262
265
|
const stringify = toStringify(loose, data.delimiter);
|
263
|
-
const
|
266
|
+
const sources = toRegExpSource(data, stringify, [], flags, strict);
|
264
267
|
// Compile all the tokens into regexps.
|
265
|
-
const encoders = data.tokens.map((token) => {
|
268
|
+
const encoders = data.tokens.map((token, index) => {
|
266
269
|
const fn = tokenToFunction(token, encode);
|
267
270
|
if (!validate || typeof token === "string")
|
268
271
|
return fn;
|
269
|
-
const
|
270
|
-
const validRe = new RegExp(`^${pattern}$`, reFlags);
|
272
|
+
const validRe = new RegExp(`^${sources[index]}$`, flags);
|
271
273
|
return (data) => {
|
272
274
|
const value = fn(data);
|
273
275
|
if (!validRe.test(value)) {
|
@@ -294,13 +296,14 @@ function match(path, options = {}) {
|
|
294
296
|
const re = tokensToRegexp(data, keys, options);
|
295
297
|
const decoders = keys.map((key) => {
|
296
298
|
if (decode && (key.modifier === "+" || key.modifier === "*")) {
|
297
|
-
const
|
299
|
+
const { prefix = "", suffix = "", separator = suffix + prefix } = key;
|
300
|
+
const re = new RegExp(stringify(separator), "g");
|
298
301
|
return (value) => value.split(re).map(decode);
|
299
302
|
}
|
300
303
|
return decode || NOOP_VALUE;
|
301
304
|
});
|
302
|
-
return function match(
|
303
|
-
const m = re.exec(
|
305
|
+
return function match(input) {
|
306
|
+
const m = re.exec(input);
|
304
307
|
if (!m)
|
305
308
|
return false;
|
306
309
|
const { 0: path, index } = m;
|
@@ -315,18 +318,18 @@ function match(path, options = {}) {
|
|
315
318
|
return { path, index, params };
|
316
319
|
};
|
317
320
|
}
|
318
|
-
exports.match = match;
|
319
321
|
/**
|
320
322
|
* Escape a regular expression string.
|
321
323
|
*/
|
322
324
|
function escape(str) {
|
323
|
-
return str.replace(/([
|
325
|
+
return str.replace(/([.+*?^${}()[\]|/\\])/g, "\\$1");
|
324
326
|
}
|
325
327
|
/**
|
326
328
|
* Escape and repeat loose characters for regular expressions.
|
327
329
|
*/
|
328
330
|
function looseReplacer(value, loose) {
|
329
|
-
|
331
|
+
const escaped = escape(value);
|
332
|
+
return loose ? `(?:${escaped})+(?!${escaped})` : escaped;
|
330
333
|
}
|
331
334
|
/**
|
332
335
|
* Encode all non-delimiter characters using the encode function.
|
@@ -334,58 +337,83 @@ function looseReplacer(value, loose) {
|
|
334
337
|
function toStringify(loose, delimiter) {
|
335
338
|
if (!loose)
|
336
339
|
return escape;
|
337
|
-
const re = new RegExp(`
|
340
|
+
const re = new RegExp(`(?:(?!${escape(delimiter)}).)+|(.)`, "g");
|
338
341
|
return (value) => value.replace(re, looseReplacer);
|
339
342
|
}
|
340
343
|
/**
|
341
344
|
* Get the flags for a regexp from the options.
|
342
345
|
*/
|
343
|
-
function
|
346
|
+
function toFlags(options) {
|
344
347
|
return options.sensitive ? "" : "i";
|
345
348
|
}
|
346
349
|
/**
|
347
350
|
* Expose a function for taking tokens and returning a RegExp.
|
348
351
|
*/
|
349
352
|
function tokensToRegexp(data, keys, options) {
|
350
|
-
const { trailing = true, start = true, end = true,
|
353
|
+
const { trailing = true, loose = true, start = true, end = true, strict = false, } = options;
|
354
|
+
const flags = toFlags(options);
|
351
355
|
const stringify = toStringify(loose, data.delimiter);
|
352
|
-
const
|
356
|
+
const sources = toRegExpSource(data, stringify, keys, flags, strict);
|
353
357
|
let pattern = start ? "^" : "";
|
354
|
-
|
355
|
-
if (typeof token === "string") {
|
356
|
-
pattern += stringify(token);
|
357
|
-
}
|
358
|
-
else {
|
359
|
-
if (token.name)
|
360
|
-
keys.push(token);
|
361
|
-
pattern += keyToRegexp(token);
|
362
|
-
}
|
363
|
-
}
|
358
|
+
pattern += sources.join("");
|
364
359
|
if (trailing)
|
365
360
|
pattern += `(?:${stringify(data.delimiter)})?`;
|
366
361
|
pattern += end ? "$" : `(?=${escape(data.delimiter)}|$)`;
|
367
|
-
return new RegExp(pattern, flags
|
362
|
+
return new RegExp(pattern, flags);
|
368
363
|
}
|
369
364
|
/**
|
370
365
|
* Convert a token into a regexp string (re-used for path validation).
|
371
366
|
*/
|
372
|
-
function
|
373
|
-
const
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
367
|
+
function toRegExpSource(data, stringify, keys, flags, strict) {
|
368
|
+
const defaultPattern = `(?:(?!${escape(data.delimiter)}).)+?`;
|
369
|
+
let backtrack = "";
|
370
|
+
let safe = true;
|
371
|
+
return data.tokens.map((token, index) => {
|
372
|
+
if (typeof token === "string") {
|
373
|
+
backtrack = token;
|
374
|
+
return stringify(token);
|
375
|
+
}
|
376
|
+
const { prefix = "", suffix = "", separator = suffix + prefix, modifier = "", } = token;
|
377
|
+
const pre = stringify(prefix);
|
378
|
+
const post = stringify(suffix);
|
379
|
+
if (token.name) {
|
380
|
+
const pattern = token.pattern ? `(?:${token.pattern})` : defaultPattern;
|
381
|
+
const re = checkPattern(pattern, token.name, flags);
|
382
|
+
safe || (safe = safePattern(re, prefix || backtrack));
|
383
|
+
if (!safe) {
|
384
|
+
throw new TypeError(`Ambiguous pattern for "${token.name}": ${DEBUG_URL}`);
|
385
|
+
}
|
386
|
+
safe = !strict || safePattern(re, suffix);
|
387
|
+
backtrack = "";
|
388
|
+
keys.push(token);
|
389
|
+
if (modifier === "+" || modifier === "*") {
|
390
|
+
const mod = modifier === "*" ? "?" : "";
|
391
|
+
const sep = stringify(separator);
|
392
|
+
if (!sep) {
|
393
|
+
throw new TypeError(`Missing separator for "${token.name}": ${DEBUG_URL}`);
|
394
|
+
}
|
395
|
+
safe || (safe = !strict || safePattern(re, separator));
|
396
|
+
if (!safe) {
|
397
|
+
throw new TypeError(`Ambiguous pattern for "${token.name}" separator: ${DEBUG_URL}`);
|
398
|
+
}
|
399
|
+
safe = !strict;
|
400
|
+
return `(?:${pre}(${pattern}(?:${sep}${pattern})*)${post})${mod}`;
|
384
401
|
}
|
385
|
-
return `(?:${
|
402
|
+
return `(?:${pre}(${pattern})${post})${modifier}`;
|
386
403
|
}
|
387
|
-
return `(?:${
|
388
|
-
};
|
404
|
+
return `(?:${pre}${post})${modifier}`;
|
405
|
+
});
|
406
|
+
}
|
407
|
+
function checkPattern(pattern, name, flags) {
|
408
|
+
try {
|
409
|
+
return new RegExp(`^${pattern}$`, flags);
|
410
|
+
}
|
411
|
+
catch (err) {
|
412
|
+
throw new TypeError(`Invalid pattern for "${name}": ${err.message}`);
|
413
|
+
}
|
414
|
+
}
|
415
|
+
function safePattern(re, value) {
|
416
|
+
return value ? !re.test(value) : false;
|
389
417
|
}
|
390
418
|
/**
|
391
419
|
* Normalize the given path string, returning a regular expression.
|
@@ -400,5 +428,4 @@ function pathToRegexp(path, options = {}) {
|
|
400
428
|
const regexp = tokensToRegexp(data, keys, options);
|
401
429
|
return Object.assign(regexp, { keys });
|
402
430
|
}
|
403
|
-
exports.pathToRegexp = pathToRegexp;
|
404
431
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const DEFAULT_DELIMITER = \"/\";\nconst NOOP_VALUE = (value: string) => value;\nconst ID_CHAR = /^\\p{XID_Continue}$/u;\n\n/**\n * Encode a string into another string.\n */\nexport type Encode = (value: string) => string;\n\n/**\n * Decode a string into another string.\n */\nexport type Decode = (value: string) => string;\n\nexport interface ParseOptions {\n /**\n * Set the default delimiter for repeat parameters. (default: `'/'`)\n */\n delimiter?: string;\n /**\n * Function for encoding input strings for output into path.\n */\n encodePath?: Encode;\n}\n\nexport interface PathToRegexpOptions extends ParseOptions {\n /**\n * When `true` the regexp will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * Allow delimiter to be arbitrarily repeated. (default: `true`)\n */\n loose?: boolean;\n /**\n * When `true` the regexp will match to the end of the string. (default: `true`)\n */\n end?: boolean;\n /**\n * When `true` the regexp will match from the beginning of the string. (default: `true`)\n */\n start?: boolean;\n /**\n * When `true` the regexp allows an optional trailing delimiter to match. (default: `true`)\n */\n trailing?: boolean;\n}\n\nexport interface MatchOptions extends PathToRegexpOptions {\n /**\n * Function for decoding strings for params, or `false` to disable entirely. (default: `decodeURIComponent`)\n */\n decode?: Decode | false;\n}\n\nexport interface CompileOptions extends ParseOptions {\n /**\n * When `true` the validation will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * Allow delimiter to be arbitrarily repeated. (default: `true`)\n */\n loose?: boolean;\n /**\n * When `false` the function can produce an invalid (unmatched) path. (default: `true`)\n */\n validate?: boolean;\n /**\n * Function for encoding input strings for output into the path, or `false` to disable entirely. (default: `encodeURIComponent`)\n */\n encode?: Encode | false;\n}\n\ntype TokenType =\n | \"{\"\n | \"}\"\n | \"*\"\n | \"+\"\n | \"?\"\n | \"NAME\"\n | \"PATTERN\"\n | \"CHAR\"\n | \"ESCAPED\"\n | \"END\"\n // Reserved for use.\n | \"!\"\n | \"@\"\n | \",\"\n | \";\";\n\n/**\n * Tokenizer results.\n */\ninterface LexToken {\n type: TokenType;\n index: number;\n value: string;\n}\n\nconst SIMPLE_TOKENS: Record<string, TokenType> = {\n \"!\": \"!\",\n \"@\": \"@\",\n \";\": \";\",\n \",\": \",\",\n \"*\": \"*\",\n \"+\": \"+\",\n \"?\": \"?\",\n \"{\": \"{\",\n \"}\": \"}\",\n};\n\n/**\n * Tokenize input string.\n */\nfunction lexer(str: string) {\n const chars = [...str];\n const tokens: LexToken[] = [];\n let i = 0;\n\n while (i < chars.length) {\n const value = chars[i];\n const type = SIMPLE_TOKENS[value];\n\n if (type) {\n tokens.push({ type, index: i++, value });\n continue;\n }\n\n if (value === \"\\\\\") {\n tokens.push({ type: \"ESCAPED\", index: i++, value: chars[i++] });\n continue;\n }\n\n if (value === \":\") {\n let name = \"\";\n\n while (ID_CHAR.test(chars[++i])) {\n name += chars[i];\n }\n\n if (!name) {\n throw new TypeError(`Missing parameter name at ${i}`);\n }\n\n tokens.push({ type: \"NAME\", index: i, value: name });\n continue;\n }\n\n if (value === \"(\") {\n const pos = i++;\n let count = 1;\n let pattern = \"\";\n\n if (chars[i] === \"?\") {\n throw new TypeError(`Pattern cannot start with \"?\" at ${i}`);\n }\n\n while (i < chars.length) {\n if (chars[i] === \"\\\\\") {\n pattern += chars[i++] + chars[i++];\n continue;\n }\n\n if (chars[i] === \")\") {\n count--;\n if (count === 0) {\n i++;\n break;\n }\n } else if (chars[i] === \"(\") {\n count++;\n if (chars[i + 1] !== \"?\") {\n throw new TypeError(`Capturing groups are not allowed at ${i}`);\n }\n }\n\n pattern += chars[i++];\n }\n\n if (count) throw new TypeError(`Unbalanced pattern at ${pos}`);\n if (!pattern) throw new TypeError(`Missing pattern at ${pos}`);\n\n tokens.push({ type: \"PATTERN\", index: i, value: pattern });\n continue;\n }\n\n tokens.push({ type: \"CHAR\", index: i, value: chars[i++] });\n }\n\n tokens.push({ type: \"END\", index: i, value: \"\" });\n\n return new Iter(tokens);\n}\n\nclass Iter {\n index = 0;\n\n constructor(private tokens: LexToken[]) {}\n\n peek(): LexToken {\n return this.tokens[this.index];\n }\n\n tryConsume(type: LexToken[\"type\"]): string | undefined {\n const token = this.peek();\n if (token.type !== type) return;\n this.index++;\n return token.value;\n }\n\n consume(type: LexToken[\"type\"]): string {\n const value = this.tryConsume(type);\n if (value !== undefined) return value;\n const { type: nextType, index } = this.peek();\n throw new TypeError(\n `Unexpected ${nextType} at ${index}, expected ${type}: https://git.new/pathToRegexpError`,\n );\n }\n\n text(): string {\n let result = \"\";\n let value: string | undefined;\n while ((value = this.tryConsume(\"CHAR\") || this.tryConsume(\"ESCAPED\"))) {\n result += value;\n }\n return result;\n }\n\n modifier(): string {\n return (\n this.tryConsume(\"?\") || this.tryConsume(\"*\") || this.tryConsume(\"+\") || \"\"\n );\n }\n}\n\n/**\n * Tokenized path instance. Can we passed around instead of string.\n */\nexport class TokenData {\n constructor(\n public readonly tokens: Token[],\n public readonly delimiter: string,\n ) {}\n}\n\n/**\n * Parse a string for the raw tokens.\n */\nexport function parse(str: string, options: ParseOptions = {}): TokenData {\n const { delimiter = DEFAULT_DELIMITER, encodePath = NOOP_VALUE } = options;\n const tokens: Token[] = [];\n const it = lexer(str);\n let key = 0;\n\n do {\n const path = it.text();\n if (path) tokens.push(encodePath(path));\n\n const name = it.tryConsume(\"NAME\");\n const pattern = it.tryConsume(\"PATTERN\");\n\n if (name || pattern) {\n tokens.push({\n name: name || String(key++),\n pattern,\n });\n\n const next = it.peek();\n if (next.type === \"*\") {\n throw new TypeError(\n `Unexpected * at ${next.index}, you probably want \\`/*\\` or \\`{/:foo}*\\`: https://git.new/pathToRegexpError`,\n );\n }\n\n continue;\n }\n\n const asterisk = it.tryConsume(\"*\");\n if (asterisk) {\n tokens.push({\n name: String(key++),\n pattern: `[^${escape(delimiter)}]*`,\n modifier: \"*\",\n separator: delimiter,\n });\n continue;\n }\n\n const open = it.tryConsume(\"{\");\n if (open) {\n const prefix = it.text();\n const name = it.tryConsume(\"NAME\");\n const pattern = it.tryConsume(\"PATTERN\");\n const suffix = it.text();\n const separator = it.tryConsume(\";\") ? it.text() : prefix + suffix;\n\n it.consume(\"}\");\n\n const modifier = it.modifier();\n\n tokens.push({\n name: name || (pattern ? String(key++) : \"\"),\n prefix: encodePath(prefix),\n suffix: encodePath(suffix),\n pattern,\n modifier,\n separator,\n });\n continue;\n }\n\n it.consume(\"END\");\n break;\n } while (true);\n\n return new TokenData(tokens, delimiter);\n}\n\n/**\n * Compile a string to a template function for the path.\n */\nexport function compile<P extends object = object>(\n path: Path,\n options: CompileOptions = {},\n) {\n const data = path instanceof TokenData ? path : parse(path, options);\n return compileTokens<P>(data, options);\n}\n\nexport type ParamData = Partial<Record<string, string | string[]>>;\nexport type PathFunction<P extends ParamData> = (data?: P) => string;\n\n/**\n * Convert a single token into a path building function.\n */\nfunction tokenToFunction(\n token: Token,\n encode: Encode | false,\n): (data: ParamData) => string {\n if (typeof token === \"string\") {\n return () => token;\n }\n\n const encodeValue = encode || NOOP_VALUE;\n const repeated = token.modifier === \"+\" || token.modifier === \"*\";\n const optional = token.modifier === \"?\" || token.modifier === \"*\";\n const { prefix = \"\", suffix = \"\", separator = \"\" } = token;\n\n if (encode && repeated) {\n const stringify = (value: string, index: number) => {\n if (typeof value !== \"string\") {\n throw new TypeError(`Expected \"${token.name}/${index}\" to be a string`);\n }\n return encodeValue(value);\n };\n\n const compile = (value: unknown) => {\n if (!Array.isArray(value)) {\n throw new TypeError(`Expected \"${token.name}\" to be an array`);\n }\n\n if (value.length === 0) return \"\";\n\n return prefix + value.map(stringify).join(separator) + suffix;\n };\n\n if (optional) {\n return (data): string => {\n const value = data[token.name];\n if (value == null) return \"\";\n return value.length ? compile(value) : \"\";\n };\n }\n\n return (data): string => {\n const value = data[token.name];\n return compile(value);\n };\n }\n\n const stringify = (value: unknown) => {\n if (typeof value !== \"string\") {\n throw new TypeError(`Expected \"${token.name}\" to be a string`);\n }\n return prefix + encodeValue(value) + suffix;\n };\n\n if (optional) {\n return (data): string => {\n const value = data[token.name];\n if (value == null) return \"\";\n return stringify(value);\n };\n }\n\n return (data): string => {\n const value = data[token.name];\n return stringify(value);\n };\n}\n\n/**\n * Transform tokens into a path building function.\n */\nfunction compileTokens<P extends ParamData>(\n data: TokenData,\n options: CompileOptions,\n): PathFunction<P> {\n const {\n encode = encodeURIComponent,\n loose = true,\n validate = true,\n } = options;\n const reFlags = flags(options);\n const stringify = toStringify(loose, data.delimiter);\n const keyToRegexp = toKeyRegexp(stringify, data.delimiter);\n\n // Compile all the tokens into regexps.\n const encoders: Array<(data: ParamData) => string> = data.tokens.map(\n (token) => {\n const fn = tokenToFunction(token, encode);\n if (!validate || typeof token === \"string\") return fn;\n\n const pattern = keyToRegexp(token);\n const validRe = new RegExp(`^${pattern}$`, reFlags);\n\n return (data) => {\n const value = fn(data);\n if (!validRe.test(value)) {\n throw new TypeError(\n `Invalid value for \"${token.name}\": ${JSON.stringify(value)}`,\n );\n }\n return value;\n };\n },\n );\n\n return function path(data: Record<string, any> = {}) {\n let path = \"\";\n for (const encoder of encoders) path += encoder(data);\n return path;\n };\n}\n\n/**\n * A match result contains data about the path match.\n */\nexport interface MatchResult<P extends ParamData> {\n path: string;\n index: number;\n params: P;\n}\n\n/**\n * A match is either `false` (no match) or a match result.\n */\nexport type Match<P extends ParamData> = false | MatchResult<P>;\n\n/**\n * The match function takes a string and returns whether it matched the path.\n */\nexport type MatchFunction<P extends ParamData> = (path: string) => Match<P>;\n\n/**\n * Create path match function from `path-to-regexp` spec.\n */\nexport function match<P extends ParamData>(\n path: Path,\n options: MatchOptions = {},\n): MatchFunction<P> {\n const { decode = decodeURIComponent, loose = true } = options;\n const data = path instanceof TokenData ? path : parse(path, options);\n const stringify = toStringify(loose, data.delimiter);\n const keys: Key[] = [];\n const re = tokensToRegexp(data, keys, options);\n\n const decoders = keys.map((key) => {\n if (decode && (key.modifier === \"+\" || key.modifier === \"*\")) {\n const re = new RegExp(stringify(key.separator || \"\"), \"g\");\n return (value: string) => value.split(re).map(decode);\n }\n\n return decode || NOOP_VALUE;\n });\n\n return function match(pathname: string) {\n const m = re.exec(pathname);\n if (!m) return false;\n\n const { 0: path, index } = m;\n const params = Object.create(null);\n\n for (let i = 1; i < m.length; i++) {\n if (m[i] === undefined) continue;\n\n const key = keys[i - 1];\n const decoder = decoders[i - 1];\n params[key.name] = decoder(m[i]);\n }\n\n return { path, index, params };\n };\n}\n\n/**\n * Escape a regular expression string.\n */\nfunction escape(str: string) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, \"\\\\$1\");\n}\n\n/**\n * Escape and repeat loose characters for regular expressions.\n */\nfunction looseReplacer(value: string, loose: string) {\n return loose ? `${escape(value)}+` : escape(value);\n}\n\n/**\n * Encode all non-delimiter characters using the encode function.\n */\nfunction toStringify(loose: boolean, delimiter: string) {\n if (!loose) return escape;\n\n const re = new RegExp(`[^${escape(delimiter)}]+|(.)`, \"g\");\n return (value: string) => value.replace(re, looseReplacer);\n}\n\n/**\n * Get the flags for a regexp from the options.\n */\nfunction flags(options: { sensitive?: boolean }) {\n return options.sensitive ? \"\" : \"i\";\n}\n\n/**\n * A key is a capture group in the regex.\n */\nexport interface Key {\n name: string;\n prefix?: string;\n suffix?: string;\n pattern?: string;\n modifier?: string;\n separator?: string;\n}\n\n/**\n * A token is a string (nothing special) or key metadata (capture group).\n */\nexport type Token = string | Key;\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n */\nfunction tokensToRegexp(\n data: TokenData,\n keys: Key[],\n options: PathToRegexpOptions,\n): RegExp {\n const { trailing = true, start = true, end = true, loose = true } = options;\n const stringify = toStringify(loose, data.delimiter);\n const keyToRegexp = toKeyRegexp(stringify, data.delimiter);\n let pattern = start ? \"^\" : \"\";\n\n for (const token of data.tokens) {\n if (typeof token === \"string\") {\n pattern += stringify(token);\n } else {\n if (token.name) keys.push(token);\n pattern += keyToRegexp(token);\n }\n }\n\n if (trailing) pattern += `(?:${stringify(data.delimiter)})?`;\n pattern += end ? \"$\" : `(?=${escape(data.delimiter)}|$)`;\n\n return new RegExp(pattern, flags(options));\n}\n\n/**\n * Convert a token into a regexp string (re-used for path validation).\n */\nfunction toKeyRegexp(stringify: Encode, delimiter: string) {\n const segmentPattern = `[^${escape(delimiter)}]+?`;\n\n return (key: Key) => {\n const prefix = key.prefix ? stringify(key.prefix) : \"\";\n const suffix = key.suffix ? stringify(key.suffix) : \"\";\n const modifier = key.modifier || \"\";\n\n if (key.name) {\n const pattern = key.pattern || segmentPattern;\n if (key.modifier === \"+\" || key.modifier === \"*\") {\n const mod = key.modifier === \"*\" ? \"?\" : \"\";\n const split = key.separator ? stringify(key.separator) : \"\";\n return `(?:${prefix}((?:${pattern})(?:${split}(?:${pattern}))*)${suffix})${mod}`;\n }\n return `(?:${prefix}(${pattern})${suffix})${modifier}`;\n }\n\n return `(?:${prefix}${suffix})${modifier}`;\n };\n}\n\n/**\n * Repeated and simple input types.\n */\nexport type Path = string | TokenData;\n\nexport type PathRegExp = RegExp & { keys: Key[] };\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n */\nexport function pathToRegexp(path: Path, options: PathToRegexpOptions = {}) {\n const data = path instanceof TokenData ? path : parse(path, options);\n const keys: Key[] = [];\n const regexp = tokensToRegexp(data, keys, options);\n return Object.assign(regexp, { keys });\n}\n"]}
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["const DEFAULT_DELIMITER = \"/\";\nconst NOOP_VALUE = (value: string) => value;\nconst ID_CHAR = /^\\p{XID_Continue}$/u;\nconst DEBUG_URL = \"https://git.new/pathToRegexpError\";\n\n/**\n * Encode a string into another string.\n */\nexport type Encode = (value: string) => string;\n\n/**\n * Decode a string into another string.\n */\nexport type Decode = (value: string) => string;\n\nexport interface ParseOptions {\n /**\n * The default delimiter for segments. (default: `'/'`)\n */\n delimiter?: string;\n /**\n * A function for encoding input strings.\n */\n encodePath?: Encode;\n}\n\nexport interface PathToRegexpOptions extends ParseOptions {\n /**\n * Regexp will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * Allow the delimiter to be arbitrarily repeated. (default: `true`)\n */\n loose?: boolean;\n /**\n * Verify patterns are valid and safe to use. (default: `false`)\n */\n strict?: boolean;\n /**\n * Match from the beginning of the string. (default: `true`)\n */\n start?: boolean;\n /**\n * Match to the end of the string. (default: `true`)\n */\n end?: boolean;\n /**\n * Allow optional trailing delimiter to match. (default: `true`)\n */\n trailing?: boolean;\n}\n\nexport interface MatchOptions extends PathToRegexpOptions {\n /**\n * Function for decoding strings for params, or `false` to disable entirely. (default: `decodeURIComponent`)\n */\n decode?: Decode | false;\n}\n\nexport interface CompileOptions extends ParseOptions {\n /**\n * Regexp will be case sensitive. (default: `false`)\n */\n sensitive?: boolean;\n /**\n * Allow the delimiter to be arbitrarily repeated. (default: `true`)\n */\n loose?: boolean;\n /**\n * Verify patterns are valid and safe to use. (default: `false`)\n */\n strict?: boolean;\n /**\n * Verifies the function is producing a valid path. (default: `true`)\n */\n validate?: boolean;\n /**\n * Function for encoding input strings for output into the path, or `false` to disable entirely. (default: `encodeURIComponent`)\n */\n encode?: Encode | false;\n}\n\ntype TokenType =\n | \"{\"\n | \"}\"\n | \";\"\n | \"*\"\n | \"+\"\n | \"?\"\n | \"NAME\"\n | \"PATTERN\"\n | \"CHAR\"\n | \"ESCAPED\"\n | \"END\"\n // Reserved for use.\n | \"!\"\n | \"@\"\n | \",\";\n\n/**\n * Tokenizer results.\n */\ninterface LexToken {\n type: TokenType;\n index: number;\n value: string;\n}\n\nconst SIMPLE_TOKENS: Record<string, TokenType> = {\n \"!\": \"!\",\n \"@\": \"@\",\n \";\": \";\",\n \",\": \",\",\n \"*\": \"*\",\n \"+\": \"+\",\n \"?\": \"?\",\n \"{\": \"{\",\n \"}\": \"}\",\n};\n\n/**\n * Tokenize input string.\n */\nfunction lexer(str: string) {\n const chars = [...str];\n const tokens: LexToken[] = [];\n let i = 0;\n\n while (i < chars.length) {\n const value = chars[i];\n const type = SIMPLE_TOKENS[value];\n\n if (type) {\n tokens.push({ type, index: i++, value });\n continue;\n }\n\n if (value === \"\\\\\") {\n tokens.push({ type: \"ESCAPED\", index: i++, value: chars[i++] });\n continue;\n }\n\n if (value === \":\") {\n let name = \"\";\n\n while (ID_CHAR.test(chars[++i])) {\n name += chars[i];\n }\n\n if (!name) {\n throw new TypeError(`Missing parameter name at ${i}`);\n }\n\n tokens.push({ type: \"NAME\", index: i, value: name });\n continue;\n }\n\n if (value === \"(\") {\n const pos = i++;\n let count = 1;\n let pattern = \"\";\n\n if (chars[i] === \"?\") {\n throw new TypeError(`Pattern cannot start with \"?\" at ${i}`);\n }\n\n while (i < chars.length) {\n if (chars[i] === \"\\\\\") {\n pattern += chars[i++] + chars[i++];\n continue;\n }\n\n if (chars[i] === \")\") {\n count--;\n if (count === 0) {\n i++;\n break;\n }\n } else if (chars[i] === \"(\") {\n count++;\n if (chars[i + 1] !== \"?\") {\n throw new TypeError(`Capturing groups are not allowed at ${i}`);\n }\n }\n\n pattern += chars[i++];\n }\n\n if (count) throw new TypeError(`Unbalanced pattern at ${pos}`);\n if (!pattern) throw new TypeError(`Missing pattern at ${pos}`);\n\n tokens.push({ type: \"PATTERN\", index: i, value: pattern });\n continue;\n }\n\n tokens.push({ type: \"CHAR\", index: i, value: chars[i++] });\n }\n\n tokens.push({ type: \"END\", index: i, value: \"\" });\n\n return new Iter(tokens);\n}\n\nclass Iter {\n index = 0;\n\n constructor(private tokens: LexToken[]) {}\n\n peek(): LexToken {\n return this.tokens[this.index];\n }\n\n tryConsume(type: LexToken[\"type\"]): string | undefined {\n const token = this.peek();\n if (token.type !== type) return;\n this.index++;\n return token.value;\n }\n\n consume(type: LexToken[\"type\"]): string {\n const value = this.tryConsume(type);\n if (value !== undefined) return value;\n const { type: nextType, index } = this.peek();\n throw new TypeError(\n `Unexpected ${nextType} at ${index}, expected ${type}: ${DEBUG_URL}`,\n );\n }\n\n text(): string {\n let result = \"\";\n let value: string | undefined;\n while ((value = this.tryConsume(\"CHAR\") || this.tryConsume(\"ESCAPED\"))) {\n result += value;\n }\n return result;\n }\n\n modifier(): string | undefined {\n return this.tryConsume(\"?\") || this.tryConsume(\"*\") || this.tryConsume(\"+\");\n }\n}\n\n/**\n * Tokenized path instance. Can we passed around instead of string.\n */\nexport class TokenData {\n constructor(\n public readonly tokens: Token[],\n public readonly delimiter: string,\n ) {}\n}\n\n/**\n * Parse a string for the raw tokens.\n */\nexport function parse(str: string, options: ParseOptions = {}): TokenData {\n const { encodePath = NOOP_VALUE, delimiter = encodePath(DEFAULT_DELIMITER) } =\n options;\n const tokens: Token[] = [];\n const it = lexer(str);\n let key = 0;\n\n do {\n const path = it.text();\n if (path) tokens.push(encodePath(path));\n\n const name = it.tryConsume(\"NAME\");\n const pattern = it.tryConsume(\"PATTERN\");\n\n if (name || pattern) {\n tokens.push({\n name: name || String(key++),\n pattern,\n });\n\n const next = it.peek();\n if (next.type === \"*\") {\n throw new TypeError(\n `Unexpected * at ${next.index}, you probably want \\`/*\\` or \\`{/:foo}*\\`: ${DEBUG_URL}`,\n );\n }\n\n continue;\n }\n\n const asterisk = it.tryConsume(\"*\");\n if (asterisk) {\n tokens.push({\n name: String(key++),\n pattern: `(?:(?!${escape(delimiter)}).)*`,\n modifier: \"*\",\n separator: delimiter,\n });\n continue;\n }\n\n const open = it.tryConsume(\"{\");\n if (open) {\n const prefix = it.text();\n const name = it.tryConsume(\"NAME\");\n const pattern = it.tryConsume(\"PATTERN\");\n const suffix = it.text();\n const separator = it.tryConsume(\";\") && it.text();\n\n it.consume(\"}\");\n\n const modifier = it.modifier();\n\n tokens.push({\n name: name || (pattern ? String(key++) : \"\"),\n prefix: encodePath(prefix),\n suffix: encodePath(suffix),\n pattern,\n modifier,\n separator,\n });\n continue;\n }\n\n it.consume(\"END\");\n break;\n } while (true);\n\n return new TokenData(tokens, delimiter);\n}\n\n/**\n * Compile a string to a template function for the path.\n */\nexport function compile<P extends ParamData = ParamData>(\n path: Path,\n options: CompileOptions = {},\n) {\n const data = path instanceof TokenData ? path : parse(path, options);\n return compileTokens<P>(data, options);\n}\n\nexport type ParamData = Partial<Record<string, string | string[]>>;\nexport type PathFunction<P extends ParamData> = (data?: P) => string;\n\n/**\n * Convert a single token into a path building function.\n */\nfunction tokenToFunction(\n token: Token,\n encode: Encode | false,\n): (data: ParamData) => string {\n if (typeof token === \"string\") {\n return () => token;\n }\n\n const encodeValue = encode || NOOP_VALUE;\n const repeated = token.modifier === \"+\" || token.modifier === \"*\";\n const optional = token.modifier === \"?\" || token.modifier === \"*\";\n const { prefix = \"\", suffix = \"\", separator = suffix + prefix } = token;\n\n if (encode && repeated) {\n const stringify = (value: string, index: number) => {\n if (typeof value !== \"string\") {\n throw new TypeError(`Expected \"${token.name}/${index}\" to be a string`);\n }\n return encodeValue(value);\n };\n\n const compile = (value: unknown) => {\n if (!Array.isArray(value)) {\n throw new TypeError(`Expected \"${token.name}\" to be an array`);\n }\n\n if (value.length === 0) return \"\";\n\n return prefix + value.map(stringify).join(separator) + suffix;\n };\n\n if (optional) {\n return (data): string => {\n const value = data[token.name];\n if (value == null) return \"\";\n return value.length ? compile(value) : \"\";\n };\n }\n\n return (data): string => {\n const value = data[token.name];\n return compile(value);\n };\n }\n\n const stringify = (value: unknown) => {\n if (typeof value !== \"string\") {\n throw new TypeError(`Expected \"${token.name}\" to be a string`);\n }\n return prefix + encodeValue(value) + suffix;\n };\n\n if (optional) {\n return (data): string => {\n const value = data[token.name];\n if (value == null) return \"\";\n return stringify(value);\n };\n }\n\n return (data): string => {\n const value = data[token.name];\n return stringify(value);\n };\n}\n\n/**\n * Transform tokens into a path building function.\n */\nfunction compileTokens<P extends ParamData>(\n data: TokenData,\n options: CompileOptions,\n): PathFunction<P> {\n const {\n encode = encodeURIComponent,\n loose = true,\n validate = true,\n strict = false,\n } = options;\n const flags = toFlags(options);\n const stringify = toStringify(loose, data.delimiter);\n const sources = toRegExpSource(data, stringify, [], flags, strict);\n\n // Compile all the tokens into regexps.\n const encoders: Array<(data: ParamData) => string> = data.tokens.map(\n (token, index) => {\n const fn = tokenToFunction(token, encode);\n if (!validate || typeof token === \"string\") return fn;\n\n const validRe = new RegExp(`^${sources[index]}$`, flags);\n\n return (data) => {\n const value = fn(data);\n if (!validRe.test(value)) {\n throw new TypeError(\n `Invalid value for \"${token.name}\": ${JSON.stringify(value)}`,\n );\n }\n return value;\n };\n },\n );\n\n return function path(data: Record<string, any> = {}) {\n let path = \"\";\n for (const encoder of encoders) path += encoder(data);\n return path;\n };\n}\n\n/**\n * A match result contains data about the path match.\n */\nexport interface MatchResult<P extends ParamData> {\n path: string;\n index: number;\n params: P;\n}\n\n/**\n * A match is either `false` (no match) or a match result.\n */\nexport type Match<P extends ParamData> = false | MatchResult<P>;\n\n/**\n * The match function takes a string and returns whether it matched the path.\n */\nexport type MatchFunction<P extends ParamData> = (path: string) => Match<P>;\n\n/**\n * Create path match function from `path-to-regexp` spec.\n */\nexport function match<P extends ParamData>(\n path: Path,\n options: MatchOptions = {},\n): MatchFunction<P> {\n const { decode = decodeURIComponent, loose = true } = options;\n const data = path instanceof TokenData ? path : parse(path, options);\n const stringify = toStringify(loose, data.delimiter);\n const keys: Key[] = [];\n const re = tokensToRegexp(data, keys, options);\n\n const decoders = keys.map((key) => {\n if (decode && (key.modifier === \"+\" || key.modifier === \"*\")) {\n const { prefix = \"\", suffix = \"\", separator = suffix + prefix } = key;\n const re = new RegExp(stringify(separator), \"g\");\n return (value: string) => value.split(re).map(decode);\n }\n\n return decode || NOOP_VALUE;\n });\n\n return function match(input: string) {\n const m = re.exec(input);\n if (!m) return false;\n\n const { 0: path, index } = m;\n const params = Object.create(null);\n\n for (let i = 1; i < m.length; i++) {\n if (m[i] === undefined) continue;\n\n const key = keys[i - 1];\n const decoder = decoders[i - 1];\n params[key.name] = decoder(m[i]);\n }\n\n return { path, index, params };\n };\n}\n\n/**\n * Escape a regular expression string.\n */\nfunction escape(str: string) {\n return str.replace(/([.+*?^${}()[\\]|/\\\\])/g, \"\\\\$1\");\n}\n\n/**\n * Escape and repeat loose characters for regular expressions.\n */\nfunction looseReplacer(value: string, loose: string) {\n const escaped = escape(value);\n return loose ? `(?:${escaped})+(?!${escaped})` : escaped;\n}\n\n/**\n * Encode all non-delimiter characters using the encode function.\n */\nfunction toStringify(loose: boolean, delimiter: string) {\n if (!loose) return escape;\n\n const re = new RegExp(`(?:(?!${escape(delimiter)}).)+|(.)`, \"g\");\n return (value: string) => value.replace(re, looseReplacer);\n}\n\n/**\n * Get the flags for a regexp from the options.\n */\nfunction toFlags(options: { sensitive?: boolean }) {\n return options.sensitive ? \"\" : \"i\";\n}\n\n/**\n * A key is a capture group in the regex.\n */\nexport interface Key {\n name: string;\n prefix?: string;\n suffix?: string;\n pattern?: string;\n modifier?: string;\n separator?: string;\n}\n\n/**\n * A token is a string (nothing special) or key metadata (capture group).\n */\nexport type Token = string | Key;\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n */\nfunction tokensToRegexp(\n data: TokenData,\n keys: Key[],\n options: PathToRegexpOptions,\n): RegExp {\n const {\n trailing = true,\n loose = true,\n start = true,\n end = true,\n strict = false,\n } = options;\n const flags = toFlags(options);\n const stringify = toStringify(loose, data.delimiter);\n const sources = toRegExpSource(data, stringify, keys, flags, strict);\n let pattern = start ? \"^\" : \"\";\n pattern += sources.join(\"\");\n if (trailing) pattern += `(?:${stringify(data.delimiter)})?`;\n pattern += end ? \"$\" : `(?=${escape(data.delimiter)}|$)`;\n\n return new RegExp(pattern, flags);\n}\n\n/**\n * Convert a token into a regexp string (re-used for path validation).\n */\nfunction toRegExpSource(\n data: TokenData,\n stringify: Encode,\n keys: Key[],\n flags: string,\n strict: boolean,\n): string[] {\n const defaultPattern = `(?:(?!${escape(data.delimiter)}).)+?`;\n let backtrack = \"\";\n let safe = true;\n\n return data.tokens.map((token, index) => {\n if (typeof token === \"string\") {\n backtrack = token;\n return stringify(token);\n }\n\n const {\n prefix = \"\",\n suffix = \"\",\n separator = suffix + prefix,\n modifier = \"\",\n } = token;\n\n const pre = stringify(prefix);\n const post = stringify(suffix);\n\n if (token.name) {\n const pattern = token.pattern ? `(?:${token.pattern})` : defaultPattern;\n const re = checkPattern(pattern, token.name, flags);\n\n safe ||= safePattern(re, prefix || backtrack);\n if (!safe) {\n throw new TypeError(\n `Ambiguous pattern for \"${token.name}\": ${DEBUG_URL}`,\n );\n }\n safe = !strict || safePattern(re, suffix);\n backtrack = \"\";\n\n keys.push(token);\n\n if (modifier === \"+\" || modifier === \"*\") {\n const mod = modifier === \"*\" ? \"?\" : \"\";\n const sep = stringify(separator);\n\n if (!sep) {\n throw new TypeError(\n `Missing separator for \"${token.name}\": ${DEBUG_URL}`,\n );\n }\n\n safe ||= !strict || safePattern(re, separator);\n if (!safe) {\n throw new TypeError(\n `Ambiguous pattern for \"${token.name}\" separator: ${DEBUG_URL}`,\n );\n }\n safe = !strict;\n\n return `(?:${pre}(${pattern}(?:${sep}${pattern})*)${post})${mod}`;\n }\n\n return `(?:${pre}(${pattern})${post})${modifier}`;\n }\n\n return `(?:${pre}${post})${modifier}`;\n });\n}\n\nfunction checkPattern(pattern: string, name: string, flags: string) {\n try {\n return new RegExp(`^${pattern}$`, flags);\n } catch (err: any) {\n throw new TypeError(`Invalid pattern for \"${name}\": ${err.message}`);\n }\n}\n\nfunction safePattern(re: RegExp, value: string) {\n return value ? !re.test(value) : false;\n}\n\n/**\n * Repeated and simple input types.\n */\nexport type Path = string | TokenData;\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n */\nexport function pathToRegexp(path: Path, options: PathToRegexpOptions = {}) {\n const data = path instanceof TokenData ? path : parse(path, options);\n const keys: Key[] = [];\n const regexp = tokensToRegexp(data, keys, options);\n return Object.assign(regexp, { keys });\n}\n"]}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "path-to-regexp",
|
3
|
-
"version": "7.
|
3
|
+
"version": "7.1.0",
|
4
4
|
"description": "Express style path to RegExp utility",
|
5
5
|
"keywords": [
|
6
6
|
"express",
|
@@ -34,8 +34,9 @@
|
|
34
34
|
"@types/node": "^20.4.9",
|
35
35
|
"@types/semver": "^7.3.1",
|
36
36
|
"@vitest/coverage-v8": "^1.4.0",
|
37
|
+
"recheck": "^4.4.5",
|
37
38
|
"size-limit": "^11.1.2",
|
38
|
-
"typescript": "^5.
|
39
|
+
"typescript": "^5.5.3"
|
39
40
|
},
|
40
41
|
"engines": {
|
41
42
|
"node": ">=16"
|