@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.
Files changed (264) hide show
  1. package/content/integrations/mollie.json +103 -28
  2. package/dist/control-plane/index.mjs +248 -58
  3. package/dist/mcp-server/http.mjs +577 -124
  4. package/dist/ui/assets/index-BFnSVa9N.js +110 -0
  5. package/dist/ui/assets/{index-CkWaRck1.css → index-BYVb_0oG.css} +1 -1
  6. package/dist/ui/index.html +2 -2
  7. package/node_modules/@hap/core/dist/index.d.mts +285 -13
  8. package/node_modules/@hap/core/dist/index.d.ts +285 -13
  9. package/node_modules/@hap/core/dist/index.js +281 -13
  10. package/node_modules/@hap/core/dist/index.mjs +266 -12
  11. package/node_modules/@hap/core/package.json +4 -2
  12. package/node_modules/@hap/core/src/did-key.ts +126 -0
  13. package/node_modules/@hap/core/src/frame.ts +115 -14
  14. package/node_modules/@hap/core/src/gatekeeper.ts +26 -0
  15. package/node_modules/@hap/core/src/identity.ts +21 -5
  16. package/node_modules/@hap/core/src/index.ts +3 -0
  17. package/node_modules/@hap/core/src/mandate.ts +207 -0
  18. package/node_modules/@hap/core/src/receipt.ts +74 -0
  19. package/node_modules/@hap/core/src/types.ts +87 -5
  20. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/accept.js +54 -0
  21. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/charset.js +10 -34
  22. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/encoding.js +9 -30
  23. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/language.js +15 -36
  24. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/lib/mediaType.js +16 -134
  25. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/LICENSE +22 -0
  26. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/README.md +71 -0
  27. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/dist/index.d.ts +46 -0
  28. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/dist/index.js +176 -0
  29. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/dist/index.js.map +1 -0
  30. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/node_modules/content-type/package.json +52 -0
  31. package/node_modules/@modelcontextprotocol/sdk/node_modules/negotiator/package.json +16 -10
  32. package/node_modules/@types/node/README.md +1 -1
  33. package/node_modules/@types/node/buffer.buffer.d.ts +10 -5
  34. package/node_modules/@types/node/crypto.d.ts +2 -4
  35. package/node_modules/@types/node/dgram.d.ts +119 -4
  36. package/node_modules/@types/node/ffi.d.ts +1 -1
  37. package/node_modules/@types/node/fs/promises.d.ts +61 -65
  38. package/node_modules/@types/node/fs.d.ts +86 -76
  39. package/node_modules/@types/node/http.d.ts +17 -1
  40. package/node_modules/@types/node/http2.d.ts +12 -4
  41. package/node_modules/@types/node/index.d.ts +1 -0
  42. package/node_modules/@types/node/inspector.d.ts +2 -1
  43. package/node_modules/@types/node/net.d.ts +108 -16
  44. package/node_modules/@types/node/package.json +2 -2
  45. package/node_modules/@types/node/process.d.ts +52 -0
  46. package/node_modules/@types/node/quic.d.ts +246 -38
  47. package/node_modules/@types/node/sqlite.d.ts +6 -2
  48. package/node_modules/@types/node/stream/iter.d.ts +4 -4
  49. package/node_modules/@types/node/test.d.ts +36 -0
  50. package/node_modules/@types/node/tls.d.ts +24 -0
  51. package/node_modules/@types/node/ts5.6/buffer.buffer.d.ts +5 -0
  52. package/node_modules/@types/node/ts5.6/index.d.ts +1 -0
  53. package/node_modules/@types/node/ts5.7/index.d.ts +1 -0
  54. package/node_modules/@types/node/tty.d.ts +4 -3
  55. package/node_modules/@types/node/vfs.d.ts +210 -0
  56. package/node_modules/@types/node/vm.d.ts +1 -1
  57. package/node_modules/express-rate-limit/dist/index.cjs +6 -3
  58. package/node_modules/express-rate-limit/dist/index.d.cts +11 -0
  59. package/node_modules/express-rate-limit/dist/index.d.mts +11 -0
  60. package/node_modules/express-rate-limit/dist/index.d.ts +11 -0
  61. package/node_modules/express-rate-limit/dist/index.mjs +6 -3
  62. package/node_modules/express-rate-limit/{license.md → license} +7 -6
  63. package/node_modules/express-rate-limit/package.json +5 -5
  64. package/node_modules/express-rate-limit/readme.md +1 -0
  65. package/node_modules/fast-uri/index.js +215 -47
  66. package/node_modules/fast-uri/lib/schemes.js +9 -4
  67. package/node_modules/fast-uri/lib/utils.js +396 -92
  68. package/node_modules/fast-uri/package.json +1 -1
  69. package/node_modules/fast-uri/test/component-safe-serialization.test.js +163 -0
  70. package/node_modules/fast-uri/test/equal.test.js +31 -3
  71. package/node_modules/fast-uri/test/fixtures/uri-js-parse.json +2 -0
  72. package/node_modules/fast-uri/test/ipv6-canonical.test.js +34 -0
  73. package/node_modules/fast-uri/test/ipv6-validation.test.js +124 -0
  74. package/node_modules/fast-uri/test/malformed-percent.test.js +77 -0
  75. package/node_modules/fast-uri/test/malformed-urn.test.js +61 -0
  76. package/node_modules/fast-uri/test/parse.test.js +7 -3
  77. package/node_modules/fast-uri/test/query-fragment-normalization.test.js +33 -0
  78. package/node_modules/fast-uri/test/reserved-path-normalization.test.js +109 -0
  79. package/node_modules/fast-uri/test/scheme-validation.test.js +124 -0
  80. package/node_modules/fast-uri/test/security-normalization.test.js +101 -0
  81. package/node_modules/fast-uri/test/security.test.js +75 -3
  82. package/node_modules/fast-uri/test/urn-full-input.test.js +29 -0
  83. package/node_modules/fast-uri/test/websocket-query-preservation.test.js +24 -0
  84. package/node_modules/hono/dist/cjs/client/client.js +25 -11
  85. package/node_modules/hono/dist/cjs/client/utils.js +4 -1
  86. package/node_modules/hono/dist/cjs/context.js +4 -0
  87. package/node_modules/hono/dist/cjs/helper/accepts/accepts.js +36 -2
  88. package/node_modules/hono/dist/cjs/helper/ssg/ssg.js +1 -1
  89. package/node_modules/hono/dist/cjs/helper/ssg/utils.js +30 -10
  90. package/node_modules/hono/dist/cjs/jsx/dom/render.js +2 -0
  91. package/node_modules/hono/dist/cjs/middleware/cache/index.js +1 -1
  92. package/node_modules/hono/dist/cjs/middleware/cors/index.js +1 -1
  93. package/node_modules/hono/dist/cjs/middleware/csrf/index.js +1 -1
  94. package/node_modules/hono/dist/cjs/middleware/etag/digest.js +1 -1
  95. package/node_modules/hono/dist/cjs/middleware/etag/index.js +3 -3
  96. package/node_modules/hono/dist/cjs/middleware/pretty-json/index.js +3 -1
  97. package/node_modules/hono/dist/cjs/request.js +8 -4
  98. package/node_modules/hono/dist/cjs/router/linear-router/router.js +7 -2
  99. package/node_modules/hono/dist/cjs/router/pattern-router/router.js +3 -9
  100. package/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +10 -3
  101. package/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +47 -83
  102. package/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +2 -1
  103. package/node_modules/hono/dist/cjs/router/trie-router/node.js +46 -69
  104. package/node_modules/hono/dist/cjs/router/trie-router/router.js +3 -11
  105. package/node_modules/hono/dist/cjs/router/utils.js +27 -0
  106. package/node_modules/hono/dist/cjs/utils/body.js +15 -3
  107. package/node_modules/hono/dist/cjs/utils/cookie.js +1 -1
  108. package/node_modules/hono/dist/cjs/utils/ipaddr.js +5 -3
  109. package/node_modules/hono/dist/cjs/utils/stream.js +7 -1
  110. package/node_modules/hono/dist/cjs/utils/url.js +9 -1
  111. package/node_modules/hono/dist/client/client.js +25 -11
  112. package/node_modules/hono/dist/client/utils.js +4 -1
  113. package/node_modules/hono/dist/context.js +4 -0
  114. package/node_modules/hono/dist/helper/accepts/accepts.js +36 -2
  115. package/node_modules/hono/dist/helper/ssg/ssg.js +1 -1
  116. package/node_modules/hono/dist/helper/ssg/utils.js +30 -10
  117. package/node_modules/hono/dist/jsx/dom/render.js +2 -0
  118. package/node_modules/hono/dist/middleware/cache/index.js +1 -1
  119. package/node_modules/hono/dist/middleware/cors/index.js +1 -1
  120. package/node_modules/hono/dist/middleware/csrf/index.js +1 -1
  121. package/node_modules/hono/dist/middleware/etag/digest.js +1 -1
  122. package/node_modules/hono/dist/middleware/etag/index.js +3 -3
  123. package/node_modules/hono/dist/middleware/pretty-json/index.js +3 -1
  124. package/node_modules/hono/dist/request.js +8 -4
  125. package/node_modules/hono/dist/router/linear-router/router.js +7 -2
  126. package/node_modules/hono/dist/router/pattern-router/router.js +3 -9
  127. package/node_modules/hono/dist/router/reg-exp-router/node.js +6 -2
  128. package/node_modules/hono/dist/router/reg-exp-router/router.js +53 -84
  129. package/node_modules/hono/dist/router/reg-exp-router/trie.js +2 -1
  130. package/node_modules/hono/dist/router/trie-router/node.js +46 -69
  131. package/node_modules/hono/dist/router/trie-router/router.js +3 -11
  132. package/node_modules/hono/dist/router/utils.js +5 -0
  133. package/node_modules/hono/dist/types/context.d.ts +4 -0
  134. package/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +3 -0
  135. package/node_modules/hono/dist/types/router/trie-router/node.d.ts +1 -2
  136. package/node_modules/hono/dist/types/router/trie-router/router.d.ts +0 -1
  137. package/node_modules/hono/dist/types/router/utils.d.ts +1 -0
  138. package/node_modules/hono/dist/types/utils/url.d.ts +4 -0
  139. package/node_modules/hono/dist/utils/body.js +15 -3
  140. package/node_modules/hono/dist/utils/cookie.js +1 -1
  141. package/node_modules/hono/dist/utils/ipaddr.js +5 -3
  142. package/node_modules/hono/dist/utils/stream.js +7 -1
  143. package/node_modules/hono/dist/utils/url.js +9 -1
  144. package/node_modules/hono/package.json +1 -1
  145. package/node_modules/ip-address/README.md +92 -82
  146. package/node_modules/ip-address/dist/common.d.ts +20 -0
  147. package/node_modules/ip-address/dist/common.js +36 -0
  148. package/node_modules/ip-address/dist/common.js.map +1 -1
  149. package/node_modules/ip-address/dist/ipv4.d.ts +50 -0
  150. package/node_modules/ip-address/dist/ipv4.js +75 -0
  151. package/node_modules/ip-address/dist/ipv4.js.map +1 -1
  152. package/node_modules/ip-address/dist/ipv6.d.ts +79 -10
  153. package/node_modules/ip-address/dist/ipv6.js +120 -30
  154. package/node_modules/ip-address/dist/ipv6.js.map +1 -1
  155. package/node_modules/ip-address/dist/v4/constants.d.ts +12 -0
  156. package/node_modules/ip-address/dist/v4/constants.js +40 -1
  157. package/node_modules/ip-address/dist/v4/constants.js.map +1 -1
  158. package/node_modules/ip-address/dist/v6/constants.d.ts +14 -0
  159. package/node_modules/ip-address/dist/v6/constants.js +47 -1
  160. package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  161. package/node_modules/ip-address/package.json +1 -1
  162. package/node_modules/is-plain-object/README.md +39 -95
  163. package/node_modules/is-plain-object/dist/is-plain-object.js +0 -2
  164. package/node_modules/is-plain-object/is-plain-object.d.ts +6 -1
  165. package/node_modules/is-plain-object/package.json +8 -34
  166. package/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts +7 -16
  167. package/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts +10 -20
  168. package/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts +7 -16
  169. package/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts +16 -38
  170. package/node_modules/jose/dist/types/jwe/general/decrypt.d.ts +7 -16
  171. package/node_modules/jose/dist/types/jwe/general/encrypt.d.ts +19 -38
  172. package/node_modules/jose/dist/types/jwk/embedded.d.ts +3 -8
  173. package/node_modules/jose/dist/types/jwk/thumbprint.d.ts +5 -5
  174. package/node_modules/jose/dist/types/jwks/local.d.ts +6 -10
  175. package/node_modules/jose/dist/types/jwks/remote.d.ts +17 -28
  176. package/node_modules/jose/dist/types/jws/compact/sign.d.ts +5 -10
  177. package/node_modules/jose/dist/types/jws/compact/verify.d.ts +9 -18
  178. package/node_modules/jose/dist/types/jws/flattened/sign.d.ts +7 -16
  179. package/node_modules/jose/dist/types/jws/flattened/verify.d.ts +9 -18
  180. package/node_modules/jose/dist/types/jws/general/sign.d.ts +11 -21
  181. package/node_modules/jose/dist/types/jws/general/verify.d.ts +12 -21
  182. package/node_modules/jose/dist/types/jwt/decrypt.d.ts +10 -20
  183. package/node_modules/jose/dist/types/jwt/encrypt.d.ts +17 -29
  184. package/node_modules/jose/dist/types/jwt/sign.d.ts +12 -19
  185. package/node_modules/jose/dist/types/jwt/unsecured.d.ts +17 -28
  186. package/node_modules/jose/dist/types/jwt/verify.d.ts +9 -19
  187. package/node_modules/jose/dist/types/key/export.d.ts +4 -4
  188. package/node_modules/jose/dist/types/key/generate_key_pair.d.ts +6 -8
  189. package/node_modules/jose/dist/types/key/generate_secret.d.ts +4 -11
  190. package/node_modules/jose/dist/types/key/import.d.ts +10 -17
  191. package/node_modules/jose/dist/types/types.d.ts +48 -86
  192. package/node_modules/jose/dist/types/util/base64url.d.ts +2 -2
  193. package/node_modules/jose/dist/types/util/decode_jwt.d.ts +3 -10
  194. package/node_modules/jose/dist/types/util/decode_protected_header.d.ts +4 -4
  195. package/node_modules/jose/dist/types/util/errors.d.ts +26 -53
  196. package/node_modules/jose/dist/webapi/index.js +70 -32
  197. package/node_modules/jose/dist/webapi/jwe/compact/decrypt.js +7 -8
  198. package/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +42 -26
  199. package/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +14 -10
  200. package/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +53 -71
  201. package/node_modules/jose/dist/webapi/jwe/general/decrypt.js +38 -49
  202. package/node_modules/jose/dist/webapi/jwe/general/encrypt.js +121 -158
  203. package/node_modules/jose/dist/webapi/jwk/embedded.js +30 -18
  204. package/node_modules/jose/dist/webapi/jwk/thumbprint.js +54 -64
  205. package/node_modules/jose/dist/webapi/jwks/local.js +49 -74
  206. package/node_modules/jose/dist/webapi/jwks/remote.js +91 -160
  207. package/node_modules/jose/dist/webapi/jws/compact/sign.js +21 -20
  208. package/node_modules/jose/dist/webapi/jws/compact/verify.js +7 -8
  209. package/node_modules/jose/dist/webapi/jws/flattened/sign.js +29 -30
  210. package/node_modules/jose/dist/webapi/jws/flattened/verify.js +21 -23
  211. package/node_modules/jose/dist/webapi/jws/general/sign.js +61 -70
  212. package/node_modules/jose/dist/webapi/jws/general/verify.js +47 -41
  213. package/node_modules/jose/dist/webapi/jwt/decrypt.js +13 -22
  214. package/node_modules/jose/dist/webapi/jwt/encrypt.js +58 -100
  215. package/node_modules/jose/dist/webapi/jwt/sign.js +18 -50
  216. package/node_modules/jose/dist/webapi/jwt/unsecured.js +34 -63
  217. package/node_modules/jose/dist/webapi/jwt/verify.js +12 -14
  218. package/node_modules/jose/dist/webapi/key/export.js +32 -37
  219. package/node_modules/jose/dist/webapi/key/generate_key_pair.js +40 -44
  220. package/node_modules/jose/dist/webapi/key/generate_secret.js +35 -39
  221. package/node_modules/jose/dist/webapi/key/import.js +52 -52
  222. package/node_modules/jose/dist/webapi/lib/asn1.js +130 -164
  223. package/node_modules/jose/dist/webapi/lib/base64.js +18 -20
  224. package/node_modules/jose/dist/webapi/lib/buffer_utils.js +34 -38
  225. package/node_modules/jose/dist/webapi/lib/content_encryption.js +79 -123
  226. package/node_modules/jose/dist/webapi/lib/crypto_key.js +24 -25
  227. package/node_modules/jose/dist/webapi/lib/deflate.js +46 -40
  228. package/node_modules/jose/dist/webapi/lib/helpers.js +40 -37
  229. package/node_modules/jose/dist/webapi/lib/invalid_key_input.js +10 -24
  230. package/node_modules/jose/dist/webapi/lib/is_key_like.js +17 -15
  231. package/node_modules/jose/dist/webapi/lib/jwe_algorithms.js +106 -93
  232. package/node_modules/jose/dist/webapi/lib/jwe_decrypt.js +210 -176
  233. package/node_modules/jose/dist/webapi/lib/jwe_encrypt.js +105 -107
  234. package/node_modules/jose/dist/webapi/lib/jwk_metadata.js +19 -0
  235. package/node_modules/jose/dist/webapi/lib/jwk_to_key.js +9 -16
  236. package/node_modules/jose/dist/webapi/lib/jws_algorithms.js +62 -61
  237. package/node_modules/jose/dist/webapi/lib/jws_sign.js +58 -72
  238. package/node_modules/jose/dist/webapi/lib/jws_verify.js +90 -103
  239. package/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +134 -185
  240. package/node_modules/jose/dist/webapi/lib/key.js +84 -121
  241. package/node_modules/jose/dist/webapi/lib/key_algorithm.js +13 -8
  242. package/node_modules/jose/dist/webapi/lib/key_descriptor.js +8 -6
  243. package/node_modules/jose/dist/webapi/lib/key_management.js +200 -225
  244. package/node_modules/jose/dist/webapi/lib/key_options.js +8 -0
  245. package/node_modules/jose/dist/webapi/lib/options.js +57 -44
  246. package/node_modules/jose/dist/webapi/lib/signing.js +18 -22
  247. package/node_modules/jose/dist/webapi/lib/type_checks.js +28 -33
  248. package/node_modules/jose/dist/webapi/util/base64url.js +26 -35
  249. package/node_modules/jose/dist/webapi/util/decode_jwt.js +32 -31
  250. package/node_modules/jose/dist/webapi/util/decode_protected_header.js +18 -23
  251. package/node_modules/jose/dist/webapi/util/errors.js +94 -84
  252. package/node_modules/jose/package.json +17 -81
  253. package/package.json +2 -2
  254. package/profiles/calendar/0.5.profile.json +190 -0
  255. package/profiles/charge/0.5.profile.json +210 -0
  256. package/profiles/customers/0.7.profile.json +157 -0
  257. package/profiles/deploy/0.9.profile.json +176 -0
  258. package/profiles/email/0.6.profile.json +208 -0
  259. package/profiles/index.json +9 -1
  260. package/profiles/publish/0.5.profile.json +186 -0
  261. package/profiles/purchase/0.5.profile.json +231 -0
  262. package/profiles/records/0.5.profile.json +117 -0
  263. package/dist/ui/assets/index-0Q2eNytX.js +0 -110
  264. 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, escapePreservingEscapes, reescapeHostDelimiters, isIPv4, nonSimpleDomain } = require('./lib/utils')
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 { parsed: baseParsed, malformedAuthorityOrPort: baseMalformed } = parseWithStatus(baseURI, schemelessOptions)
30
- const { parsed: relativeParsed, malformedAuthorityOrPort: relativeMalformed } = parseWithStatus(relativeURI, schemelessOptions)
31
- if (baseMalformed || relativeMalformed) {
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.toLowerCase() === normalizedB.toLowerCase()
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 = escapePreservingEscapes(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
- parsed.host = ipv6result.host.toLowerCase()
332
- isIP = ipv6result.isIPV6
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
- // check if scheme can't handle IRIs
356
- if (!options.unicodeSupport && (!schemeHandler || !schemeHandler.unicodeSupport)) {
357
- // if host component is a domain name
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.scheme !== undefined) {
372
- parsed.scheme = unescape(parsed.scheme)
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
- try {
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 === 'string') {
438
- const { normalized, malformedAuthorityOrPort } = normalizeStringWithStatus(uri, opts)
439
- return malformedAuthorityOrPort ? undefined : normalized
601
+ if (typeof uri !== 'string' && typeof uri !== 'object') {
602
+ return undefined
440
603
  }
441
604
 
442
- if (typeof uri === 'object') {
443
- return serialize(uri, opts)
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 = /([\da-z][\d\-a-z]{0,31}):((?:[\w!$'()*+,\-.:;=@]|%[\da-f]{2})+)/iu
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 [path, query] = wsComponent.resourceName.split('?')
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 = 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]