1 | # URI.js
|
---|
2 |
|
---|
3 | URI.js is an [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt) compliant, scheme extendable URI parsing/validating/resolving library for all JavaScript environments (browsers, Node.js, etc).
|
---|
4 | It is also compliant with the IRI ([RFC 3987](http://www.ietf.org/rfc/rfc3987.txt)), IDNA ([RFC 5890](http://www.ietf.org/rfc/rfc5890.txt)), IPv6 Address ([RFC 5952](http://www.ietf.org/rfc/rfc5952.txt)), IPv6 Zone Identifier ([RFC 6874](http://www.ietf.org/rfc/rfc6874.txt)) specifications.
|
---|
5 |
|
---|
6 | URI.js has an extensive test suite, and works in all (Node.js, web) environments. It weighs in at 6.4kb (gzipped, 17kb deflated).
|
---|
7 |
|
---|
8 | ## API
|
---|
9 |
|
---|
10 | ### Parsing
|
---|
11 |
|
---|
12 | URI.parse("uri://user:pass@example.com:123/one/two.three?q1=a1&q2=a2#body");
|
---|
13 | //returns:
|
---|
14 | //{
|
---|
15 | // scheme : "uri",
|
---|
16 | // userinfo : "user:pass",
|
---|
17 | // host : "example.com",
|
---|
18 | // port : 123,
|
---|
19 | // path : "/one/two.three",
|
---|
20 | // query : "q1=a1&q2=a2",
|
---|
21 | // fragment : "body"
|
---|
22 | //}
|
---|
23 |
|
---|
24 | ### Serializing
|
---|
25 |
|
---|
26 | URI.serialize({scheme : "http", host : "example.com", fragment : "footer"}) === "http://example.com/#footer"
|
---|
27 |
|
---|
28 | ### Resolving
|
---|
29 |
|
---|
30 | URI.resolve("uri://a/b/c/d?q", "../../g") === "uri://a/g"
|
---|
31 |
|
---|
32 | ### Normalizing
|
---|
33 |
|
---|
34 | URI.normalize("HTTP://ABC.com:80/%7Esmith/home.html") === "http://abc.com/~smith/home.html"
|
---|
35 |
|
---|
36 | ### Comparison
|
---|
37 |
|
---|
38 | URI.equal("example://a/b/c/%7Bfoo%7D", "eXAMPLE://a/./b/../b/%63/%7bfoo%7d") === true
|
---|
39 |
|
---|
40 | ### IP Support
|
---|
41 |
|
---|
42 | //IPv4 normalization
|
---|
43 | URI.normalize("//192.068.001.000") === "//192.68.1.0"
|
---|
44 |
|
---|
45 | //IPv6 normalization
|
---|
46 | URI.normalize("//[2001:0:0DB8::0:0001]") === "//[2001:0:db8::1]"
|
---|
47 |
|
---|
48 | //IPv6 zone identifier support
|
---|
49 | URI.parse("//[2001:db8::7%25en1]");
|
---|
50 | //returns:
|
---|
51 | //{
|
---|
52 | // host : "2001:db8::7%en1"
|
---|
53 | //}
|
---|
54 |
|
---|
55 | ### IRI Support
|
---|
56 |
|
---|
57 | //convert IRI to URI
|
---|
58 | URI.serialize(URI.parse("http://examplé.org/rosé")) === "http://xn--exampl-gva.org/ros%C3%A9"
|
---|
59 | //convert URI to IRI
|
---|
60 | URI.serialize(URI.parse("http://xn--exampl-gva.org/ros%C3%A9"), {iri:true}) === "http://examplé.org/rosé"
|
---|
61 |
|
---|
62 | ### Options
|
---|
63 |
|
---|
64 | 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:
|
---|
65 |
|
---|
66 | * `scheme` (string)
|
---|
67 |
|
---|
68 | Indicates the scheme that the URI should be treated as, overriding the URI's normal scheme parsing behavior.
|
---|
69 |
|
---|
70 | * `reference` (string)
|
---|
71 |
|
---|
72 | If set to `"suffix"`, it indicates that the URI is in the suffix format, and the validator will use the option's `scheme` property to determine the URI's scheme.
|
---|
73 |
|
---|
74 | * `tolerant` (boolean, false)
|
---|
75 |
|
---|
76 | If set to `true`, the parser will relax URI resolving rules.
|
---|
77 |
|
---|
78 | * `absolutePath` (boolean, false)
|
---|
79 |
|
---|
80 | If set to `true`, the serializer will not resolve a relative `path` component.
|
---|
81 |
|
---|
82 | * `iri` (boolean, false)
|
---|
83 |
|
---|
84 | If set to `true`, the serializer will unescape non-ASCII characters as per [RFC 3987](http://www.ietf.org/rfc/rfc3987.txt).
|
---|
85 |
|
---|
86 | * `unicodeSupport` (boolean, false)
|
---|
87 |
|
---|
88 | 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).
|
---|
89 |
|
---|
90 | * `domainHost` (boolean, false)
|
---|
91 |
|
---|
92 | 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).
|
---|
93 |
|
---|
94 | ## Scheme Extendable
|
---|
95 |
|
---|
96 | URI.js supports inserting custom [scheme](http://en.wikipedia.org/wiki/URI_scheme) dependent processing rules. Currently, URI.js has built in support for the following schemes:
|
---|
97 |
|
---|
98 | * http \[[RFC 2616](http://www.ietf.org/rfc/rfc2616.txt)\]
|
---|
99 | * https \[[RFC 2818](http://www.ietf.org/rfc/rfc2818.txt)\]
|
---|
100 | * ws \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\]
|
---|
101 | * wss \[[RFC 6455](http://www.ietf.org/rfc/rfc6455.txt)\]
|
---|
102 | * mailto \[[RFC 6068](http://www.ietf.org/rfc/rfc6068.txt)\]
|
---|
103 | * urn \[[RFC 2141](http://www.ietf.org/rfc/rfc2141.txt)\]
|
---|
104 | * urn:uuid \[[RFC 4122](http://www.ietf.org/rfc/rfc4122.txt)\]
|
---|
105 |
|
---|
106 | ### HTTP/HTTPS Support
|
---|
107 |
|
---|
108 | URI.equal("HTTP://ABC.COM:80", "http://abc.com/") === true
|
---|
109 | URI.equal("https://abc.com", "HTTPS://ABC.COM:443/") === true
|
---|
110 |
|
---|
111 | ### WS/WSS Support
|
---|
112 |
|
---|
113 | URI.parse("wss://example.com/foo?bar=baz");
|
---|
114 | //returns:
|
---|
115 | //{
|
---|
116 | // scheme : "wss",
|
---|
117 | // host: "example.com",
|
---|
118 | // resourceName: "/foo?bar=baz",
|
---|
119 | // secure: true,
|
---|
120 | //}
|
---|
121 |
|
---|
122 | URI.equal("WS://ABC.COM:80/chat#one", "ws://abc.com/chat") === true
|
---|
123 |
|
---|
124 | ### Mailto Support
|
---|
125 |
|
---|
126 | URI.parse("mailto:alpha@example.com,bravo@example.com?subject=SUBSCRIBE&body=Sign%20me%20up!");
|
---|
127 | //returns:
|
---|
128 | //{
|
---|
129 | // scheme : "mailto",
|
---|
130 | // to : ["alpha@example.com", "bravo@example.com"],
|
---|
131 | // subject : "SUBSCRIBE",
|
---|
132 | // body : "Sign me up!"
|
---|
133 | //}
|
---|
134 |
|
---|
135 | URI.serialize({
|
---|
136 | scheme : "mailto",
|
---|
137 | to : ["alpha@example.com"],
|
---|
138 | subject : "REMOVE",
|
---|
139 | body : "Please remove me",
|
---|
140 | headers : {
|
---|
141 | cc : "charlie@example.com"
|
---|
142 | }
|
---|
143 | }) === "mailto:alpha@example.com?cc=charlie@example.com&subject=REMOVE&body=Please%20remove%20me"
|
---|
144 |
|
---|
145 | ### URN Support
|
---|
146 |
|
---|
147 | URI.parse("urn:example:foo");
|
---|
148 | //returns:
|
---|
149 | //{
|
---|
150 | // scheme : "urn",
|
---|
151 | // nid : "example",
|
---|
152 | // nss : "foo",
|
---|
153 | //}
|
---|
154 |
|
---|
155 | #### URN UUID Support
|
---|
156 |
|
---|
157 | URI.parse("urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6");
|
---|
158 | //returns:
|
---|
159 | //{
|
---|
160 | // scheme : "urn",
|
---|
161 | // nid : "uuid",
|
---|
162 | // uuid : "f81d4fae-7dec-11d0-a765-00a0c91e6bf6",
|
---|
163 | //}
|
---|
164 |
|
---|
165 | ## Usage
|
---|
166 |
|
---|
167 | To load in a browser, use the following tag:
|
---|
168 |
|
---|
169 | <script type="text/javascript" src="uri-js/dist/es5/uri.all.min.js"></script>
|
---|
170 |
|
---|
171 | To load in a CommonJS/Module environment, first install with npm/yarn by running on the command line:
|
---|
172 |
|
---|
173 | npm install uri-js
|
---|
174 | # OR
|
---|
175 | yarn add uri-js
|
---|
176 |
|
---|
177 | Then, in your code, load it using:
|
---|
178 |
|
---|
179 | const URI = require("uri-js");
|
---|
180 |
|
---|
181 | If you are writing your code in ES6+ (ESNEXT) or TypeScript, you would load it using:
|
---|
182 |
|
---|
183 | import * as URI from "uri-js";
|
---|
184 |
|
---|
185 | Or you can load just what you need using named exports:
|
---|
186 |
|
---|
187 | import { parse, serialize, resolve, resolveComponents, normalize, equal, removeDotSegments, pctEncChar, pctDecChars, escapeComponent, unescapeComponent } from "uri-js";
|
---|
188 |
|
---|
189 | ## Breaking changes
|
---|
190 |
|
---|
191 | ### Breaking changes from 3.x
|
---|
192 |
|
---|
193 | URN parsing has been completely changed to better align with the specification. Scheme is now always `urn`, but has two new properties: `nid` which contains the Namspace Identifier, and `nss` which contains the Namespace Specific String. The `nss` property will be removed by higher order scheme handlers, such as the UUID URN scheme handler.
|
---|
194 |
|
---|
195 | The UUID of a URN can now be found in the `uuid` property.
|
---|
196 |
|
---|
197 | ### Breaking changes from 2.x
|
---|
198 |
|
---|
199 | URI validation has been removed as it was slow, exposed a vulnerabilty, and was generally not useful.
|
---|
200 |
|
---|
201 | ### Breaking changes from 1.x
|
---|
202 |
|
---|
203 | The `errors` array on parsed components is now an `error` string.
|
---|