recoder-code
Version:
š AI-powered development platform - Chat with 32+ models, build projects, automate workflows. Free models included!
144 lines (111 loc) ⢠11.3 kB
Markdown
# fast-uri
<div align="center">
[](https://www.npmjs.com/package/fast-uri)
[](https://github.com/fastify/fast-uri/actions/workflows/ci.yml)
[](https://github.com/neostandard/neostandard)
</div>
Dependency-free RFC 3986 URI toolbox.
## Usage
## Options
All of the above functions can accept an additional options argument that is an object that can contain one or more of the following properties:
* `scheme` (string)
Indicates the scheme that the URI should be treated as, overriding the URI's normal scheme parsing behavior.
* `reference` (string)
If set to `"suffix"`, it indicates that the URI is in the suffix format and the parser will use the option's `scheme` property to determine the URI's scheme.
* `tolerant` (boolean, false)
If set to `true`, the parser will relax URI resolving rules.
* `absolutePath` (boolean, false)
If set to `true`, the serializer will not resolve a relative `path` component.
* `unicodeSupport` (boolean, false)
If set to `true`, the parser will unescape non-ASCII characters in the parsed output as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt).
* `domainHost` (boolean, false)
If set to `true`, the library will treat the `host` component as a domain name, and convert IDNs (International Domain Names) as per [RFC 5891](http://www.ietf.org/rfc/rfc5891.txt).
### Parse
```js
const uri = require('fast-uri')
uri.parse('uri://user:pass@example.com:123/one/two.three?q1=a1&q2=a2#body')
// Output
{
scheme: "uri",
userinfo: "user:pass",
host: "example.com",
port: 123,
path: "/one/two.three",
query: "q1=a1&q2=a2",
fragment: "body"
}
```
### Serialize
```js
const uri = require('fast-uri')
uri.serialize({scheme: "http", host: "example.com", fragment: "footer"})
// Output
"http://example.com/#footer"
```
### Resolve
```js
const uri = require('fast-uri')
uri.resolve("uri://a/b/c/d?q", "../../g")
// Output
"uri://a/g"
```
### Equal
```js
const uri = require('fast-uri')
uri.equal("example://a/b/c/%7Bfoo%7D", "eXAMPLE://a/./b/../b/%63/%7bfoo%7d")
// Output
true
```
## Scheme supports
fast-uri supports inserting custom [scheme](http://en.wikipedia.org/wiki/URI_scheme)-dependent processing rules. Currently, fast-uri has built-in support for the following schemes:
* http \[[RFC 2616](http://www.ietf.org/rfc/rfc2616.txt)\]
* https \[[RFC 2818](http://www.ietf.org/rfc/rfc2818.txt)\]
* ws \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\]
* wss \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\]
* urn \[[RFC 2141](http://www.ietf.org/rfc/rfc2141.txt)\]
* urn:uuid \[[RFC 4122](http://www.ietf.org/rfc/rfc4122.txt)\]
## Benchmarks
```
fast-uri benchmark
āāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāā
ā (index) ā Task name ā Latency avg (ns) ā Latency med (ns) ā Throughput avg (ops/s) ā Throughput med (ops/s) ā Samples ā
āāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāā¤
ā 0 ā 'fast-uri: parse domain' ā '951.31 ± 0.75%' ā '875.00 ± 11.00' ā '1122538 ± 0.01%' ā '1142857 ± 14550' ā 1051187 ā
ā 1 ā 'fast-uri: parse IPv4' ā '443.44 ± 0.22%' ā '406.00 ± 3.00' ā '2422762 ± 0.01%' ā '2463054 ± 18335' ā 2255105 ā
ā 2 ā 'fast-uri: parse IPv6' ā '1241.6 ± 1.74%' ā '1131.0 ± 30.00' ā '875177 ± 0.02%' ā '884173 ± 24092' ā 805399 ā
ā 3 ā 'fast-uri: parse URN' ā '689.19 ± 4.29%' ā '618.00 ± 9.00' ā '1598373 ± 0.01%' ā '1618123 ± 23913' ā 1450972 ā
ā 4 ā 'fast-uri: parse URN uuid' ā '1025.4 ± 2.02%' ā '921.00 ± 19.00' ā '1072419 ± 0.02%' ā '1085776 ± 22871' ā 975236 ā
ā 5 ā 'fast-uri: serialize uri' ā '1028.5 ± 0.53%' ā '933.00 ± 43.00' ā '1063310 ± 0.02%' ā '1071811 ± 50523' ā 972249 ā
ā 6 ā 'fast-uri: serialize long uri with dots' ā '1805.1 ± 0.52%' ā '1627.0 ± 17.00' ā '602620 ± 0.02%' ā '614628 ± 6490' ā 553997 ā
ā 7 ā 'fast-uri: serialize IPv6' ā '2569.4 ± 2.69%' ā '2302.0 ± 21.00' ā '426080 ± 0.03%' ā '434405 ± 3999' ā 389194 ā
ā 8 ā 'fast-uri: serialize ws' ā '979.39 ± 0.43%' ā '882.00 ± 8.00' ā '1111665 ± 0.02%' ā '1133787 ± 10378' ā 1021045 ā
ā 9 ā 'fast-uri: resolve' ā '2208.2 ± 1.08%' ā '1980.0 ± 24.00' ā '495001 ± 0.03%' ā '505051 ± 6049' ā 452848 ā
āāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāā
uri-js benchmark
āāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāā
ā (index) ā Task name ā Latency avg (ns) ā Latency med (ns) ā Throughput avg (ops/s) ā Throughput med (ops/s) ā Samples ā
āāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāā¤
ā 0 ā 'urijs: parse domain' ā '3618.3 ± 0.43%' ā '3314.0 ± 33.00' ā '294875 ± 0.04%' ā '301750 ± 2975' ā 276375 ā
ā 1 ā 'urijs: parse IPv4' ā '4024.1 ± 0.41%' ā '3751.0 ± 25.00' ā '261981 ± 0.04%' ā '266596 ± 1789' ā 248506 ā
ā 2 ā 'urijs: parse IPv6' ā '5417.2 ± 0.46%' ā '4968.0 ± 43.00' ā '196023 ± 0.05%' ā '201288 ± 1727' ā 184598 ā
ā 3 ā 'urijs: parse URN' ā '1324.2 ± 0.23%' ā '1229.0 ± 17.00' ā '801535 ± 0.02%' ā '813670 ± 11413' ā 755185 ā
ā 4 ā 'urijs: parse URN uuid' ā '1822.0 ± 3.08%' ā '1655.0 ± 15.00' ā '594433 ± 0.02%' ā '604230 ± 5427' ā 548843 ā
ā 5 ā 'urijs: serialize uri' ā '4196.8 ± 0.36%' ā '3908.0 ± 27.00' ā '251146 ± 0.04%' ā '255885 ± 1756' ā 238276 ā
ā 6 ā 'urijs: serialize long uri with dots' ā '8331.0 ± 1.30%' ā '7658.0 ± 72.00' ā '126440 ± 0.07%' ā '130582 ± 1239' ā 120034 ā
ā 7 ā 'urijs: serialize IPv6' ā '5685.5 ± 0.30%' ā '5366.0 ± 33.00' ā '182632 ± 0.05%' ā '186359 ± 1153' ā 175886 ā
ā 8 ā 'urijs: serialize ws' ā '4159.3 ± 0.20%' ā '3899.0 ± 28.00' ā '250459 ± 0.04%' ā '256476 ± 1855' ā 240423 ā
ā 9 ā 'urijs: resolve' ā '6729.9 ± 0.39%' ā '6261.0 ± 37.00' ā '156361 ± 0.06%' ā '159719 ± 949' ā 148591 ā
āāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāā
WHATWG URL benchmark
āāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāāāāāāāāāāāāāāāāā¬āāāāāāāāāā
ā (index) ā Task name ā Latency avg (ns) ā Latency med (ns) ā Throughput avg (ops/s) ā Throughput med (ops/s) ā Samples ā
āāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāāāāāāāāāāāāāāāāā¼āāāāāāāāāā¤
ā 0 ā 'WHATWG URL: parse domain' ā '475.22 ± 0.20%' ā '444.00 ± 5.00' ā '2217599 ± 0.01%' ā '2252252 ± 25652' ā 2104289 ā
ā 1 ā 'WHATWG URL: parse URN' ā '384.78 ± 0.85%' ā '350.00 ± 5.00' ā '2809071 ± 0.01%' ā '2857143 ± 41408' ā 2598885 ā
āāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāāāāāāāāāāāāāāāāā“āāāāāāāāāā
```
## TODO
- [ ] Support MailTo
- [ ] Be 100% iso compatible with uri-js
## License
Licensed under [BSD-3-Clause](./LICENSE).