@suveren/gateway 0.7.4 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/content/integrations/mollie.json +103 -28
- package/dist/control-plane/index.mjs +248 -58
- package/dist/mcp-server/http.mjs +577 -124
- package/dist/ui/assets/index-BFnSVa9N.js +110 -0
- package/dist/ui/assets/{index-CkWaRck1.css → index-BYVb_0oG.css} +1 -1
- package/dist/ui/index.html +2 -2
- package/node_modules/@hap/core/dist/index.d.mts +285 -13
- package/node_modules/@hap/core/dist/index.d.ts +285 -13
- package/node_modules/@hap/core/dist/index.js +281 -13
- package/node_modules/@hap/core/dist/index.mjs +266 -12
- package/node_modules/@hap/core/package.json +4 -2
- package/node_modules/@hap/core/src/did-key.ts +126 -0
- package/node_modules/@hap/core/src/frame.ts +115 -14
- package/node_modules/@hap/core/src/gatekeeper.ts +26 -0
- package/node_modules/@hap/core/src/identity.ts +21 -5
- package/node_modules/@hap/core/src/index.ts +3 -0
- package/node_modules/@hap/core/src/mandate.ts +207 -0
- package/node_modules/@hap/core/src/receipt.ts +74 -0
- package/node_modules/@hap/core/src/types.ts +87 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/accept.js +54 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/charset.js +10 -34
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/encoding.js +9 -30
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/language.js +15 -36
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/mediaType.js +16 -134
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/LICENSE +22 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/README.md +71 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/dist/index.d.ts +46 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/dist/index.js +176 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/dist/index.js.map +1 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/package.json +52 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/package.json +16 -10
- package/node_modules/@types/node/README.md +1 -1
- package/node_modules/@types/node/buffer.buffer.d.ts +10 -5
- package/node_modules/@types/node/crypto.d.ts +2 -4
- package/node_modules/@types/node/dgram.d.ts +119 -4
- package/node_modules/@types/node/ffi.d.ts +1 -1
- package/node_modules/@types/node/fs/promises.d.ts +61 -65
- package/node_modules/@types/node/fs.d.ts +86 -76
- package/node_modules/@types/node/http.d.ts +17 -1
- package/node_modules/@types/node/http2.d.ts +12 -4
- package/node_modules/@types/node/index.d.ts +1 -0
- package/node_modules/@types/node/inspector.d.ts +2 -1
- package/node_modules/@types/node/net.d.ts +108 -16
- package/node_modules/@types/node/package.json +2 -2
- package/node_modules/@types/node/process.d.ts +52 -0
- package/node_modules/@types/node/quic.d.ts +246 -38
- package/node_modules/@types/node/sqlite.d.ts +6 -2
- package/node_modules/@types/node/stream/iter.d.ts +4 -4
- package/node_modules/@types/node/test.d.ts +36 -0
- package/node_modules/@types/node/tls.d.ts +24 -0
- package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +5 -0
- package/node_modules/@types/node/ts5.6/index.d.ts +1 -0
- package/node_modules/@types/node/ts5.7/index.d.ts +1 -0
- package/node_modules/@types/node/tty.d.ts +4 -3
- package/node_modules/@types/node/vfs.d.ts +210 -0
- package/node_modules/@types/node/vm.d.ts +1 -1
- package/node_modules/express-rate-limit/dist/index.cjs +6 -3
- package/node_modules/express-rate-limit/dist/index.d.cts +11 -0
- package/node_modules/express-rate-limit/dist/index.d.mts +11 -0
- package/node_modules/express-rate-limit/dist/index.d.ts +11 -0
- package/node_modules/express-rate-limit/dist/index.mjs +6 -3
- package/node_modules/express-rate-limit/{license.md → license} +7 -6
- package/node_modules/express-rate-limit/package.json +5 -5
- package/node_modules/express-rate-limit/readme.md +1 -0
- package/node_modules/fast-uri/index.js +215 -47
- package/node_modules/fast-uri/lib/schemes.js +9 -4
- package/node_modules/fast-uri/lib/utils.js +396 -92
- package/node_modules/fast-uri/package.json +1 -1
- package/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
- package/node_modules/fast-uri/test/equal.test.js +31 -3
- package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
- package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
- package/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
- package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
- package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
- package/node_modules/fast-uri/test/parse.test.js +7 -3
- package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
- package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
- package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
- package/node_modules/fast-uri/test/security-normalization.test.js +101 -0
- package/node_modules/fast-uri/test/security.test.js +75 -3
- package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
- package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
- package/node_modules/hono/dist/cjs/client/client.js +25 -11
- package/node_modules/hono/dist/cjs/client/utils.js +4 -1
- package/node_modules/hono/dist/cjs/context.js +4 -0
- package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
- package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
- package/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
- package/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
- package/node_modules/hono/dist/cjs/middleware/cache/index.js +1 -1
- package/node_modules/hono/dist/cjs/middleware/cors/index.js +1 -1
- package/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
- package/node_modules/hono/dist/cjs/middleware/etag/digest.js +1 -1
- package/node_modules/hono/dist/cjs/middleware/etag/index.js +3 -3
- package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
- package/node_modules/hono/dist/cjs/request.js +8 -4
- package/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
- package/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
- package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +10 -3
- package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +47 -83
- package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +2 -1
- package/node_modules/hono/dist/cjs/router/trie-router/node.js +46 -69
- package/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
- package/node_modules/hono/dist/cjs/router/utils.js +27 -0
- package/node_modules/hono/dist/cjs/utils/body.js +15 -3
- package/node_modules/hono/dist/cjs/utils/cookie.js +1 -1
- package/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
- package/node_modules/hono/dist/cjs/utils/stream.js +7 -1
- package/node_modules/hono/dist/cjs/utils/url.js +9 -1
- package/node_modules/hono/dist/client/client.js +25 -11
- package/node_modules/hono/dist/client/utils.js +4 -1
- package/node_modules/hono/dist/context.js +4 -0
- package/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
- package/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
- package/node_modules/hono/dist/helper/ssg/utils.js +30 -10
- package/node_modules/hono/dist/jsx/dom/render.js +2 -0
- package/node_modules/hono/dist/middleware/cache/index.js +1 -1
- package/node_modules/hono/dist/middleware/cors/index.js +1 -1
- package/node_modules/hono/dist/middleware/csrf/index.js +1 -1
- package/node_modules/hono/dist/middleware/etag/digest.js +1 -1
- package/node_modules/hono/dist/middleware/etag/index.js +3 -3
- package/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
- package/node_modules/hono/dist/request.js +8 -4
- package/node_modules/hono/dist/router/linear-router/router.js +7 -2
- package/node_modules/hono/dist/router/pattern-router/router.js +3 -9
- package/node_modules/hono/dist/router/reg-exp-router/node.js +6 -2
- package/node_modules/hono/dist/router/reg-exp-router/router.js +53 -84
- package/node_modules/hono/dist/router/reg-exp-router/trie.js +2 -1
- package/node_modules/hono/dist/router/trie-router/node.js +46 -69
- package/node_modules/hono/dist/router/trie-router/router.js +3 -11
- package/node_modules/hono/dist/router/utils.js +5 -0
- package/node_modules/hono/dist/types/context.d.ts +4 -0
- package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +3 -0
- package/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
- package/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
- package/node_modules/hono/dist/types/router/utils.d.ts +1 -0
- package/node_modules/hono/dist/types/utils/url.d.ts +4 -0
- package/node_modules/hono/dist/utils/body.js +15 -3
- package/node_modules/hono/dist/utils/cookie.js +1 -1
- package/node_modules/hono/dist/utils/ipaddr.js +5 -3
- package/node_modules/hono/dist/utils/stream.js +7 -1
- package/node_modules/hono/dist/utils/url.js +9 -1
- package/node_modules/hono/package.json +1 -1
- package/node_modules/ip-address/README.md +92 -82
- package/node_modules/ip-address/dist/common.d.ts +20 -0
- package/node_modules/ip-address/dist/common.js +36 -0
- package/node_modules/ip-address/dist/common.js.map +1 -1
- package/node_modules/ip-address/dist/ipv4.d.ts +50 -0
- package/node_modules/ip-address/dist/ipv4.js +75 -0
- package/node_modules/ip-address/dist/ipv4.js.map +1 -1
- package/node_modules/ip-address/dist/ipv6.d.ts +79 -10
- package/node_modules/ip-address/dist/ipv6.js +120 -30
- package/node_modules/ip-address/dist/ipv6.js.map +1 -1
- package/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
- package/node_modules/ip-address/dist/v4/constants.js +40 -1
- package/node_modules/ip-address/dist/v4/constants.js.map +1 -1
- package/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
- package/node_modules/ip-address/dist/v6/constants.js +47 -1
- package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
- package/node_modules/ip-address/package.json +1 -1
- package/node_modules/is-plain-object/README.md +39 -95
- package/node_modules/is-plain-object/dist/is-plain-object.js +0 -2
- package/node_modules/is-plain-object/is-plain-object.d.ts +6 -1
- package/node_modules/is-plain-object/package.json +8 -34
- package/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts +7 -16
- package/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts +10 -20
- package/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts +7 -16
- package/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts +16 -38
- package/node_modules/jose/dist/types/jwe/general/decrypt.d.ts +7 -16
- package/node_modules/jose/dist/types/jwe/general/encrypt.d.ts +19 -38
- package/node_modules/jose/dist/types/jwk/embedded.d.ts +3 -8
- package/node_modules/jose/dist/types/jwk/thumbprint.d.ts +5 -5
- package/node_modules/jose/dist/types/jwks/local.d.ts +6 -10
- package/node_modules/jose/dist/types/jwks/remote.d.ts +17 -28
- package/node_modules/jose/dist/types/jws/compact/sign.d.ts +5 -10
- package/node_modules/jose/dist/types/jws/compact/verify.d.ts +9 -18
- package/node_modules/jose/dist/types/jws/flattened/sign.d.ts +7 -16
- package/node_modules/jose/dist/types/jws/flattened/verify.d.ts +9 -18
- package/node_modules/jose/dist/types/jws/general/sign.d.ts +11 -21
- package/node_modules/jose/dist/types/jws/general/verify.d.ts +12 -21
- package/node_modules/jose/dist/types/jwt/decrypt.d.ts +10 -20
- package/node_modules/jose/dist/types/jwt/encrypt.d.ts +17 -29
- package/node_modules/jose/dist/types/jwt/sign.d.ts +12 -19
- package/node_modules/jose/dist/types/jwt/unsecured.d.ts +17 -28
- package/node_modules/jose/dist/types/jwt/verify.d.ts +9 -19
- package/node_modules/jose/dist/types/key/export.d.ts +4 -4
- package/node_modules/jose/dist/types/key/generate_key_pair.d.ts +6 -8
- package/node_modules/jose/dist/types/key/generate_secret.d.ts +4 -11
- package/node_modules/jose/dist/types/key/import.d.ts +10 -17
- package/node_modules/jose/dist/types/types.d.ts +48 -86
- package/node_modules/jose/dist/types/util/base64url.d.ts +2 -2
- package/node_modules/jose/dist/types/util/decode_jwt.d.ts +3 -10
- package/node_modules/jose/dist/types/util/decode_protected_header.d.ts +4 -4
- package/node_modules/jose/dist/types/util/errors.d.ts +26 -53
- package/node_modules/jose/dist/webapi/index.js +70 -32
- package/node_modules/jose/dist/webapi/jwe/compact/decrypt.js +7 -8
- package/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +42 -26
- package/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +14 -10
- package/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +53 -71
- package/node_modules/jose/dist/webapi/jwe/general/decrypt.js +38 -49
- package/node_modules/jose/dist/webapi/jwe/general/encrypt.js +121 -158
- package/node_modules/jose/dist/webapi/jwk/embedded.js +30 -18
- package/node_modules/jose/dist/webapi/jwk/thumbprint.js +54 -64
- package/node_modules/jose/dist/webapi/jwks/local.js +49 -74
- package/node_modules/jose/dist/webapi/jwks/remote.js +91 -160
- package/node_modules/jose/dist/webapi/jws/compact/sign.js +21 -20
- package/node_modules/jose/dist/webapi/jws/compact/verify.js +7 -8
- package/node_modules/jose/dist/webapi/jws/flattened/sign.js +29 -30
- package/node_modules/jose/dist/webapi/jws/flattened/verify.js +21 -23
- package/node_modules/jose/dist/webapi/jws/general/sign.js +61 -70
- package/node_modules/jose/dist/webapi/jws/general/verify.js +47 -41
- package/node_modules/jose/dist/webapi/jwt/decrypt.js +13 -22
- package/node_modules/jose/dist/webapi/jwt/encrypt.js +58 -100
- package/node_modules/jose/dist/webapi/jwt/sign.js +18 -50
- package/node_modules/jose/dist/webapi/jwt/unsecured.js +34 -63
- package/node_modules/jose/dist/webapi/jwt/verify.js +12 -14
- package/node_modules/jose/dist/webapi/key/export.js +32 -37
- package/node_modules/jose/dist/webapi/key/generate_key_pair.js +40 -44
- package/node_modules/jose/dist/webapi/key/generate_secret.js +35 -39
- package/node_modules/jose/dist/webapi/key/import.js +52 -52
- package/node_modules/jose/dist/webapi/lib/asn1.js +130 -164
- package/node_modules/jose/dist/webapi/lib/base64.js +18 -20
- package/node_modules/jose/dist/webapi/lib/buffer_utils.js +34 -38
- package/node_modules/jose/dist/webapi/lib/content_encryption.js +79 -123
- package/node_modules/jose/dist/webapi/lib/crypto_key.js +24 -25
- package/node_modules/jose/dist/webapi/lib/deflate.js +46 -40
- package/node_modules/jose/dist/webapi/lib/helpers.js +40 -37
- package/node_modules/jose/dist/webapi/lib/invalid_key_input.js +10 -24
- package/node_modules/jose/dist/webapi/lib/is_key_like.js +17 -15
- package/node_modules/jose/dist/webapi/lib/jwe_algorithms.js +106 -93
- package/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +210 -176
- package/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +105 -107
- package/node_modules/jose/dist/webapi/lib/jwk_metadata.js +19 -0
- package/node_modules/jose/dist/webapi/lib/jwk_to_key.js +9 -16
- package/node_modules/jose/dist/webapi/lib/jws_algorithms.js +62 -61
- package/node_modules/jose/dist/webapi/lib/jws_sign.js +58 -72
- package/node_modules/jose/dist/webapi/lib/jws_verify.js +90 -103
- package/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +134 -185
- package/node_modules/jose/dist/webapi/lib/key.js +84 -121
- package/node_modules/jose/dist/webapi/lib/key_algorithm.js +13 -8
- package/node_modules/jose/dist/webapi/lib/key_descriptor.js +8 -6
- package/node_modules/jose/dist/webapi/lib/key_management.js +200 -225
- package/node_modules/jose/dist/webapi/lib/key_options.js +8 -0
- package/node_modules/jose/dist/webapi/lib/options.js +57 -44
- package/node_modules/jose/dist/webapi/lib/signing.js +18 -22
- package/node_modules/jose/dist/webapi/lib/type_checks.js +28 -33
- package/node_modules/jose/dist/webapi/util/base64url.js +26 -35
- package/node_modules/jose/dist/webapi/util/decode_jwt.js +32 -31
- package/node_modules/jose/dist/webapi/util/decode_protected_header.js +18 -23
- package/node_modules/jose/dist/webapi/util/errors.js +94 -84
- package/node_modules/jose/package.json +17 -81
- package/package.json +2 -2
- package/profiles/calendar/0.5.profile.json +190 -0
- package/profiles/charge/0.5.profile.json +210 -0
- package/profiles/customers/0.7.profile.json +157 -0
- package/profiles/deploy/0.9.profile.json +176 -0
- package/profiles/email/0.6.profile.json +208 -0
- package/profiles/index.json +9 -1
- package/profiles/publish/0.5.profile.json +186 -0
- package/profiles/purchase/0.5.profile.json +231 -0
- package/profiles/records/0.5.profile.json +117 -0
- package/dist/ui/assets/index-0Q2eNytX.js +0 -110
- package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/HISTORY.md +0 -114
|
@@ -1,8 +1,23 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
|
-
const { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding,
|
|
3
|
+
const { normalizeIPv6, removeDotSegments, recomposeAuthority, normalizePercentEncoding, normalizePathEncoding, serializePathEncoding, normalizeQueryFragmentEncoding, encodeQuery, encodeFragment, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require('./lib/utils')
|
|
4
4
|
const { SCHEMES, getSchemeHandler } = require('./lib/schemes')
|
|
5
5
|
|
|
6
|
+
const VALID_SCHEME = /^[A-Za-z][A-Za-z0-9+.-]*$/u
|
|
7
|
+
const MALFORMED_SCHEME_ERROR = 'URI scheme is malformed.'
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @param {string} scheme
|
|
11
|
+
* @returns {string}
|
|
12
|
+
*/
|
|
13
|
+
function decodeValidScheme (scheme) {
|
|
14
|
+
const decodedScheme = unescape(String(scheme))
|
|
15
|
+
if (!VALID_SCHEME.test(decodedScheme)) {
|
|
16
|
+
throw new TypeError(MALFORMED_SCHEME_ERROR)
|
|
17
|
+
}
|
|
18
|
+
return decodedScheme
|
|
19
|
+
}
|
|
20
|
+
|
|
6
21
|
/**
|
|
7
22
|
* @template {import('./types/index').URIComponent|string} T
|
|
8
23
|
* @param {T} uri
|
|
@@ -26,12 +41,50 @@ function normalize (uri, options) {
|
|
|
26
41
|
*/
|
|
27
42
|
function resolve (baseURI, relativeURI, options) {
|
|
28
43
|
const schemelessOptions = options ? Object.assign({ scheme: 'null' }, options) : { scheme: 'null' }
|
|
29
|
-
const {
|
|
30
|
-
|
|
31
|
-
|
|
44
|
+
const {
|
|
45
|
+
parsed: baseParsed,
|
|
46
|
+
malformedAuthorityOrPort: baseMalformed,
|
|
47
|
+
malformedPercentEncoding: baseMalformedPercentEncoding,
|
|
48
|
+
malformedSchemeSpecific: baseMalformedSchemeSpecific,
|
|
49
|
+
malformedHost: baseMalformedHost,
|
|
50
|
+
malformedScheme: baseMalformedScheme
|
|
51
|
+
} = parseWithStatus(baseURI, schemelessOptions)
|
|
52
|
+
const {
|
|
53
|
+
parsed: relativeParsed,
|
|
54
|
+
malformedAuthorityOrPort: relativeMalformed,
|
|
55
|
+
malformedPercentEncoding: relativeMalformedPercentEncoding,
|
|
56
|
+
malformedSchemeSpecific: relativeMalformedSchemeSpecific,
|
|
57
|
+
malformedHost: relativeMalformedHost,
|
|
58
|
+
malformedScheme: relativeMalformedScheme
|
|
59
|
+
} = parseWithStatus(relativeURI, schemelessOptions)
|
|
60
|
+
if (
|
|
61
|
+
baseMalformed ||
|
|
62
|
+
relativeMalformed ||
|
|
63
|
+
baseMalformedPercentEncoding ||
|
|
64
|
+
relativeMalformedPercentEncoding ||
|
|
65
|
+
baseMalformedSchemeSpecific ||
|
|
66
|
+
relativeMalformedSchemeSpecific ||
|
|
67
|
+
baseMalformedHost ||
|
|
68
|
+
relativeMalformedHost ||
|
|
69
|
+
baseMalformedScheme ||
|
|
70
|
+
relativeMalformedScheme
|
|
71
|
+
) {
|
|
32
72
|
throw new Error(baseParsed.error || relativeParsed.error || 'URI is malformed.')
|
|
33
73
|
}
|
|
34
74
|
const resolved = resolveComponent(baseParsed, relativeParsed, schemelessOptions, true)
|
|
75
|
+
const resolvedSchemeHandler = getSchemeHandler((options && options.scheme) || resolved.scheme)
|
|
76
|
+
const resolvedHost = resolved.host
|
|
77
|
+
const resolvedHostIsIP = resolvedHost !== undefined && resolvedHost !== '' &&
|
|
78
|
+
(isIPv4(resolvedHost) || normalizeIPv6(resolvedHost).isIPV6)
|
|
79
|
+
canonicalizeHost(resolved, options || {}, resolvedSchemeHandler, resolvedHostIsIP)
|
|
80
|
+
// Percent escapes in an ASCII reg-name are encoded data. The WHATWG hostname
|
|
81
|
+
// parser can reject them even though fast-uri preserves them safely as RFC
|
|
82
|
+
// 3986 data. A raw non-ASCII host must still fail closed if conversion fails.
|
|
83
|
+
const encodedASCIIHost = resolvedHost && resolvedHost.indexOf('%') !== -1 &&
|
|
84
|
+
!/\P{ASCII}/u.test(resolvedHost)
|
|
85
|
+
if (resolved.error && !encodedASCIIHost) {
|
|
86
|
+
throw new Error(resolved.error)
|
|
87
|
+
}
|
|
35
88
|
schemelessOptions.skipEscape = true
|
|
36
89
|
return serialize(resolved, schemelessOptions)
|
|
37
90
|
}
|
|
@@ -114,7 +167,7 @@ function equal (uriA, uriB, options) {
|
|
|
114
167
|
const normalizedA = normalizeComparableURI(uriA, options)
|
|
115
168
|
const normalizedB = normalizeComparableURI(uriB, options)
|
|
116
169
|
|
|
117
|
-
return normalizedA !== undefined && normalizedB !== undefined && normalizedA
|
|
170
|
+
return normalizedA !== undefined && normalizedB !== undefined && normalizedA === normalizedB
|
|
118
171
|
}
|
|
119
172
|
|
|
120
173
|
/**
|
|
@@ -142,25 +195,30 @@ function serialize (cmpts, opts) {
|
|
|
142
195
|
const options = Object.assign({}, opts)
|
|
143
196
|
const uriTokens = []
|
|
144
197
|
|
|
198
|
+
if (component.scheme) {
|
|
199
|
+
component.scheme = decodeValidScheme(component.scheme)
|
|
200
|
+
}
|
|
201
|
+
|
|
145
202
|
// find scheme handler
|
|
146
203
|
const schemeHandler = getSchemeHandler(options.scheme || component.scheme)
|
|
147
204
|
|
|
148
205
|
// perform scheme specific serialization
|
|
149
206
|
if (schemeHandler && schemeHandler.serialize) schemeHandler.serialize(component, options)
|
|
150
207
|
|
|
208
|
+
const hasAuthority = component.userinfo !== undefined || component.host !== undefined || component.port !== undefined
|
|
209
|
+
const pathNoScheme = !options.skipEscape && component.scheme === undefined && !hasAuthority
|
|
210
|
+
|
|
151
211
|
if (component.path !== undefined) {
|
|
152
212
|
if (!options.skipEscape) {
|
|
153
|
-
component.path =
|
|
154
|
-
|
|
155
|
-
if (component.scheme !== undefined) {
|
|
156
|
-
component.path = component.path.split('%3A').join(':')
|
|
157
|
-
}
|
|
213
|
+
component.path = serializePathEncoding(component.path, pathNoScheme)
|
|
158
214
|
} else {
|
|
159
215
|
component.path = normalizePercentEncoding(component.path)
|
|
160
216
|
}
|
|
161
217
|
}
|
|
162
218
|
|
|
163
219
|
if (options.reference !== 'suffix' && component.scheme) {
|
|
220
|
+
// Scheme handlers may replace the scheme during serialization.
|
|
221
|
+
component.scheme = decodeValidScheme(component.scheme)
|
|
164
222
|
uriTokens.push(component.scheme, ':')
|
|
165
223
|
}
|
|
166
224
|
|
|
@@ -183,6 +241,13 @@ function serialize (cmpts, opts) {
|
|
|
183
241
|
s = removeDotSegments(s)
|
|
184
242
|
}
|
|
185
243
|
|
|
244
|
+
// Dot-segment removal can expose a colon that was not originally in the
|
|
245
|
+
// first segment (for example, "./a:b"). Reapply path-noscheme encoding so
|
|
246
|
+
// the serialized relative reference cannot be reparsed as a URI scheme.
|
|
247
|
+
if (pathNoScheme) {
|
|
248
|
+
s = serializePathEncoding(s, true)
|
|
249
|
+
}
|
|
250
|
+
|
|
186
251
|
if (
|
|
187
252
|
authority === undefined &&
|
|
188
253
|
s[0] === '/' &&
|
|
@@ -196,11 +261,11 @@ function serialize (cmpts, opts) {
|
|
|
196
261
|
}
|
|
197
262
|
|
|
198
263
|
if (component.query !== undefined) {
|
|
199
|
-
uriTokens.push('?', component.query)
|
|
264
|
+
uriTokens.push('?', encodeQuery(component.query))
|
|
200
265
|
}
|
|
201
266
|
|
|
202
267
|
if (component.fragment !== undefined) {
|
|
203
|
-
uriTokens.push('#', component.fragment)
|
|
268
|
+
uriTokens.push('#', encodeFragment(component.fragment))
|
|
204
269
|
}
|
|
205
270
|
return uriTokens.join('')
|
|
206
271
|
}
|
|
@@ -237,10 +302,86 @@ function getParseError (parsed, matches) {
|
|
|
237
302
|
return undefined
|
|
238
303
|
}
|
|
239
304
|
|
|
305
|
+
/**
|
|
306
|
+
* Checks percent syntax without decoding the represented octets. RFC 3986
|
|
307
|
+
* percent-encoding is byte-oriented, so sequences such as `%FF` are valid even
|
|
308
|
+
* though they are not independently valid UTF-8.
|
|
309
|
+
*
|
|
310
|
+
* @param {string|undefined} component
|
|
311
|
+
* @returns {boolean}
|
|
312
|
+
*/
|
|
313
|
+
function hasMalformedPercentEncoding (component) {
|
|
314
|
+
if (component === undefined) return false
|
|
315
|
+
|
|
316
|
+
let percent = component.indexOf('%')
|
|
317
|
+
while (percent !== -1) {
|
|
318
|
+
if (percent + 2 >= component.length || !/^[\da-f]{2}$/iu.test(component.slice(percent + 1, percent + 3))) {
|
|
319
|
+
return true
|
|
320
|
+
}
|
|
321
|
+
percent = component.indexOf('%', percent + 3)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return false
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Whether the host is a bracketed IP literal (RFC 3986 `IP-literal`).
|
|
329
|
+
* An unterminated `[` is not a literal, so it must still be validated as a
|
|
330
|
+
* reg-name instead of being waved through as an IP.
|
|
331
|
+
*
|
|
332
|
+
* @param {string} host
|
|
333
|
+
* @returns {boolean}
|
|
334
|
+
*/
|
|
335
|
+
function isIPLiteral (host) {
|
|
336
|
+
return host[0] === '[' && host[host.length - 1] === ']'
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* @param {RegExpMatchArray} matches
|
|
341
|
+
* @returns {boolean}
|
|
342
|
+
*/
|
|
343
|
+
function hasMalformedComponentPercentEncoding (matches) {
|
|
344
|
+
// Bracketed IP literals use a raw "%" as the zone separator for historical
|
|
345
|
+
// compatibility. Their parsing is intentionally left to normalizeIPv6.
|
|
346
|
+
const host = matches[4]
|
|
347
|
+
return hasMalformedPercentEncoding(matches[3]) ||
|
|
348
|
+
(host !== undefined && !isIPLiteral(host) && hasMalformedPercentEncoding(host)) ||
|
|
349
|
+
hasMalformedPercentEncoding(matches[6]) ||
|
|
350
|
+
hasMalformedPercentEncoding(matches[7]) ||
|
|
351
|
+
hasMalformedPercentEncoding(matches[8])
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* @param {import('./types/index').URIComponent} parsed
|
|
356
|
+
* @param {import('./types/index').Options} options
|
|
357
|
+
* @param {{ domainHost?: boolean, unicodeSupport?: boolean }|undefined} schemeHandler
|
|
358
|
+
* @param {boolean} isIP
|
|
359
|
+
* @returns {boolean} whether host conversion failed
|
|
360
|
+
*/
|
|
361
|
+
function canonicalizeHost (parsed, options, schemeHandler, isIP) {
|
|
362
|
+
if (
|
|
363
|
+
!options.unicodeSupport &&
|
|
364
|
+
(!schemeHandler || !schemeHandler.unicodeSupport) &&
|
|
365
|
+
parsed.host &&
|
|
366
|
+
!isIPLiteral(parsed.host) &&
|
|
367
|
+
(options.domainHost || (schemeHandler && schemeHandler.domainHost)) &&
|
|
368
|
+
isIP === false &&
|
|
369
|
+
nonSimpleDomain(parsed.host)
|
|
370
|
+
) {
|
|
371
|
+
try {
|
|
372
|
+
parsed.host = new URL('http://' + parsed.host).hostname
|
|
373
|
+
} catch (e) {
|
|
374
|
+
parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e
|
|
375
|
+
return true
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return false
|
|
379
|
+
}
|
|
380
|
+
|
|
240
381
|
/**
|
|
241
382
|
* @param {string} uri
|
|
242
383
|
* @param {import('./types/index').Options} [opts]
|
|
243
|
-
* @returns {{ parsed: import('./types/index').URIComponent, malformedAuthorityOrPort: boolean }}
|
|
384
|
+
* @returns {{ parsed: import('./types/index').URIComponent, malformedAuthorityOrPort: boolean, malformedPercentEncoding: boolean, malformedSchemeSpecific: boolean, malformedHost: boolean, malformedScheme: boolean }}
|
|
244
385
|
*/
|
|
245
386
|
function parseWithStatus (uri, opts) {
|
|
246
387
|
const options = Object.assign({}, opts)
|
|
@@ -256,6 +397,11 @@ function parseWithStatus (uri, opts) {
|
|
|
256
397
|
}
|
|
257
398
|
|
|
258
399
|
let malformedAuthorityOrPort = false
|
|
400
|
+
let malformedPercentEncoding = false
|
|
401
|
+
let malformedSchemeSpecific = false
|
|
402
|
+
let malformedHost = false
|
|
403
|
+
let malformedIPLiteral = false
|
|
404
|
+
let malformedScheme = false
|
|
259
405
|
|
|
260
406
|
let isIP = false
|
|
261
407
|
if (options.reference === 'suffix') {
|
|
@@ -313,6 +459,21 @@ function parseWithStatus (uri, opts) {
|
|
|
313
459
|
parsed.query = matches[7]
|
|
314
460
|
parsed.fragment = matches[8]
|
|
315
461
|
|
|
462
|
+
if (parsed.scheme !== undefined) {
|
|
463
|
+
const decodedScheme = unescape(parsed.scheme)
|
|
464
|
+
if (VALID_SCHEME.test(decodedScheme)) {
|
|
465
|
+
parsed.scheme = decodedScheme.toLowerCase()
|
|
466
|
+
} else {
|
|
467
|
+
parsed.error = parsed.error || MALFORMED_SCHEME_ERROR
|
|
468
|
+
malformedScheme = true
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
malformedPercentEncoding = hasMalformedComponentPercentEncoding(matches)
|
|
473
|
+
if (malformedPercentEncoding) {
|
|
474
|
+
parsed.error = parsed.error || 'URI contains malformed percent-encoding.'
|
|
475
|
+
}
|
|
476
|
+
|
|
316
477
|
// fix port number
|
|
317
478
|
if (isNaN(parsed.port)) {
|
|
318
479
|
parsed.port = matches[5]
|
|
@@ -327,9 +488,17 @@ function parseWithStatus (uri, opts) {
|
|
|
327
488
|
if (parsed.host) {
|
|
328
489
|
const ipv4result = isIPv4(parsed.host)
|
|
329
490
|
if (ipv4result === false) {
|
|
491
|
+
const bracketedIPLiteral = isIPLiteral(parsed.host)
|
|
492
|
+
const hasIPLiteralBracket = parsed.host.indexOf('[') !== -1 || parsed.host.indexOf(']') !== -1
|
|
330
493
|
const ipv6result = normalizeIPv6(parsed.host)
|
|
331
|
-
|
|
332
|
-
|
|
494
|
+
isIP = ipv6result.isIPV6 || ipv6result.isIPVFuture === true
|
|
495
|
+
malformedIPLiteral = hasIPLiteralBracket && (!bracketedIPLiteral || ipv6result.error === true)
|
|
496
|
+
parsed.host = isIP ? ipv6result.host : ipv6result.host.toLowerCase()
|
|
497
|
+
|
|
498
|
+
if (malformedIPLiteral) {
|
|
499
|
+
parsed.error = parsed.error || 'URI host is malformed.'
|
|
500
|
+
malformedAuthorityOrPort = true
|
|
501
|
+
}
|
|
333
502
|
} else {
|
|
334
503
|
isIP = true
|
|
335
504
|
}
|
|
@@ -352,49 +521,40 @@ function parseWithStatus (uri, opts) {
|
|
|
352
521
|
// find scheme handler
|
|
353
522
|
const schemeHandler = getSchemeHandler(options.scheme || parsed.scheme)
|
|
354
523
|
|
|
355
|
-
//
|
|
356
|
-
if (!
|
|
357
|
-
|
|
358
|
-
if (parsed.host && (options.domainHost || (schemeHandler && schemeHandler.domainHost)) && isIP === false && nonSimpleDomain(parsed.host)) {
|
|
359
|
-
// convert Unicode IDN -> ASCII IDN
|
|
360
|
-
try {
|
|
361
|
-
parsed.host = new URL('http://' + parsed.host).hostname
|
|
362
|
-
} catch (e) {
|
|
363
|
-
parsed.error = parsed.error || "Host's domain name can not be converted to ASCII: " + e
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
// convert IRI -> URI
|
|
524
|
+
// convert Unicode IDN -> ASCII IDN when the effective scheme uses domain hosts
|
|
525
|
+
if (!malformedIPLiteral) {
|
|
526
|
+
malformedHost = canonicalizeHost(parsed, options, schemeHandler, isIP)
|
|
367
527
|
}
|
|
368
528
|
|
|
369
529
|
if (!schemeHandler || (schemeHandler && !schemeHandler.skipNormalize)) {
|
|
370
530
|
if (uri.indexOf('%') !== -1) {
|
|
371
|
-
if (parsed.
|
|
372
|
-
parsed.
|
|
373
|
-
|
|
374
|
-
if (parsed.host !== undefined) {
|
|
375
|
-
parsed.host = reescapeHostDelimiters(unescape(parsed.host), isIP)
|
|
531
|
+
if (parsed.host !== undefined && !malformedIPLiteral) {
|
|
532
|
+
const host = isIP ? parsed.host : normalizePercentEncoding(parsed.host, true)
|
|
533
|
+
parsed.host = reescapeHostDelimiters(host, isIP)
|
|
376
534
|
}
|
|
377
535
|
}
|
|
378
536
|
if (parsed.path) {
|
|
379
537
|
parsed.path = normalizePathEncoding(parsed.path)
|
|
380
538
|
}
|
|
539
|
+
if (parsed.query) {
|
|
540
|
+
parsed.query = normalizeQueryFragmentEncoding(parsed.query)
|
|
541
|
+
}
|
|
381
542
|
if (parsed.fragment) {
|
|
382
|
-
|
|
383
|
-
parsed.fragment = encodeURI(decodeURIComponent(parsed.fragment))
|
|
384
|
-
} catch {
|
|
385
|
-
parsed.error = parsed.error || 'URI malformed'
|
|
386
|
-
}
|
|
543
|
+
parsed.fragment = normalizeQueryFragmentEncoding(parsed.fragment)
|
|
387
544
|
}
|
|
388
545
|
}
|
|
389
546
|
|
|
390
547
|
// perform scheme specific parsing
|
|
391
548
|
if (schemeHandler && schemeHandler.parse) {
|
|
392
549
|
schemeHandler.parse(parsed, options)
|
|
550
|
+
if (schemeHandler === SCHEMES.urn && parsed.nid === undefined) {
|
|
551
|
+
malformedSchemeSpecific = true
|
|
552
|
+
}
|
|
393
553
|
}
|
|
394
554
|
} else {
|
|
395
555
|
parsed.error = parsed.error || 'URI can not be parsed.'
|
|
396
556
|
}
|
|
397
|
-
return { parsed, malformedAuthorityOrPort }
|
|
557
|
+
return { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme }
|
|
398
558
|
}
|
|
399
559
|
|
|
400
560
|
/**
|
|
@@ -418,13 +578,17 @@ function normalizeString (uri, opts) {
|
|
|
418
578
|
/**
|
|
419
579
|
* @param {string} uri
|
|
420
580
|
* @param {import('./types/index').Options} [opts]
|
|
421
|
-
* @returns {{ normalized: string, malformedAuthorityOrPort: boolean }}
|
|
581
|
+
* @returns {{ normalized: string, malformedAuthorityOrPort: boolean, malformedPercentEncoding: boolean, malformedSchemeSpecific: boolean, malformedHost: boolean, malformedScheme: boolean }}
|
|
422
582
|
*/
|
|
423
583
|
function normalizeStringWithStatus (uri, opts) {
|
|
424
|
-
const { parsed, malformedAuthorityOrPort } = parseWithStatus(uri, opts)
|
|
584
|
+
const { parsed, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = parseWithStatus(uri, opts)
|
|
425
585
|
return {
|
|
426
|
-
normalized: malformedAuthorityOrPort ? uri : serialize(parsed, opts),
|
|
427
|
-
malformedAuthorityOrPort
|
|
586
|
+
normalized: malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? uri : serialize(parsed, opts),
|
|
587
|
+
malformedAuthorityOrPort,
|
|
588
|
+
malformedPercentEncoding,
|
|
589
|
+
malformedSchemeSpecific,
|
|
590
|
+
malformedHost,
|
|
591
|
+
malformedScheme
|
|
428
592
|
}
|
|
429
593
|
}
|
|
430
594
|
|
|
@@ -434,14 +598,18 @@ function normalizeStringWithStatus (uri, opts) {
|
|
|
434
598
|
* @returns {string|undefined}
|
|
435
599
|
*/
|
|
436
600
|
function normalizeComparableURI (uri, opts) {
|
|
437
|
-
if (typeof uri
|
|
438
|
-
|
|
439
|
-
return malformedAuthorityOrPort ? undefined : normalized
|
|
601
|
+
if (typeof uri !== 'string' && typeof uri !== 'object') {
|
|
602
|
+
return undefined
|
|
440
603
|
}
|
|
441
604
|
|
|
442
|
-
|
|
443
|
-
|
|
605
|
+
let value
|
|
606
|
+
try {
|
|
607
|
+
value = typeof uri === 'string' ? uri : serialize(uri, opts)
|
|
608
|
+
} catch {
|
|
609
|
+
return undefined
|
|
444
610
|
}
|
|
611
|
+
const { normalized, malformedAuthorityOrPort, malformedPercentEncoding, malformedSchemeSpecific, malformedHost, malformedScheme } = normalizeStringWithStatus(value, opts)
|
|
612
|
+
return malformedAuthorityOrPort || malformedPercentEncoding || malformedSchemeSpecific || malformedHost || malformedScheme ? undefined : normalized
|
|
445
613
|
}
|
|
446
614
|
|
|
447
615
|
const fastUri = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const { isUUID } = require('./utils')
|
|
4
|
-
const URN_REG =
|
|
4
|
+
const URN_REG = /^([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-./:;=@]|%[\da-f]{2})+)$/iu
|
|
5
5
|
|
|
6
6
|
const supportedSchemeNames = /** @type {const} */ (['http', 'https', 'ws',
|
|
7
7
|
'wss', 'urn', 'urn:uuid'])
|
|
@@ -113,9 +113,14 @@ function wsSerialize (wsComponent) {
|
|
|
113
113
|
|
|
114
114
|
// reconstruct path from resource name
|
|
115
115
|
if (wsComponent.resourceName) {
|
|
116
|
-
const
|
|
116
|
+
const queryIndex = wsComponent.resourceName.indexOf('?')
|
|
117
|
+
const path = queryIndex === -1
|
|
118
|
+
? wsComponent.resourceName
|
|
119
|
+
: wsComponent.resourceName.slice(0, queryIndex)
|
|
117
120
|
wsComponent.path = (path && path !== '/' ? path : undefined)
|
|
118
|
-
wsComponent.query =
|
|
121
|
+
wsComponent.query = queryIndex === -1
|
|
122
|
+
? undefined
|
|
123
|
+
: wsComponent.resourceName.slice(queryIndex + 1)
|
|
119
124
|
wsComponent.resourceName = undefined
|
|
120
125
|
}
|
|
121
126
|
|
|
@@ -132,7 +137,7 @@ function urnParse (urnComponent, options) {
|
|
|
132
137
|
return urnComponent
|
|
133
138
|
}
|
|
134
139
|
const matches = urnComponent.path.match(URN_REG)
|
|
135
|
-
if (matches) {
|
|
140
|
+
if (matches && matches[0] === urnComponent.path) {
|
|
136
141
|
const scheme = options.scheme || urnComponent.scheme || 'urn'
|
|
137
142
|
urnComponent.nid = matches[1].toLowerCase()
|
|
138
143
|
urnComponent.nss = matches[2]
|