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 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** Regexp allows an optional trailing delimiter to match. (default: `true`)
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 an arbitrary number of times. (default: `true`)
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 to encode strings before inserting into `RegExp`. (default: `x => x`, recommended: [`encodeurl`](https://github.com/pillarjs/encodeurl))
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
- // Make sure you consistently `decode` segments.
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: 123 }); //=> "/user/123"
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/:/", throws when `validate: false` is not set.
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
- ### Token Information
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 `!`, `@`, `,`, or `;`
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
- * Set the default delimiter for repeat parameters. (default: `'/'`)
11
+ * The default delimiter for segments. (default: `'/'`)
12
12
  */
13
13
  delimiter?: string;
14
14
  /**
15
- * Function for encoding input strings for output into path.
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
- * When `true` the regexp will be case sensitive. (default: `false`)
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
- * When `true` the regexp will match to the end of the string. (default: `true`)
29
+ * Verify patterns are valid and safe to use. (default: `false`)
30
30
  */
31
- end?: boolean;
31
+ strict?: boolean;
32
32
  /**
33
- * When `true` the regexp will match from the beginning of the string. (default: `true`)
33
+ * Match from the beginning of the string. (default: `true`)
34
34
  */
35
35
  start?: boolean;
36
36
  /**
37
- * When `true` the regexp allows an optional trailing delimiter to match. (default: `true`)
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
- * When `true` the validation will be case sensitive. (default: `false`)
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
- * When `false` the function can produce an invalid (unmatched) path. (default: `true`)
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 object = object>(path: Path, options?: CompileOptions): PathFunction<P>;
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.pathToRegexp = exports.match = exports.compile = exports.parse = exports.TokenData = void 0;
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}: https://git.new/pathToRegexpError`);
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 (this.tryConsume("?") || this.tryConsume("*") || this.tryConsume("+") || "");
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 { delimiter = DEFAULT_DELIMITER, encodePath = NOOP_VALUE } = options;
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}*\`: https://git.new/pathToRegexpError`);
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: `[^${escape(delimiter)}]*`,
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(";") ? it.text() : prefix + suffix;
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 = "" } = token;
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 reFlags = flags(options);
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 keyToRegexp = toKeyRegexp(stringify, data.delimiter);
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 pattern = keyToRegexp(token);
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 re = new RegExp(stringify(key.separator || ""), "g");
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(pathname) {
303
- const m = re.exec(pathname);
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(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1");
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
- return loose ? `${escape(value)}+` : escape(value);
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(`[^${escape(delimiter)}]+|(.)`, "g");
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 flags(options) {
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, loose = true } = options;
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 keyToRegexp = toKeyRegexp(stringify, data.delimiter);
356
+ const sources = toRegExpSource(data, stringify, keys, flags, strict);
353
357
  let pattern = start ? "^" : "";
354
- for (const token of data.tokens) {
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(options));
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 toKeyRegexp(stringify, delimiter) {
373
- const segmentPattern = `[^${escape(delimiter)}]+?`;
374
- return (key) => {
375
- const prefix = key.prefix ? stringify(key.prefix) : "";
376
- const suffix = key.suffix ? stringify(key.suffix) : "";
377
- const modifier = key.modifier || "";
378
- if (key.name) {
379
- const pattern = key.pattern || segmentPattern;
380
- if (key.modifier === "+" || key.modifier === "*") {
381
- const mod = key.modifier === "*" ? "?" : "";
382
- const split = key.separator ? stringify(key.separator) : "";
383
- return `(?:${prefix}((?:${pattern})(?:${split}(?:${pattern}))*)${suffix})${mod}`;
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 `(?:${prefix}(${pattern})${suffix})${modifier}`;
402
+ return `(?:${pre}(${pattern})${post})${modifier}`;
386
403
  }
387
- return `(?:${prefix}${suffix})${modifier}`;
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.0.0",
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.1.6"
39
+ "typescript": "^5.5.3"
39
40
  },
40
41
  "engines": {
41
42
  "node": ">=16"