@wirebench/engine 2.1.1

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 (583) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +3 -0
  3. package/dist/assert/contract.d.ts +3 -0
  4. package/dist/assert/contract.js +17 -0
  5. package/dist/assert/index.d.ts +4 -0
  6. package/dist/assert/index.js +27 -0
  7. package/dist/assert/match.d.ts +3 -0
  8. package/dist/assert/match.js +58 -0
  9. package/dist/assert/model.d.ts +73 -0
  10. package/dist/assert/model.js +8 -0
  11. package/dist/assert/schema.d.ts +34 -0
  12. package/dist/assert/schema.js +46 -0
  13. package/dist/assert/sla.d.ts +3 -0
  14. package/dist/assert/sla.js +8 -0
  15. package/dist/assert/soap-fault.d.ts +3 -0
  16. package/dist/assert/soap-fault.js +20 -0
  17. package/dist/assert/status.d.ts +3 -0
  18. package/dist/assert/status.js +14 -0
  19. package/dist/errors.d.ts +77 -0
  20. package/dist/errors.js +121 -0
  21. package/dist/fs.d.ts +35 -0
  22. package/dist/fs.js +64 -0
  23. package/dist/generate.d.ts +12 -0
  24. package/dist/generate.js +14 -0
  25. package/dist/grpc/browser.d.ts +11 -0
  26. package/dist/grpc/browser.js +9 -0
  27. package/dist/grpc/cache.d.ts +113 -0
  28. package/dist/grpc/cache.js +244 -0
  29. package/dist/grpc/call.d.ts +64 -0
  30. package/dist/grpc/call.js +72 -0
  31. package/dist/grpc/codec.d.ts +29 -0
  32. package/dist/grpc/codec.js +416 -0
  33. package/dist/grpc/command.d.ts +23 -0
  34. package/dist/grpc/command.js +91 -0
  35. package/dist/grpc/expand.d.ts +25 -0
  36. package/dist/grpc/expand.js +52 -0
  37. package/dist/grpc/framing.d.ts +28 -0
  38. package/dist/grpc/framing.js +61 -0
  39. package/dist/grpc/import.d.ts +47 -0
  40. package/dist/grpc/import.js +88 -0
  41. package/dist/grpc/model.d.ts +179 -0
  42. package/dist/grpc/model.js +91 -0
  43. package/dist/grpc/proto/describe.d.ts +92 -0
  44. package/dist/grpc/proto/describe.js +205 -0
  45. package/dist/grpc/proto/load.d.ts +35 -0
  46. package/dist/grpc/proto/load.js +112 -0
  47. package/dist/grpc/proto/sample.d.ts +21 -0
  48. package/dist/grpc/proto/sample.js +79 -0
  49. package/dist/grpc/proto/well-known.d.ts +42 -0
  50. package/dist/grpc/proto/well-known.js +143 -0
  51. package/dist/grpc/reconcile.d.ts +42 -0
  52. package/dist/grpc/reconcile.js +153 -0
  53. package/dist/grpc/reflection/client.d.ts +70 -0
  54. package/dist/grpc/reflection/client.js +197 -0
  55. package/dist/grpc/reflection/descriptors.d.ts +69 -0
  56. package/dist/grpc/reflection/descriptors.js +140 -0
  57. package/dist/grpc/reflection/proto.d.ts +33 -0
  58. package/dist/grpc/reflection/proto.js +144 -0
  59. package/dist/grpc/send.d.ts +132 -0
  60. package/dist/grpc/send.js +435 -0
  61. package/dist/grpc/shape.d.ts +29 -0
  62. package/dist/grpc/shape.js +36 -0
  63. package/dist/grpc/status.d.ts +21 -0
  64. package/dist/grpc/status.js +62 -0
  65. package/dist/grpc/target.d.ts +21 -0
  66. package/dist/grpc/target.js +66 -0
  67. package/dist/http/auth/apply.d.ts +37 -0
  68. package/dist/http/auth/apply.js +74 -0
  69. package/dist/http/auth/basic.d.ts +36 -0
  70. package/dist/http/auth/basic.js +69 -0
  71. package/dist/http/auth/md4.d.ts +13 -0
  72. package/dist/http/auth/md4.js +81 -0
  73. package/dist/http/auth/ntlm-transport.d.ts +61 -0
  74. package/dist/http/auth/ntlm-transport.js +97 -0
  75. package/dist/http/auth/ntlm.d.ts +190 -0
  76. package/dist/http/auth/ntlm.js +377 -0
  77. package/dist/http/client.d.ts +73 -0
  78. package/dist/http/client.js +403 -0
  79. package/dist/http/curl-flags.d.ts +15 -0
  80. package/dist/http/curl-flags.js +95 -0
  81. package/dist/http/curl.d.ts +94 -0
  82. package/dist/http/curl.js +245 -0
  83. package/dist/http/decompress.d.ts +7 -0
  84. package/dist/http/decompress.js +22 -0
  85. package/dist/http/errors.d.ts +22 -0
  86. package/dist/http/errors.js +144 -0
  87. package/dist/http/failed-request.d.ts +27 -0
  88. package/dist/http/failed-request.js +48 -0
  89. package/dist/http/headers.d.ts +15 -0
  90. package/dist/http/headers.js +50 -0
  91. package/dist/http/heredoc.d.ts +25 -0
  92. package/dist/http/heredoc.js +74 -0
  93. package/dist/http/proxy.d.ts +103 -0
  94. package/dist/http/proxy.js +168 -0
  95. package/dist/http/raw-capture.d.ts +23 -0
  96. package/dist/http/raw-capture.js +57 -0
  97. package/dist/http/timings.d.ts +79 -0
  98. package/dist/http/timings.js +212 -0
  99. package/dist/http/tls.d.ts +111 -0
  100. package/dist/http/tls.js +167 -0
  101. package/dist/http/types.d.ts +125 -0
  102. package/dist/http/types.js +6 -0
  103. package/dist/import-detect.d.ts +26 -0
  104. package/dist/import-detect.js +169 -0
  105. package/dist/import.d.ts +20 -0
  106. package/dist/import.js +163 -0
  107. package/dist/index.d.ts +272 -0
  108. package/dist/index.js +157 -0
  109. package/dist/json/cursor.d.ts +43 -0
  110. package/dist/json/cursor.js +168 -0
  111. package/dist/operations.d.ts +12 -0
  112. package/dist/operations.js +52 -0
  113. package/dist/project/attachments-cache.d.ts +80 -0
  114. package/dist/project/attachments-cache.js +186 -0
  115. package/dist/project/endpoints.d.ts +23 -0
  116. package/dist/project/endpoints.js +47 -0
  117. package/dist/project/environments.d.ts +68 -0
  118. package/dist/project/environments.js +124 -0
  119. package/dist/project/fs.d.ts +45 -0
  120. package/dist/project/fs.js +78 -0
  121. package/dist/project/history.d.ts +171 -0
  122. package/dist/project/history.js +179 -0
  123. package/dist/project/keystores.d.ts +24 -0
  124. package/dist/project/keystores.js +66 -0
  125. package/dist/project/load.d.ts +44 -0
  126. package/dist/project/load.js +634 -0
  127. package/dist/project/migrate.d.ts +27 -0
  128. package/dist/project/migrate.js +46 -0
  129. package/dist/project/model.d.ts +401 -0
  130. package/dist/project/model.js +126 -0
  131. package/dist/project/paths.d.ts +134 -0
  132. package/dist/project/paths.js +259 -0
  133. package/dist/project/preferences.d.ts +318 -0
  134. package/dist/project/preferences.js +239 -0
  135. package/dist/project/properties.d.ts +97 -0
  136. package/dist/project/properties.js +356 -0
  137. package/dist/project/save.d.ts +65 -0
  138. package/dist/project/save.js +295 -0
  139. package/dist/project/schema.d.ts +1329 -0
  140. package/dist/project/schema.js +737 -0
  141. package/dist/project/serialize.d.ts +42 -0
  142. package/dist/project/serialize.js +385 -0
  143. package/dist/project/wss-configs.d.ts +40 -0
  144. package/dist/project/wss-configs.js +142 -0
  145. package/dist/project/yaml.d.ts +17 -0
  146. package/dist/project/yaml.js +39 -0
  147. package/dist/redact/index.d.ts +77 -0
  148. package/dist/redact/index.js +328 -0
  149. package/dist/redact/literal.d.ts +12 -0
  150. package/dist/redact/literal.js +68 -0
  151. package/dist/rest/auth.d.ts +53 -0
  152. package/dist/rest/auth.js +80 -0
  153. package/dist/rest/body.d.ts +61 -0
  154. package/dist/rest/body.js +184 -0
  155. package/dist/rest/browser.d.ts +12 -0
  156. package/dist/rest/browser.js +11 -0
  157. package/dist/rest/cookies.d.ts +41 -0
  158. package/dist/rest/cookies.js +102 -0
  159. package/dist/rest/curl.d.ts +75 -0
  160. package/dist/rest/curl.js +417 -0
  161. package/dist/rest/expand.d.ts +35 -0
  162. package/dist/rest/expand.js +104 -0
  163. package/dist/rest/model.d.ts +247 -0
  164. package/dist/rest/model.js +118 -0
  165. package/dist/rest/oauth2.d.ts +118 -0
  166. package/dist/rest/oauth2.js +212 -0
  167. package/dist/rest/openapi/cache.d.ts +54 -0
  168. package/dist/rest/openapi/cache.js +128 -0
  169. package/dist/rest/openapi/import.d.ts +67 -0
  170. package/dist/rest/openapi/import.js +91 -0
  171. package/dist/rest/openapi/map.d.ts +102 -0
  172. package/dist/rest/openapi/map.js +477 -0
  173. package/dist/rest/openapi/model.d.ts +203 -0
  174. package/dist/rest/openapi/model.js +37 -0
  175. package/dist/rest/openapi/parse.d.ts +44 -0
  176. package/dist/rest/openapi/parse.js +1530 -0
  177. package/dist/rest/openapi/refs.d.ts +63 -0
  178. package/dist/rest/openapi/refs.js +258 -0
  179. package/dist/rest/openapi/sample.d.ts +68 -0
  180. package/dist/rest/openapi/sample.js +336 -0
  181. package/dist/rest/postman/import.d.ts +21 -0
  182. package/dist/rest/postman/import.js +47 -0
  183. package/dist/rest/postman/index.d.ts +7 -0
  184. package/dist/rest/postman/index.js +7 -0
  185. package/dist/rest/postman/map.d.ts +28 -0
  186. package/dist/rest/postman/map.js +427 -0
  187. package/dist/rest/postman/model.d.ts +118 -0
  188. package/dist/rest/postman/model.js +7 -0
  189. package/dist/rest/postman/parse.d.ts +29 -0
  190. package/dist/rest/postman/parse.js +518 -0
  191. package/dist/rest/response.d.ts +72 -0
  192. package/dist/rest/response.js +221 -0
  193. package/dist/rest/send.d.ts +102 -0
  194. package/dist/rest/send.js +148 -0
  195. package/dist/rest/url.d.ts +92 -0
  196. package/dist/rest/url.js +213 -0
  197. package/dist/run/effective-auth.d.ts +10 -0
  198. package/dist/run/effective-auth.js +19 -0
  199. package/dist/run/index.d.ts +8 -0
  200. package/dist/run/index.js +4 -0
  201. package/dist/run/prepare.d.ts +43 -0
  202. package/dist/run/prepare.js +280 -0
  203. package/dist/run/run.d.ts +53 -0
  204. package/dist/run/run.js +223 -0
  205. package/dist/run/secret-needs.d.ts +13 -0
  206. package/dist/run/secret-needs.js +125 -0
  207. package/dist/run/select.d.ts +34 -0
  208. package/dist/run/select.js +76 -0
  209. package/dist/secrets/env-names.d.ts +27 -0
  210. package/dist/secrets/env-names.js +40 -0
  211. package/dist/secrets/resolve.d.ts +58 -0
  212. package/dist/secrets/resolve.js +136 -0
  213. package/dist/send-options.d.ts +141 -0
  214. package/dist/send-options.js +228 -0
  215. package/dist/send.d.ts +53 -0
  216. package/dist/send.js +210 -0
  217. package/dist/soap/body-builder.d.ts +38 -0
  218. package/dist/soap/body-builder.js +250 -0
  219. package/dist/soap/build-problems.d.ts +12 -0
  220. package/dist/soap/build-problems.js +2 -0
  221. package/dist/soap/charset.d.ts +23 -0
  222. package/dist/soap/charset.js +47 -0
  223. package/dist/soap/envelope.d.ts +44 -0
  224. package/dist/soap/envelope.js +76 -0
  225. package/dist/soap/fault.d.ts +46 -0
  226. package/dist/soap/fault.js +129 -0
  227. package/dist/soap/form-request.d.ts +34 -0
  228. package/dist/soap/form-request.js +251 -0
  229. package/dist/soap/legacy-project/definition-fetcher.d.ts +21 -0
  230. package/dist/soap/legacy-project/definition-fetcher.js +43 -0
  231. package/dist/soap/legacy-project/format.d.ts +18 -0
  232. package/dist/soap/legacy-project/format.js +24 -0
  233. package/dist/soap/legacy-project/import.d.ts +21 -0
  234. package/dist/soap/legacy-project/import.js +46 -0
  235. package/dist/soap/legacy-project/index.d.ts +9 -0
  236. package/dist/soap/legacy-project/index.js +5 -0
  237. package/dist/soap/legacy-project/map.d.ts +91 -0
  238. package/dist/soap/legacy-project/map.js +290 -0
  239. package/dist/soap/legacy-project/model.d.ts +98 -0
  240. package/dist/soap/legacy-project/model.js +5 -0
  241. package/dist/soap/legacy-project/parse.d.ts +16 -0
  242. package/dist/soap/legacy-project/parse.js +325 -0
  243. package/dist/soap/mime/cid-scan.d.ts +36 -0
  244. package/dist/soap/mime/cid-scan.js +52 -0
  245. package/dist/soap/mime/inline-files.d.ts +39 -0
  246. package/dist/soap/mime/inline-files.js +71 -0
  247. package/dist/soap/mime/mtom.d.ts +74 -0
  248. package/dist/soap/mime/mtom.js +134 -0
  249. package/dist/soap/mime/multipart.d.ts +66 -0
  250. package/dist/soap/mime/multipart.js +329 -0
  251. package/dist/soap/mime/send-pipeline.d.ts +61 -0
  252. package/dist/soap/mime/send-pipeline.js +145 -0
  253. package/dist/soap/mime/swa.d.ts +45 -0
  254. package/dist/soap/mime/swa.js +62 -0
  255. package/dist/soap/mime/types.d.ts +69 -0
  256. package/dist/soap/mime/types.js +10 -0
  257. package/dist/soap/namespace-scope.d.ts +32 -0
  258. package/dist/soap/namespace-scope.js +85 -0
  259. package/dist/soap/prefixes.d.ts +24 -0
  260. package/dist/soap/prefixes.js +70 -0
  261. package/dist/soap/recreate.d.ts +28 -0
  262. package/dist/soap/recreate.js +168 -0
  263. package/dist/soap/request-builder.d.ts +63 -0
  264. package/dist/soap/request-builder.js +161 -0
  265. package/dist/soap/response-parser.d.ts +29 -0
  266. package/dist/soap/response-parser.js +71 -0
  267. package/dist/soap/soap-action.d.ts +31 -0
  268. package/dist/soap/soap-action.js +28 -0
  269. package/dist/soap/transforms.d.ts +52 -0
  270. package/dist/soap/transforms.js +164 -0
  271. package/dist/types.d.ts +307 -0
  272. package/dist/types.js +6 -0
  273. package/dist/validate/index.d.ts +61 -0
  274. package/dist/validate/index.js +72 -0
  275. package/dist/validate/schema-file-set.d.ts +51 -0
  276. package/dist/validate/schema-file-set.js +288 -0
  277. package/dist/validate/schema-validator.d.ts +53 -0
  278. package/dist/validate/schema-validator.js +251 -0
  279. package/dist/validate/soap-structure.d.ts +34 -0
  280. package/dist/validate/soap-structure.js +255 -0
  281. package/dist/validate/types.d.ts +47 -0
  282. package/dist/validate/types.js +8 -0
  283. package/dist/validate/wsi/assertions/helpers.d.ts +145 -0
  284. package/dist/validate/wsi/assertions/helpers.js +387 -0
  285. package/dist/validate/wsi/assertions/index.d.ts +44 -0
  286. package/dist/validate/wsi/assertions/index.js +77 -0
  287. package/dist/validate/wsi/assertions/message/helpers.d.ts +63 -0
  288. package/dist/validate/wsi/assertions/message/helpers.js +168 -0
  289. package/dist/validate/wsi/assertions/message/index.d.ts +39 -0
  290. package/dist/validate/wsi/assertions/message/index.js +62 -0
  291. package/dist/validate/wsi/assertions/message/r1001.d.ts +10 -0
  292. package/dist/validate/wsi/assertions/message/r1001.js +38 -0
  293. package/dist/validate/wsi/assertions/message/r1003.d.ts +14 -0
  294. package/dist/validate/wsi/assertions/message/r1003.js +45 -0
  295. package/dist/validate/wsi/assertions/message/r1005.d.ts +12 -0
  296. package/dist/validate/wsi/assertions/message/r1005.js +37 -0
  297. package/dist/validate/wsi/assertions/message/r1006.d.ts +10 -0
  298. package/dist/validate/wsi/assertions/message/r1006.js +49 -0
  299. package/dist/validate/wsi/assertions/message/r1007.d.ts +10 -0
  300. package/dist/validate/wsi/assertions/message/r1007.js +30 -0
  301. package/dist/validate/wsi/assertions/message/r1011.d.ts +10 -0
  302. package/dist/validate/wsi/assertions/message/r1011.js +33 -0
  303. package/dist/validate/wsi/assertions/message/r1012.d.ts +13 -0
  304. package/dist/validate/wsi/assertions/message/r1012.js +37 -0
  305. package/dist/validate/wsi/assertions/message/r1013.d.ts +9 -0
  306. package/dist/validate/wsi/assertions/message/r1013.js +42 -0
  307. package/dist/validate/wsi/assertions/message/r1014.d.ts +10 -0
  308. package/dist/validate/wsi/assertions/message/r1014.js +30 -0
  309. package/dist/validate/wsi/assertions/message/r1015.d.ts +12 -0
  310. package/dist/validate/wsi/assertions/message/r1015.js +36 -0
  311. package/dist/validate/wsi/assertions/message/r1017.d.ts +10 -0
  312. package/dist/validate/wsi/assertions/message/r1017.js +30 -0
  313. package/dist/validate/wsi/assertions/message/r1100.d.ts +10 -0
  314. package/dist/validate/wsi/assertions/message/r1100.js +39 -0
  315. package/dist/validate/wsi/assertions/message/r1101.d.ts +10 -0
  316. package/dist/validate/wsi/assertions/message/r1101.js +37 -0
  317. package/dist/validate/wsi/assertions/message/r1102.d.ts +10 -0
  318. package/dist/validate/wsi/assertions/message/r1102.js +41 -0
  319. package/dist/validate/wsi/assertions/message/r1103.d.ts +10 -0
  320. package/dist/validate/wsi/assertions/message/r1103.js +28 -0
  321. package/dist/validate/wsi/assertions/message/r1107.d.ts +10 -0
  322. package/dist/validate/wsi/assertions/message/r1107.js +38 -0
  323. package/dist/validate/wsi/assertions/message/r1109.d.ts +10 -0
  324. package/dist/validate/wsi/assertions/message/r1109.js +32 -0
  325. package/dist/validate/wsi/assertions/message/r1124.d.ts +10 -0
  326. package/dist/validate/wsi/assertions/message/r1124.js +31 -0
  327. package/dist/validate/wsi/assertions/message/r1132.d.ts +9 -0
  328. package/dist/validate/wsi/assertions/message/r1132.js +23 -0
  329. package/dist/validate/wsi/assertions/message/r1140.d.ts +10 -0
  330. package/dist/validate/wsi/assertions/message/r1140.js +42 -0
  331. package/dist/validate/wsi/assertions/message/r1141.d.ts +10 -0
  332. package/dist/validate/wsi/assertions/message/r1141.js +32 -0
  333. package/dist/validate/wsi/assertions/message/r2113.d.ts +11 -0
  334. package/dist/validate/wsi/assertions/message/r2113.js +33 -0
  335. package/dist/validate/wsi/assertions/message/r2211.d.ts +7 -0
  336. package/dist/validate/wsi/assertions/message/r2211.js +42 -0
  337. package/dist/validate/wsi/assertions/r2001.d.ts +15 -0
  338. package/dist/validate/wsi/assertions/r2001.js +47 -0
  339. package/dist/validate/wsi/assertions/r2002.d.ts +11 -0
  340. package/dist/validate/wsi/assertions/r2002.js +38 -0
  341. package/dist/validate/wsi/assertions/r2003.d.ts +7 -0
  342. package/dist/validate/wsi/assertions/r2003.js +32 -0
  343. package/dist/validate/wsi/assertions/r2005.d.ts +7 -0
  344. package/dist/validate/wsi/assertions/r2005.js +40 -0
  345. package/dist/validate/wsi/assertions/r2101.d.ts +14 -0
  346. package/dist/validate/wsi/assertions/r2101.js +65 -0
  347. package/dist/validate/wsi/assertions/r2102.d.ts +10 -0
  348. package/dist/validate/wsi/assertions/r2102.js +41 -0
  349. package/dist/validate/wsi/assertions/r2105.d.ts +8 -0
  350. package/dist/validate/wsi/assertions/r2105.js +39 -0
  351. package/dist/validate/wsi/assertions/r2110.d.ts +8 -0
  352. package/dist/validate/wsi/assertions/r2110.js +38 -0
  353. package/dist/validate/wsi/assertions/r2111.d.ts +6 -0
  354. package/dist/validate/wsi/assertions/r2111.js +30 -0
  355. package/dist/validate/wsi/assertions/r2112.d.ts +7 -0
  356. package/dist/validate/wsi/assertions/r2112.js +35 -0
  357. package/dist/validate/wsi/assertions/r2201.d.ts +7 -0
  358. package/dist/validate/wsi/assertions/r2201.js +28 -0
  359. package/dist/validate/wsi/assertions/r2203.d.ts +7 -0
  360. package/dist/validate/wsi/assertions/r2203.js +30 -0
  361. package/dist/validate/wsi/assertions/r2204.d.ts +6 -0
  362. package/dist/validate/wsi/assertions/r2204.js +29 -0
  363. package/dist/validate/wsi/assertions/r2205.d.ts +8 -0
  364. package/dist/validate/wsi/assertions/r2205.js +46 -0
  365. package/dist/validate/wsi/assertions/r2206.d.ts +7 -0
  366. package/dist/validate/wsi/assertions/r2206.js +36 -0
  367. package/dist/validate/wsi/assertions/r2209.d.ts +12 -0
  368. package/dist/validate/wsi/assertions/r2209.js +37 -0
  369. package/dist/validate/wsi/assertions/r2210.d.ts +7 -0
  370. package/dist/validate/wsi/assertions/r2210.js +30 -0
  371. package/dist/validate/wsi/assertions/r2303.d.ts +7 -0
  372. package/dist/validate/wsi/assertions/r2303.js +44 -0
  373. package/dist/validate/wsi/assertions/r2304.d.ts +6 -0
  374. package/dist/validate/wsi/assertions/r2304.js +32 -0
  375. package/dist/validate/wsi/assertions/r2401.d.ts +12 -0
  376. package/dist/validate/wsi/assertions/r2401.js +31 -0
  377. package/dist/validate/wsi/assertions/r2701.d.ts +7 -0
  378. package/dist/validate/wsi/assertions/r2701.js +28 -0
  379. package/dist/validate/wsi/assertions/r2702.d.ts +6 -0
  380. package/dist/validate/wsi/assertions/r2702.js +26 -0
  381. package/dist/validate/wsi/assertions/r2705.d.ts +11 -0
  382. package/dist/validate/wsi/assertions/r2705.js +31 -0
  383. package/dist/validate/wsi/assertions/r2706.d.ts +7 -0
  384. package/dist/validate/wsi/assertions/r2706.js +29 -0
  385. package/dist/validate/wsi/assertions/r2710.d.ts +13 -0
  386. package/dist/validate/wsi/assertions/r2710.js +37 -0
  387. package/dist/validate/wsi/assertions/r2716.d.ts +7 -0
  388. package/dist/validate/wsi/assertions/r2716.js +29 -0
  389. package/dist/validate/wsi/assertions/r2717.d.ts +9 -0
  390. package/dist/validate/wsi/assertions/r2717.js +31 -0
  391. package/dist/validate/wsi/assertions/r2718.d.ts +7 -0
  392. package/dist/validate/wsi/assertions/r2718.js +41 -0
  393. package/dist/validate/wsi/assertions/r2720.d.ts +7 -0
  394. package/dist/validate/wsi/assertions/r2720.js +29 -0
  395. package/dist/validate/wsi/assertions/r2721.d.ts +6 -0
  396. package/dist/validate/wsi/assertions/r2721.js +27 -0
  397. package/dist/validate/wsi/assertions/r2722.d.ts +6 -0
  398. package/dist/validate/wsi/assertions/r2722.js +29 -0
  399. package/dist/validate/wsi/assertions/r2801.d.ts +7 -0
  400. package/dist/validate/wsi/assertions/r2801.js +39 -0
  401. package/dist/validate/wsi/assertions/r2803.d.ts +7 -0
  402. package/dist/validate/wsi/assertions/r2803.js +29 -0
  403. package/dist/validate/wsi/docs.d.ts +29 -0
  404. package/dist/validate/wsi/docs.js +167 -0
  405. package/dist/validate/wsi/index.d.ts +16 -0
  406. package/dist/validate/wsi/index.js +11 -0
  407. package/dist/validate/wsi/report-html.d.ts +36 -0
  408. package/dist/validate/wsi/report-html.js +135 -0
  409. package/dist/validate/wsi/run-message.d.ts +50 -0
  410. package/dist/validate/wsi/run-message.js +190 -0
  411. package/dist/validate/wsi/run-wsdl.d.ts +48 -0
  412. package/dist/validate/wsi/run-wsdl.js +99 -0
  413. package/dist/validate/wsi/types.d.ts +173 -0
  414. package/dist/validate/wsi/types.js +17 -0
  415. package/dist/workspace/commit-message.d.ts +47 -0
  416. package/dist/workspace/commit-message.js +195 -0
  417. package/dist/workspace/environments.d.ts +79 -0
  418. package/dist/workspace/environments.js +115 -0
  419. package/dist/workspace/index.d.ts +28 -0
  420. package/dist/workspace/index.js +19 -0
  421. package/dist/workspace/load.d.ts +45 -0
  422. package/dist/workspace/load.js +155 -0
  423. package/dist/workspace/local-state.d.ts +37 -0
  424. package/dist/workspace/local-state.js +59 -0
  425. package/dist/workspace/migrate.d.ts +38 -0
  426. package/dist/workspace/migrate.js +50 -0
  427. package/dist/workspace/model.d.ts +86 -0
  428. package/dist/workspace/model.js +54 -0
  429. package/dist/workspace/paths.d.ts +64 -0
  430. package/dist/workspace/paths.js +97 -0
  431. package/dist/workspace/reidentify.d.ts +22 -0
  432. package/dist/workspace/reidentify.js +122 -0
  433. package/dist/workspace/save.d.ts +31 -0
  434. package/dist/workspace/save.js +84 -0
  435. package/dist/workspace/schema.d.ts +93 -0
  436. package/dist/workspace/schema.js +115 -0
  437. package/dist/workspace/serialize.d.ts +24 -0
  438. package/dist/workspace/serialize.js +60 -0
  439. package/dist/workspace/share.d.ts +52 -0
  440. package/dist/workspace/share.js +89 -0
  441. package/dist/ws/browser.d.ts +13 -0
  442. package/dist/ws/browser.js +11 -0
  443. package/dist/ws/call.d.ts +53 -0
  444. package/dist/ws/call.js +106 -0
  445. package/dist/ws/command.d.ts +19 -0
  446. package/dist/ws/command.js +28 -0
  447. package/dist/ws/expand.d.ts +38 -0
  448. package/dist/ws/expand.js +76 -0
  449. package/dist/ws/model.d.ts +191 -0
  450. package/dist/ws/model.js +83 -0
  451. package/dist/ws/pretty.d.ts +12 -0
  452. package/dist/ws/pretty.js +25 -0
  453. package/dist/ws/session.d.ts +50 -0
  454. package/dist/ws/session.js +333 -0
  455. package/dist/ws/shape.d.ts +18 -0
  456. package/dist/ws/shape.js +28 -0
  457. package/dist/ws/transcript.d.ts +14 -0
  458. package/dist/ws/transcript.js +29 -0
  459. package/dist/ws/url.d.ts +3 -0
  460. package/dist/ws/url.js +44 -0
  461. package/dist/wsa/headers.d.ts +78 -0
  462. package/dist/wsa/headers.js +244 -0
  463. package/dist/wsa/model.d.ts +66 -0
  464. package/dist/wsa/model.js +52 -0
  465. package/dist/wsa/policy-detect.d.ts +81 -0
  466. package/dist/wsa/policy-detect.js +245 -0
  467. package/dist/wsdl/cache-naming.d.ts +39 -0
  468. package/dist/wsdl/cache-naming.js +90 -0
  469. package/dist/wsdl/cache.d.ts +48 -0
  470. package/dist/wsdl/cache.js +141 -0
  471. package/dist/wsdl/docs-generator.d.ts +47 -0
  472. package/dist/wsdl/docs-generator.js +439 -0
  473. package/dist/wsdl/dom-utils.d.ts +15 -0
  474. package/dist/wsdl/dom-utils.js +50 -0
  475. package/dist/wsdl/export-definition.d.ts +38 -0
  476. package/dist/wsdl/export-definition.js +100 -0
  477. package/dist/wsdl/fetch.d.ts +13 -0
  478. package/dist/wsdl/fetch.js +60 -0
  479. package/dist/wsdl/merge.d.ts +17 -0
  480. package/dist/wsdl/merge.js +57 -0
  481. package/dist/wsdl/model.d.ts +176 -0
  482. package/dist/wsdl/model.js +17 -0
  483. package/dist/wsdl/parse-binding.d.ts +6 -0
  484. package/dist/wsdl/parse-binding.js +150 -0
  485. package/dist/wsdl/parse-wsdl.d.ts +47 -0
  486. package/dist/wsdl/parse-wsdl.js +161 -0
  487. package/dist/wsdl/qname.d.ts +28 -0
  488. package/dist/wsdl/qname.js +41 -0
  489. package/dist/wsdl/ref-policy.d.ts +54 -0
  490. package/dist/wsdl/ref-policy.js +87 -0
  491. package/dist/wsdl/resolver.d.ts +81 -0
  492. package/dist/wsdl/resolver.js +276 -0
  493. package/dist/wsdl/update-definition.d.ts +106 -0
  494. package/dist/wsdl/update-definition.js +314 -0
  495. package/dist/wss/apply.d.ts +40 -0
  496. package/dist/wss/apply.js +212 -0
  497. package/dist/wss/c14n-prefixes.d.ts +27 -0
  498. package/dist/wss/c14n-prefixes.js +95 -0
  499. package/dist/wss/incoming/decrypt.d.ts +35 -0
  500. package/dist/wss/incoming/decrypt.js +57 -0
  501. package/dist/wss/incoming/index.d.ts +56 -0
  502. package/dist/wss/incoming/index.js +189 -0
  503. package/dist/wss/incoming/verify.d.ts +74 -0
  504. package/dist/wss/incoming/verify.js +440 -0
  505. package/dist/wss/key-identifiers.d.ts +76 -0
  506. package/dist/wss/key-identifiers.js +139 -0
  507. package/dist/wss/keystore/certificate.d.ts +45 -0
  508. package/dist/wss/keystore/certificate.js +134 -0
  509. package/dist/wss/keystore/index.d.ts +50 -0
  510. package/dist/wss/keystore/index.js +80 -0
  511. package/dist/wss/keystore/model.d.ts +83 -0
  512. package/dist/wss/keystore/model.js +27 -0
  513. package/dist/wss/keystore/pem.d.ts +21 -0
  514. package/dist/wss/keystore/pem.js +140 -0
  515. package/dist/wss/keystore/pkcs12.d.ts +21 -0
  516. package/dist/wss/keystore/pkcs12.js +125 -0
  517. package/dist/wss/model.d.ts +160 -0
  518. package/dist/wss/model.js +37 -0
  519. package/dist/wss/outgoing/encryption.d.ts +76 -0
  520. package/dist/wss/outgoing/encryption.js +618 -0
  521. package/dist/wss/outgoing/signature.d.ts +73 -0
  522. package/dist/wss/outgoing/signature.js +239 -0
  523. package/dist/wss/outgoing/timestamp.d.ts +29 -0
  524. package/dist/wss/outgoing/timestamp.js +39 -0
  525. package/dist/wss/outgoing/username-token.d.ts +36 -0
  526. package/dist/wss/outgoing/username-token.js +68 -0
  527. package/dist/wss/security-header.d.ts +31 -0
  528. package/dist/wss/security-header.js +83 -0
  529. package/dist/xml/index.d.ts +7 -0
  530. package/dist/xml/index.js +7 -0
  531. package/dist/xml/namespaces.d.ts +36 -0
  532. package/dist/xml/namespaces.js +60 -0
  533. package/dist/xml/parse.d.ts +79 -0
  534. package/dist/xml/parse.js +109 -0
  535. package/dist/xml/positions.d.ts +26 -0
  536. package/dist/xml/positions.js +71 -0
  537. package/dist/xml/pretty.d.ts +37 -0
  538. package/dist/xml/pretty.js +137 -0
  539. package/dist/xml/serialize.d.ts +6 -0
  540. package/dist/xml/serialize.js +8 -0
  541. package/dist/xml/tolerant-tree.d.ts +56 -0
  542. package/dist/xml/tolerant-tree.js +134 -0
  543. package/dist/xpath/evaluate-async.d.ts +31 -0
  544. package/dist/xpath/evaluate-async.js +81 -0
  545. package/dist/xpath/evaluate.d.ts +98 -0
  546. package/dist/xpath/evaluate.js +340 -0
  547. package/dist/xpath/jsonpath.d.ts +40 -0
  548. package/dist/xpath/jsonpath.js +109 -0
  549. package/dist/xpath/namespaces.d.ts +29 -0
  550. package/dist/xpath/namespaces.js +101 -0
  551. package/dist/xpath/worker.d.ts +7 -0
  552. package/dist/xpath/worker.js +26 -0
  553. package/dist/xsd/builtins.d.ts +36 -0
  554. package/dist/xsd/builtins.js +108 -0
  555. package/dist/xsd/check-references.d.ts +25 -0
  556. package/dist/xsd/check-references.js +145 -0
  557. package/dist/xsd/form-edits.d.ts +57 -0
  558. package/dist/xsd/form-edits.js +153 -0
  559. package/dist/xsd/form-model.d.ts +153 -0
  560. package/dist/xsd/form-model.js +691 -0
  561. package/dist/xsd/locate.d.ts +42 -0
  562. package/dist/xsd/locate.js +249 -0
  563. package/dist/xsd/model.d.ts +249 -0
  564. package/dist/xsd/model.js +1 -0
  565. package/dist/xsd/parse-particles.d.ts +48 -0
  566. package/dist/xsd/parse-particles.js +320 -0
  567. package/dist/xsd/parse-schema.d.ts +21 -0
  568. package/dist/xsd/parse-schema.js +143 -0
  569. package/dist/xsd/resolve-content.d.ts +18 -0
  570. package/dist/xsd/resolve-content.js +242 -0
  571. package/dist/xsd/sample-generator.d.ts +51 -0
  572. package/dist/xsd/sample-generator.js +291 -0
  573. package/dist/xsd/sample-types.d.ts +21 -0
  574. package/dist/xsd/sample-types.js +69 -0
  575. package/dist/xsd/sample-values.d.ts +54 -0
  576. package/dist/xsd/sample-values.js +267 -0
  577. package/dist/xsd/schema-set.d.ts +51 -0
  578. package/dist/xsd/schema-set.js +203 -0
  579. package/dist/xsd/xml-scan.d.ts +64 -0
  580. package/dist/xsd/xml-scan.js +286 -0
  581. package/dist/xsd/xml-writer.d.ts +56 -0
  582. package/dist/xsd/xml-writer.js +103 -0
  583. package/package.json +69 -0
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Making sense of what came back: what kind of document it is, how to read it as text, how to show
3
+ * it formatted, and what cookies it set.
4
+ *
5
+ * Everything here is pure and defensive. A response is whatever the server felt like sending — a
6
+ * JSON body labelled `text/plain`, a charset Node has never heard of, HTML where an API was
7
+ * promised, a `Set-Cookie` with an attribute in the wrong order — and none of that may throw,
8
+ * because the user still has to be able to look at it.
9
+ */
10
+ import { decodeBody } from '../soap/charset.js';
11
+ import { mediaTypeOf } from '../soap/mime/multipart.js';
12
+ import { formatXml } from '../xml/pretty.js';
13
+ /**
14
+ * The language of a response body.
15
+ *
16
+ * The declared `Content-Type` is believed first, but only so far: `text/plain` and
17
+ * `application/octet-stream` are what servers send when they have not thought about it, so a body
18
+ * that begins like JSON or XML is treated as such. A structured suffix (`+json`, `+xml`) counts as
19
+ * its base type, which is what `application/problem+json` and every SOAP-ish REST API rely on.
20
+ */
21
+ export function detectLanguage(contentType, bytes) {
22
+ const media = contentType === undefined ? '' : mediaTypeOf(contentType).toLowerCase();
23
+ if (media.startsWith('image/')) {
24
+ return 'image';
25
+ }
26
+ if (media === 'application/json' || media.endsWith('+json')) {
27
+ return 'json';
28
+ }
29
+ if (media === 'text/xml' || media === 'application/xml' || media.endsWith('+xml')) {
30
+ return 'xml';
31
+ }
32
+ if (media === 'text/html' || media === 'application/xhtml+xml') {
33
+ return 'html';
34
+ }
35
+ if (media === 'application/javascript' || media === 'text/javascript') {
36
+ return 'javascript';
37
+ }
38
+ const sniffed = sniff(bytes);
39
+ if (sniffed !== undefined) {
40
+ return sniffed;
41
+ }
42
+ if (media.startsWith('text/')) {
43
+ return 'text';
44
+ }
45
+ return media === '' || media === 'application/octet-stream' ? 'binary' : 'text';
46
+ }
47
+ /**
48
+ * The first non-whitespace bytes, as a short ASCII string, for sniffing.
49
+ *
50
+ * A UTF-8 byte-order mark is skipped at the byte level: read as characters it would be three
51
+ * Latin-1 letters, and a BOM-prefixed JSON body would then sniff as text.
52
+ */
53
+ function head(bytes, length = 512) {
54
+ const start = bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf ? 3 : 0;
55
+ const slice = bytes.subarray(start, start + length);
56
+ let text = '';
57
+ for (const byte of slice) {
58
+ text += String.fromCharCode(byte);
59
+ }
60
+ return text.trimStart();
61
+ }
62
+ /** What the first bytes look like, when they look like anything in particular. */
63
+ function sniff(bytes) {
64
+ const start = head(bytes);
65
+ if (start === '') {
66
+ return undefined;
67
+ }
68
+ if (start.startsWith('{') || start.startsWith('[')) {
69
+ return 'json';
70
+ }
71
+ if (/^<!doctype html/i.test(start) || /^<html[\s>]/i.test(start)) {
72
+ return 'html';
73
+ }
74
+ if (start.startsWith('<?xml') || /^<[A-Za-z_]/.test(start)) {
75
+ return 'xml';
76
+ }
77
+ return undefined;
78
+ }
79
+ /**
80
+ * Decodes a body to text per the charset in its `Content-Type`, defaulting to UTF-8.
81
+ *
82
+ * Never throws and never returns nothing: an unsupported label falls back to UTF-8 with a note,
83
+ * and invalid bytes become replacement characters, because a body the user cannot read at all is
84
+ * worse than one they can read imperfectly.
85
+ */
86
+ export function decodeResponseText(bytes, contentType) {
87
+ const { text, problem } = decodeBody(bytes, contentType);
88
+ const withoutBom = text.replace(/^/, '');
89
+ return problem === undefined ? { text: withoutBom } : { text: withoutBom, problem: problem.message };
90
+ }
91
+ /**
92
+ * Formats a body for reading: JSON re-indented, XML through the engine's own pretty printer, HTML
93
+ * given one tag per line.
94
+ *
95
+ * A malformed document is returned unchanged with a problem rather than repaired or rejected — the
96
+ * broken body *is* the interesting thing when an API misbehaves, and hiding it would hide the bug.
97
+ */
98
+ export function prettyBody(text, language, indent = 2) {
99
+ if (language === 'json') {
100
+ try {
101
+ const formatted = JSON.stringify(JSON.parse(text), null, indent);
102
+ return { text: formatted, changed: formatted !== text };
103
+ }
104
+ catch (error) {
105
+ return { text, changed: false, problem: error instanceof Error ? error.message : 'Invalid JSON' };
106
+ }
107
+ }
108
+ if (language === 'xml') {
109
+ const result = formatXml(text, { indent: ' '.repeat(indent) });
110
+ return result.problem === undefined
111
+ ? { text: result.text, changed: result.changed }
112
+ : { text: result.text, changed: result.changed, problem: result.problem };
113
+ }
114
+ if (language === 'html') {
115
+ const formatted = formatHtml(text, indent);
116
+ return { text: formatted, changed: formatted !== text };
117
+ }
118
+ return { text, changed: false };
119
+ }
120
+ /**
121
+ * Indents HTML by tag depth.
122
+ *
123
+ * Deliberately not a parser: HTML's void elements, optional end tags and inline content make a
124
+ * faithful formatter a project of its own, and this only has to make a response readable. Text
125
+ * runs are kept on the line of the tag that opened them.
126
+ */
127
+ function formatHtml(text, indent) {
128
+ const tokens = text
129
+ .replace(/\r\n?/g, '\n')
130
+ .split(/(<[^>]*>)/)
131
+ .filter((token) => token.trim() !== '');
132
+ const pad = ' '.repeat(indent);
133
+ const lines = [];
134
+ let depth = 0;
135
+ for (const token of tokens) {
136
+ const isTag = token.startsWith('<');
137
+ const isClose = token.startsWith('</');
138
+ const selfCloses = /\/>$/.test(token) || /^<(?:area|base|br|col|embed|hr|img|input|link|meta|source|track|wbr|!)/i.test(token);
139
+ if (isTag && isClose) {
140
+ depth = Math.max(0, depth - 1);
141
+ }
142
+ lines.push(pad.repeat(depth) + (isTag ? token.trim() : token.trim()));
143
+ if (isTag && !isClose && !selfCloses) {
144
+ depth += 1;
145
+ }
146
+ }
147
+ return lines.join('\n');
148
+ }
149
+ /**
150
+ * Parses every `Set-Cookie` header of a response (RFC 6265 §5.2).
151
+ *
152
+ * `rawHeaders` rather than the merged map, because several cookies arrive as several headers and
153
+ * joining them with `, ` — which is what merging does — makes them unparseable. A line that is not
154
+ * a cookie at all is kept as `malformed` instead of dropped: it is evidence about the server.
155
+ */
156
+ export function parseSetCookie(rawHeaders) {
157
+ const cookies = [];
158
+ for (const [name, value] of rawHeaders) {
159
+ if (name.toLowerCase() !== 'set-cookie') {
160
+ continue;
161
+ }
162
+ cookies.push(parseOne(value));
163
+ }
164
+ return cookies;
165
+ }
166
+ function parseOne(header) {
167
+ const parts = header.split(';');
168
+ const pair = parts[0] ?? '';
169
+ const equals = pair.indexOf('=');
170
+ if (equals <= 0) {
171
+ return { name: header.trim(), value: '', malformed: true };
172
+ }
173
+ const cookie = {
174
+ name: pair.slice(0, equals).trim(),
175
+ value: unquote(pair.slice(equals + 1).trim()),
176
+ };
177
+ for (const attribute of parts.slice(1)) {
178
+ const split = attribute.indexOf('=');
179
+ const key = (split === -1 ? attribute : attribute.slice(0, split)).trim().toLowerCase();
180
+ const attributeValue = split === -1 ? '' : attribute.slice(split + 1).trim();
181
+ switch (key) {
182
+ case 'domain':
183
+ // A leading dot is legal and means the same as its absence (RFC 6265 §5.2.3).
184
+ cookie.domain = attributeValue.replace(/^\./, '').toLowerCase();
185
+ break;
186
+ case 'path':
187
+ cookie.path = attributeValue;
188
+ break;
189
+ case 'expires': {
190
+ const date = new Date(attributeValue);
191
+ cookie.expires = Number.isNaN(date.getTime()) ? attributeValue : date.toISOString();
192
+ break;
193
+ }
194
+ case 'max-age': {
195
+ const seconds = Number.parseInt(attributeValue, 10);
196
+ if (!Number.isNaN(seconds)) {
197
+ cookie.maxAge = seconds;
198
+ }
199
+ break;
200
+ }
201
+ case 'secure':
202
+ cookie.secure = true;
203
+ break;
204
+ case 'httponly':
205
+ cookie.httpOnly = true;
206
+ break;
207
+ case 'samesite': {
208
+ const normalized = attributeValue.toLowerCase();
209
+ cookie.sameSite = normalized === 'strict' ? 'Strict' : normalized === 'none' ? 'None' : 'Lax';
210
+ break;
211
+ }
212
+ default:
213
+ break;
214
+ }
215
+ }
216
+ return cookie;
217
+ }
218
+ /** Strips one layer of double quotes from a cookie value, which some servers add. */
219
+ function unquote(value) {
220
+ return value.length > 1 && value.startsWith('"') && value.endsWith('"') ? value.slice(1, -1) : value;
221
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Sending one REST request.
3
+ *
4
+ * Everything is already resolved by the time it gets here: the base URL (environment overrides
5
+ * applied), every `${…}` property expanded, credentials turned from `secretRef`s into values, TLS
6
+ * and proxy settled. This function composes the wire request, hands it to the one HTTP transport
7
+ * the SOAP path also uses, and decodes what came back — so the desktop app and the planned CLI
8
+ * runner send identically, and there is one implementation of redirects, timings and raw capture
9
+ * rather than two.
10
+ */
11
+ import type { HttpExchange, HttpRequest, ProxyOptions, TlsOptions } from '../http/types.js';
12
+ import type { AuthSummary, SendAuth } from '../types.js';
13
+ import type { FileResolver } from './body.js';
14
+ import type { KeyValueEntry, RestBody, RestMethod } from './model.js';
15
+ import type { BodyLanguage, Cookie } from './response.js';
16
+ /** The parts of a saved request a send reads, with every property already expanded. */
17
+ export interface RestSendRequest {
18
+ readonly method: RestMethod;
19
+ readonly url: string;
20
+ readonly pathParams: readonly KeyValueEntry[];
21
+ readonly query: readonly KeyValueEntry[];
22
+ readonly headers: readonly KeyValueEntry[];
23
+ readonly body: RestBody;
24
+ }
25
+ /** Transport settings for one send, every value already resolved from request, API and preference. */
26
+ export interface RestSendSettings {
27
+ readonly timeoutMs: number;
28
+ readonly followRedirects: boolean;
29
+ readonly maxRedirects?: number;
30
+ readonly keepBodyOnRedirect?: boolean;
31
+ readonly encodeUrl?: boolean;
32
+ readonly maxSizeBytes?: number;
33
+ readonly localAddress?: string;
34
+ readonly allowH2?: boolean;
35
+ readonly decompress?: boolean;
36
+ /** Charset for a raw or form body, and for the `Content-Type` that declares it. */
37
+ readonly charset?: string;
38
+ }
39
+ /** Everything {@link sendRest} needs. */
40
+ export interface RestSendInput {
41
+ /** The API's effective base URL, already expanded. Empty when the request's URL is absolute. */
42
+ readonly baseUrl: string;
43
+ readonly request: RestSendRequest;
44
+ readonly settings: RestSendSettings;
45
+ /**
46
+ * Headers the host adds on the request's behalf — `User-Agent`, `Accept-Encoding`, `Connection`,
47
+ * a default `Accept` — which a header the request sets itself overrides.
48
+ */
49
+ readonly defaultHeaders?: Readonly<Record<string, string>>;
50
+ /** Credentials, already resolved to values. */
51
+ readonly auth?: SendAuth;
52
+ /** Cookies to send back, already matched against the URL (`rest/cookies.ts`). */
53
+ readonly cookies?: readonly Cookie[];
54
+ readonly tls?: TlsOptions;
55
+ readonly proxy?: ProxyOptions;
56
+ /** How a multipart file part or a binary body is read. */
57
+ readonly resolveFile?: FileResolver;
58
+ /** Fixed multipart boundary; tests inject it. */
59
+ readonly boundary?: string;
60
+ readonly signal?: AbortSignal;
61
+ }
62
+ /** One REST exchange: everything the transport captured, plus what the body turned out to be. */
63
+ export interface RestExchange extends HttpExchange {
64
+ /** The response body decoded to text; empty for a body with no text form. */
65
+ readonly text: string;
66
+ readonly language: BodyLanguage;
67
+ /** Set when the declared charset could not be honoured and UTF-8 was used instead. */
68
+ readonly decodeNote?: string;
69
+ readonly cookies: readonly Cookie[];
70
+ /** True when a redirect turned the request into a `GET`, which the HTTP log calls out. */
71
+ readonly methodChanged: boolean;
72
+ /** What authentication did, when credentials needed a round trip of their own. */
73
+ readonly auth?: AuthSummary;
74
+ /**
75
+ * Total time across every leg of the send, including a Basic challenge retry or an NTLM
76
+ * handshake — `timings.totalMs` describes the final leg alone.
77
+ */
78
+ readonly durationMs: number;
79
+ }
80
+ /**
81
+ * Sends one REST request and decodes the response.
82
+ *
83
+ * Order of work: credentials are applied first (an API key in the query has to be part of the URL),
84
+ * then the URL is composed, then the body encoded, then headers merged. A URL that is still
85
+ * incomplete — an unfilled `{param}`, an unexpanded property, no host at all — is refused here
86
+ * rather than sent: those are the problems the preflight surfaces, and sending anyway would put a
87
+ * literal `{id}` on someone's wire.
88
+ *
89
+ * HTTP-level failures (timeout, DNS, TLS, too many redirects) propagate as `HttpError`. A non-2xx
90
+ * status is not a failure: it is a response, and the caller inspects it.
91
+ *
92
+ * @throws WirebenchError `rest-url-incomplete` when the URL could not be completed
93
+ */
94
+ export declare function sendRest(input: RestSendInput): Promise<RestExchange>;
95
+ /**
96
+ * Turns a finished HTTP exchange into a REST one: body decoded to text, language detected, cookies
97
+ * parsed, and a note when a redirect changed the method.
98
+ *
99
+ * Split out so a response replayed from history or from the exchange cache is presented exactly as
100
+ * a live one.
101
+ */
102
+ export declare function decodeRestResponse(exchange: HttpExchange, sentMethod: HttpRequest['method']): RestExchange;
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Sending one REST request.
3
+ *
4
+ * Everything is already resolved by the time it gets here: the base URL (environment overrides
5
+ * applied), every `${…}` property expanded, credentials turned from `secretRef`s into values, TLS
6
+ * and proxy settled. This function composes the wire request, hands it to the one HTTP transport
7
+ * the SOAP path also uses, and decodes what came back — so the desktop app and the planned CLI
8
+ * runner send identically, and there is one implementation of redirects, timings and raw capture
9
+ * rather than two.
10
+ */
11
+ import { WirebenchError } from '../errors.js';
12
+ import { sendWithAuth } from '../http/auth/apply.js';
13
+ import { applyAuth } from './auth.js';
14
+ import { encodeRestBody } from './body.js';
15
+ import { cookieHeader } from './cookies.js';
16
+ import { decodeResponseText, detectLanguage, parseSetCookie } from './response.js';
17
+ import { composeUrl } from './url.js';
18
+ /**
19
+ * Merges the header sources in precedence order, lowest first: host defaults, then what the body
20
+ * and credentials imply, then the request's own typed headers.
21
+ *
22
+ * The request always wins — a user who typed a `Content-Type` meant it, even when the body kind
23
+ * implies another — which is the same rule the SOAP path applies to its computed headers.
24
+ */
25
+ function mergeRequestHeaders(input) {
26
+ const merged = new Map();
27
+ const put = (name, value) => {
28
+ merged.set(name.toLowerCase(), [name, value]);
29
+ };
30
+ for (const [name, value] of Object.entries(input.defaults)) {
31
+ put(name, value);
32
+ }
33
+ for (const [name, value] of Object.entries(input.computed)) {
34
+ put(name, value);
35
+ }
36
+ // A repeated header name in the request's own table is joined with `, `, which is what RFC 9110
37
+ // §5.3 says a recipient must treat as equivalent to two headers; undici takes one value per name.
38
+ const typedSeen = new Set();
39
+ for (const header of input.typed) {
40
+ if (!header.enabled || header.name === '') {
41
+ continue;
42
+ }
43
+ const key = header.name.toLowerCase();
44
+ const previous = typedSeen.has(key) ? merged.get(key)?.[1] : undefined;
45
+ put(header.name, previous === undefined ? header.value : `${previous}, ${header.value}`);
46
+ typedSeen.add(key);
47
+ }
48
+ return Object.fromEntries([...merged.values()]);
49
+ }
50
+ /** The methods this transport will send. A custom method is passed through as given. */
51
+ function methodFor(method) {
52
+ return method.toUpperCase();
53
+ }
54
+ /**
55
+ * Sends one REST request and decodes the response.
56
+ *
57
+ * Order of work: credentials are applied first (an API key in the query has to be part of the URL),
58
+ * then the URL is composed, then the body encoded, then headers merged. A URL that is still
59
+ * incomplete — an unfilled `{param}`, an unexpanded property, no host at all — is refused here
60
+ * rather than sent: those are the problems the preflight surfaces, and sending anyway would put a
61
+ * literal `{id}` on someone's wire.
62
+ *
63
+ * HTTP-level failures (timeout, DNS, TLS, too many redirects) propagate as `HttpError`. A non-2xx
64
+ * status is not a failure: it is a response, and the caller inspects it.
65
+ *
66
+ * @throws WirebenchError `rest-url-incomplete` when the URL could not be completed
67
+ */
68
+ export async function sendRest(input) {
69
+ const { request, settings } = input;
70
+ const applied = applyAuth(input.auth);
71
+ const composed = composeUrl(input.baseUrl, request.url, request.pathParams, [...request.query, ...applied.query], {
72
+ encode: settings.encodeUrl ?? true,
73
+ });
74
+ if (composed.problems.length > 0) {
75
+ throw urlIncomplete(composed.problems, composed.url);
76
+ }
77
+ const encoded = await encodeRestBody(request.body, {
78
+ ...(input.resolveFile !== undefined ? { resolveFile: input.resolveFile } : {}),
79
+ ...(settings.charset !== undefined ? { charset: settings.charset } : {}),
80
+ ...(input.boundary !== undefined ? { boundary: input.boundary } : {}),
81
+ ...(input.signal !== undefined ? { signal: input.signal } : {}),
82
+ });
83
+ const cookies = cookieHeader(input.cookies ?? []);
84
+ const headers = mergeRequestHeaders({
85
+ defaults: input.defaultHeaders ?? {},
86
+ computed: {
87
+ ...applied.headers,
88
+ ...(encoded.contentType !== undefined ? { 'Content-Type': encoded.contentType } : {}),
89
+ ...(cookies !== undefined ? { Cookie: cookies } : {}),
90
+ },
91
+ typed: request.headers,
92
+ });
93
+ const httpRequest = {
94
+ url: composed.url,
95
+ method: methodFor(request.method),
96
+ headers,
97
+ ...(encoded.bytes !== undefined ? { body: encoded.bytes } : {}),
98
+ timeoutMs: settings.timeoutMs,
99
+ followRedirects: settings.followRedirects,
100
+ ...(settings.maxRedirects !== undefined ? { maxRedirects: settings.maxRedirects } : {}),
101
+ ...(settings.keepBodyOnRedirect === true ? { preserveMethodOnRedirect: true } : {}),
102
+ ...(settings.maxSizeBytes !== undefined ? { maxSizeBytes: settings.maxSizeBytes } : {}),
103
+ ...(settings.localAddress !== undefined ? { localAddress: settings.localAddress } : {}),
104
+ ...(settings.allowH2 === true ? { allowH2: true } : {}),
105
+ ...(settings.decompress !== undefined ? { decompress: settings.decompress } : {}),
106
+ ...(input.tls !== undefined ? { tls: input.tls } : {}),
107
+ ...(input.proxy !== undefined ? { proxy: input.proxy } : {}),
108
+ ...(input.signal !== undefined ? { signal: input.signal } : {}),
109
+ };
110
+ // Basic and NTLM may need a round trip of their own; every other scheme is already in `headers`.
111
+ const authenticated = await sendWithAuth(httpRequest, applied.transportAuth);
112
+ return {
113
+ ...decodeRestResponse(authenticated.http, methodFor(request.method)),
114
+ ...(authenticated.auth !== undefined ? { auth: authenticated.auth } : {}),
115
+ durationMs: authenticated.durationMs,
116
+ };
117
+ }
118
+ /** The error a URL that cannot be completed raises, naming every problem at once. */
119
+ function urlIncomplete(problems, url) {
120
+ const missing = problems.filter((problem) => problem.code === 'missing-path-param').map((problem) => problem.name);
121
+ const message = missing.length > 0
122
+ ? `The URL still needs a value for ${missing.map((name) => `{${name}}`).join(', ')}`
123
+ : `The URL is not a complete address: ${url}`;
124
+ return new WirebenchError('rest-url-incomplete', message, { details: { url, problems } });
125
+ }
126
+ /**
127
+ * Turns a finished HTTP exchange into a REST one: body decoded to text, language detected, cookies
128
+ * parsed, and a note when a redirect changed the method.
129
+ *
130
+ * Split out so a response replayed from history or from the exchange cache is presented exactly as
131
+ * a live one.
132
+ */
133
+ export function decodeRestResponse(exchange, sentMethod) {
134
+ const contentType = exchange.headers['content-type'];
135
+ const language = detectLanguage(contentType, exchange.body);
136
+ const decoded = language === 'image' || language === 'binary' ? { text: '' } : decodeResponseText(exchange.body, contentType);
137
+ const methodChanged = sentMethod !== 'GET' &&
138
+ exchange.redirects.some((hop) => hop.status === 303 || ((hop.status === 301 || hop.status === 302) && sentMethod === 'POST'));
139
+ return {
140
+ ...exchange,
141
+ durationMs: exchange.timings.totalMs,
142
+ text: decoded.text,
143
+ language,
144
+ ...(decoded.problem !== undefined ? { decodeNote: decoded.problem } : {}),
145
+ cookies: parseSetCookie(exchange.rawHeaders),
146
+ methodChanged,
147
+ };
148
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Building the URL a REST request actually sends, and taking one apart again.
3
+ *
4
+ * Two jobs, both pure. {@link composeUrl} joins the API's base URL with the request's own URL,
5
+ * fills its `{name}` path parameters and appends its enabled query rows, percent-encoding to
6
+ * RFC 3986. {@link splitQuery} and {@link joinQuery} are the other direction: the editor keeps one
7
+ * URL field and one query table, and they have to be the same thing seen twice, so a value typed
8
+ * into either lands in the other without drifting.
9
+ *
10
+ * Nothing here throws for bad input. A missing path parameter or a property reference nothing
11
+ * expanded is a {@link UrlProblem} the caller surfaces before the send — a URL that is merely
12
+ * unfinished is the normal state of a request being written.
13
+ */
14
+ import type { KeyValueEntry } from './model.js';
15
+ /** Something wrong with a URL that must stop the send rather than reach the wire. */
16
+ export interface UrlProblem {
17
+ readonly code:
18
+ /** A `{name}` in the URL with no value in the request's path-parameter table. */
19
+ 'missing-path-param'
20
+ /** A `${…}` property reference the caller did not expand. */
21
+ | 'unexpanded-property'
22
+ /** Neither the request's URL nor the base URL gives a scheme and host. */
23
+ | 'no-host';
24
+ /** The parameter or reference the problem is about. */
25
+ readonly name: string;
26
+ }
27
+ /** The result of {@link composeUrl}: the URL to send, and anything that must stop the send. */
28
+ export interface ComposedUrl {
29
+ readonly url: string;
30
+ readonly problems: readonly UrlProblem[];
31
+ }
32
+ /** Options for {@link composeUrl}. */
33
+ export interface ComposeUrlOptions {
34
+ /**
35
+ * Percent-encode path-parameter and query values. On by default. Off sends them exactly as
36
+ * typed, which is what a request that has to pass a pre-encoded or deliberately odd value needs.
37
+ */
38
+ readonly encode?: boolean;
39
+ }
40
+ /**
41
+ * Percent-encodes one value, leaving an existing valid `%XX` escape alone.
42
+ *
43
+ * The double-encoding guard is the whole point: a user who pastes `a%20b` means one space, and
44
+ * turning it into `a%2520b` would silently change the request. A lone `%` that is not a valid
45
+ * escape *is* encoded, because on the wire it has to be.
46
+ */
47
+ export declare function encodeValue(value: string, extraSafe?: string): string;
48
+ /** Every `{name}` in `url`, in the order they appear, without duplicates. */
49
+ export declare function parseUrlParams(url: string): string[];
50
+ /**
51
+ * Drops every trailing `/` from `text`.
52
+ *
53
+ * A character walk rather than `replace(/\/+$/, '')`: that pattern is anchored at the end but not
54
+ * at the start, so the engine retries it at each of the string's positions and the whole trim costs
55
+ * O(n²) — 80k slashes took five seconds. Nothing here is attacker-supplied (it is the user's own
56
+ * base URL), so this is a sharp edge rather than a vulnerability, but linear is free.
57
+ */
58
+ export declare function trimTrailingSlashes(text: string): string;
59
+ /**
60
+ * Joins a base URL with a request's relative URL.
61
+ *
62
+ * The base's own path is kept (`https://h/api/v3` + `/pet` is `https://h/api/v3/pet`), because an
63
+ * API's base URL usually *is* a path prefix; exactly one `/` ends up between the two however many
64
+ * either side brought. An empty relative URL sends the base itself.
65
+ */
66
+ export declare function joinBase(base: string, url: string): string;
67
+ /** Splits `url` into its part before `?`/`#` and the query rows after it. */
68
+ export declare function splitQuery(url: string): {
69
+ readonly path: string;
70
+ readonly query: KeyValueEntry[];
71
+ };
72
+ /**
73
+ * The inverse of {@link splitQuery}: puts enabled rows back onto `path` as its query string.
74
+ *
75
+ * Values are written exactly as given — this is the editor's URL field, not the wire — so
76
+ * `joinQuery(splitQuery(url))` returns `url` for any URL the editor could have produced.
77
+ */
78
+ export declare function joinQuery(path: string, query: readonly KeyValueEntry[]): string;
79
+ /**
80
+ * Builds the URL one send actually uses.
81
+ *
82
+ * Order of work: the request's URL wins over the base when it is absolute; `{name}` parameters are
83
+ * filled from the enabled rows of `pathParams`; the URL's own query string and the `query` table
84
+ * are concatenated, in that order, so a parameter typed into the field and one added in the table
85
+ * both survive; every value is encoded unless `encode` is off.
86
+ *
87
+ * @param base the API's effective base URL, already expanded
88
+ * @param url the request's URL, already expanded
89
+ * @param pathParams values for the URL's `{name}` placeholders
90
+ * @param query query rows to append
91
+ */
92
+ export declare function composeUrl(base: string, url: string, pathParams?: readonly KeyValueEntry[], query?: readonly KeyValueEntry[], options?: ComposeUrlOptions): ComposedUrl;