Bump the npm group with 3 updates (#2303)
* --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor dependency-group: npm - dependency-name: sinon dependency-type: direct:development update-type: version-update:semver-major dependency-group: npm ... Signed-off-by: dependabot[bot] <support@github.com> * Update checked-in dependencies --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This commit is contained in:
parent
ebd27c09f6
commit
b1bd8da5e7
212 changed files with 11182 additions and 16383 deletions
158
node_modules/path-to-regexp/History.md
generated
vendored
158
node_modules/path-to-regexp/History.md
generated
vendored
|
|
@ -1,158 +0,0 @@
|
|||
1.7.0 / 2016-11-08
|
||||
==================
|
||||
|
||||
* Allow a `delimiter` option to be passed in with `tokensToRegExp` which will be used for "non-ending" token match situations
|
||||
|
||||
1.6.0 / 2016-10-03
|
||||
==================
|
||||
|
||||
* Populate `RegExp.keys` when using the `tokensToRegExp` method (making it consistent with the main export)
|
||||
* Allow a `delimiter` option to be passed in with `parse`
|
||||
* Updated TypeScript definition with `Keys` and `Options` updated
|
||||
|
||||
1.5.3 / 2016-06-15
|
||||
==================
|
||||
|
||||
* Add `\\` to the ignore character group to avoid backtracking on mismatched parens
|
||||
|
||||
1.5.2 / 2016-06-15
|
||||
==================
|
||||
|
||||
* Escape `\\` in string segments of regexp
|
||||
|
||||
1.5.1 / 2016-06-08
|
||||
==================
|
||||
|
||||
* Add `index.d.ts` to NPM package
|
||||
|
||||
1.5.0 / 2016-05-20
|
||||
==================
|
||||
|
||||
* Handle partial token segments (better)
|
||||
* Allow compile to handle asterisk token segments
|
||||
|
||||
1.4.0 / 2016-05-18
|
||||
==================
|
||||
|
||||
* Handle RegExp unions in path matching groups
|
||||
|
||||
1.3.0 / 2016-05-08
|
||||
==================
|
||||
|
||||
* Clarify README language and named parameter token support
|
||||
* Support advanced Closure Compiler with type annotations
|
||||
* Add pretty paths options to compiled function output
|
||||
* Add TypeScript definition to project
|
||||
* Improved prefix handling with non-complete segment parameters (E.g. `/:foo?-bar`)
|
||||
|
||||
1.2.1 / 2015-08-17
|
||||
==================
|
||||
|
||||
* Encode values before validation with path compilation function
|
||||
* More examples of using compilation in README
|
||||
|
||||
1.2.0 / 2015-05-20
|
||||
==================
|
||||
|
||||
* Add support for matching an asterisk (`*`) as an unnamed match everything group (`(.*)`)
|
||||
|
||||
1.1.1 / 2015-05-11
|
||||
==================
|
||||
|
||||
* Expose methods for working with path tokens
|
||||
|
||||
1.1.0 / 2015-05-09
|
||||
==================
|
||||
|
||||
* Expose the parser implementation to consumers
|
||||
* Implement a compiler function to generate valid strings
|
||||
* Huge refactor of tests to be more DRY and cover new parse and compile functions
|
||||
* Use chai in tests
|
||||
* Add .editorconfig
|
||||
|
||||
1.0.3 / 2015-01-17
|
||||
==================
|
||||
|
||||
* Optimised function runtime
|
||||
* Added `files` to `package.json`
|
||||
|
||||
1.0.2 / 2014-12-17
|
||||
==================
|
||||
|
||||
* Use `Array.isArray` shim
|
||||
* Remove ES5 incompatible code
|
||||
* Fixed repository path
|
||||
* Added new readme badges
|
||||
|
||||
1.0.1 / 2014-08-27
|
||||
==================
|
||||
|
||||
* Ensure installation works correctly on 0.8
|
||||
|
||||
1.0.0 / 2014-08-17
|
||||
==================
|
||||
|
||||
* No more API changes
|
||||
|
||||
0.2.5 / 2014-08-07
|
||||
==================
|
||||
|
||||
* Allow keys parameter to be omitted
|
||||
|
||||
0.2.4 / 2014-08-02
|
||||
==================
|
||||
|
||||
* Code coverage badge
|
||||
* Updated readme
|
||||
* Attach keys to the generated regexp
|
||||
|
||||
0.2.3 / 2014-07-09
|
||||
==================
|
||||
|
||||
* Add MIT license
|
||||
|
||||
0.2.2 / 2014-07-06
|
||||
==================
|
||||
|
||||
* A passed in trailing slash in non-strict mode will become optional
|
||||
* In non-end mode, the optional trailing slash will only match at the end
|
||||
|
||||
0.2.1 / 2014-06-11
|
||||
==================
|
||||
|
||||
* Fixed a major capturing group regexp regression
|
||||
|
||||
0.2.0 / 2014-06-09
|
||||
==================
|
||||
|
||||
* Improved support for arrays
|
||||
* Improved support for regexps
|
||||
* Better support for non-ending strict mode matches with a trailing slash
|
||||
* Travis CI support
|
||||
* Block using regexp special characters in the path
|
||||
* Removed support for the asterisk to match all
|
||||
* New support for parameter suffixes - `*`, `+` and `?`
|
||||
* Updated readme
|
||||
* Provide delimiter information with keys array
|
||||
|
||||
0.1.2 / 2014-03-10
|
||||
==================
|
||||
|
||||
* Move testing dependencies to `devDependencies`
|
||||
|
||||
0.1.1 / 2014-03-10
|
||||
==================
|
||||
|
||||
* Match entire substring with `options.end`
|
||||
* Properly handle ending and non-ending matches
|
||||
|
||||
0.1.0 / 2014-03-06
|
||||
==================
|
||||
|
||||
* Add `options.end`
|
||||
|
||||
0.0.2 / 2013-02-10
|
||||
==================
|
||||
|
||||
* Update to match current express
|
||||
* Add .license property to component.json
|
||||
351
node_modules/path-to-regexp/Readme.md
generated
vendored
351
node_modules/path-to-regexp/Readme.md
generated
vendored
|
|
@ -1,13 +1,12 @@
|
|||
# Path-to-RegExp
|
||||
|
||||
> Turn an Express-style path string such as `/user/:name` into a regular expression.
|
||||
> Turn a path string such as `/user/:name` into a regular expression.
|
||||
|
||||
[![NPM version][npm-image]][npm-url]
|
||||
[![Build status][travis-image]][travis-url]
|
||||
[![Test coverage][coveralls-image]][coveralls-url]
|
||||
[![Dependency Status][david-image]][david-url]
|
||||
[![NPM downloads][downloads-image]][downloads-url]
|
||||
[![Build status][build-image]][build-url]
|
||||
[![Build coverage][coverage-image]][coverage-url]
|
||||
[![License][license-image]][license-url]
|
||||
[![Downloads][downloads-image]][downloads-url]
|
||||
|
||||
## Installation
|
||||
|
||||
|
|
@ -18,240 +17,334 @@ npm install path-to-regexp --save
|
|||
## Usage
|
||||
|
||||
```javascript
|
||||
var pathToRegexp = require('path-to-regexp')
|
||||
const { pathToRegexp, match, parse, compile } = require("path-to-regexp");
|
||||
|
||||
// pathToRegexp(path, keys, options)
|
||||
// pathToRegexp.parse(path)
|
||||
// pathToRegexp.compile(path)
|
||||
// pathToRegexp(path, keys?, options?)
|
||||
// match(path)
|
||||
// parse(path)
|
||||
// compile(path)
|
||||
```
|
||||
|
||||
- **path** An Express-style string, an array of strings, or a regular expression.
|
||||
- **keys** An array to be populated with the keys found in the path.
|
||||
- **options**
|
||||
- **sensitive** When `true` the route will be case sensitive. (default: `false`)
|
||||
- **strict** When `false` the trailing slash is optional. (default: `false`)
|
||||
- **end** When `false` the path will match at the beginning. (default: `true`)
|
||||
- **delimiter** Set the default delimiter for repeat parameters. (default: `'/'`)
|
||||
### Path to regexp
|
||||
|
||||
The `pathToRegexp` function will return a regular expression object based on the provided `path` argument. It accepts the following arguments:
|
||||
|
||||
- **path** A string, array of strings, or a regular expression.
|
||||
- **keys** _(optional)_ An array to populate with keys found in the path.
|
||||
- **options** _(optional)_
|
||||
- **sensitive** When `true` the regexp will be case sensitive. (default: `false`)
|
||||
- **strict** When `true` the regexp won't allow an optional trailing delimiter to match. (default: `false`)
|
||||
- **end** When `true` the regexp will match to the end of the string. (default: `true`)
|
||||
- **start** When `true` the regexp will match from the beginning of the string. (default: `true`)
|
||||
- **delimiter** The default delimiter for segments, e.g. `[^/#?]` for `:named` patterns. (default: `'/#?'`)
|
||||
- **endsWith** Optional character, or list of characters, to treat as "end" characters.
|
||||
- **encode** A function to encode strings before inserting into `RegExp`. (default: `x => x`)
|
||||
- **prefixes** List of characters to automatically consider prefixes when parsing. (default: `./`)
|
||||
|
||||
```javascript
|
||||
var keys = []
|
||||
var re = pathToRegexp('/foo/:bar', keys)
|
||||
// re = /^\/foo\/([^\/]+?)\/?$/i
|
||||
// keys = [{ name: 'bar', prefix: '/', delimiter: '/', optional: false, repeat: false, pattern: '[^\\/]+?' }]
|
||||
const keys = [];
|
||||
const regexp = pathToRegexp("/foo/:bar", keys);
|
||||
// regexp = /^\/foo(?:\/([^\/#\?]+?))[\/#\?]?$/i
|
||||
// keys = [{ name: 'bar', prefix: '/', suffix: '', pattern: '[^\\/#\\?]+?', modifier: '' }]
|
||||
```
|
||||
|
||||
**Please note:** The `RegExp` returned by `path-to-regexp` is intended for use with pathnames or hostnames. It can not handle the query strings or fragments of a URL.
|
||||
**Please note:** The `RegExp` returned by `path-to-regexp` is intended for ordered data (e.g. pathnames, hostnames). It can not handle arbitrarily ordered data (e.g. query strings, URL fragments, JSON, etc). When using paths that contain query strings, you need to escape the question mark (`?`) to ensure it does not flag the parameter as [optional](#optional).
|
||||
|
||||
### Parameters
|
||||
|
||||
The path string can be used to define parameters and populate the keys.
|
||||
The path argument is used to define parameters and populate keys.
|
||||
|
||||
#### Named Parameters
|
||||
|
||||
Named parameters are defined by prefixing a colon to the parameter name (`:foo`). By default, the parameter will match until the following path segment.
|
||||
Named parameters are defined by prefixing a colon to the parameter name (`:foo`).
|
||||
|
||||
```js
|
||||
var re = pathToRegexp('/:foo/:bar', keys)
|
||||
const regexp = pathToRegexp("/:foo/:bar");
|
||||
// keys = [{ name: 'foo', prefix: '/', ... }, { name: 'bar', prefix: '/', ... }]
|
||||
|
||||
re.exec('/test/route')
|
||||
//=> ['/test/route', 'test', 'route']
|
||||
regexp.exec("/test/route");
|
||||
//=> [ '/test/route', 'test', 'route', index: 0, input: '/test/route', groups: undefined ]
|
||||
```
|
||||
|
||||
**Please note:** Named parameters must be made up of "word characters" (`[A-Za-z0-9_]`).
|
||||
**Please note:** Parameter names must use "word characters" (`[A-Za-z0-9_]`).
|
||||
|
||||
##### Custom Matching Parameters
|
||||
|
||||
Parameters can have a custom regexp, which overrides the default match (`[^/]+`). For example, you can match digits or names in a path:
|
||||
|
||||
```js
|
||||
var re = pathToRegexp('/(apple-)?icon-:res(\\d+).png', keys)
|
||||
// keys = [{ name: 0, prefix: '/', ... }, { name: 'res', prefix: '', ... }]
|
||||
const regexpNumbers = pathToRegexp("/icon-:foo(\\d+).png");
|
||||
// keys = [{ name: 'foo', ... }]
|
||||
|
||||
re.exec('/icon-76.png')
|
||||
//=> ['/icon-76.png', undefined, '76']
|
||||
regexpNumbers.exec("/icon-123.png");
|
||||
//=> ['/icon-123.png', '123']
|
||||
|
||||
regexpNumbers.exec("/icon-abc.png");
|
||||
//=> null
|
||||
|
||||
const regexpWord = pathToRegexp("/(user|u)");
|
||||
// keys = [{ name: 0, ... }]
|
||||
|
||||
regexpWord.exec("/u");
|
||||
//=> ['/u', 'u']
|
||||
|
||||
regexpWord.exec("/users");
|
||||
//=> null
|
||||
```
|
||||
|
||||
#### Modified Parameters
|
||||
**Tip:** Backslashes need to be escaped with another backslash in JavaScript strings.
|
||||
|
||||
##### Custom Prefix and Suffix
|
||||
|
||||
Parameters can be wrapped in `{}` to create custom prefixes or suffixes for your segment:
|
||||
|
||||
```js
|
||||
const regexp = pathToRegexp("/:attr1?{-:attr2}?{-:attr3}?");
|
||||
|
||||
regexp.exec("/test");
|
||||
// => ['/test', 'test', undefined, undefined]
|
||||
|
||||
regexp.exec("/test-test");
|
||||
// => ['/test', 'test', 'test', undefined]
|
||||
```
|
||||
|
||||
#### Unnamed Parameters
|
||||
|
||||
It is possible to write an unnamed parameter that only consists of a regexp. It works the same the named parameter, except it will be numerically indexed:
|
||||
|
||||
```js
|
||||
const regexp = pathToRegexp("/:foo/(.*)");
|
||||
// keys = [{ name: 'foo', ... }, { name: 0, ... }]
|
||||
|
||||
regexp.exec("/test/route");
|
||||
//=> [ '/test/route', 'test', 'route', index: 0, input: '/test/route', groups: undefined ]
|
||||
```
|
||||
|
||||
#### Modifiers
|
||||
|
||||
Modifiers must be placed after the parameter (e.g. `/:foo?`, `/(test)?`, `/:foo(test)?`, or `{-:foo(test)}?`).
|
||||
|
||||
##### Optional
|
||||
|
||||
Parameters can be suffixed with a question mark (`?`) to make the parameter optional. This will also make the prefix optional.
|
||||
Parameters can be suffixed with a question mark (`?`) to make the parameter optional.
|
||||
|
||||
```js
|
||||
var re = pathToRegexp('/:foo/:bar?', keys)
|
||||
// keys = [{ name: 'foo', ... }, { name: 'bar', delimiter: '/', optional: true, repeat: false }]
|
||||
const regexp = pathToRegexp("/:foo/:bar?");
|
||||
// keys = [{ name: 'foo', ... }, { name: 'bar', prefix: '/', modifier: '?' }]
|
||||
|
||||
re.exec('/test')
|
||||
//=> ['/test', 'test', undefined]
|
||||
regexp.exec("/test");
|
||||
//=> [ '/test', 'test', undefined, index: 0, input: '/test', groups: undefined ]
|
||||
|
||||
re.exec('/test/route')
|
||||
//=> ['/test', 'test', 'route']
|
||||
regexp.exec("/test/route");
|
||||
//=> [ '/test/route', 'test', 'route', index: 0, input: '/test/route', groups: undefined ]
|
||||
```
|
||||
|
||||
**Tip:** The prefix is also optional, escape the prefix `\/` to make it required.
|
||||
|
||||
When dealing with query strings, escape the question mark (`?`) so it doesn't mark the parameter as optional. Handling unordered data is outside the scope of this library.
|
||||
|
||||
```js
|
||||
const regexp = pathToRegexp("/search/:tableName\\?useIndex=true&term=amazing");
|
||||
|
||||
regexp.exec("/search/people?useIndex=true&term=amazing");
|
||||
//=> [ '/search/people?useIndex=true&term=amazing', 'people', index: 0, input: '/search/people?useIndex=true&term=amazing', groups: undefined ]
|
||||
|
||||
// This library does not handle query strings in different orders
|
||||
regexp.exec("/search/people?term=amazing&useIndex=true");
|
||||
//=> null
|
||||
```
|
||||
|
||||
##### Zero or more
|
||||
|
||||
Parameters can be suffixed with an asterisk (`*`) to denote a zero or more parameter matches. The prefix is taken into account for each match.
|
||||
Parameters can be suffixed with an asterisk (`*`) to denote a zero or more parameter matches.
|
||||
|
||||
```js
|
||||
var re = pathToRegexp('/:foo*', keys)
|
||||
// keys = [{ name: 'foo', delimiter: '/', optional: true, repeat: true }]
|
||||
const regexp = pathToRegexp("/:foo*");
|
||||
// keys = [{ name: 'foo', prefix: '/', modifier: '*' }]
|
||||
|
||||
re.exec('/')
|
||||
//=> ['/', undefined]
|
||||
regexp.exec("/");
|
||||
//=> [ '/', undefined, index: 0, input: '/', groups: undefined ]
|
||||
|
||||
re.exec('/bar/baz')
|
||||
//=> ['/bar/baz', 'bar/baz']
|
||||
regexp.exec("/bar/baz");
|
||||
//=> [ '/bar/baz', 'bar/baz', index: 0, input: '/bar/baz', groups: undefined ]
|
||||
```
|
||||
|
||||
##### One or more
|
||||
|
||||
Parameters can be suffixed with a plus sign (`+`) to denote a one or more parameter matches. The prefix is taken into account for each match.
|
||||
Parameters can be suffixed with a plus sign (`+`) to denote a one or more parameter matches.
|
||||
|
||||
```js
|
||||
var re = pathToRegexp('/:foo+', keys)
|
||||
// keys = [{ name: 'foo', delimiter: '/', optional: false, repeat: true }]
|
||||
const regexp = pathToRegexp("/:foo+");
|
||||
// keys = [{ name: 'foo', prefix: '/', modifier: '+' }]
|
||||
|
||||
re.exec('/')
|
||||
regexp.exec("/");
|
||||
//=> null
|
||||
|
||||
re.exec('/bar/baz')
|
||||
//=> ['/bar/baz', 'bar/baz']
|
||||
regexp.exec("/bar/baz");
|
||||
//=> [ '/bar/baz','bar/baz', index: 0, input: '/bar/baz', groups: undefined ]
|
||||
```
|
||||
|
||||
#### Custom Match Parameters
|
||||
### Match
|
||||
|
||||
All parameters can be provided a custom regexp, which overrides the default (`[^\/]+`).
|
||||
The `match` function will return a function for transforming paths into parameters:
|
||||
|
||||
```js
|
||||
var re = pathToRegexp('/:foo(\\d+)', keys)
|
||||
// keys = [{ name: 'foo', ... }]
|
||||
// Make sure you consistently `decode` segments.
|
||||
const fn = match("/user/:id", { decode: decodeURIComponent });
|
||||
|
||||
re.exec('/123')
|
||||
//=> ['/123', '123']
|
||||
|
||||
re.exec('/abc')
|
||||
//=> null
|
||||
fn("/user/123"); //=> { path: '/user/123', index: 0, params: { id: '123' } }
|
||||
fn("/invalid"); //=> false
|
||||
fn("/user/caf%C3%A9"); //=> { path: '/user/caf%C3%A9', index: 0, params: { id: 'café' } }
|
||||
```
|
||||
|
||||
**Please note:** Backslashes need to be escaped with another backslash in strings.
|
||||
|
||||
#### Unnamed Parameters
|
||||
|
||||
It is possible to write an unnamed parameter that only consists of a matching group. It works the same as a named parameter, except it will be numerically indexed.
|
||||
The `match` function can be used to custom match named parameters. For example, this can be used to whitelist a small number of valid paths:
|
||||
|
||||
```js
|
||||
var re = pathToRegexp('/:foo/(.*)', keys)
|
||||
// keys = [{ name: 'foo', ... }, { name: 0, ... }]
|
||||
const urlMatch = match("/users/:id/:tab(home|photos|bio)", {
|
||||
decode: decodeURIComponent,
|
||||
});
|
||||
|
||||
re.exec('/test/route')
|
||||
//=> ['/test/route', 'test', 'route']
|
||||
urlMatch("/users/1234/photos");
|
||||
//=> { path: '/users/1234/photos', index: 0, params: { id: '1234', tab: 'photos' } }
|
||||
|
||||
urlMatch("/users/1234/bio");
|
||||
//=> { path: '/users/1234/bio', index: 0, params: { id: '1234', tab: 'bio' } }
|
||||
|
||||
urlMatch("/users/1234/otherstuff");
|
||||
//=> false
|
||||
```
|
||||
|
||||
#### Asterisk
|
||||
#### Process Pathname
|
||||
|
||||
An asterisk can be used for matching everything. It is equivalent to an unnamed matching group of `(.*)`.
|
||||
You should make sure variations of the same path match the expected `path`. Here's one possible solution using `encode`:
|
||||
|
||||
```js
|
||||
var re = pathToRegexp('/foo/*', keys)
|
||||
// keys = [{ name: '0', ... }]
|
||||
const fn = match("/café", { encode: encodeURI });
|
||||
|
||||
re.exec('/foo/bar/baz')
|
||||
//=> ['/foo/bar/baz', 'bar/baz']
|
||||
fn("/caf%C3%A9"); //=> { path: '/caf%C3%A9', index: 0, params: {} }
|
||||
```
|
||||
|
||||
**Note:** [`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL) encodes paths, so `/café` would be normalized to `/caf%C3%A9` and match in the above example.
|
||||
|
||||
##### Alternative Using Normalize
|
||||
|
||||
Sometimes you won't have already normalized paths to use, so you could normalize it yourself before matching:
|
||||
|
||||
```js
|
||||
/**
|
||||
* Normalize a pathname for matching, replaces multiple slashes with a single
|
||||
* slash and normalizes unicode characters to "NFC". When using this method,
|
||||
* `decode` should be an identity function so you don't decode strings twice.
|
||||
*/
|
||||
function normalizePathname(pathname: string) {
|
||||
return (
|
||||
decodeURI(pathname)
|
||||
// Replaces repeated slashes in the URL.
|
||||
.replace(/\/+/g, "/")
|
||||
// Reference: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
|
||||
// Note: Missing native IE support, may want to skip this step.
|
||||
.normalize()
|
||||
);
|
||||
}
|
||||
|
||||
// Two possible ways of writing `/café`:
|
||||
const re = pathToRegexp("/caf\u00E9");
|
||||
const input = encodeURI("/cafe\u0301");
|
||||
|
||||
re.test(input); //=> false
|
||||
re.test(normalizePathname(input)); //=> true
|
||||
```
|
||||
|
||||
### Parse
|
||||
|
||||
The parse function is exposed via `pathToRegexp.parse`. This will return an array of strings and keys.
|
||||
The `parse` function will return a list of strings and keys from a path string:
|
||||
|
||||
```js
|
||||
var tokens = pathToRegexp.parse('/route/:foo/(.*)')
|
||||
const tokens = parse("/route/:foo/(.*)");
|
||||
|
||||
console.log(tokens[0])
|
||||
console.log(tokens[0]);
|
||||
//=> "/route"
|
||||
|
||||
console.log(tokens[1])
|
||||
//=> { name: 'foo', prefix: '/', delimiter: '/', optional: false, repeat: false, pattern: '[^\\/]+?' }
|
||||
console.log(tokens[1]);
|
||||
//=> { name: 'foo', prefix: '/', suffix: '', pattern: '[^\\/#\\?]+?', modifier: '' }
|
||||
|
||||
console.log(tokens[2])
|
||||
//=> { name: 0, prefix: '/', delimiter: '/', optional: false, repeat: false, pattern: '.*' }
|
||||
console.log(tokens[2]);
|
||||
//=> { name: 0, prefix: '/', suffix: '', pattern: '.*', modifier: '' }
|
||||
```
|
||||
|
||||
**Note:** This method only works with Express-style strings.
|
||||
**Note:** This method only works with strings.
|
||||
|
||||
### Compile ("Reverse" Path-To-RegExp)
|
||||
|
||||
Path-To-RegExp exposes a compile function for transforming an Express-style path into a valid path.
|
||||
The `compile` function will return a function for transforming parameters into a valid path:
|
||||
|
||||
```js
|
||||
var toPath = pathToRegexp.compile('/user/:id')
|
||||
// Make sure you encode your path segments consistently.
|
||||
const toPath = compile("/user/:id", { encode: encodeURIComponent });
|
||||
|
||||
toPath({ id: 123 }) //=> "/user/123"
|
||||
toPath({ id: 'café' }) //=> "/user/caf%C3%A9"
|
||||
toPath({ id: '/' }) //=> "/user/%2F"
|
||||
toPath({ id: 123 }); //=> "/user/123"
|
||||
toPath({ id: "café" }); //=> "/user/caf%C3%A9"
|
||||
toPath({ id: ":/" }); //=> "/user/%3A%2F"
|
||||
|
||||
toPath({ id: ':' }) //=> "/user/%3A"
|
||||
toPath({ id: ':' }, { pretty: true }) //=> "/user/:"
|
||||
// Without `encode`, you need to make sure inputs are encoded correctly.
|
||||
// (Note: You can use `validate: false` to create an invalid paths.)
|
||||
const toPathRaw = compile("/user/:id", { validate: false });
|
||||
|
||||
var toPathRepeated = pathToRegexp.compile('/:segment+')
|
||||
toPathRaw({ id: "%3A%2F" }); //=> "/user/%3A%2F"
|
||||
toPathRaw({ id: ":/" }); //=> "/user/:/"
|
||||
|
||||
toPathRepeated({ segment: 'foo' }) //=> "/foo"
|
||||
toPathRepeated({ segment: ['a', 'b', 'c'] }) //=> "/a/b/c"
|
||||
const toPathRepeated = compile("/:segment+");
|
||||
|
||||
var toPathRegexp = pathToRegexp.compile('/user/:id(\\d+)')
|
||||
toPathRepeated({ segment: "foo" }); //=> "/foo"
|
||||
toPathRepeated({ segment: ["a", "b", "c"] }); //=> "/a/b/c"
|
||||
|
||||
toPathRegexp({ id: 123 }) //=> "/user/123"
|
||||
toPathRegexp({ id: '123' }) //=> "/user/123"
|
||||
toPathRegexp({ id: 'abc' }) //=> Throws `TypeError`.
|
||||
const toPathRegexp = compile("/user/:id(\\d+)");
|
||||
|
||||
toPathRegexp({ id: 123 }); //=> "/user/123"
|
||||
toPathRegexp({ id: "123" }); //=> "/user/123"
|
||||
```
|
||||
|
||||
**Note:** The generated function will throw on invalid input. It will do all necessary checks to ensure the generated path is valid. This method only works with strings.
|
||||
**Note:** The generated function will throw on invalid input.
|
||||
|
||||
### Working with Tokens
|
||||
|
||||
Path-To-RegExp exposes the two functions used internally that accept an array of tokens.
|
||||
Path-To-RegExp exposes the two functions used internally that accept an array of tokens:
|
||||
|
||||
* `pathToRegexp.tokensToRegExp(tokens, options)` Transform an array of tokens into a matching regular expression.
|
||||
* `pathToRegexp.tokensToFunction(tokens)` Transform an array of tokens into a path generator function.
|
||||
- `tokensToRegexp(tokens, keys?, options?)` Transform an array of tokens into a matching regular expression.
|
||||
- `tokensToFunction(tokens)` Transform an array of tokens into a path generator function.
|
||||
|
||||
#### Token Information
|
||||
|
||||
* `name` The name of the token (`string` for named or `number` for index)
|
||||
* `prefix` The prefix character for the segment (`/` or `.`)
|
||||
* `delimiter` The delimiter for the segment (same as prefix or `/`)
|
||||
* `optional` Indicates the token is optional (`boolean`)
|
||||
* `repeat` Indicates the token is repeated (`boolean`)
|
||||
* `partial` Indicates this token is a partial path segment (`boolean`)
|
||||
* `pattern` The RegExp used to match this token (`string`)
|
||||
* `asterisk` Indicates the token is an `*` match (`boolean`)
|
||||
- `name` The name of the token (`string` for named or `number` for unnamed index)
|
||||
- `prefix` The prefix string for the segment (e.g. `"/"`)
|
||||
- `suffix` The suffix string for the segment (e.g. `""`)
|
||||
- `pattern` The RegExp used to match this token (`string`)
|
||||
- `modifier` The modifier character used for the segment (e.g. `?`)
|
||||
|
||||
## Compatibility with Express <= 4.x
|
||||
|
||||
Path-To-RegExp breaks compatibility with Express <= `4.x`:
|
||||
|
||||
* No longer a direct conversion to a RegExp with sugar on top - it's a path matcher with named and unnamed matching groups
|
||||
* It's unlikely you previously abused this feature, it's rare and you could always use a RegExp instead
|
||||
* All matching RegExp special characters can be used in a matching group. E.g. `/:user(.*)`
|
||||
* Other RegExp features are not support - no nested matching groups, non-capturing groups or look aheads
|
||||
* Parameters have suffixes that augment meaning - `*`, `+` and `?`. E.g. `/:user*`
|
||||
|
||||
## TypeScript
|
||||
|
||||
Includes a [`.d.ts`](index.d.ts) file for TypeScript users.
|
||||
- RegExp special characters can only be used in a parameter
|
||||
- Express.js 4.x supported `RegExp` special characters regardless of position - this is considered a bug
|
||||
- Parameters have suffixes that augment meaning - `*`, `+` and `?`. E.g. `/:user*`
|
||||
- No wildcard asterisk (`*`) - use parameters instead (`(.*)` or `:splat*`)
|
||||
|
||||
## Live Demo
|
||||
|
||||
You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.com/express-route-tester/).
|
||||
You can see a live demo of this library in use at [express-route-tester](http://forbeslindesay.github.io/express-route-tester/).
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
|
||||
[npm-image]: https://img.shields.io/npm/v/path-to-regexp.svg?style=flat
|
||||
[npm-image]: https://img.shields.io/npm/v/path-to-regexp
|
||||
[npm-url]: https://npmjs.org/package/path-to-regexp
|
||||
[travis-image]: https://img.shields.io/travis/pillarjs/path-to-regexp.svg?style=flat
|
||||
[travis-url]: https://travis-ci.org/pillarjs/path-to-regexp
|
||||
[coveralls-image]: https://img.shields.io/coveralls/pillarjs/path-to-regexp.svg?style=flat
|
||||
[coveralls-url]: https://coveralls.io/r/pillarjs/path-to-regexp?branch=master
|
||||
[david-image]: http://img.shields.io/david/pillarjs/path-to-regexp.svg?style=flat
|
||||
[david-url]: https://david-dm.org/pillarjs/path-to-regexp
|
||||
[downloads-image]: https://img.shields.io/npm/dm/path-to-regexp
|
||||
[downloads-url]: https://npmjs.org/package/path-to-regexp
|
||||
[build-image]: https://img.shields.io/github/actions/workflow/status/pillarjs/path-to-regexp/ci.yml?branch=master
|
||||
[build-url]: https://github.com/pillarjs/path-to-regexp/actions/workflows/ci.yml?query=branch%3Amaster
|
||||
[coverage-image]: https://img.shields.io/codecov/c/gh/pillarjs/path-to-regexp
|
||||
[coverage-url]: https://codecov.io/gh/pillarjs/path-to-regexp
|
||||
[license-image]: http://img.shields.io/npm/l/path-to-regexp.svg?style=flat
|
||||
[license-url]: LICENSE.md
|
||||
[downloads-image]: http://img.shields.io/npm/dm/path-to-regexp.svg?style=flat
|
||||
[downloads-url]: https://npmjs.org/package/path-to-regexp
|
||||
|
|
|
|||
400
node_modules/path-to-regexp/dist.es2015/index.js
generated
vendored
Normal file
400
node_modules/path-to-regexp/dist.es2015/index.js
generated
vendored
Normal file
|
|
@ -0,0 +1,400 @@
|
|||
/**
|
||||
* Tokenize input string.
|
||||
*/
|
||||
function lexer(str) {
|
||||
var tokens = [];
|
||||
var i = 0;
|
||||
while (i < str.length) {
|
||||
var char = str[i];
|
||||
if (char === "*" || char === "+" || char === "?") {
|
||||
tokens.push({ type: "MODIFIER", index: i, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === "\\") {
|
||||
tokens.push({ type: "ESCAPED_CHAR", index: i++, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === "{") {
|
||||
tokens.push({ type: "OPEN", index: i, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === "}") {
|
||||
tokens.push({ type: "CLOSE", index: i, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === ":") {
|
||||
var name = "";
|
||||
var j = i + 1;
|
||||
while (j < str.length) {
|
||||
var code = str.charCodeAt(j);
|
||||
if (
|
||||
// `0-9`
|
||||
(code >= 48 && code <= 57) ||
|
||||
// `A-Z`
|
||||
(code >= 65 && code <= 90) ||
|
||||
// `a-z`
|
||||
(code >= 97 && code <= 122) ||
|
||||
// `_`
|
||||
code === 95) {
|
||||
name += str[j++];
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!name)
|
||||
throw new TypeError("Missing parameter name at ".concat(i));
|
||||
tokens.push({ type: "NAME", index: i, value: name });
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
if (char === "(") {
|
||||
var count = 1;
|
||||
var pattern = "";
|
||||
var j = i + 1;
|
||||
if (str[j] === "?") {
|
||||
throw new TypeError("Pattern cannot start with \"?\" at ".concat(j));
|
||||
}
|
||||
while (j < str.length) {
|
||||
if (str[j] === "\\") {
|
||||
pattern += str[j++] + str[j++];
|
||||
continue;
|
||||
}
|
||||
if (str[j] === ")") {
|
||||
count--;
|
||||
if (count === 0) {
|
||||
j++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (str[j] === "(") {
|
||||
count++;
|
||||
if (str[j + 1] !== "?") {
|
||||
throw new TypeError("Capturing groups are not allowed at ".concat(j));
|
||||
}
|
||||
}
|
||||
pattern += str[j++];
|
||||
}
|
||||
if (count)
|
||||
throw new TypeError("Unbalanced pattern at ".concat(i));
|
||||
if (!pattern)
|
||||
throw new TypeError("Missing pattern at ".concat(i));
|
||||
tokens.push({ type: "PATTERN", index: i, value: pattern });
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
tokens.push({ type: "CHAR", index: i, value: str[i++] });
|
||||
}
|
||||
tokens.push({ type: "END", index: i, value: "" });
|
||||
return tokens;
|
||||
}
|
||||
/**
|
||||
* Parse a string for the raw tokens.
|
||||
*/
|
||||
export function parse(str, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var tokens = lexer(str);
|
||||
var _a = options.prefixes, prefixes = _a === void 0 ? "./" : _a;
|
||||
var defaultPattern = "[^".concat(escapeString(options.delimiter || "/#?"), "]+?");
|
||||
var result = [];
|
||||
var key = 0;
|
||||
var i = 0;
|
||||
var path = "";
|
||||
var tryConsume = function (type) {
|
||||
if (i < tokens.length && tokens[i].type === type)
|
||||
return tokens[i++].value;
|
||||
};
|
||||
var mustConsume = function (type) {
|
||||
var value = tryConsume(type);
|
||||
if (value !== undefined)
|
||||
return value;
|
||||
var _a = tokens[i], nextType = _a.type, index = _a.index;
|
||||
throw new TypeError("Unexpected ".concat(nextType, " at ").concat(index, ", expected ").concat(type));
|
||||
};
|
||||
var consumeText = function () {
|
||||
var result = "";
|
||||
var value;
|
||||
while ((value = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR"))) {
|
||||
result += value;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
while (i < tokens.length) {
|
||||
var char = tryConsume("CHAR");
|
||||
var name = tryConsume("NAME");
|
||||
var pattern = tryConsume("PATTERN");
|
||||
if (name || pattern) {
|
||||
var prefix = char || "";
|
||||
if (prefixes.indexOf(prefix) === -1) {
|
||||
path += prefix;
|
||||
prefix = "";
|
||||
}
|
||||
if (path) {
|
||||
result.push(path);
|
||||
path = "";
|
||||
}
|
||||
result.push({
|
||||
name: name || key++,
|
||||
prefix: prefix,
|
||||
suffix: "",
|
||||
pattern: pattern || defaultPattern,
|
||||
modifier: tryConsume("MODIFIER") || "",
|
||||
});
|
||||
continue;
|
||||
}
|
||||
var value = char || tryConsume("ESCAPED_CHAR");
|
||||
if (value) {
|
||||
path += value;
|
||||
continue;
|
||||
}
|
||||
if (path) {
|
||||
result.push(path);
|
||||
path = "";
|
||||
}
|
||||
var open = tryConsume("OPEN");
|
||||
if (open) {
|
||||
var prefix = consumeText();
|
||||
var name_1 = tryConsume("NAME") || "";
|
||||
var pattern_1 = tryConsume("PATTERN") || "";
|
||||
var suffix = consumeText();
|
||||
mustConsume("CLOSE");
|
||||
result.push({
|
||||
name: name_1 || (pattern_1 ? key++ : ""),
|
||||
pattern: name_1 && !pattern_1 ? defaultPattern : pattern_1,
|
||||
prefix: prefix,
|
||||
suffix: suffix,
|
||||
modifier: tryConsume("MODIFIER") || "",
|
||||
});
|
||||
continue;
|
||||
}
|
||||
mustConsume("END");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
/**
|
||||
* Compile a string to a template function for the path.
|
||||
*/
|
||||
export function compile(str, options) {
|
||||
return tokensToFunction(parse(str, options), options);
|
||||
}
|
||||
/**
|
||||
* Expose a method for transforming tokens into the path function.
|
||||
*/
|
||||
export function tokensToFunction(tokens, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var reFlags = flags(options);
|
||||
var _a = options.encode, encode = _a === void 0 ? function (x) { return x; } : _a, _b = options.validate, validate = _b === void 0 ? true : _b;
|
||||
// Compile all the tokens into regexps.
|
||||
var matches = tokens.map(function (token) {
|
||||
if (typeof token === "object") {
|
||||
return new RegExp("^(?:".concat(token.pattern, ")$"), reFlags);
|
||||
}
|
||||
});
|
||||
return function (data) {
|
||||
var path = "";
|
||||
for (var i = 0; i < tokens.length; i++) {
|
||||
var token = tokens[i];
|
||||
if (typeof token === "string") {
|
||||
path += token;
|
||||
continue;
|
||||
}
|
||||
var value = data ? data[token.name] : undefined;
|
||||
var optional = token.modifier === "?" || token.modifier === "*";
|
||||
var repeat = token.modifier === "*" || token.modifier === "+";
|
||||
if (Array.isArray(value)) {
|
||||
if (!repeat) {
|
||||
throw new TypeError("Expected \"".concat(token.name, "\" to not repeat, but got an array"));
|
||||
}
|
||||
if (value.length === 0) {
|
||||
if (optional)
|
||||
continue;
|
||||
throw new TypeError("Expected \"".concat(token.name, "\" to not be empty"));
|
||||
}
|
||||
for (var j = 0; j < value.length; j++) {
|
||||
var segment = encode(value[j], token);
|
||||
if (validate && !matches[i].test(segment)) {
|
||||
throw new TypeError("Expected all \"".concat(token.name, "\" to match \"").concat(token.pattern, "\", but got \"").concat(segment, "\""));
|
||||
}
|
||||
path += token.prefix + segment + token.suffix;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (typeof value === "string" || typeof value === "number") {
|
||||
var segment = encode(String(value), token);
|
||||
if (validate && !matches[i].test(segment)) {
|
||||
throw new TypeError("Expected \"".concat(token.name, "\" to match \"").concat(token.pattern, "\", but got \"").concat(segment, "\""));
|
||||
}
|
||||
path += token.prefix + segment + token.suffix;
|
||||
continue;
|
||||
}
|
||||
if (optional)
|
||||
continue;
|
||||
var typeOfMessage = repeat ? "an array" : "a string";
|
||||
throw new TypeError("Expected \"".concat(token.name, "\" to be ").concat(typeOfMessage));
|
||||
}
|
||||
return path;
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Create path match function from `path-to-regexp` spec.
|
||||
*/
|
||||
export function match(str, options) {
|
||||
var keys = [];
|
||||
var re = pathToRegexp(str, keys, options);
|
||||
return regexpToFunction(re, keys, options);
|
||||
}
|
||||
/**
|
||||
* Create a path match function from `path-to-regexp` output.
|
||||
*/
|
||||
export function regexpToFunction(re, keys, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var _a = options.decode, decode = _a === void 0 ? function (x) { return x; } : _a;
|
||||
return function (pathname) {
|
||||
var m = re.exec(pathname);
|
||||
if (!m)
|
||||
return false;
|
||||
var path = m[0], index = m.index;
|
||||
var params = Object.create(null);
|
||||
var _loop_1 = function (i) {
|
||||
if (m[i] === undefined)
|
||||
return "continue";
|
||||
var key = keys[i - 1];
|
||||
if (key.modifier === "*" || key.modifier === "+") {
|
||||
params[key.name] = m[i].split(key.prefix + key.suffix).map(function (value) {
|
||||
return decode(value, key);
|
||||
});
|
||||
}
|
||||
else {
|
||||
params[key.name] = decode(m[i], key);
|
||||
}
|
||||
};
|
||||
for (var i = 1; i < m.length; i++) {
|
||||
_loop_1(i);
|
||||
}
|
||||
return { path: path, index: index, params: params };
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Escape a regular expression string.
|
||||
*/
|
||||
function escapeString(str) {
|
||||
return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1");
|
||||
}
|
||||
/**
|
||||
* Get the flags for a regexp from the options.
|
||||
*/
|
||||
function flags(options) {
|
||||
return options && options.sensitive ? "" : "i";
|
||||
}
|
||||
/**
|
||||
* Pull out keys from a regexp.
|
||||
*/
|
||||
function regexpToRegexp(path, keys) {
|
||||
if (!keys)
|
||||
return path;
|
||||
var groupsRegex = /\((?:\?<(.*?)>)?(?!\?)/g;
|
||||
var index = 0;
|
||||
var execResult = groupsRegex.exec(path.source);
|
||||
while (execResult) {
|
||||
keys.push({
|
||||
// Use parenthesized substring match if available, index otherwise
|
||||
name: execResult[1] || index++,
|
||||
prefix: "",
|
||||
suffix: "",
|
||||
modifier: "",
|
||||
pattern: "",
|
||||
});
|
||||
execResult = groupsRegex.exec(path.source);
|
||||
}
|
||||
return path;
|
||||
}
|
||||
/**
|
||||
* Transform an array into a regexp.
|
||||
*/
|
||||
function arrayToRegexp(paths, keys, options) {
|
||||
var parts = paths.map(function (path) { return pathToRegexp(path, keys, options).source; });
|
||||
return new RegExp("(?:".concat(parts.join("|"), ")"), flags(options));
|
||||
}
|
||||
/**
|
||||
* Create a path regexp from string input.
|
||||
*/
|
||||
function stringToRegexp(path, keys, options) {
|
||||
return tokensToRegexp(parse(path, options), keys, options);
|
||||
}
|
||||
/**
|
||||
* Expose a function for taking tokens and returning a RegExp.
|
||||
*/
|
||||
export function tokensToRegexp(tokens, keys, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var _a = options.strict, strict = _a === void 0 ? false : _a, _b = options.start, start = _b === void 0 ? true : _b, _c = options.end, end = _c === void 0 ? true : _c, _d = options.encode, encode = _d === void 0 ? function (x) { return x; } : _d, _e = options.delimiter, delimiter = _e === void 0 ? "/#?" : _e, _f = options.endsWith, endsWith = _f === void 0 ? "" : _f;
|
||||
var endsWithRe = "[".concat(escapeString(endsWith), "]|$");
|
||||
var delimiterRe = "[".concat(escapeString(delimiter), "]");
|
||||
var route = start ? "^" : "";
|
||||
// Iterate over the tokens and create our regexp string.
|
||||
for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {
|
||||
var token = tokens_1[_i];
|
||||
if (typeof token === "string") {
|
||||
route += escapeString(encode(token));
|
||||
}
|
||||
else {
|
||||
var prefix = escapeString(encode(token.prefix));
|
||||
var suffix = escapeString(encode(token.suffix));
|
||||
if (token.pattern) {
|
||||
if (keys)
|
||||
keys.push(token);
|
||||
if (prefix || suffix) {
|
||||
if (token.modifier === "+" || token.modifier === "*") {
|
||||
var mod = token.modifier === "*" ? "?" : "";
|
||||
route += "(?:".concat(prefix, "((?:").concat(token.pattern, ")(?:").concat(suffix).concat(prefix, "(?:").concat(token.pattern, "))*)").concat(suffix, ")").concat(mod);
|
||||
}
|
||||
else {
|
||||
route += "(?:".concat(prefix, "(").concat(token.pattern, ")").concat(suffix, ")").concat(token.modifier);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (token.modifier === "+" || token.modifier === "*") {
|
||||
route += "((?:".concat(token.pattern, ")").concat(token.modifier, ")");
|
||||
}
|
||||
else {
|
||||
route += "(".concat(token.pattern, ")").concat(token.modifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
route += "(?:".concat(prefix).concat(suffix, ")").concat(token.modifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (end) {
|
||||
if (!strict)
|
||||
route += "".concat(delimiterRe, "?");
|
||||
route += !options.endsWith ? "$" : "(?=".concat(endsWithRe, ")");
|
||||
}
|
||||
else {
|
||||
var endToken = tokens[tokens.length - 1];
|
||||
var isEndDelimited = typeof endToken === "string"
|
||||
? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1
|
||||
: endToken === undefined;
|
||||
if (!strict) {
|
||||
route += "(?:".concat(delimiterRe, "(?=").concat(endsWithRe, "))?");
|
||||
}
|
||||
if (!isEndDelimited) {
|
||||
route += "(?=".concat(delimiterRe, "|").concat(endsWithRe, ")");
|
||||
}
|
||||
}
|
||||
return new RegExp(route, flags(options));
|
||||
}
|
||||
/**
|
||||
* Normalize the given path string, returning a regular expression.
|
||||
*
|
||||
* An empty array can be passed in for the keys, which will hold the
|
||||
* placeholder key descriptions. For example, using `/user/:id`, `keys` will
|
||||
* contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
|
||||
*/
|
||||
export function pathToRegexp(path, keys, options) {
|
||||
if (path instanceof RegExp)
|
||||
return regexpToRegexp(path, keys);
|
||||
if (Array.isArray(path))
|
||||
return arrayToRegexp(path, keys, options);
|
||||
return stringToRegexp(path, keys, options);
|
||||
}
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/path-to-regexp/dist.es2015/index.js.map
generated
vendored
Normal file
1
node_modules/path-to-regexp/dist.es2015/index.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
127
node_modules/path-to-regexp/dist/index.d.ts
generated
vendored
Normal file
127
node_modules/path-to-regexp/dist/index.d.ts
generated
vendored
Normal file
|
|
@ -0,0 +1,127 @@
|
|||
export interface ParseOptions {
|
||||
/**
|
||||
* Set the default delimiter for repeat parameters. (default: `'/'`)
|
||||
*/
|
||||
delimiter?: string;
|
||||
/**
|
||||
* List of characters to automatically consider prefixes when parsing.
|
||||
*/
|
||||
prefixes?: string;
|
||||
}
|
||||
/**
|
||||
* Parse a string for the raw tokens.
|
||||
*/
|
||||
export declare function parse(str: string, options?: ParseOptions): Token[];
|
||||
export interface TokensToFunctionOptions {
|
||||
/**
|
||||
* When `true` the regexp will be case sensitive. (default: `false`)
|
||||
*/
|
||||
sensitive?: boolean;
|
||||
/**
|
||||
* Function for encoding input strings for output.
|
||||
*/
|
||||
encode?: (value: string, token: Key) => string;
|
||||
/**
|
||||
* When `false` the function can produce an invalid (unmatched) path. (default: `true`)
|
||||
*/
|
||||
validate?: boolean;
|
||||
}
|
||||
/**
|
||||
* Compile a string to a template function for the path.
|
||||
*/
|
||||
export declare function compile<P extends object = object>(str: string, options?: ParseOptions & TokensToFunctionOptions): PathFunction<P>;
|
||||
export type PathFunction<P extends object = object> = (data?: P) => string;
|
||||
/**
|
||||
* Expose a method for transforming tokens into the path function.
|
||||
*/
|
||||
export declare function tokensToFunction<P extends object = object>(tokens: Token[], options?: TokensToFunctionOptions): PathFunction<P>;
|
||||
export interface RegexpToFunctionOptions {
|
||||
/**
|
||||
* Function for decoding strings for params.
|
||||
*/
|
||||
decode?: (value: string, token: Key) => string;
|
||||
}
|
||||
/**
|
||||
* A match result contains data about the path match.
|
||||
*/
|
||||
export interface MatchResult<P extends object = object> {
|
||||
path: string;
|
||||
index: number;
|
||||
params: P;
|
||||
}
|
||||
/**
|
||||
* A match is either `false` (no match) or a match result.
|
||||
*/
|
||||
export type Match<P extends object = object> = false | MatchResult<P>;
|
||||
/**
|
||||
* The match function takes a string and returns whether it matched the path.
|
||||
*/
|
||||
export type MatchFunction<P extends object = object> = (path: string) => Match<P>;
|
||||
/**
|
||||
* Create path match function from `path-to-regexp` spec.
|
||||
*/
|
||||
export declare function match<P extends object = object>(str: Path, options?: ParseOptions & TokensToRegexpOptions & RegexpToFunctionOptions): MatchFunction<P>;
|
||||
/**
|
||||
* Create a path match function from `path-to-regexp` output.
|
||||
*/
|
||||
export declare function regexpToFunction<P extends object = object>(re: RegExp, keys: Key[], options?: RegexpToFunctionOptions): MatchFunction<P>;
|
||||
/**
|
||||
* Metadata about a key.
|
||||
*/
|
||||
export interface Key {
|
||||
name: string | number;
|
||||
prefix: string;
|
||||
suffix: string;
|
||||
pattern: string;
|
||||
modifier: string;
|
||||
}
|
||||
/**
|
||||
* A token is a string (nothing special) or key metadata (capture group).
|
||||
*/
|
||||
export type Token = string | Key;
|
||||
export interface TokensToRegexpOptions {
|
||||
/**
|
||||
* When `true` the regexp will be case sensitive. (default: `false`)
|
||||
*/
|
||||
sensitive?: boolean;
|
||||
/**
|
||||
* When `true` the regexp won't allow an optional trailing delimiter to match. (default: `false`)
|
||||
*/
|
||||
strict?: boolean;
|
||||
/**
|
||||
* When `true` the regexp will match to the end of the string. (default: `true`)
|
||||
*/
|
||||
end?: boolean;
|
||||
/**
|
||||
* When `true` the regexp will match from the beginning of the string. (default: `true`)
|
||||
*/
|
||||
start?: boolean;
|
||||
/**
|
||||
* Sets the final character for non-ending optimistic matches. (default: `/`)
|
||||
*/
|
||||
delimiter?: string;
|
||||
/**
|
||||
* List of characters that can also be "end" characters.
|
||||
*/
|
||||
endsWith?: string;
|
||||
/**
|
||||
* Encode path tokens for use in the `RegExp`.
|
||||
*/
|
||||
encode?: (value: string) => string;
|
||||
}
|
||||
/**
|
||||
* Expose a function for taking tokens and returning a RegExp.
|
||||
*/
|
||||
export declare function tokensToRegexp(tokens: Token[], keys?: Key[], options?: TokensToRegexpOptions): RegExp;
|
||||
/**
|
||||
* Supported `path-to-regexp` input types.
|
||||
*/
|
||||
export type Path = string | RegExp | Array<string | RegExp>;
|
||||
/**
|
||||
* Normalize the given path string, returning a regular expression.
|
||||
*
|
||||
* An empty array can be passed in for the keys, which will hold the
|
||||
* placeholder key descriptions. For example, using `/user/:id`, `keys` will
|
||||
* contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
|
||||
*/
|
||||
export declare function pathToRegexp(path: Path, keys?: Key[], options?: TokensToRegexpOptions & ParseOptions): RegExp;
|
||||
410
node_modules/path-to-regexp/dist/index.js
generated
vendored
Normal file
410
node_modules/path-to-regexp/dist/index.js
generated
vendored
Normal file
|
|
@ -0,0 +1,410 @@
|
|||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.pathToRegexp = exports.tokensToRegexp = exports.regexpToFunction = exports.match = exports.tokensToFunction = exports.compile = exports.parse = void 0;
|
||||
/**
|
||||
* Tokenize input string.
|
||||
*/
|
||||
function lexer(str) {
|
||||
var tokens = [];
|
||||
var i = 0;
|
||||
while (i < str.length) {
|
||||
var char = str[i];
|
||||
if (char === "*" || char === "+" || char === "?") {
|
||||
tokens.push({ type: "MODIFIER", index: i, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === "\\") {
|
||||
tokens.push({ type: "ESCAPED_CHAR", index: i++, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === "{") {
|
||||
tokens.push({ type: "OPEN", index: i, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === "}") {
|
||||
tokens.push({ type: "CLOSE", index: i, value: str[i++] });
|
||||
continue;
|
||||
}
|
||||
if (char === ":") {
|
||||
var name = "";
|
||||
var j = i + 1;
|
||||
while (j < str.length) {
|
||||
var code = str.charCodeAt(j);
|
||||
if (
|
||||
// `0-9`
|
||||
(code >= 48 && code <= 57) ||
|
||||
// `A-Z`
|
||||
(code >= 65 && code <= 90) ||
|
||||
// `a-z`
|
||||
(code >= 97 && code <= 122) ||
|
||||
// `_`
|
||||
code === 95) {
|
||||
name += str[j++];
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (!name)
|
||||
throw new TypeError("Missing parameter name at ".concat(i));
|
||||
tokens.push({ type: "NAME", index: i, value: name });
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
if (char === "(") {
|
||||
var count = 1;
|
||||
var pattern = "";
|
||||
var j = i + 1;
|
||||
if (str[j] === "?") {
|
||||
throw new TypeError("Pattern cannot start with \"?\" at ".concat(j));
|
||||
}
|
||||
while (j < str.length) {
|
||||
if (str[j] === "\\") {
|
||||
pattern += str[j++] + str[j++];
|
||||
continue;
|
||||
}
|
||||
if (str[j] === ")") {
|
||||
count--;
|
||||
if (count === 0) {
|
||||
j++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (str[j] === "(") {
|
||||
count++;
|
||||
if (str[j + 1] !== "?") {
|
||||
throw new TypeError("Capturing groups are not allowed at ".concat(j));
|
||||
}
|
||||
}
|
||||
pattern += str[j++];
|
||||
}
|
||||
if (count)
|
||||
throw new TypeError("Unbalanced pattern at ".concat(i));
|
||||
if (!pattern)
|
||||
throw new TypeError("Missing pattern at ".concat(i));
|
||||
tokens.push({ type: "PATTERN", index: i, value: pattern });
|
||||
i = j;
|
||||
continue;
|
||||
}
|
||||
tokens.push({ type: "CHAR", index: i, value: str[i++] });
|
||||
}
|
||||
tokens.push({ type: "END", index: i, value: "" });
|
||||
return tokens;
|
||||
}
|
||||
/**
|
||||
* Parse a string for the raw tokens.
|
||||
*/
|
||||
function parse(str, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var tokens = lexer(str);
|
||||
var _a = options.prefixes, prefixes = _a === void 0 ? "./" : _a;
|
||||
var defaultPattern = "[^".concat(escapeString(options.delimiter || "/#?"), "]+?");
|
||||
var result = [];
|
||||
var key = 0;
|
||||
var i = 0;
|
||||
var path = "";
|
||||
var tryConsume = function (type) {
|
||||
if (i < tokens.length && tokens[i].type === type)
|
||||
return tokens[i++].value;
|
||||
};
|
||||
var mustConsume = function (type) {
|
||||
var value = tryConsume(type);
|
||||
if (value !== undefined)
|
||||
return value;
|
||||
var _a = tokens[i], nextType = _a.type, index = _a.index;
|
||||
throw new TypeError("Unexpected ".concat(nextType, " at ").concat(index, ", expected ").concat(type));
|
||||
};
|
||||
var consumeText = function () {
|
||||
var result = "";
|
||||
var value;
|
||||
while ((value = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR"))) {
|
||||
result += value;
|
||||
}
|
||||
return result;
|
||||
};
|
||||
while (i < tokens.length) {
|
||||
var char = tryConsume("CHAR");
|
||||
var name = tryConsume("NAME");
|
||||
var pattern = tryConsume("PATTERN");
|
||||
if (name || pattern) {
|
||||
var prefix = char || "";
|
||||
if (prefixes.indexOf(prefix) === -1) {
|
||||
path += prefix;
|
||||
prefix = "";
|
||||
}
|
||||
if (path) {
|
||||
result.push(path);
|
||||
path = "";
|
||||
}
|
||||
result.push({
|
||||
name: name || key++,
|
||||
prefix: prefix,
|
||||
suffix: "",
|
||||
pattern: pattern || defaultPattern,
|
||||
modifier: tryConsume("MODIFIER") || "",
|
||||
});
|
||||
continue;
|
||||
}
|
||||
var value = char || tryConsume("ESCAPED_CHAR");
|
||||
if (value) {
|
||||
path += value;
|
||||
continue;
|
||||
}
|
||||
if (path) {
|
||||
result.push(path);
|
||||
path = "";
|
||||
}
|
||||
var open = tryConsume("OPEN");
|
||||
if (open) {
|
||||
var prefix = consumeText();
|
||||
var name_1 = tryConsume("NAME") || "";
|
||||
var pattern_1 = tryConsume("PATTERN") || "";
|
||||
var suffix = consumeText();
|
||||
mustConsume("CLOSE");
|
||||
result.push({
|
||||
name: name_1 || (pattern_1 ? key++ : ""),
|
||||
pattern: name_1 && !pattern_1 ? defaultPattern : pattern_1,
|
||||
prefix: prefix,
|
||||
suffix: suffix,
|
||||
modifier: tryConsume("MODIFIER") || "",
|
||||
});
|
||||
continue;
|
||||
}
|
||||
mustConsume("END");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
exports.parse = parse;
|
||||
/**
|
||||
* Compile a string to a template function for the path.
|
||||
*/
|
||||
function compile(str, options) {
|
||||
return tokensToFunction(parse(str, options), options);
|
||||
}
|
||||
exports.compile = compile;
|
||||
/**
|
||||
* Expose a method for transforming tokens into the path function.
|
||||
*/
|
||||
function tokensToFunction(tokens, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var reFlags = flags(options);
|
||||
var _a = options.encode, encode = _a === void 0 ? function (x) { return x; } : _a, _b = options.validate, validate = _b === void 0 ? true : _b;
|
||||
// Compile all the tokens into regexps.
|
||||
var matches = tokens.map(function (token) {
|
||||
if (typeof token === "object") {
|
||||
return new RegExp("^(?:".concat(token.pattern, ")$"), reFlags);
|
||||
}
|
||||
});
|
||||
return function (data) {
|
||||
var path = "";
|
||||
for (var i = 0; i < tokens.length; i++) {
|
||||
var token = tokens[i];
|
||||
if (typeof token === "string") {
|
||||
path += token;
|
||||
continue;
|
||||
}
|
||||
var value = data ? data[token.name] : undefined;
|
||||
var optional = token.modifier === "?" || token.modifier === "*";
|
||||
var repeat = token.modifier === "*" || token.modifier === "+";
|
||||
if (Array.isArray(value)) {
|
||||
if (!repeat) {
|
||||
throw new TypeError("Expected \"".concat(token.name, "\" to not repeat, but got an array"));
|
||||
}
|
||||
if (value.length === 0) {
|
||||
if (optional)
|
||||
continue;
|
||||
throw new TypeError("Expected \"".concat(token.name, "\" to not be empty"));
|
||||
}
|
||||
for (var j = 0; j < value.length; j++) {
|
||||
var segment = encode(value[j], token);
|
||||
if (validate && !matches[i].test(segment)) {
|
||||
throw new TypeError("Expected all \"".concat(token.name, "\" to match \"").concat(token.pattern, "\", but got \"").concat(segment, "\""));
|
||||
}
|
||||
path += token.prefix + segment + token.suffix;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (typeof value === "string" || typeof value === "number") {
|
||||
var segment = encode(String(value), token);
|
||||
if (validate && !matches[i].test(segment)) {
|
||||
throw new TypeError("Expected \"".concat(token.name, "\" to match \"").concat(token.pattern, "\", but got \"").concat(segment, "\""));
|
||||
}
|
||||
path += token.prefix + segment + token.suffix;
|
||||
continue;
|
||||
}
|
||||
if (optional)
|
||||
continue;
|
||||
var typeOfMessage = repeat ? "an array" : "a string";
|
||||
throw new TypeError("Expected \"".concat(token.name, "\" to be ").concat(typeOfMessage));
|
||||
}
|
||||
return path;
|
||||
};
|
||||
}
|
||||
exports.tokensToFunction = tokensToFunction;
|
||||
/**
|
||||
* Create path match function from `path-to-regexp` spec.
|
||||
*/
|
||||
function match(str, options) {
|
||||
var keys = [];
|
||||
var re = pathToRegexp(str, keys, options);
|
||||
return regexpToFunction(re, keys, options);
|
||||
}
|
||||
exports.match = match;
|
||||
/**
|
||||
* Create a path match function from `path-to-regexp` output.
|
||||
*/
|
||||
function regexpToFunction(re, keys, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var _a = options.decode, decode = _a === void 0 ? function (x) { return x; } : _a;
|
||||
return function (pathname) {
|
||||
var m = re.exec(pathname);
|
||||
if (!m)
|
||||
return false;
|
||||
var path = m[0], index = m.index;
|
||||
var params = Object.create(null);
|
||||
var _loop_1 = function (i) {
|
||||
if (m[i] === undefined)
|
||||
return "continue";
|
||||
var key = keys[i - 1];
|
||||
if (key.modifier === "*" || key.modifier === "+") {
|
||||
params[key.name] = m[i].split(key.prefix + key.suffix).map(function (value) {
|
||||
return decode(value, key);
|
||||
});
|
||||
}
|
||||
else {
|
||||
params[key.name] = decode(m[i], key);
|
||||
}
|
||||
};
|
||||
for (var i = 1; i < m.length; i++) {
|
||||
_loop_1(i);
|
||||
}
|
||||
return { path: path, index: index, params: params };
|
||||
};
|
||||
}
|
||||
exports.regexpToFunction = regexpToFunction;
|
||||
/**
|
||||
* Escape a regular expression string.
|
||||
*/
|
||||
function escapeString(str) {
|
||||
return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1");
|
||||
}
|
||||
/**
|
||||
* Get the flags for a regexp from the options.
|
||||
*/
|
||||
function flags(options) {
|
||||
return options && options.sensitive ? "" : "i";
|
||||
}
|
||||
/**
|
||||
* Pull out keys from a regexp.
|
||||
*/
|
||||
function regexpToRegexp(path, keys) {
|
||||
if (!keys)
|
||||
return path;
|
||||
var groupsRegex = /\((?:\?<(.*?)>)?(?!\?)/g;
|
||||
var index = 0;
|
||||
var execResult = groupsRegex.exec(path.source);
|
||||
while (execResult) {
|
||||
keys.push({
|
||||
// Use parenthesized substring match if available, index otherwise
|
||||
name: execResult[1] || index++,
|
||||
prefix: "",
|
||||
suffix: "",
|
||||
modifier: "",
|
||||
pattern: "",
|
||||
});
|
||||
execResult = groupsRegex.exec(path.source);
|
||||
}
|
||||
return path;
|
||||
}
|
||||
/**
|
||||
* Transform an array into a regexp.
|
||||
*/
|
||||
function arrayToRegexp(paths, keys, options) {
|
||||
var parts = paths.map(function (path) { return pathToRegexp(path, keys, options).source; });
|
||||
return new RegExp("(?:".concat(parts.join("|"), ")"), flags(options));
|
||||
}
|
||||
/**
|
||||
* Create a path regexp from string input.
|
||||
*/
|
||||
function stringToRegexp(path, keys, options) {
|
||||
return tokensToRegexp(parse(path, options), keys, options);
|
||||
}
|
||||
/**
|
||||
* Expose a function for taking tokens and returning a RegExp.
|
||||
*/
|
||||
function tokensToRegexp(tokens, keys, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var _a = options.strict, strict = _a === void 0 ? false : _a, _b = options.start, start = _b === void 0 ? true : _b, _c = options.end, end = _c === void 0 ? true : _c, _d = options.encode, encode = _d === void 0 ? function (x) { return x; } : _d, _e = options.delimiter, delimiter = _e === void 0 ? "/#?" : _e, _f = options.endsWith, endsWith = _f === void 0 ? "" : _f;
|
||||
var endsWithRe = "[".concat(escapeString(endsWith), "]|$");
|
||||
var delimiterRe = "[".concat(escapeString(delimiter), "]");
|
||||
var route = start ? "^" : "";
|
||||
// Iterate over the tokens and create our regexp string.
|
||||
for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) {
|
||||
var token = tokens_1[_i];
|
||||
if (typeof token === "string") {
|
||||
route += escapeString(encode(token));
|
||||
}
|
||||
else {
|
||||
var prefix = escapeString(encode(token.prefix));
|
||||
var suffix = escapeString(encode(token.suffix));
|
||||
if (token.pattern) {
|
||||
if (keys)
|
||||
keys.push(token);
|
||||
if (prefix || suffix) {
|
||||
if (token.modifier === "+" || token.modifier === "*") {
|
||||
var mod = token.modifier === "*" ? "?" : "";
|
||||
route += "(?:".concat(prefix, "((?:").concat(token.pattern, ")(?:").concat(suffix).concat(prefix, "(?:").concat(token.pattern, "))*)").concat(suffix, ")").concat(mod);
|
||||
}
|
||||
else {
|
||||
route += "(?:".concat(prefix, "(").concat(token.pattern, ")").concat(suffix, ")").concat(token.modifier);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (token.modifier === "+" || token.modifier === "*") {
|
||||
route += "((?:".concat(token.pattern, ")").concat(token.modifier, ")");
|
||||
}
|
||||
else {
|
||||
route += "(".concat(token.pattern, ")").concat(token.modifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
route += "(?:".concat(prefix).concat(suffix, ")").concat(token.modifier);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (end) {
|
||||
if (!strict)
|
||||
route += "".concat(delimiterRe, "?");
|
||||
route += !options.endsWith ? "$" : "(?=".concat(endsWithRe, ")");
|
||||
}
|
||||
else {
|
||||
var endToken = tokens[tokens.length - 1];
|
||||
var isEndDelimited = typeof endToken === "string"
|
||||
? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1
|
||||
: endToken === undefined;
|
||||
if (!strict) {
|
||||
route += "(?:".concat(delimiterRe, "(?=").concat(endsWithRe, "))?");
|
||||
}
|
||||
if (!isEndDelimited) {
|
||||
route += "(?=".concat(delimiterRe, "|").concat(endsWithRe, ")");
|
||||
}
|
||||
}
|
||||
return new RegExp(route, flags(options));
|
||||
}
|
||||
exports.tokensToRegexp = tokensToRegexp;
|
||||
/**
|
||||
* Normalize the given path string, returning a regular expression.
|
||||
*
|
||||
* An empty array can be passed in for the keys, which will hold the
|
||||
* placeholder key descriptions. For example, using `/user/:id`, `keys` will
|
||||
* contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
|
||||
*/
|
||||
function pathToRegexp(path, keys, options) {
|
||||
if (path instanceof RegExp)
|
||||
return regexpToRegexp(path, keys);
|
||||
if (Array.isArray(path))
|
||||
return arrayToRegexp(path, keys, options);
|
||||
return stringToRegexp(path, keys, options);
|
||||
}
|
||||
exports.pathToRegexp = pathToRegexp;
|
||||
//# sourceMappingURL=index.js.map
|
||||
1
node_modules/path-to-regexp/dist/index.js.map
generated
vendored
Normal file
1
node_modules/path-to-regexp/dist/index.js.map
generated
vendored
Normal file
File diff suppressed because one or more lines are too long
84
node_modules/path-to-regexp/index.d.ts
generated
vendored
84
node_modules/path-to-regexp/index.d.ts
generated
vendored
|
|
@ -1,84 +0,0 @@
|
|||
declare function pathToRegexp (path: pathToRegexp.Path, options?: pathToRegexp.RegExpOptions & pathToRegexp.ParseOptions): pathToRegexp.PathRegExp;
|
||||
declare function pathToRegexp (path: pathToRegexp.Path, keys?: pathToRegexp.Key[], options?: pathToRegexp.RegExpOptions & pathToRegexp.ParseOptions): pathToRegexp.PathRegExp;
|
||||
|
||||
declare namespace pathToRegexp {
|
||||
export interface PathRegExp extends RegExp {
|
||||
// An array to be populated with the keys found in the path.
|
||||
keys: Key[];
|
||||
}
|
||||
|
||||
export interface RegExpOptions {
|
||||
/**
|
||||
* When `true` the route will be case sensitive. (default: `false`)
|
||||
*/
|
||||
sensitive?: boolean;
|
||||
/**
|
||||
* When `false` the trailing slash is optional. (default: `false`)
|
||||
*/
|
||||
strict?: boolean;
|
||||
/**
|
||||
* When `false` the path will match at the beginning. (default: `true`)
|
||||
*/
|
||||
end?: boolean;
|
||||
/**
|
||||
* Sets the final character for non-ending optimistic matches. (default: `/`)
|
||||
*/
|
||||
delimiter?: string;
|
||||
}
|
||||
|
||||
export interface ParseOptions {
|
||||
/**
|
||||
* Set the default delimiter for repeat parameters. (default: `'/'`)
|
||||
*/
|
||||
delimiter?: string;
|
||||
}
|
||||
|
||||
export interface TokensToFunctionOptions {
|
||||
/**
|
||||
* When `true` the regexp will be case sensitive. (default: `false`)
|
||||
*/
|
||||
sensitive?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse an Express-style path into an array of tokens.
|
||||
*/
|
||||
export function parse (path: string, options?: ParseOptions): Token[];
|
||||
|
||||
/**
|
||||
* Transforming an Express-style path into a valid path.
|
||||
*/
|
||||
export function compile (path: string, options?: ParseOptions & TokensToFunctionOptions): PathFunction;
|
||||
|
||||
/**
|
||||
* Transform an array of tokens into a path generator function.
|
||||
*/
|
||||
export function tokensToFunction (tokens: Token[], options?: TokensToFunctionOptions): PathFunction;
|
||||
|
||||
/**
|
||||
* Transform an array of tokens into a matching regular expression.
|
||||
*/
|
||||
export function tokensToRegExp (tokens: Token[], options?: RegExpOptions): PathRegExp;
|
||||
export function tokensToRegExp (tokens: Token[], keys?: Key[], options?: RegExpOptions): PathRegExp;
|
||||
|
||||
export interface Key {
|
||||
name: string | number;
|
||||
prefix: string;
|
||||
delimiter: string;
|
||||
optional: boolean;
|
||||
repeat: boolean;
|
||||
pattern: string;
|
||||
partial: boolean;
|
||||
asterisk: boolean;
|
||||
}
|
||||
|
||||
interface PathFunctionOptions {
|
||||
pretty?: boolean;
|
||||
}
|
||||
|
||||
export type Token = string | Key;
|
||||
export type Path = string | RegExp | Array<string | RegExp>;
|
||||
export type PathFunction = (data?: Object, options?: PathFunctionOptions) => string;
|
||||
}
|
||||
|
||||
export = pathToRegexp;
|
||||
426
node_modules/path-to-regexp/index.js
generated
vendored
426
node_modules/path-to-regexp/index.js
generated
vendored
|
|
@ -1,426 +0,0 @@
|
|||
var isarray = require('isarray')
|
||||
|
||||
/**
|
||||
* Expose `pathToRegexp`.
|
||||
*/
|
||||
module.exports = pathToRegexp
|
||||
module.exports.parse = parse
|
||||
module.exports.compile = compile
|
||||
module.exports.tokensToFunction = tokensToFunction
|
||||
module.exports.tokensToRegExp = tokensToRegExp
|
||||
|
||||
/**
|
||||
* The main path matching regexp utility.
|
||||
*
|
||||
* @type {RegExp}
|
||||
*/
|
||||
var PATH_REGEXP = new RegExp([
|
||||
// Match escaped characters that would otherwise appear in future matches.
|
||||
// This allows the user to escape special characters that won't transform.
|
||||
'(\\\\.)',
|
||||
// Match Express-style parameters and un-named parameters with a prefix
|
||||
// and optional suffixes. Matches appear as:
|
||||
//
|
||||
// "/:test(\\d+)?" => ["/", "test", "\d+", undefined, "?", undefined]
|
||||
// "/route(\\d+)" => [undefined, undefined, undefined, "\d+", undefined, undefined]
|
||||
// "/*" => ["/", undefined, undefined, undefined, undefined, "*"]
|
||||
'([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))'
|
||||
].join('|'), 'g')
|
||||
|
||||
/**
|
||||
* Parse a string for the raw tokens.
|
||||
*
|
||||
* @param {string} str
|
||||
* @param {Object=} options
|
||||
* @return {!Array}
|
||||
*/
|
||||
function parse (str, options) {
|
||||
var tokens = []
|
||||
var key = 0
|
||||
var index = 0
|
||||
var path = ''
|
||||
var defaultDelimiter = options && options.delimiter || '/'
|
||||
var res
|
||||
|
||||
while ((res = PATH_REGEXP.exec(str)) != null) {
|
||||
var m = res[0]
|
||||
var escaped = res[1]
|
||||
var offset = res.index
|
||||
path += str.slice(index, offset)
|
||||
index = offset + m.length
|
||||
|
||||
// Ignore already escaped sequences.
|
||||
if (escaped) {
|
||||
path += escaped[1]
|
||||
continue
|
||||
}
|
||||
|
||||
var next = str[index]
|
||||
var prefix = res[2]
|
||||
var name = res[3]
|
||||
var capture = res[4]
|
||||
var group = res[5]
|
||||
var modifier = res[6]
|
||||
var asterisk = res[7]
|
||||
|
||||
// Push the current path onto the tokens.
|
||||
if (path) {
|
||||
tokens.push(path)
|
||||
path = ''
|
||||
}
|
||||
|
||||
var partial = prefix != null && next != null && next !== prefix
|
||||
var repeat = modifier === '+' || modifier === '*'
|
||||
var optional = modifier === '?' || modifier === '*'
|
||||
var delimiter = res[2] || defaultDelimiter
|
||||
var pattern = capture || group
|
||||
|
||||
tokens.push({
|
||||
name: name || key++,
|
||||
prefix: prefix || '',
|
||||
delimiter: delimiter,
|
||||
optional: optional,
|
||||
repeat: repeat,
|
||||
partial: partial,
|
||||
asterisk: !!asterisk,
|
||||
pattern: pattern ? escapeGroup(pattern) : (asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?')
|
||||
})
|
||||
}
|
||||
|
||||
// Match any characters still remaining.
|
||||
if (index < str.length) {
|
||||
path += str.substr(index)
|
||||
}
|
||||
|
||||
// If the path exists, push it onto the end.
|
||||
if (path) {
|
||||
tokens.push(path)
|
||||
}
|
||||
|
||||
return tokens
|
||||
}
|
||||
|
||||
/**
|
||||
* Compile a string to a template function for the path.
|
||||
*
|
||||
* @param {string} str
|
||||
* @param {Object=} options
|
||||
* @return {!function(Object=, Object=)}
|
||||
*/
|
||||
function compile (str, options) {
|
||||
return tokensToFunction(parse(str, options), options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Prettier encoding of URI path segments.
|
||||
*
|
||||
* @param {string}
|
||||
* @return {string}
|
||||
*/
|
||||
function encodeURIComponentPretty (str) {
|
||||
return encodeURI(str).replace(/[\/?#]/g, function (c) {
|
||||
return '%' + c.charCodeAt(0).toString(16).toUpperCase()
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode the asterisk parameter. Similar to `pretty`, but allows slashes.
|
||||
*
|
||||
* @param {string}
|
||||
* @return {string}
|
||||
*/
|
||||
function encodeAsterisk (str) {
|
||||
return encodeURI(str).replace(/[?#]/g, function (c) {
|
||||
return '%' + c.charCodeAt(0).toString(16).toUpperCase()
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose a method for transforming tokens into the path function.
|
||||
*/
|
||||
function tokensToFunction (tokens, options) {
|
||||
// Compile all the tokens into regexps.
|
||||
var matches = new Array(tokens.length)
|
||||
|
||||
// Compile all the patterns before compilation.
|
||||
for (var i = 0; i < tokens.length; i++) {
|
||||
if (typeof tokens[i] === 'object') {
|
||||
matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options))
|
||||
}
|
||||
}
|
||||
|
||||
return function (obj, opts) {
|
||||
var path = ''
|
||||
var data = obj || {}
|
||||
var options = opts || {}
|
||||
var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent
|
||||
|
||||
for (var i = 0; i < tokens.length; i++) {
|
||||
var token = tokens[i]
|
||||
|
||||
if (typeof token === 'string') {
|
||||
path += token
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
var value = data[token.name]
|
||||
var segment
|
||||
|
||||
if (value == null) {
|
||||
if (token.optional) {
|
||||
// Prepend partial segment prefixes.
|
||||
if (token.partial) {
|
||||
path += token.prefix
|
||||
}
|
||||
|
||||
continue
|
||||
} else {
|
||||
throw new TypeError('Expected "' + token.name + '" to be defined')
|
||||
}
|
||||
}
|
||||
|
||||
if (isarray(value)) {
|
||||
if (!token.repeat) {
|
||||
throw new TypeError('Expected "' + token.name + '" to not repeat, but received `' + JSON.stringify(value) + '`')
|
||||
}
|
||||
|
||||
if (value.length === 0) {
|
||||
if (token.optional) {
|
||||
continue
|
||||
} else {
|
||||
throw new TypeError('Expected "' + token.name + '" to not be empty')
|
||||
}
|
||||
}
|
||||
|
||||
for (var j = 0; j < value.length; j++) {
|
||||
segment = encode(value[j])
|
||||
|
||||
if (!matches[i].test(segment)) {
|
||||
throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '", but received `' + JSON.stringify(segment) + '`')
|
||||
}
|
||||
|
||||
path += (j === 0 ? token.prefix : token.delimiter) + segment
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
segment = token.asterisk ? encodeAsterisk(value) : encode(value)
|
||||
|
||||
if (!matches[i].test(segment)) {
|
||||
throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but received "' + segment + '"')
|
||||
}
|
||||
|
||||
path += token.prefix + segment
|
||||
}
|
||||
|
||||
return path
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape a regular expression string.
|
||||
*
|
||||
* @param {string} str
|
||||
* @return {string}
|
||||
*/
|
||||
function escapeString (str) {
|
||||
return str.replace(/([.+*?=^!:${}()[\]|\/\\])/g, '\\$1')
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape the capturing group by escaping special characters and meaning.
|
||||
*
|
||||
* @param {string} group
|
||||
* @return {string}
|
||||
*/
|
||||
function escapeGroup (group) {
|
||||
return group.replace(/([=!:$\/()])/g, '\\$1')
|
||||
}
|
||||
|
||||
/**
|
||||
* Attach the keys as a property of the regexp.
|
||||
*
|
||||
* @param {!RegExp} re
|
||||
* @param {Array} keys
|
||||
* @return {!RegExp}
|
||||
*/
|
||||
function attachKeys (re, keys) {
|
||||
re.keys = keys
|
||||
return re
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the flags for a regexp from the options.
|
||||
*
|
||||
* @param {Object} options
|
||||
* @return {string}
|
||||
*/
|
||||
function flags (options) {
|
||||
return options && options.sensitive ? '' : 'i'
|
||||
}
|
||||
|
||||
/**
|
||||
* Pull out keys from a regexp.
|
||||
*
|
||||
* @param {!RegExp} path
|
||||
* @param {!Array} keys
|
||||
* @return {!RegExp}
|
||||
*/
|
||||
function regexpToRegexp (path, keys) {
|
||||
// Use a negative lookahead to match only capturing groups.
|
||||
var groups = path.source.match(/\((?!\?)/g)
|
||||
|
||||
if (groups) {
|
||||
for (var i = 0; i < groups.length; i++) {
|
||||
keys.push({
|
||||
name: i,
|
||||
prefix: null,
|
||||
delimiter: null,
|
||||
optional: false,
|
||||
repeat: false,
|
||||
partial: false,
|
||||
asterisk: false,
|
||||
pattern: null
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
return attachKeys(path, keys)
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform an array into a regexp.
|
||||
*
|
||||
* @param {!Array} path
|
||||
* @param {Array} keys
|
||||
* @param {!Object} options
|
||||
* @return {!RegExp}
|
||||
*/
|
||||
function arrayToRegexp (path, keys, options) {
|
||||
var parts = []
|
||||
|
||||
for (var i = 0; i < path.length; i++) {
|
||||
parts.push(pathToRegexp(path[i], keys, options).source)
|
||||
}
|
||||
|
||||
var regexp = new RegExp('(?:' + parts.join('|') + ')', flags(options))
|
||||
|
||||
return attachKeys(regexp, keys)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a path regexp from string input.
|
||||
*
|
||||
* @param {string} path
|
||||
* @param {!Array} keys
|
||||
* @param {!Object} options
|
||||
* @return {!RegExp}
|
||||
*/
|
||||
function stringToRegexp (path, keys, options) {
|
||||
return tokensToRegExp(parse(path, options), keys, options)
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose a function for taking tokens and returning a RegExp.
|
||||
*
|
||||
* @param {!Array} tokens
|
||||
* @param {(Array|Object)=} keys
|
||||
* @param {Object=} options
|
||||
* @return {!RegExp}
|
||||
*/
|
||||
function tokensToRegExp (tokens, keys, options) {
|
||||
if (!isarray(keys)) {
|
||||
options = /** @type {!Object} */ (keys || options)
|
||||
keys = []
|
||||
}
|
||||
|
||||
options = options || {}
|
||||
|
||||
var strict = options.strict
|
||||
var end = options.end !== false
|
||||
var route = ''
|
||||
|
||||
// Iterate over the tokens and create our regexp string.
|
||||
for (var i = 0; i < tokens.length; i++) {
|
||||
var token = tokens[i]
|
||||
|
||||
if (typeof token === 'string') {
|
||||
route += escapeString(token)
|
||||
} else {
|
||||
var prefix = escapeString(token.prefix)
|
||||
var capture = '(?:' + token.pattern + ')'
|
||||
|
||||
keys.push(token)
|
||||
|
||||
if (token.repeat) {
|
||||
capture += '(?:' + prefix + capture + ')*'
|
||||
}
|
||||
|
||||
if (token.optional) {
|
||||
if (!token.partial) {
|
||||
capture = '(?:' + prefix + '(' + capture + '))?'
|
||||
} else {
|
||||
capture = prefix + '(' + capture + ')?'
|
||||
}
|
||||
} else {
|
||||
capture = prefix + '(' + capture + ')'
|
||||
}
|
||||
|
||||
route += capture
|
||||
}
|
||||
}
|
||||
|
||||
var delimiter = escapeString(options.delimiter || '/')
|
||||
var endsWithDelimiter = route.slice(-delimiter.length) === delimiter
|
||||
|
||||
// In non-strict mode we allow a slash at the end of match. If the path to
|
||||
// match already ends with a slash, we remove it for consistency. The slash
|
||||
// is valid at the end of a path match, not in the middle. This is important
|
||||
// in non-ending mode, where "/test/" shouldn't match "/test//route".
|
||||
if (!strict) {
|
||||
route = (endsWithDelimiter ? route.slice(0, -delimiter.length) : route) + '(?:' + delimiter + '(?=$))?'
|
||||
}
|
||||
|
||||
if (end) {
|
||||
route += '$'
|
||||
} else {
|
||||
// In non-ending mode, we need the capturing groups to match as much as
|
||||
// possible by using a positive lookahead to the end or next path segment.
|
||||
route += strict && endsWithDelimiter ? '' : '(?=' + delimiter + '|$)'
|
||||
}
|
||||
|
||||
return attachKeys(new RegExp('^' + route, flags(options)), keys)
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize the given path string, returning a regular expression.
|
||||
*
|
||||
* An empty array can be passed in for the keys, which will hold the
|
||||
* placeholder key descriptions. For example, using `/user/:id`, `keys` will
|
||||
* contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.
|
||||
*
|
||||
* @param {(string|RegExp|Array)} path
|
||||
* @param {(Array|Object)=} keys
|
||||
* @param {Object=} options
|
||||
* @return {!RegExp}
|
||||
*/
|
||||
function pathToRegexp (path, keys, options) {
|
||||
if (!isarray(keys)) {
|
||||
options = /** @type {!Object} */ (keys || options)
|
||||
keys = []
|
||||
}
|
||||
|
||||
options = options || {}
|
||||
|
||||
if (path instanceof RegExp) {
|
||||
return regexpToRegexp(path, /** @type {!Array} */ (keys))
|
||||
}
|
||||
|
||||
if (isarray(path)) {
|
||||
return arrayToRegexp(/** @type {!Array} */ (path), /** @type {!Array} */ (keys), options)
|
||||
}
|
||||
|
||||
return stringToRegexp(/** @type {string} */ (path), /** @type {!Array} */ (keys), options)
|
||||
}
|
||||
77
node_modules/path-to-regexp/package.json
generated
vendored
77
node_modules/path-to-regexp/package.json
generated
vendored
|
|
@ -1,47 +1,62 @@
|
|||
{
|
||||
"name": "path-to-regexp",
|
||||
"version": "6.2.2",
|
||||
"description": "Express style path to RegExp utility",
|
||||
"version": "1.8.0",
|
||||
"main": "index.js",
|
||||
"typings": "index.d.ts",
|
||||
"files": [
|
||||
"index.js",
|
||||
"index.d.ts",
|
||||
"LICENSE"
|
||||
],
|
||||
"scripts": {
|
||||
"lint": "standard",
|
||||
"test-spec": "mocha --require ts-node/register -R spec --bail test.ts",
|
||||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require ts-node/register -R spec test.ts",
|
||||
"prepublish": "typings install",
|
||||
"test": "npm run lint && npm run test-cov"
|
||||
},
|
||||
"keywords": [
|
||||
"express",
|
||||
"regexp",
|
||||
"route",
|
||||
"routing"
|
||||
],
|
||||
"component": {
|
||||
"scripts": {
|
||||
"path-to-regexp": "index.js"
|
||||
}
|
||||
},
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/pillarjs/path-to-regexp.git"
|
||||
},
|
||||
"devDependencies": {
|
||||
"chai": "^2.3.0",
|
||||
"istanbul": "~0.3.0",
|
||||
"mocha": "~2.2.4",
|
||||
"standard": "~3.7.3",
|
||||
"ts-node": "^0.5.5",
|
||||
"typescript": "^1.8.7",
|
||||
"typings": "^1.0.4"
|
||||
"license": "MIT",
|
||||
"sideEffects": false,
|
||||
"main": "dist/index.js",
|
||||
"module": "dist.es2015/index.js",
|
||||
"typings": "dist/index.d.ts",
|
||||
"files": [
|
||||
"dist.es2015/",
|
||||
"dist/"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "ts-scripts build",
|
||||
"format": "ts-scripts format",
|
||||
"lint": "ts-scripts lint",
|
||||
"prepare": "ts-scripts install && npm run build",
|
||||
"size": "size-limit",
|
||||
"specs": "ts-scripts specs",
|
||||
"test": "ts-scripts test && npm run size"
|
||||
},
|
||||
"dependencies": {
|
||||
"isarray": "0.0.1"
|
||||
"devDependencies": {
|
||||
"@borderless/ts-scripts": "^0.15.0",
|
||||
"@size-limit/preset-small-lib": "^11.1.2",
|
||||
"@types/node": "^20.4.9",
|
||||
"@types/semver": "^7.3.1",
|
||||
"@vitest/coverage-v8": "^1.4.0",
|
||||
"semver": "^7.3.5",
|
||||
"size-limit": "^11.1.2",
|
||||
"typescript": "^5.1.6"
|
||||
},
|
||||
"publishConfig": {
|
||||
"access": "public"
|
||||
},
|
||||
"size-limit": [
|
||||
{
|
||||
"path": "dist.es2015/index.js",
|
||||
"limit": "2 kB"
|
||||
}
|
||||
],
|
||||
"ts-scripts": {
|
||||
"dist": [
|
||||
"dist",
|
||||
"dist.es2015"
|
||||
],
|
||||
"project": [
|
||||
"tsconfig.build.json",
|
||||
"tsconfig.es2015.json"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue