@uncefact/untp-utils 0.2.0 → 0.3.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 (238) hide show
  1. package/README.md +40 -12
  2. package/artefacts/context/untp/0.6.0/dcc.json +1241 -0
  3. package/artefacts/context/untp/0.6.0/dfr.json +619 -0
  4. package/artefacts/context/untp/0.6.0/dia.json +162 -0
  5. package/artefacts/context/untp/0.6.0/dpp.json +1078 -0
  6. package/artefacts/context/untp/0.6.0/dte.json +1285 -0
  7. package/artefacts/context/untp/0.6.1/dcc.json +1388 -0
  8. package/artefacts/context/untp/0.6.1/dfr.json +690 -0
  9. package/artefacts/context/untp/0.6.1/dia.json +196 -0
  10. package/artefacts/context/untp/0.6.1/dpp.json +1164 -0
  11. package/artefacts/context/untp/0.6.1/dte.json +1340 -0
  12. package/artefacts/context/untp/0.7.0/untp.json +3493 -0
  13. package/artefacts/context/vcdm/2/credentials.json +301 -0
  14. package/artefacts/manifest.json +214 -0
  15. package/artefacts/schema/untp/0.6.0/dcc.json +1131 -0
  16. package/artefacts/schema/untp/0.6.0/dfr.json +1028 -0
  17. package/artefacts/schema/untp/0.6.0/dia.json +236 -0
  18. package/artefacts/schema/untp/0.6.0/dpp.json +1219 -0
  19. package/artefacts/schema/untp/0.6.0/dte.json +845 -0
  20. package/artefacts/schema/untp/0.6.1/dcc.json +1196 -0
  21. package/artefacts/schema/untp/0.6.1/dfr.json +1037 -0
  22. package/artefacts/schema/untp/0.6.1/dia.json +236 -0
  23. package/artefacts/schema/untp/0.6.1/dpp.json +1229 -0
  24. package/artefacts/schema/untp/0.6.1/dte.json +845 -0
  25. package/artefacts/schema/untp/0.7.0/cvc.json +701 -0
  26. package/artefacts/schema/untp/0.7.0/dcc.json +1133 -0
  27. package/artefacts/schema/untp/0.7.0/dfr.json +1245 -0
  28. package/artefacts/schema/untp/0.7.0/dia.json +443 -0
  29. package/artefacts/schema/untp/0.7.0/dpp.json +1300 -0
  30. package/artefacts/schema/untp/0.7.0/dte.json +1226 -0
  31. package/artefacts/schema/untp/0.7.0/linkset.json +119 -0
  32. package/artefacts/schema/vcdm/2/verifiable-credential.json +318 -0
  33. package/build/artefacts/urls.d.ts +6 -0
  34. package/build/artefacts/urls.js +8 -0
  35. package/build/artefacts/urls.js.map +1 -1
  36. package/build/artefacts/urls.test.js +9 -1
  37. package/build/artefacts/urls.test.js.map +1 -1
  38. package/build/bundle/artefacts/context/untp/0.6.0/dcc.d.ts +2 -0
  39. package/build/bundle/artefacts/context/untp/0.6.0/dcc.js +1244 -0
  40. package/build/bundle/artefacts/context/untp/0.6.0/dcc.js.map +1 -0
  41. package/build/bundle/artefacts/context/untp/0.6.0/dfr.d.ts +2 -0
  42. package/build/bundle/artefacts/context/untp/0.6.0/dfr.js +622 -0
  43. package/build/bundle/artefacts/context/untp/0.6.0/dfr.js.map +1 -0
  44. package/build/bundle/artefacts/context/untp/0.6.0/dia.d.ts +2 -0
  45. package/build/bundle/artefacts/context/untp/0.6.0/dia.js +165 -0
  46. package/build/bundle/artefacts/context/untp/0.6.0/dia.js.map +1 -0
  47. package/build/bundle/artefacts/context/untp/0.6.0/dpp.d.ts +2 -0
  48. package/build/bundle/artefacts/context/untp/0.6.0/dpp.js +1081 -0
  49. package/build/bundle/artefacts/context/untp/0.6.0/dpp.js.map +1 -0
  50. package/build/bundle/artefacts/context/untp/0.6.0/dte.d.ts +2 -0
  51. package/build/bundle/artefacts/context/untp/0.6.0/dte.js +1288 -0
  52. package/build/bundle/artefacts/context/untp/0.6.0/dte.js.map +1 -0
  53. package/build/bundle/artefacts/context/untp/0.6.1/dcc.d.ts +2 -0
  54. package/build/bundle/artefacts/context/untp/0.6.1/dcc.js +1391 -0
  55. package/build/bundle/artefacts/context/untp/0.6.1/dcc.js.map +1 -0
  56. package/build/bundle/artefacts/context/untp/0.6.1/dfr.d.ts +2 -0
  57. package/build/bundle/artefacts/context/untp/0.6.1/dfr.js +693 -0
  58. package/build/bundle/artefacts/context/untp/0.6.1/dfr.js.map +1 -0
  59. package/build/bundle/artefacts/context/untp/0.6.1/dia.d.ts +2 -0
  60. package/build/bundle/artefacts/context/untp/0.6.1/dia.js +199 -0
  61. package/build/bundle/artefacts/context/untp/0.6.1/dia.js.map +1 -0
  62. package/build/bundle/artefacts/context/untp/0.6.1/dpp.d.ts +2 -0
  63. package/build/bundle/artefacts/context/untp/0.6.1/dpp.js +1167 -0
  64. package/build/bundle/artefacts/context/untp/0.6.1/dpp.js.map +1 -0
  65. package/build/bundle/artefacts/context/untp/0.6.1/dte.d.ts +2 -0
  66. package/build/bundle/artefacts/context/untp/0.6.1/dte.js +1343 -0
  67. package/build/bundle/artefacts/context/untp/0.6.1/dte.js.map +1 -0
  68. package/build/bundle/artefacts/context/untp/0.7.0/untp.d.ts +2 -0
  69. package/build/bundle/artefacts/context/untp/0.7.0/untp.js +3496 -0
  70. package/build/bundle/artefacts/context/untp/0.7.0/untp.js.map +1 -0
  71. package/build/bundle/artefacts/context/vcdm/2/credentials.d.ts +2 -0
  72. package/build/bundle/artefacts/context/vcdm/2/credentials.js +304 -0
  73. package/build/bundle/artefacts/context/vcdm/2/credentials.js.map +1 -0
  74. package/build/bundle/artefacts/schema/untp/0.6.0/dcc.d.ts +2 -0
  75. package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js +1134 -0
  76. package/build/bundle/artefacts/schema/untp/0.6.0/dcc.js.map +1 -0
  77. package/build/bundle/artefacts/schema/untp/0.6.0/dfr.d.ts +2 -0
  78. package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js +1031 -0
  79. package/build/bundle/artefacts/schema/untp/0.6.0/dfr.js.map +1 -0
  80. package/build/bundle/artefacts/schema/untp/0.6.0/dia.d.ts +2 -0
  81. package/build/bundle/artefacts/schema/untp/0.6.0/dia.js +239 -0
  82. package/build/bundle/artefacts/schema/untp/0.6.0/dia.js.map +1 -0
  83. package/build/bundle/artefacts/schema/untp/0.6.0/dpp.d.ts +2 -0
  84. package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js +1222 -0
  85. package/build/bundle/artefacts/schema/untp/0.6.0/dpp.js.map +1 -0
  86. package/build/bundle/artefacts/schema/untp/0.6.0/dte.d.ts +2 -0
  87. package/build/bundle/artefacts/schema/untp/0.6.0/dte.js +848 -0
  88. package/build/bundle/artefacts/schema/untp/0.6.0/dte.js.map +1 -0
  89. package/build/bundle/artefacts/schema/untp/0.6.1/dcc.d.ts +2 -0
  90. package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js +1199 -0
  91. package/build/bundle/artefacts/schema/untp/0.6.1/dcc.js.map +1 -0
  92. package/build/bundle/artefacts/schema/untp/0.6.1/dfr.d.ts +2 -0
  93. package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js +1040 -0
  94. package/build/bundle/artefacts/schema/untp/0.6.1/dfr.js.map +1 -0
  95. package/build/bundle/artefacts/schema/untp/0.6.1/dia.d.ts +2 -0
  96. package/build/bundle/artefacts/schema/untp/0.6.1/dia.js +239 -0
  97. package/build/bundle/artefacts/schema/untp/0.6.1/dia.js.map +1 -0
  98. package/build/bundle/artefacts/schema/untp/0.6.1/dpp.d.ts +2 -0
  99. package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js +1232 -0
  100. package/build/bundle/artefacts/schema/untp/0.6.1/dpp.js.map +1 -0
  101. package/build/bundle/artefacts/schema/untp/0.6.1/dte.d.ts +2 -0
  102. package/build/bundle/artefacts/schema/untp/0.6.1/dte.js +848 -0
  103. package/build/bundle/artefacts/schema/untp/0.6.1/dte.js.map +1 -0
  104. package/build/bundle/artefacts/schema/untp/0.7.0/cvc.d.ts +2 -0
  105. package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js +704 -0
  106. package/build/bundle/artefacts/schema/untp/0.7.0/cvc.js.map +1 -0
  107. package/build/bundle/artefacts/schema/untp/0.7.0/dcc.d.ts +2 -0
  108. package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js +1136 -0
  109. package/build/bundle/artefacts/schema/untp/0.7.0/dcc.js.map +1 -0
  110. package/build/bundle/artefacts/schema/untp/0.7.0/dfr.d.ts +2 -0
  111. package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js +1248 -0
  112. package/build/bundle/artefacts/schema/untp/0.7.0/dfr.js.map +1 -0
  113. package/build/bundle/artefacts/schema/untp/0.7.0/dia.d.ts +2 -0
  114. package/build/bundle/artefacts/schema/untp/0.7.0/dia.js +446 -0
  115. package/build/bundle/artefacts/schema/untp/0.7.0/dia.js.map +1 -0
  116. package/build/bundle/artefacts/schema/untp/0.7.0/dpp.d.ts +2 -0
  117. package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js +1303 -0
  118. package/build/bundle/artefacts/schema/untp/0.7.0/dpp.js.map +1 -0
  119. package/build/bundle/artefacts/schema/untp/0.7.0/dte.d.ts +2 -0
  120. package/build/bundle/artefacts/schema/untp/0.7.0/dte.js +1229 -0
  121. package/build/bundle/artefacts/schema/untp/0.7.0/dte.js.map +1 -0
  122. package/build/bundle/artefacts/schema/untp/0.7.0/linkset.d.ts +2 -0
  123. package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js +122 -0
  124. package/build/bundle/artefacts/schema/untp/0.7.0/linkset.js.map +1 -0
  125. package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.d.ts +2 -0
  126. package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js +321 -0
  127. package/build/bundle/artefacts/schema/vcdm/2/verifiable-credential.js.map +1 -0
  128. package/build/bundle/fallback.d.ts +41 -0
  129. package/build/bundle/fallback.js +62 -0
  130. package/build/bundle/fallback.js.map +1 -0
  131. package/build/bundle/fallback.test.d.ts +1 -0
  132. package/build/bundle/fallback.test.js +124 -0
  133. package/build/bundle/fallback.test.js.map +1 -0
  134. package/build/bundle/index.d.ts +4 -0
  135. package/build/bundle/index.js +77 -0
  136. package/build/bundle/index.js.map +1 -0
  137. package/build/bundle/lookup.d.ts +14 -0
  138. package/build/bundle/lookup.js +40 -0
  139. package/build/bundle/lookup.js.map +1 -0
  140. package/build/bundle/lookup.test.d.ts +1 -0
  141. package/build/bundle/lookup.test.js +70 -0
  142. package/build/bundle/lookup.test.js.map +1 -0
  143. package/build/bundle/public.d.ts +25 -0
  144. package/build/bundle/public.js +56 -0
  145. package/build/bundle/public.js.map +1 -0
  146. package/build/bundle/public.test.d.ts +1 -0
  147. package/build/bundle/public.test.js +35 -0
  148. package/build/bundle/public.test.js.map +1 -0
  149. package/build/bundle/refresh-classify.test.d.ts +1 -0
  150. package/build/bundle/refresh-classify.test.js +20 -0
  151. package/build/bundle/refresh-classify.test.js.map +1 -0
  152. package/build/bundle/refresh-main.test.d.ts +1 -0
  153. package/build/bundle/refresh-main.test.js +98 -0
  154. package/build/bundle/refresh-main.test.js.map +1 -0
  155. package/build/common/as-date-time.d.ts +13 -0
  156. package/build/common/as-date-time.js +44 -0
  157. package/build/common/as-date-time.js.map +1 -0
  158. package/build/common/as-date-time.test.d.ts +1 -0
  159. package/build/common/as-date-time.test.js +42 -0
  160. package/build/common/as-date-time.test.js.map +1 -0
  161. package/build/common/as-non-empty-string.d.ts +11 -4
  162. package/build/common/as-non-empty-string.js +15 -5
  163. package/build/common/as-non-empty-string.js.map +1 -1
  164. package/build/common/as-non-empty-string.test.js +7 -2
  165. package/build/common/as-non-empty-string.test.js.map +1 -1
  166. package/build/common/index.d.ts +4 -0
  167. package/build/common/index.js +5 -0
  168. package/build/common/index.js.map +1 -0
  169. package/build/common/validity-window.d.ts +45 -0
  170. package/build/common/validity-window.js +68 -0
  171. package/build/common/validity-window.js.map +1 -0
  172. package/build/common/validity-window.test.d.ts +1 -0
  173. package/build/common/validity-window.test.js +67 -0
  174. package/build/common/validity-window.test.js.map +1 -0
  175. package/build/loaders/index.d.ts +2 -0
  176. package/build/loaders/index.js +1 -0
  177. package/build/loaders/index.js.map +1 -1
  178. package/build/loaders/jsonld-document-loader.d.ts +7 -5
  179. package/build/loaders/jsonld-document-loader.js +11 -2
  180. package/build/loaders/jsonld-document-loader.js.map +1 -1
  181. package/build/loaders/jsonld-document-loader.test.js +41 -1
  182. package/build/loaders/jsonld-document-loader.test.js.map +1 -1
  183. package/build/loaders/schema-loader.d.ts +13 -3
  184. package/build/loaders/schema-loader.js +24 -8
  185. package/build/loaders/schema-loader.js.map +1 -1
  186. package/build/loaders/schema-loader.test.js +56 -1
  187. package/build/loaders/schema-loader.test.js.map +1 -1
  188. package/build/node/errors.d.ts +9 -3
  189. package/build/node/errors.js +9 -3
  190. package/build/node/errors.js.map +1 -1
  191. package/build/node/index.d.ts +1 -1
  192. package/build/node/index.js +1 -1
  193. package/build/node/index.js.map +1 -1
  194. package/build/node/is-private-ip.d.ts +8 -4
  195. package/build/node/is-private-ip.fail-closed.test.d.ts +1 -0
  196. package/build/node/is-private-ip.fail-closed.test.js +36 -0
  197. package/build/node/is-private-ip.fail-closed.test.js.map +1 -0
  198. package/build/node/is-private-ip.js +77 -12
  199. package/build/node/is-private-ip.js.map +1 -1
  200. package/build/node/is-private-ip.test.js +28 -0
  201. package/build/node/is-private-ip.test.js.map +1 -1
  202. package/build/node/validate-public-url.d.ts +43 -11
  203. package/build/node/validate-public-url.js +68 -34
  204. package/build/node/validate-public-url.js.map +1 -1
  205. package/build/node/validate-public-url.test.js +161 -14
  206. package/build/node/validate-public-url.test.js.map +1 -1
  207. package/build/resolvers/errors.d.ts +36 -6
  208. package/build/resolvers/errors.js +41 -7
  209. package/build/resolvers/errors.js.map +1 -1
  210. package/build/resolvers/resolve-document-if-changed.test.js +7 -0
  211. package/build/resolvers/resolve-document-if-changed.test.js.map +1 -1
  212. package/build/resolvers/resolve-document.d.ts +29 -9
  213. package/build/resolvers/resolve-document.integration.test.d.ts +1 -0
  214. package/build/resolvers/resolve-document.integration.test.js +108 -0
  215. package/build/resolvers/resolve-document.integration.test.js.map +1 -0
  216. package/build/resolvers/resolve-document.js +129 -49
  217. package/build/resolvers/resolve-document.js.map +1 -1
  218. package/build/resolvers/resolve-document.test.js +462 -12
  219. package/build/resolvers/resolve-document.test.js.map +1 -1
  220. package/build/resolvers/resolve-json-document.d.ts +11 -8
  221. package/build/resolvers/resolve-json-document.js +7 -6
  222. package/build/resolvers/resolve-json-document.js.map +1 -1
  223. package/build/resolvers/resolve-json-document.test.js +21 -4
  224. package/build/resolvers/resolve-json-document.test.js.map +1 -1
  225. package/build/validation/describe-jsonld-failure.d.ts +48 -8
  226. package/build/validation/describe-jsonld-failure.js +94 -27
  227. package/build/validation/describe-jsonld-failure.js.map +1 -1
  228. package/build/validation/describe-jsonld-failure.test.js +98 -13
  229. package/build/validation/describe-jsonld-failure.test.js.map +1 -1
  230. package/build/validation/index.d.ts +3 -2
  231. package/build/validation/index.js +2 -2
  232. package/build/validation/index.js.map +1 -1
  233. package/build/validation/validate-jsonld.d.ts +29 -3
  234. package/build/validation/validate-jsonld.js +49 -22
  235. package/build/validation/validate-jsonld.js.map +1 -1
  236. package/build/validation/validate-jsonld.test.js +62 -5
  237. package/build/validation/validate-jsonld.test.js.map +1 -1
  238. package/package.json +23 -3
@@ -1 +1 @@
1
- {"version":3,"file":"is-private-ip.test.js","sourceRoot":"","sources":["../../src/node/is-private-ip.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"is-private-ip.test.js","sourceRoot":"","sources":["../../src/node/is-private-ip.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErF,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CAClD,uDAAuD,EACvD,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,SAAS,CAAC,EAAE,cAAc;QAC3B,CAAC,UAAU,CAAC,EAAE,WAAW;QACzB,CAAC,gBAAgB,CAAC;QAClB,CAAC,YAAY,CAAC,EAAE,QAAQ;QACxB,CAAC,WAAW,CAAC,EAAE,WAAW;QAC1B,CAAC,iBAAiB,CAAC;QACnB,CAAC,aAAa,CAAC,EAAE,aAAa;QAC9B,CAAC,iBAAiB,CAAC,EAAE,iCAAiC;QACtD,CAAC,YAAY,CAAC,EAAE,WAAW;QAC3B,CAAC,gBAAgB,CAAC;QAClB,CAAC,aAAa,CAAC,EAAE,WAAW;QAC5B,CAAC,iBAAiB,CAAC;QACnB,CAAC,WAAW,CAAC,EAAE,YAAY;QAC3B,CAAC,iBAAiB,CAAC,EAAE,YAAY;QACjC,CAAC,YAAY,CAAC,EAAE,eAAe;QAC/B,CAAC,aAAa,CAAC,EAAE,wBAAwB;QACzC,CAAC,iBAAiB,CAAC,EAAE,qEAAqE;KAC3F,CAAC,CAAC,2DAA2D,EAAE,CAAC,IAAI,EAAE,EAAE;QACvE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,sBAAsB,CAAC,EAAE,wBAAwB;QAClD,CAAC,sBAAsB,CAAC,EAAE,oBAAoB;KAC/C,CAAC,CAAC,uDAAuD,EAAE,CAAC,IAAI,EAAE,EAAE;QACnE,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,IAAI,CAAC,EAAE,cAAc;QACtB,CAAC,KAAK,CAAC,EAAE,WAAW;QACpB,CAAC,SAAS,CAAC,EAAE,aAAa;QAC1B,CAAC,SAAS,CAAC,EAAE,eAAe;QAC5B,CAAC,SAAS,CAAC,EAAE,eAAe;QAC5B,CAAC,SAAS,CAAC,EAAE,YAAY;QACzB,CAAC,aAAa,CAAC,EAAE,2BAA2B;QAC5C,CAAC,SAAS,CAAC,EAAE,OAAO;KACrB,CAAC,CAAC,4CAA4C,EAAE,CAAC,IAAI,EAAE,EAAE;QACxD,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,aAAa,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,UAAU,CAAC,EAAE,qCAAqC;QACnD,CAAC,aAAa,CAAC,EAAE,2CAA2C;QAC5D,CAAC,aAAa,CAAC,EAAE,iFAAiF;QAClG,CAAC,aAAa,CAAC,EAAE,2EAA2E;QAC5F,CAAC,iBAAiB,CAAC,EAAE,8CAA8C;QACnE,CAAC,eAAe,CAAC,EAAE,wEAAwE;QAC3F,CAAC,sBAAsB,CAAC,EAAE,2DAA2D;KACtF,CAAC,CAAC,mFAAmF,EAAE,CAAC,IAAI,EAAE,EAAE;QAC/F,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU;QAC/D,0EAA0E;QAC1E,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,SAAS,CAAC,EAAE,gCAAgC;QAC7C,CAAC,SAAS,CAAC,EAAE,6BAA6B;QAC1C,CAAC,QAAQ,CAAC,EAAE,gCAAgC;QAC5C,CAAC,cAAc,CAAC,EAAE,sCAAsC;QACxD,CAAC,SAAS,CAAC,EAAE,6CAA6C;KAC3D,CAAC,CAAC,sFAAsF,EAAE,CAAC,IAAI,EAAE,EAAE;QAClG,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,IAAI,CAAC;QACN,CAAC,EAAE,CAAC;QACJ,CAAC,WAAW,CAAC;QACb,CAAC,WAAW,CAAC;QACb,CAAC,eAAe,CAAC;QACjB,CAAC,WAAW,CAAC;QACb,CAAC,gBAAgB,CAAC,EAAE,2BAA2B;QAC/C,CAAC,aAAa,CAAC;QACf,CAAC,cAAc,CAAC;QAChB,CAAC,iBAAiB,CAAC;QACnB,CAAC,aAAa,CAAC;QACf,CAAC,UAAU,CAAC;QACZ,CAAC,eAAe,CAAC;KAClB,CAAC,CAAC,0CAA0C,EAAE,CAAC,IAAI,EAAE,EAAE;QACtD,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,oBAAoB,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,CACjE,0CAA0C,EAC1C,CAAC,IAAI,EAAE,EAAE;QACP,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9C,CAAC,CACF,CAAC;IAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,iBAAiB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { LookupAddress, LookupAllOptions } from 'node:dns';
1
2
  /**
2
3
  * Options for {@link validatePublicUrl}.
3
4
  */
@@ -12,7 +13,18 @@ export interface ValidatePublicUrlOptions {
12
13
  * family the resolver prefers, `4` forces IPv4-only, `6` forces IPv6-only.
13
14
  */
14
15
  family?: 0 | 4 | 6;
16
+ /** Permit private, loopback and reserved hostnames and addresses. Defaults to strict rejection. */
17
+ allowPrivateAddresses?: boolean;
18
+ /**
19
+ * Lookup implementation used for hostname resolution. This is a test and
20
+ * diagnostics seam, not a policy switch: every returned address still goes
21
+ * through the hostname and address guard below. Omitted uses Node's default
22
+ * `node:dns/promises` lookup.
23
+ */
24
+ lookup?: PublicUrlLookup;
15
25
  }
26
+ /** Node lookup result shape used when validating all addresses for a hostname. */
27
+ export type PublicUrlLookup = (hostname: string, options: LookupAllOptions) => Promise<LookupAddress[]>;
16
28
  /**
17
29
  * The resolved address that callers must use as the connect target so the
18
30
  * connection lands on the IP that validation checked. Connecting via the
@@ -22,15 +34,35 @@ export interface ResolvedAddress {
22
34
  address: string;
23
35
  family: 4 | 6;
24
36
  }
37
+ /**
38
+ * The validated address set for one hostname, in resolver order. Callers must
39
+ * connect only to these addresses, so the connection lands on IPs that
40
+ * validation checked.
41
+ *
42
+ * `address` and `family` repeat the first entry of `addresses`, so a caller
43
+ * that can use only one connect target keeps working unchanged. A caller that
44
+ * can offer several targets to its connector should hand it the whole of
45
+ * `addresses`: a name such as `localhost` resolves to both `::1` and
46
+ * `127.0.0.1`, and only one of them may have a listener, so pinning the first
47
+ * alone refuses a connection an unpinned request would have made.
48
+ */
49
+ export interface ValidatedAddresses extends ResolvedAddress {
50
+ addresses: readonly ResolvedAddress[];
51
+ }
25
52
  /**
26
53
  * Validates that `url` is a parseable HTTP(S) URL whose hostname resolves
27
- * to publicly routable IP addresses, and returns one of those addresses
28
- * pinned for the caller to use as the connect target.
54
+ * to publicly routable IP addresses, and returns the validated address set,
55
+ * pinned by the resolver, for the caller to use as its connect targets. When
56
+ * `allowPrivateAddresses` is exactly `true`, private and reserved destinations
57
+ * are permitted while the other validation and pinning rules remain active.
29
58
  *
30
- * DNS resolution is performed with `all: true`; the URL is rejected if any
31
- * resolved address is in a private / loopback / link-local /
32
- * cloud-metadata range, so a mixed public/private DNS response cannot
33
- * sneak a private record through.
59
+ * DNS resolution is performed with `all: true`; in strict mode the URL is
60
+ * rejected if any resolved address is in a private / loopback / link-local /
61
+ * cloud-metadata range, so a mixed public/private DNS response cannot sneak a
62
+ * private record through. `addresses` therefore holds every structurally valid
63
+ * record, in resolver order: in strict mode all of them are public, because a
64
+ * private one has already thrown, and in relaxed mode all of them. `address`
65
+ * and `family` repeat the first entry.
34
66
  *
35
67
  * Per ADR-035, this function throws subclasses of {@link UrlValidationError}
36
68
  * on failure. The structured payload (`code`, `message`, `received`,
@@ -39,11 +71,11 @@ export interface ResolvedAddress {
39
71
  *
40
72
  * @see https://owasp.org/www-community/attacks/Server_Side_Request_Forgery
41
73
  * @see ../../../docs/adrs/035-utils-throws-structured-errors.md
42
- * @throws {InvalidUrlError} `url` is not a parseable URL.
74
+ * @throws {InvalidUrlError} `url` is not a parseable URL, or has no hostname.
43
75
  * @throws {UnsupportedSchemeError} the URL's scheme is not allowed.
44
- * @throws {PrivateHostnameError} the hostname names a private resource.
45
- * @throws {ResolutionFailedError} DNS resolution rejected.
76
+ * @throws {PrivateHostnameError} the hostname names a private resource in strict mode.
77
+ * @throws {ResolutionFailedError} DNS resolution rejected, or the resolver returned an unparseable or family-contradictory record.
46
78
  * @throws {ResolutionEmptyError} DNS resolution returned no records.
47
- * @throws {PrivateAddressError} any resolved record is private.
79
+ * @throws {PrivateAddressError} any resolved record is private in strict mode.
48
80
  */
49
- export declare function validatePublicUrl(url: string, options?: ValidatePublicUrlOptions): Promise<ResolvedAddress>;
81
+ export declare function validatePublicUrl(url: string, options?: ValidatePublicUrlOptions): Promise<ValidatedAddresses>;
@@ -5,13 +5,18 @@ import { InvalidUrlError, PrivateAddressError, PrivateHostnameError, ResolutionE
5
5
  const DEFAULT_ALLOWED_SCHEMES = ['http', 'https'];
6
6
  /**
7
7
  * Validates that `url` is a parseable HTTP(S) URL whose hostname resolves
8
- * to publicly routable IP addresses, and returns one of those addresses
9
- * pinned for the caller to use as the connect target.
8
+ * to publicly routable IP addresses, and returns the validated address set,
9
+ * pinned by the resolver, for the caller to use as its connect targets. When
10
+ * `allowPrivateAddresses` is exactly `true`, private and reserved destinations
11
+ * are permitted while the other validation and pinning rules remain active.
10
12
  *
11
- * DNS resolution is performed with `all: true`; the URL is rejected if any
12
- * resolved address is in a private / loopback / link-local /
13
- * cloud-metadata range, so a mixed public/private DNS response cannot
14
- * sneak a private record through.
13
+ * DNS resolution is performed with `all: true`; in strict mode the URL is
14
+ * rejected if any resolved address is in a private / loopback / link-local /
15
+ * cloud-metadata range, so a mixed public/private DNS response cannot sneak a
16
+ * private record through. `addresses` therefore holds every structurally valid
17
+ * record, in resolver order: in strict mode all of them are public, because a
18
+ * private one has already thrown, and in relaxed mode all of them. `address`
19
+ * and `family` repeat the first entry.
15
20
  *
16
21
  * Per ADR-035, this function throws subclasses of {@link UrlValidationError}
17
22
  * on failure. The structured payload (`code`, `message`, `received`,
@@ -20,12 +25,12 @@ const DEFAULT_ALLOWED_SCHEMES = ['http', 'https'];
20
25
  *
21
26
  * @see https://owasp.org/www-community/attacks/Server_Side_Request_Forgery
22
27
  * @see ../../../docs/adrs/035-utils-throws-structured-errors.md
23
- * @throws {InvalidUrlError} `url` is not a parseable URL.
28
+ * @throws {InvalidUrlError} `url` is not a parseable URL, or has no hostname.
24
29
  * @throws {UnsupportedSchemeError} the URL's scheme is not allowed.
25
- * @throws {PrivateHostnameError} the hostname names a private resource.
26
- * @throws {ResolutionFailedError} DNS resolution rejected.
30
+ * @throws {PrivateHostnameError} the hostname names a private resource in strict mode.
31
+ * @throws {ResolutionFailedError} DNS resolution rejected, or the resolver returned an unparseable or family-contradictory record.
27
32
  * @throws {ResolutionEmptyError} DNS resolution returned no records.
28
- * @throws {PrivateAddressError} any resolved record is private.
33
+ * @throws {PrivateAddressError} any resolved record is private in strict mode.
29
34
  */
30
35
  export async function validatePublicUrl(url, options) {
31
36
  let parsed;
@@ -36,29 +41,48 @@ export async function validatePublicUrl(url, options) {
36
41
  throw new InvalidUrlError(url, cause);
37
42
  }
38
43
  const allowedSchemes = options?.allowedSchemes ?? DEFAULT_ALLOWED_SCHEMES;
44
+ const allowPrivateAddresses = options?.allowPrivateAddresses === true;
39
45
  const scheme = parsed.protocol.toLowerCase().replace(/:$/, '');
40
46
  if (!allowedSchemes.some((s) => s.toLowerCase() === scheme)) {
41
47
  throw new UnsupportedSchemeError(scheme, allowedSchemes);
42
48
  }
43
49
  // URL.hostname wraps IPv6 literals in brackets (e.g. `[::1]`); strip them
44
50
  // so the hostname can be passed to predicates and DNS resolution. Note
45
- // that `URL` already discards any `userinfo@` prefix from the hostname,
46
- // so smuggling attempts like `http://evil.com@127.0.0.1/` resolve to
47
- // `127.0.0.1` and are caught by isPrivateHostname below.
51
+ // that `URL` already discards any `userinfo@` prefix from the hostname, so
52
+ // a smuggling attempt like `http://evil.com@127.0.0.1/` is checked and
53
+ // connected as `127.0.0.1`, never as `evil.com`. In strict mode
54
+ // `isPrivateHostname` below then refuses it; in relaxed mode the private
55
+ // test does not run, and the destination is permitted as any other private
56
+ // destination is. Refusing the userinfo itself is not this function's job in
57
+ // either mode: for user-submitted URLs the RI's request schema rejects one
58
+ // that carries userinfo, and undici does not send credentials it was not
59
+ // asked for. URLs this function is given from elsewhere (did:web resolution,
60
+ // for instance) pass through no such schema, so that first clause covers the
61
+ // caller-supplied case only.
48
62
  const hostname = parsed.hostname.replace(/^\[|\]$/g, '');
49
- if (isPrivateHostname(hostname)) {
63
+ // A URL with no authority is malformed input, not a private destination, so
64
+ // it is reported as an invalid URL in both modes. Refusing it here keeps the
65
+ // function total: with no hostname there is nothing to resolve and nothing to
66
+ // pin, so returning normally would hand the caller an unpinned fetch.
67
+ if (!hostname) {
68
+ throw new InvalidUrlError(url, new Error('URL has no hostname.'));
69
+ }
70
+ if (!allowPrivateAddresses && isPrivateHostname(hostname)) {
50
71
  throw new PrivateHostnameError(hostname);
51
72
  }
52
- // If the hostname is already an IP literal, skip DNS resolution; the
53
- // literal itself is the resolved address, and the private-range check
54
- // above (via isPrivateHostname) has already validated it.
73
+ // If the hostname is already an IP literal, skip DNS resolution: the
74
+ // literal itself is the resolved address, so there is nothing to look up.
75
+ // In strict mode `isPrivateHostname` above has already refused a private
76
+ // literal. In relaxed mode that test did not run, which is the point of the
77
+ // mode: the literal is returned and pinned without a private-range check.
55
78
  const literalFamily = isIP(hostname);
56
79
  if (literalFamily === 4 || literalFamily === 6) {
57
- return { address: hostname, family: literalFamily };
80
+ return { address: hostname, family: literalFamily, addresses: [{ address: hostname, family: literalFamily }] };
58
81
  }
59
82
  let records;
60
83
  try {
61
- records = await dnsLookup(hostname, { family: options?.family ?? 0, all: true });
84
+ const lookup = options?.lookup ?? dnsLookup;
85
+ records = await lookup(hostname, { family: options?.family ?? 0, all: true });
62
86
  }
63
87
  catch (cause) {
64
88
  throw new ResolutionFailedError(hostname, cause);
@@ -67,28 +91,38 @@ export async function validatePublicUrl(url, options) {
67
91
  throw new ResolutionEmptyError(hostname);
68
92
  }
69
93
  const privateRecords = [];
70
- let firstPublicRecord = null;
94
+ const validRecords = [];
71
95
  for (const record of records) {
72
- if (record.family !== 4 && record.family !== 6) {
73
- throw new ResolutionFailedError(hostname, new Error(`unsupported address family ${record.family}`));
96
+ // Derive the record's family from the address string itself rather than
97
+ // trusting `record.family` (typed as a bare `number`, and DNS resolvers
98
+ // have shipped bugs that misreport it). A record whose address does not
99
+ // parse as an IP at all, or whose derived family disagrees with the
100
+ // resolver's claim, is contradictory metadata and is rejected outright
101
+ // rather than silently reconciled.
102
+ const derivedFamily = isIP(record.address);
103
+ if ((derivedFamily !== 4 && derivedFamily !== 6) || derivedFamily !== record.family) {
104
+ throw new ResolutionFailedError(hostname, new Error(`resolver returned a contradictory or unparseable record: ${record.address} (family ${record.family})`));
74
105
  }
75
- const isPrivate = record.family === 4 ? isPrivateIpv4(record.address) : isPrivateIpv6(record.address);
76
- if (isPrivate) {
106
+ const isPrivate = derivedFamily === 4 ? isPrivateIpv4(record.address) : isPrivateIpv6(record.address);
107
+ validRecords.push({ address: record.address, family: derivedFamily });
108
+ if (isPrivate && !allowPrivateAddresses) {
77
109
  privateRecords.push(record.address);
78
110
  }
79
- else if (!firstPublicRecord) {
80
- firstPublicRecord = { address: record.address, family: record.family };
81
- }
82
111
  }
83
- if (privateRecords.length > 0) {
112
+ if (!allowPrivateAddresses && privateRecords.length > 0) {
84
113
  throw new PrivateAddressError(hostname, privateRecords);
85
114
  }
86
- // Defensive: `records.length > 0` and `privateRecords.length === 0`
87
- // implies a public record was assigned in the loop. Throwing rather
88
- // than `!`-asserting keeps the invariant explicit at the boundary.
89
- if (!firstPublicRecord) {
90
- throw new ResolutionEmptyError(hostname);
115
+ // Defensive: every record either throws above or is collected, so
116
+ // `records.length > 0` implies `validRecords` is non-empty. That reasoning
117
+ // holds in both modes; the pre-relaxation version reasoned from a public
118
+ // record existing, which is no longer what the loop collects. Throwing
119
+ // rather than `!`-asserting keeps the invariant explicit at the boundary. It
120
+ // throws a plain Error rather than a resolution failure so a defect in this
121
+ // loop can never be classified as a retryable DNS fault by a caller.
122
+ const [first] = validRecords;
123
+ if (!first) {
124
+ throw new Error('validatePublicUrl invariant: no record selected');
91
125
  }
92
- return firstPublicRecord;
126
+ return { address: first.address, family: first.family, addresses: validRecords };
93
127
  }
94
128
  //# sourceMappingURL=validate-public-url.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate-public-url.js","sourceRoot":"","sources":["../../src/node/validate-public-url.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-public-url.js","sourceRoot":"","sources":["../../src/node/validate-public-url.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,13 @@ jest.unstable_mockModule('node:dns/promises', () => ({
6
6
  lookup,
7
7
  }));
8
8
  const { validatePublicUrl } = await import('./validate-public-url.js');
9
+ /**
10
+ * The shape `validatePublicUrl` returns for a single validated address:
11
+ * `address` / `family` repeat the first entry of `addresses`.
12
+ */
13
+ function validated(address, family) {
14
+ return { address, family, addresses: [{ address, family }] };
15
+ }
9
16
  describe('validatePublicUrl', () => {
10
17
  beforeEach(() => {
11
18
  lookup.mockReset();
@@ -19,6 +26,10 @@ describe('validatePublicUrl', () => {
19
26
  });
20
27
  expect(lookup).not.toHaveBeenCalled();
21
28
  });
29
+ it('retains parse rejection when private addresses are allowed', async () => {
30
+ await expect(validatePublicUrl('not a url', { allowPrivateAddresses: true })).rejects.toBeInstanceOf(InvalidUrlError);
31
+ expect(lookup).not.toHaveBeenCalled();
32
+ });
22
33
  });
23
34
  describe('scheme', () => {
24
35
  it('throws UnsupportedSchemeError for an unallowed scheme', async () => {
@@ -31,10 +42,13 @@ describe('validatePublicUrl', () => {
31
42
  });
32
43
  it('accepts a caller-supplied allowedSchemes list', async () => {
33
44
  lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
34
- await expect(validatePublicUrl('wss://example.com/ws', { allowedSchemes: ['wss', 'ws'] })).resolves.toEqual({
35
- address: '1.1.1.1',
36
- family: 4,
45
+ await expect(validatePublicUrl('wss://example.com/ws', { allowedSchemes: ['wss', 'ws'] })).resolves.toEqual(validated('1.1.1.1', 4));
46
+ });
47
+ it('retains scheme rejection when private addresses are allowed', async () => {
48
+ await expect(validatePublicUrl('ftp://example.com/path', { allowPrivateAddresses: true })).rejects.toMatchObject({
49
+ name: 'UnsupportedSchemeError',
37
50
  });
51
+ expect(lookup).not.toHaveBeenCalled();
38
52
  });
39
53
  it('reports canonical scheme details on the error', async () => {
40
54
  await expect(validatePublicUrl('ftp://example.com/')).rejects.toMatchObject({
@@ -45,10 +59,7 @@ describe('validatePublicUrl', () => {
45
59
  });
46
60
  it('compares schemes case-insensitively', async () => {
47
61
  lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
48
- await expect(validatePublicUrl('HTTPS://example.com/')).resolves.toEqual({
49
- address: '1.1.1.1',
50
- family: 4,
51
- });
62
+ await expect(validatePublicUrl('HTTPS://example.com/')).resolves.toEqual(validated('1.1.1.1', 4));
52
63
  });
53
64
  });
54
65
  describe('hostname', () => {
@@ -69,14 +80,11 @@ describe('validatePublicUrl', () => {
69
80
  expect(lookup).not.toHaveBeenCalled();
70
81
  });
71
82
  it('returns the literal IP for a public IPv4 host without calling DNS', async () => {
72
- await expect(validatePublicUrl('http://1.1.1.1/')).resolves.toEqual({ address: '1.1.1.1', family: 4 });
83
+ await expect(validatePublicUrl('http://1.1.1.1/')).resolves.toEqual(validated('1.1.1.1', 4));
73
84
  expect(lookup).not.toHaveBeenCalled();
74
85
  });
75
86
  it('returns the literal IP for a public IPv6 host without calling DNS', async () => {
76
- await expect(validatePublicUrl('http://[2606:4700:4700::1111]/')).resolves.toEqual({
77
- address: '2606:4700:4700::1111',
78
- family: 6,
79
- });
87
+ await expect(validatePublicUrl('http://[2606:4700:4700::1111]/')).resolves.toEqual(validated('2606:4700:4700::1111', 6));
80
88
  expect(lookup).not.toHaveBeenCalled();
81
89
  });
82
90
  it('rejects a literal 0.0.0.0 host without DNS lookup', async () => {
@@ -91,8 +99,39 @@ describe('validatePublicUrl', () => {
91
99
  });
92
100
  expect(lookup).not.toHaveBeenCalled();
93
101
  });
102
+ it.each([undefined, false, 'true'])('keeps private literals strict when allowPrivateAddresses is %p', async (option) => {
103
+ await expect(validatePublicUrl('http://10.0.0.1/', { allowPrivateAddresses: option })).rejects.toBeInstanceOf(PrivateHostnameError);
104
+ expect(lookup).not.toHaveBeenCalled();
105
+ });
106
+ it('rejects an empty hostname as malformed input even when private addresses are allowed', async () => {
107
+ await expect(validatePublicUrl('file:///', { allowedSchemes: ['file'], allowPrivateAddresses: true })).rejects.toBeInstanceOf(InvalidUrlError);
108
+ expect(lookup).not.toHaveBeenCalled();
109
+ });
110
+ it.each(['localhost', 'db.internal'])('resolves local names when private addresses are allowed', async (hostname) => {
111
+ lookup.mockResolvedValue([{ address: '10.0.0.5', family: 4 }]);
112
+ await expect(validatePublicUrl(`http://${hostname}/`, { allowPrivateAddresses: true })).resolves.toEqual(validated('10.0.0.5', 4));
113
+ expect(lookup).toHaveBeenCalledWith(hostname, { family: 0, all: true });
114
+ });
115
+ it.each([
116
+ ['127.0.0.1', 'http://127.0.0.1/'],
117
+ ['169.254.169.254', 'http://169.254.169.254/'],
118
+ ['224.0.0.1', 'http://224.0.0.1/'],
119
+ ['0.0.0.0', 'http://0.0.0.0/'],
120
+ ['::1', 'http://[::1]/'],
121
+ ['fc00::1', 'http://[fc00::1]/'],
122
+ ['::ffff:10.0.0.1', 'http://[::ffff:10.0.0.1]/'],
123
+ ])('allows the non-public literal %s without DNS when opted in', async (_address, url) => {
124
+ const hostname = new URL(url).hostname.replace(/^\[|\]$/g, '');
125
+ await expect(validatePublicUrl(url, { allowPrivateAddresses: true })).resolves.toEqual(validated(hostname, url.includes('[') ? 6 : 4));
126
+ expect(lookup).not.toHaveBeenCalled();
127
+ });
94
128
  });
95
129
  describe('DNS resolution', () => {
130
+ it('uses a supplied lookup callback while still validating its addresses', async () => {
131
+ const suppliedLookup = jest.fn().mockResolvedValue([{ address: '10.0.0.5', family: 4 }]);
132
+ await expect(validatePublicUrl('https://example.com/', { lookup: suppliedLookup })).rejects.toBeInstanceOf(PrivateAddressError);
133
+ expect(suppliedLookup).toHaveBeenCalledWith('example.com', { family: 0, all: true });
134
+ });
96
135
  it('throws ResolutionFailedError when dns.lookup rejects', async () => {
97
136
  lookup.mockRejectedValue(new Error('ENOTFOUND example.com'));
98
137
  await expect(validatePublicUrl('https://example.com/')).rejects.toMatchObject({
@@ -105,6 +144,18 @@ describe('validatePublicUrl', () => {
105
144
  lookup.mockResolvedValue([]);
106
145
  await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(ResolutionEmptyError);
107
146
  });
147
+ it('rejects a record whose address does not parse as an IP', async () => {
148
+ lookup.mockResolvedValue([{ address: 'not-an-ip-address', family: 4 }]);
149
+ await expect(validatePublicUrl('https://example.com/')).rejects.toThrow(ResolutionFailedError);
150
+ });
151
+ it('rejects a record whose claimed family contradicts its address', async () => {
152
+ lookup.mockResolvedValue([{ address: '10.0.0.1', family: 6 }]);
153
+ await expect(validatePublicUrl('https://example.com/')).rejects.toThrow(ResolutionFailedError);
154
+ });
155
+ it('requires family agreement even when the address itself is public', async () => {
156
+ lookup.mockResolvedValue([{ address: '93.184.216.34', family: 0 }]);
157
+ await expect(validatePublicUrl('https://example.com/')).rejects.toThrow(ResolutionFailedError);
158
+ });
108
159
  it('passes the family option through to dns.lookup with all: true', async () => {
109
160
  lookup.mockResolvedValue([{ address: '1.1.1.1', family: 4 }]);
110
161
  await validatePublicUrl('https://example.com/', { family: 4 });
@@ -119,6 +170,18 @@ describe('validatePublicUrl', () => {
119
170
  lookup.mockResolvedValue([{ address: 'whatever', family: 7 }]);
120
171
  await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(ResolutionFailedError);
121
172
  });
173
+ it('retains DNS rejection when private addresses are allowed', async () => {
174
+ const dnsError = new Error('EAI_AGAIN');
175
+ lookup.mockRejectedValue(dnsError);
176
+ await expect(validatePublicUrl('https://example.com/', { allowPrivateAddresses: true })).rejects.toMatchObject({
177
+ name: 'ResolutionFailedError',
178
+ cause: dnsError,
179
+ });
180
+ });
181
+ it('retains empty resolution when private addresses are allowed', async () => {
182
+ lookup.mockResolvedValue([]);
183
+ await expect(validatePublicUrl('https://example.com/', { allowPrivateAddresses: true })).rejects.toBeInstanceOf(ResolutionEmptyError);
184
+ });
122
185
  });
123
186
  describe('rebind defence', () => {
124
187
  it('rejects a hostname that resolves to AWS metadata', async () => {
@@ -158,12 +221,96 @@ describe('validatePublicUrl', () => {
158
221
  resolvedAddresses: ['169.254.169.254'],
159
222
  });
160
223
  });
161
- it('returns the first resolved IP so callers can use it as the connect target', async () => {
224
+ it('returns every validated public record so callers can use them all as connect targets', async () => {
162
225
  lookup.mockResolvedValue([
163
226
  { address: '1.1.1.1', family: 4 },
164
227
  { address: '8.8.8.8', family: 4 },
165
228
  ]);
166
- await expect(validatePublicUrl('https://example.com/')).resolves.toEqual({ address: '1.1.1.1', family: 4 });
229
+ await expect(validatePublicUrl('https://example.com/')).resolves.toEqual({
230
+ address: '1.1.1.1',
231
+ family: 4,
232
+ addresses: [
233
+ { address: '1.1.1.1', family: 4 },
234
+ { address: '8.8.8.8', family: 4 },
235
+ ],
236
+ });
237
+ });
238
+ it('allows private and public records and returns them all when opted in', async () => {
239
+ lookup.mockResolvedValue([
240
+ { address: '10.0.0.1', family: 4 },
241
+ { address: '1.1.1.1', family: 4 },
242
+ ]);
243
+ await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true })).resolves.toEqual({
244
+ address: '10.0.0.1',
245
+ family: 4,
246
+ addresses: [
247
+ { address: '10.0.0.1', family: 4 },
248
+ { address: '1.1.1.1', family: 4 },
249
+ ],
250
+ });
251
+ });
252
+ // The dual-stack `localhost` case that CI hit: only one of the two
253
+ // addresses has a listener, so the caller needs both to reach it.
254
+ it('returns both records for a dual-stack loopback name when opted in', async () => {
255
+ lookup.mockResolvedValue([
256
+ { address: '::1', family: 6 },
257
+ { address: '127.0.0.1', family: 4 },
258
+ ]);
259
+ await expect(validatePublicUrl('http://localhost/', { allowPrivateAddresses: true })).resolves.toEqual({
260
+ address: '::1',
261
+ family: 6,
262
+ addresses: [
263
+ { address: '::1', family: 6 },
264
+ { address: '127.0.0.1', family: 4 },
265
+ ],
266
+ });
267
+ });
268
+ it('returns every public record in strict mode', async () => {
269
+ lookup.mockResolvedValue([
270
+ { address: '1.1.1.1', family: 4 },
271
+ { address: '2606:4700:4700::1111', family: 6 },
272
+ ]);
273
+ await expect(validatePublicUrl('https://example.com/')).resolves.toEqual({
274
+ address: '1.1.1.1',
275
+ family: 4,
276
+ addresses: [
277
+ { address: '1.1.1.1', family: 4 },
278
+ { address: '2606:4700:4700::1111', family: 6 },
279
+ ],
280
+ });
281
+ });
282
+ it('still throws when a later record is private in strict mode', async () => {
283
+ lookup.mockResolvedValue([
284
+ { address: '1.1.1.1', family: 4 },
285
+ { address: '10.0.0.1', family: 4 },
286
+ ]);
287
+ await expect(validatePublicUrl('https://example.com/')).rejects.toBeInstanceOf(PrivateAddressError);
288
+ });
289
+ it('leads with a public first record rather than preferring a later private record when opted in', async () => {
290
+ lookup.mockResolvedValue([
291
+ { address: '1.1.1.1', family: 4 },
292
+ { address: '10.0.0.1', family: 4 },
293
+ ]);
294
+ await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true })).resolves.toEqual({
295
+ address: '1.1.1.1',
296
+ family: 4,
297
+ addresses: [
298
+ { address: '1.1.1.1', family: 4 },
299
+ { address: '10.0.0.1', family: 4 },
300
+ ],
301
+ });
302
+ });
303
+ it('checks every record for contradictory metadata in relaxed mode', async () => {
304
+ lookup.mockResolvedValue([
305
+ { address: '10.0.0.1', family: 4 },
306
+ { address: 'not-an-ip', family: 4 },
307
+ ]);
308
+ await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true })).rejects.toBeInstanceOf(ResolutionFailedError);
309
+ });
310
+ it('retains family validation and lookup hints in relaxed mode', async () => {
311
+ lookup.mockResolvedValue([{ address: '10.0.0.1', family: 6 }]);
312
+ await expect(validatePublicUrl('https://mixed.example/', { allowPrivateAddresses: true, family: 6 })).rejects.toBeInstanceOf(ResolutionFailedError);
313
+ expect(lookup).toHaveBeenCalledWith('mixed.example', { family: 6, all: true });
167
314
  });
168
315
  });
169
316
  describe('hierarchy', () => {
@@ -1 +1 @@
1
- {"version":3,"file":"validate-public-url.test.js","sourceRoot":"","sources":["../../src/node/validate-public-url.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate-public-url.test.js","sourceRoot":"","sources":["../../src/node/validate-public-url.test.ts"],"names":[],"mappings":"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"}