@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,212 @@
1
+ /**
2
+ * The OAuth2 pieces that are pure: what a token request looks like, what a token response means,
3
+ * and the PKCE maths (RFC 6749, RFC 7636, RFC 8252).
4
+ *
5
+ * Everything stateful stays out of the engine on purpose. Opening a browser, listening on a
6
+ * loopback port, caching a token for the session, deciding when to refresh — those belong to the
7
+ * host, which owns windows, ports and the keychain. This module only builds and reads messages, so
8
+ * both the desktop app and the planned CLI runner authenticate the same way.
9
+ *
10
+ * No access token is ever written to a project file or returned to a renderer by this module; it
11
+ * hands back a {@link TokenSet} and the host decides where it lives (ADR-0004).
12
+ */
13
+ import { createHash, randomBytes } from 'node:crypto';
14
+ import { WirebenchError } from '../errors.js';
15
+ /** Base64url without padding, the encoding every OAuth2 extension uses. */
16
+ function base64url(bytes) {
17
+ return Buffer.from(bytes).toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
18
+ }
19
+ /**
20
+ * A fresh PKCE pair.
21
+ *
22
+ * 32 random bytes give a 43-character verifier, the shortest RFC 7636 §4.1 allows and the length
23
+ * every provider tests against. `plain` is not offered: a challenge equal to its verifier protects
24
+ * nothing, and every provider worth supporting takes S256.
25
+ */
26
+ export function pkce(random = randomBytes) {
27
+ const verifier = base64url(random(32));
28
+ const challenge = base64url(createHash('sha256').update(verifier).digest());
29
+ return { verifier, challenge, method: 'S256' };
30
+ }
31
+ /** A random `state` value, which is what makes a callback attributable to this flow. */
32
+ export function newState(random = randomBytes) {
33
+ return base64url(random(16));
34
+ }
35
+ /**
36
+ * The URL the user's browser is sent to for an authorization-code flow.
37
+ *
38
+ * @throws WirebenchError `oauth2-no-authorization-url` when the configuration has no endpoint to
39
+ * send them to, which is a configuration error rather than something to guess at.
40
+ */
41
+ export function authorizationUrl(input) {
42
+ const { config } = input;
43
+ if (config.authorizationUrl === undefined || config.authorizationUrl === '') {
44
+ throw new WirebenchError('oauth2-no-authorization-url', 'This configuration has no authorization URL', {
45
+ details: { clientId: config.clientId },
46
+ });
47
+ }
48
+ const url = new URL(config.authorizationUrl);
49
+ url.searchParams.set('response_type', 'code');
50
+ url.searchParams.set('client_id', config.clientId);
51
+ url.searchParams.set('redirect_uri', input.redirectUri);
52
+ url.searchParams.set('state', input.state);
53
+ if (config.scopes.length > 0) {
54
+ url.searchParams.set('scope', config.scopes.join(' '));
55
+ }
56
+ if (config.audience !== undefined && config.audience !== '') {
57
+ url.searchParams.set('audience', config.audience);
58
+ }
59
+ if (config.pkce && input.challenge !== undefined) {
60
+ url.searchParams.set('code_challenge', input.challenge);
61
+ url.searchParams.set('code_challenge_method', 'S256');
62
+ }
63
+ return url.toString();
64
+ }
65
+ /**
66
+ * Builds the `POST` to the token endpoint.
67
+ *
68
+ * `clientAuth` decides where the client credentials go: `basic` puts them in an `Authorization`
69
+ * header (RFC 6749 §2.3.1, which providers overwhelmingly prefer), `body` puts `client_secret` in
70
+ * the form. A public client — no secret at all — sends `client_id` in the body and no header, which
71
+ * is what RFC 8252 §8.4 expects of a native app.
72
+ *
73
+ * @throws WirebenchError `oauth2-no-token-url` when the configuration has no token endpoint
74
+ */
75
+ export function buildTokenRequest(config, secrets, grantInput, options = {}) {
76
+ if (config.tokenUrl === '') {
77
+ throw new WirebenchError('oauth2-no-token-url', 'This configuration has no token URL', {
78
+ details: { clientId: config.clientId },
79
+ });
80
+ }
81
+ const form = new URLSearchParams();
82
+ switch (grantInput.grant) {
83
+ case 'client-credentials':
84
+ form.set('grant_type', 'client_credentials');
85
+ if (config.scopes.length > 0) {
86
+ form.set('scope', config.scopes.join(' '));
87
+ }
88
+ break;
89
+ case 'authorization-code':
90
+ form.set('grant_type', 'authorization_code');
91
+ form.set('code', grantInput.code);
92
+ form.set('redirect_uri', grantInput.redirectUri);
93
+ if (grantInput.verifier !== undefined) {
94
+ form.set('code_verifier', grantInput.verifier);
95
+ }
96
+ break;
97
+ case 'refresh':
98
+ form.set('grant_type', 'refresh_token');
99
+ form.set('refresh_token', grantInput.refreshToken);
100
+ if (config.scopes.length > 0) {
101
+ form.set('scope', config.scopes.join(' '));
102
+ }
103
+ break;
104
+ }
105
+ if (config.audience !== undefined && config.audience !== '') {
106
+ form.set('audience', config.audience);
107
+ }
108
+ const headers = {
109
+ 'Content-Type': 'application/x-www-form-urlencoded',
110
+ Accept: 'application/json',
111
+ };
112
+ const secret = secrets.clientSecret;
113
+ if (config.clientAuth === 'basic' && secret !== undefined && secret !== '') {
114
+ // RFC 6749 §2.3.1: both halves are form-urlencoded before being base64'd, which matters for a
115
+ // secret containing a `+` or a space.
116
+ const encoded = `${encodeURIComponent(config.clientId)}:${encodeURIComponent(secret)}`;
117
+ headers.Authorization = `Basic ${Buffer.from(encoded).toString('base64')}`;
118
+ }
119
+ else {
120
+ form.set('client_id', config.clientId);
121
+ if (secret !== undefined && secret !== '') {
122
+ form.set('client_secret', secret);
123
+ }
124
+ }
125
+ return {
126
+ url: config.tokenUrl,
127
+ method: 'POST',
128
+ headers,
129
+ body: new TextEncoder().encode(form.toString()),
130
+ timeoutMs: options.timeoutMs ?? 30_000,
131
+ followRedirects: false,
132
+ ...(options.signal !== undefined ? { signal: options.signal } : {}),
133
+ };
134
+ }
135
+ /**
136
+ * Reads a token response (RFC 6749 §5.1) or raises the error it describes (§5.2).
137
+ *
138
+ * A provider that answers 200 with an `error` field, or 400 with a perfectly good token, is not
139
+ * unheard of, so the body decides and the status only breaks ties. `expires_in` is turned into an
140
+ * absolute `expiresAt` immediately: a duration is meaningless once it has been cached.
141
+ *
142
+ * @throws WirebenchError `oauth2-token-error` with the provider's own `error`/`error_description`,
143
+ * or `oauth2-token-malformed` when the body is not a token response at all
144
+ */
145
+ export function parseTokenResponse(input) {
146
+ const text = Buffer.from(input.body).toString('utf8');
147
+ let parsed;
148
+ try {
149
+ parsed = JSON.parse(text);
150
+ }
151
+ catch {
152
+ throw new WirebenchError('oauth2-token-malformed', 'The token endpoint did not answer with JSON', {
153
+ details: { status: input.status, body: text.slice(0, 200) },
154
+ });
155
+ }
156
+ if (typeof parsed !== 'object' || parsed === null) {
157
+ throw new WirebenchError('oauth2-token-malformed', 'The token endpoint did not answer with a JSON object', {
158
+ details: { status: input.status },
159
+ });
160
+ }
161
+ const body = parsed;
162
+ const error = typeof body['error'] === 'string' ? body['error'] : undefined;
163
+ if (error !== undefined) {
164
+ const description = typeof body['error_description'] === 'string' ? body['error_description'] : undefined;
165
+ throw new WirebenchError('oauth2-token-error', description ?? `The token endpoint refused the request: ${error}`, {
166
+ details: { status: input.status, error, ...(description !== undefined ? { description } : {}) },
167
+ });
168
+ }
169
+ const accessToken = body['access_token'];
170
+ if (typeof accessToken !== 'string' || accessToken === '') {
171
+ throw new WirebenchError('oauth2-token-malformed', 'The token response carried no access token', {
172
+ details: { status: input.status, keys: Object.keys(body) },
173
+ });
174
+ }
175
+ // `expires_in` is a number per RFC 6749 §5.1, but providers do send it as a string; anything
176
+ // else is ignored rather than coerced into a nonsense expiry.
177
+ const expiresIn = body['expires_in'];
178
+ const seconds = typeof expiresIn === 'number'
179
+ ? expiresIn
180
+ : typeof expiresIn === 'string'
181
+ ? Number.parseInt(expiresIn, 10)
182
+ : Number.NaN;
183
+ const now = (input.now ?? (() => new Date()))();
184
+ const scope = body['scope'];
185
+ const refreshToken = body['refresh_token'];
186
+ const tokenType = body['token_type'];
187
+ return {
188
+ accessToken,
189
+ tokenType: typeof tokenType === 'string' && tokenType !== '' ? tokenType : 'Bearer',
190
+ ...(Number.isFinite(seconds) && seconds > 0
191
+ ? { expiresAt: new Date(now.getTime() + seconds * 1000).toISOString() }
192
+ : {}),
193
+ ...(typeof refreshToken === 'string' && refreshToken !== '' ? { refreshToken } : {}),
194
+ ...(typeof scope === 'string' && scope.trim() !== '' ? { scopes: scope.trim().split(/\s+/) } : {}),
195
+ };
196
+ }
197
+ /** How close to its expiry a token is refreshed rather than used. */
198
+ export const TOKEN_REFRESH_MARGIN_MS = 30_000;
199
+ /**
200
+ * Whether `token` should be replaced before the next send.
201
+ *
202
+ * A token with no stated expiry is used until it fails, which is all a client can do; one with an
203
+ * expiry is refreshed while it still has {@link TOKEN_REFRESH_MARGIN_MS} left, so a slow request
204
+ * does not arrive just after it lapsed.
205
+ */
206
+ export function needsRefresh(token, now = new Date()) {
207
+ if (token.expiresAt === undefined) {
208
+ return false;
209
+ }
210
+ const expires = new Date(token.expiresAt).getTime();
211
+ return Number.isNaN(expires) ? false : expires - now.getTime() <= TOKEN_REFRESH_MARGIN_MS;
212
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Persisting an imported OpenAPI definition byte-exact under `apis/<slug>/definition/`.
3
+ *
4
+ * The same contract the WSDL cache keeps (`wsdl/cache.ts`): nothing is ever re-serialised, so an
5
+ * export of a cached definition is byte-identical to what was fetched, and a `manifest.yaml` records
6
+ * each document's location, size and SHA-256 so corruption is noticed rather than parsed. What
7
+ * differs is only what there is to record — a JSON or YAML document has no namespace, no `kind` and
8
+ * no importing document, just a location and its bytes.
9
+ */
10
+ import type { FsLike } from '../../project/fs.js';
11
+ import type { ApiDefinitionCacheManifest } from '../../project/schema.js';
12
+ import type { FetchDocument } from '../../wsdl/resolver.js';
13
+ import type { ResolvedDocument } from './refs.js';
14
+ /** Options accepted by the read and write halves. */
15
+ export interface ApiDefinitionCacheOptions {
16
+ /** Overrides the file system, e.g. for tests. Defaults to `nodeFs`. */
17
+ readonly fs?: FsLike;
18
+ }
19
+ /** Options accepted by {@link writeApiDefinitionCache}. */
20
+ export interface WriteApiDefinitionCacheOptions extends ApiDefinitionCacheOptions {
21
+ /** Overrides the clock used for `fetchedAt`. Defaults to `() => new Date().toISOString()`. */
22
+ readonly now?: () => string;
23
+ /** The `openapi` string the root document declared, recorded for the definition card. */
24
+ readonly declaredVersion?: string;
25
+ }
26
+ /**
27
+ * Writes every document byte-exact into `dir` (created if needed) alongside a `manifest.yaml`, and
28
+ * returns that manifest. The directory's previous contents are REPLACED: a file left over from an
29
+ * earlier cache that the new manifest does not list is deleted, so the folder never accumulates
30
+ * documents a later import no longer references.
31
+ *
32
+ * @param documents every document the import was made of, root first
33
+ * @param dir absolute path of the API's `definition/` directory
34
+ */
35
+ export declare function writeApiDefinitionCache(documents: readonly ResolvedDocument[], dir: string, options?: WriteApiDefinitionCacheOptions): Promise<ApiDefinitionCacheManifest>;
36
+ /** A cached definition: its manifest and every document it lists, root first. */
37
+ export interface CachedApiDefinition {
38
+ readonly manifest: ApiDefinitionCacheManifest;
39
+ readonly documents: readonly ResolvedDocument[];
40
+ }
41
+ /**
42
+ * Reads a cache previously written by {@link writeApiDefinitionCache}, verifying every document's
43
+ * bytes against its recorded SHA-256.
44
+ *
45
+ * @throws {ProjectError} `definition-cache-missing` if `dir` has no `manifest.yaml`
46
+ * @throws {ProjectError} `definition-cache-corrupt` if a document's bytes no longer match its hash
47
+ */
48
+ export declare function readApiDefinitionCache(dir: string, options?: ApiDefinitionCacheOptions): Promise<CachedApiDefinition>;
49
+ /**
50
+ * Wraps `fallback` with a fetcher that answers from a written cache by location (or by the location
51
+ * originally requested), and only reaches the network for something the cache does not hold. This is
52
+ * what lets an imported API be re-read, exported and viewed with no connection at all.
53
+ */
54
+ export declare function createCachedApiFetch(manifest: ApiDefinitionCacheManifest, dir: string, fallback: FetchDocument, options?: ApiDefinitionCacheOptions): FetchDocument;
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Persisting an imported OpenAPI definition byte-exact under `apis/<slug>/definition/`.
3
+ *
4
+ * The same contract the WSDL cache keeps (`wsdl/cache.ts`): nothing is ever re-serialised, so an
5
+ * export of a cached definition is byte-identical to what was fetched, and a `manifest.yaml` records
6
+ * each document's location, size and SHA-256 so corruption is noticed rather than parsed. What
7
+ * differs is only what there is to record — a JSON or YAML document has no namespace, no `kind` and
8
+ * no importing document, just a location and its bytes.
9
+ */
10
+ import { createHash } from 'node:crypto';
11
+ import { join } from 'node:path';
12
+ import { ProjectError } from '../../errors.js';
13
+ import { nodeFs, readFileIfExists, readdirIfExists, writeFileAtomic } from '../../project/fs.js';
14
+ import { apiDefinitionCacheManifestSchema, parseFile } from '../../project/schema.js';
15
+ import { parseYaml, stringifyYaml } from '../../project/yaml.js';
16
+ import { assignFileNames } from '../../wsdl/cache-naming.js';
17
+ const MANIFEST_FILE = 'manifest.yaml';
18
+ function sha256Hex(bytes) {
19
+ return createHash('sha256').update(bytes).digest('hex');
20
+ }
21
+ /** A document's fallback extension: what it actually is, not what its URL claims. */
22
+ function kindOf(text) {
23
+ return text.trimStart().startsWith('{') ? 'json' : 'yaml';
24
+ }
25
+ /**
26
+ * Writes every document byte-exact into `dir` (created if needed) alongside a `manifest.yaml`, and
27
+ * returns that manifest. The directory's previous contents are REPLACED: a file left over from an
28
+ * earlier cache that the new manifest does not list is deleted, so the folder never accumulates
29
+ * documents a later import no longer references.
30
+ *
31
+ * @param documents every document the import was made of, root first
32
+ * @param dir absolute path of the API's `definition/` directory
33
+ */
34
+ export async function writeApiDefinitionCache(documents, dir, options) {
35
+ const fs = options?.fs ?? nodeFs;
36
+ const now = options?.now ?? (() => new Date().toISOString());
37
+ const root = documents[0];
38
+ if (root === undefined) {
39
+ throw new ProjectError('definition-cache-corrupt', 'An API definition cache needs at least one document', {
40
+ details: { dir },
41
+ });
42
+ }
43
+ const existing = await readdirIfExists(fs, dir);
44
+ const named = assignFileNames(documents.map((document) => ({ ...document, kind: kindOf(document.text) })), { rootFile: 'openapi.yaml' });
45
+ const entries = named.map(({ document, file }) => ({
46
+ file,
47
+ location: document.location,
48
+ ...(document.requestedLocation !== document.location ? { requestedLocation: document.requestedLocation } : {}),
49
+ sha256: sha256Hex(document.bytes),
50
+ bytes: document.bytes.length,
51
+ }));
52
+ const manifest = {
53
+ formatVersion: 1,
54
+ rootLocation: root.location,
55
+ fetchedAt: now(),
56
+ ...(options?.declaredVersion !== undefined ? { declaredVersion: options.declaredVersion } : {}),
57
+ documents: entries,
58
+ };
59
+ for (const { document, file } of named) {
60
+ await writeFileAtomic(fs, join(dir, file), Buffer.from(document.bytes));
61
+ }
62
+ await writeFileAtomic(fs, join(dir, MANIFEST_FILE), stringifyYaml(manifest));
63
+ const keep = new Set([MANIFEST_FILE, ...named.map((one) => one.file)]);
64
+ for (const entry of existing) {
65
+ if (entry.isFile && !keep.has(entry.name)) {
66
+ await fs.rm(join(dir, entry.name), { force: true });
67
+ }
68
+ }
69
+ return manifest;
70
+ }
71
+ /**
72
+ * Reads a cache previously written by {@link writeApiDefinitionCache}, verifying every document's
73
+ * bytes against its recorded SHA-256.
74
+ *
75
+ * @throws {ProjectError} `definition-cache-missing` if `dir` has no `manifest.yaml`
76
+ * @throws {ProjectError} `definition-cache-corrupt` if a document's bytes no longer match its hash
77
+ */
78
+ export async function readApiDefinitionCache(dir, options) {
79
+ const fs = options?.fs ?? nodeFs;
80
+ const manifestPath = join(dir, MANIFEST_FILE);
81
+ const raw = await readFileIfExists(fs, manifestPath);
82
+ if (raw === undefined) {
83
+ throw new ProjectError('definition-cache-missing', `No API definition cache manifest at ${manifestPath}`, {
84
+ details: { dir },
85
+ });
86
+ }
87
+ const manifest = parseFile(apiDefinitionCacheManifestSchema, parseYaml(raw.toString('utf-8'), manifestPath), manifestPath);
88
+ const documents = [];
89
+ for (const entry of manifest.documents) {
90
+ const bytes = new Uint8Array(await fs.readFile(join(dir, entry.file)));
91
+ const actual = sha256Hex(bytes);
92
+ if (actual !== entry.sha256) {
93
+ throw new ProjectError('definition-cache-corrupt', `Definition cache document "${entry.file}" is corrupt`, {
94
+ details: { file: entry.file, expected: entry.sha256, actual },
95
+ });
96
+ }
97
+ documents.push({
98
+ location: entry.location,
99
+ requestedLocation: entry.requestedLocation ?? entry.location,
100
+ bytes,
101
+ text: new TextDecoder('utf-8').decode(bytes),
102
+ });
103
+ }
104
+ return { manifest, documents };
105
+ }
106
+ /**
107
+ * Wraps `fallback` with a fetcher that answers from a written cache by location (or by the location
108
+ * originally requested), and only reaches the network for something the cache does not hold. This is
109
+ * what lets an imported API be re-read, exported and viewed with no connection at all.
110
+ */
111
+ export function createCachedApiFetch(manifest, dir, fallback, options) {
112
+ const fs = options?.fs ?? nodeFs;
113
+ const byLocation = new Map();
114
+ for (const entry of manifest.documents) {
115
+ byLocation.set(entry.location, entry);
116
+ if (entry.requestedLocation !== undefined) {
117
+ byLocation.set(entry.requestedLocation, entry);
118
+ }
119
+ }
120
+ return async (location, signal) => {
121
+ const entry = byLocation.get(location);
122
+ if (entry === undefined) {
123
+ return fallback(location, signal);
124
+ }
125
+ const bytes = new Uint8Array(await fs.readFile(join(dir, entry.file)));
126
+ return { location: entry.location, bytes, text: new TextDecoder('utf-8').decode(bytes) };
127
+ };
128
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Reading an OpenAPI document from wherever the user pointed at, and turning it into an API.
3
+ *
4
+ * Two steps, kept apart on purpose. {@link parseOpenApi} answers "a document this client
5
+ * understands, plus every file it was made of" — those files are what the definition cache stores,
6
+ * byte for byte, which is what lets the API tab export exactly what was imported. {@link
7
+ * importOpenApi} then adds the mapping from `map.ts`, so a caller that already has the text (a
8
+ * re-import from the cache, a test) can do either half on its own.
9
+ */
10
+ import type { FetchDocument } from '../../wsdl/resolver.js';
11
+ import type { MapApiOptions, MappedApi } from './map.js';
12
+ import type { OpenApiDocument } from './model.js';
13
+ import { type RefProblem, type ResolvedDocument } from './refs.js';
14
+ /** Where a document comes from: a location to fetch, or text the user already has. */
15
+ export type OpenApiSource = {
16
+ readonly kind: 'url';
17
+ readonly url: string;
18
+ } | {
19
+ readonly kind: 'file';
20
+ readonly path: string;
21
+ }
22
+ /** Text with a location to resolve relative references against — a paste, or a test. */
23
+ | {
24
+ readonly kind: 'text';
25
+ readonly text: string;
26
+ readonly location?: string;
27
+ };
28
+ export interface ParseOpenApiOptions {
29
+ readonly fetchDocument: FetchDocument;
30
+ readonly signal?: AbortSignal;
31
+ }
32
+ /** A parsed document and everything it was made of. */
33
+ export interface ParsedOpenApi {
34
+ readonly document: OpenApiDocument;
35
+ /** Every file fetched, root first — what the definition cache stores. */
36
+ readonly documents: readonly ResolvedDocument[];
37
+ /** References that could not be followed. The import continues without them. */
38
+ readonly refProblems: readonly RefProblem[];
39
+ }
40
+ /**
41
+ * Fetches (when needed), resolves and parses one OpenAPI document.
42
+ *
43
+ * @throws OpenApiError `openapi-malformed`, `openapi-not-a-document`, `openapi-unsupported-version`
44
+ * or `openapi-source-invalid`; an `AbortError` when the signal fires mid-fetch.
45
+ */
46
+ export declare function parseOpenApi(source: OpenApiSource, options: ParseOpenApiOptions): Promise<ParsedOpenApi>;
47
+ /** Options for {@link importOpenApi}: how to fetch, and how to map what was fetched. */
48
+ export interface ImportOpenApiOptions extends ParseOpenApiOptions, MapApiOptions {
49
+ }
50
+ /** An imported API, every document it was made of, and what the mapping could not use. */
51
+ export interface ImportedOpenApi extends MappedApi {
52
+ /** Every file fetched, root first — what the definition cache stores. */
53
+ readonly documents: readonly ResolvedDocument[];
54
+ /** References that could not be followed. They appear in the summary as skipped items too. */
55
+ readonly refProblems: readonly RefProblem[];
56
+ /** The document itself, for a caller that wants to offer a choice and map again. */
57
+ readonly document: OpenApiDocument;
58
+ }
59
+ /**
60
+ * Fetches, resolves, parses and maps one OpenAPI document into an API.
61
+ *
62
+ * A reference that could not be followed is reported, never fatal: the import produces the API the
63
+ * document does describe, and the summary says what was missing from it.
64
+ *
65
+ * @throws OpenApiError the codes {@link parseOpenApi} throws; an `AbortError` when the signal fires
66
+ */
67
+ export declare function importOpenApi(source: OpenApiSource, options: ImportOpenApiOptions): Promise<ImportedOpenApi>;
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Reading an OpenAPI document from wherever the user pointed at, and turning it into an API.
3
+ *
4
+ * Two steps, kept apart on purpose. {@link parseOpenApi} answers "a document this client
5
+ * understands, plus every file it was made of" — those files are what the definition cache stores,
6
+ * byte for byte, which is what lets the API tab export exactly what was imported. {@link
7
+ * importOpenApi} then adds the mapping from `map.ts`, so a caller that already has the text (a
8
+ * re-import from the cache, a test) can do either half on its own.
9
+ */
10
+ import { OpenApiError } from '../../errors.js';
11
+ import { apiFromDocument } from './map.js';
12
+ import { parseOpenApiDocument } from './parse.js';
13
+ import { resolveRefs } from './refs.js';
14
+ /** The absolute location a source resolves references against. */
15
+ function locationOf(source) {
16
+ if (source.kind === 'url') {
17
+ return source.url;
18
+ }
19
+ if (source.kind === 'file') {
20
+ // A path, not a URL: the caller owns turning it into one, because only it knows the platform's
21
+ // rules. `pathToFileURL` lives in the host, so this is deliberately strict rather than clever.
22
+ if (!source.path.startsWith('file:')) {
23
+ throw new OpenApiError('openapi-source-invalid', 'A file source must be given as a file: URL', {
24
+ details: { path: source.path },
25
+ });
26
+ }
27
+ return source.path;
28
+ }
29
+ // Pasted text has no folder of its own, so `inline:` is its world — the reference policy then
30
+ // refuses a local file reference out of it, which is the point.
31
+ return source.location ?? 'inline:openapi';
32
+ }
33
+ /**
34
+ * Fetches (when needed), resolves and parses one OpenAPI document.
35
+ *
36
+ * @throws OpenApiError `openapi-malformed`, `openapi-not-a-document`, `openapi-unsupported-version`
37
+ * or `openapi-source-invalid`; an `AbortError` when the signal fires mid-fetch.
38
+ */
39
+ export async function parseOpenApi(source, options) {
40
+ const location = locationOf(source);
41
+ let text;
42
+ let bytes;
43
+ let rootLocation = location;
44
+ if (source.kind === 'text') {
45
+ text = source.text;
46
+ }
47
+ else {
48
+ const fetched = await options.fetchDocument(location, options.signal);
49
+ text = fetched.text;
50
+ bytes = fetched.bytes;
51
+ // The post-redirect location: a document moved by a redirect references its siblings from
52
+ // where it actually lives, not from where it was asked for.
53
+ rootLocation = fetched.location;
54
+ }
55
+ const resolved = await resolveRefs(text, rootLocation, {
56
+ fetchDocument: options.fetchDocument,
57
+ ...(options.signal !== undefined ? { signal: options.signal } : {}),
58
+ }, bytes);
59
+ return {
60
+ document: parseOpenApiDocument(resolved.document),
61
+ documents: resolved.documents,
62
+ refProblems: resolved.problems,
63
+ };
64
+ }
65
+ /**
66
+ * Fetches, resolves, parses and maps one OpenAPI document into an API.
67
+ *
68
+ * A reference that could not be followed is reported, never fatal: the import produces the API the
69
+ * document does describe, and the summary says what was missing from it.
70
+ *
71
+ * @throws OpenApiError the codes {@link parseOpenApi} throws; an `AbortError` when the signal fires
72
+ */
73
+ export async function importOpenApi(source, options) {
74
+ const parsed = await parseOpenApi(source, options);
75
+ const mapped = apiFromDocument(parsed.document, options);
76
+ const skipped = [
77
+ ...mapped.summary.skipped,
78
+ ...parsed.refProblems.map((problem) => ({
79
+ kind: 'reference',
80
+ where: problem.at,
81
+ reason: `${problem.ref}: ${problem.reason}`,
82
+ })),
83
+ ];
84
+ return {
85
+ api: mapped.api,
86
+ summary: { ...mapped.summary, skipped },
87
+ documents: parsed.documents,
88
+ refProblems: parsed.refProblems,
89
+ document: parsed.document,
90
+ };
91
+ }
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Turning a parsed OpenAPI document into an API, its folders and its requests.
3
+ *
4
+ * Kept apart from `import.ts` because this half is pure: given a document it always produces the
5
+ * same tree, with no fetching, no clock and no file system. That is what makes an import reviewable
6
+ * — a golden test can state the whole tree — and it is the only way the mapping rules stay legible.
7
+ *
8
+ * The mapping is deliberately conservative. An imported request is a *starting point a user edits*,
9
+ * so where the document is ambiguous the import picks the reading that leaves the least hidden: a
10
+ * required query parameter is enabled and an optional one is present but switched off, a header
11
+ * parameter arrives switched off, and anything the mapping cannot represent is counted and named in
12
+ * the summary rather than dropped in silence.
13
+ */
14
+ import type { AuthConfig, IdGenerator } from '../../project/model.js';
15
+ import type { RestApi, RestDefinitionRef, RestServer } from '../model.js';
16
+ import type { OpenApiDocument, OpenApiSecurityScheme, OpenApiSkipped } from './model.js';
17
+ /** How the caller wants the document read. Every field has a documented default. */
18
+ export interface MapApiOptions {
19
+ /** The API's name. Defaults to `info.title`, which the import dialog offers for editing. */
20
+ readonly name?: string;
21
+ /** The base URL. Defaults to the first server's URL with its variables' defaults substituted. */
22
+ readonly baseUrl?: string;
23
+ /**
24
+ * The security scheme, by its name in `securitySchemes`, that becomes the API's own credentials.
25
+ * Defaults to the scheme a single global `security` requirement names, and to none otherwise —
26
+ * the choice then belongs to the user, in the import dialog.
27
+ */
28
+ readonly securityScheme?: string;
29
+ /** Passed to the sample generator for every generated body. */
30
+ readonly includeOptional?: boolean;
31
+ /** Passed to the sample generator for every generated body. */
32
+ readonly sampleValues?: boolean;
33
+ /** Injectable id generator, so a test can state the whole tree. */
34
+ readonly newId?: IdGenerator;
35
+ /** The API's position among the project's interfaces and APIs. */
36
+ readonly order?: number;
37
+ /** Recorded on the API when the caller has cached the document. */
38
+ readonly definition?: RestDefinitionRef;
39
+ }
40
+ /**
41
+ * One security scheme the document declares, as a candidate for the API's own credentials.
42
+ *
43
+ * Every scheme is listed, mappable or not, because the import dialog offers the choice and a
44
+ * scheme it cannot use has to say so rather than be missing from the list without explanation.
45
+ */
46
+ export interface OpenApiSchemeCandidate {
47
+ readonly name: string;
48
+ readonly type: OpenApiSecurityScheme['type'];
49
+ readonly description?: string;
50
+ /** What picking it would set. Absent when this client has no equivalent for it. */
51
+ readonly auth?: AuthConfig;
52
+ /** Why it cannot be used, when {@link auth} is absent. */
53
+ readonly reason?: string;
54
+ /** True for the scheme the import already applied to the API. */
55
+ readonly applied: boolean;
56
+ }
57
+ /** What an import did, for the summary the dialog shows when it finishes. */
58
+ export interface OpenApiImportSummary {
59
+ /** The API's name, after {@link MapApiOptions.name} had its say. */
60
+ readonly name: string;
61
+ readonly title: string;
62
+ /** The `openapi` string the document declared. */
63
+ readonly declaredVersion: string;
64
+ /** `info.version` — the version of the API, not of the specification. */
65
+ readonly apiVersion?: string;
66
+ readonly baseUrl: string;
67
+ readonly servers: readonly RestServer[];
68
+ readonly folders: number;
69
+ readonly requests: number;
70
+ readonly deprecated: number;
71
+ /** The auth the API ended up with, by type, when it got any. */
72
+ readonly auth?: AuthConfig['type'];
73
+ /** Every scheme the document declares, so the dialog can offer a different one. */
74
+ readonly securitySchemes: readonly OpenApiSchemeCandidate[];
75
+ /** Everything the parser and the mapping could not use, in the order it was met. */
76
+ readonly skipped: readonly OpenApiSkipped[];
77
+ }
78
+ /** An API mapped from a document, and what the mapping made of it. */
79
+ export interface MappedApi {
80
+ readonly api: RestApi;
81
+ readonly summary: OpenApiImportSummary;
82
+ }
83
+ /**
84
+ * The credentials one security scheme maps to, or the reason none does.
85
+ *
86
+ * Separate from {@link authFromScheme} because the summary lists *every* scheme the document
87
+ * declares as a candidate the user may pick, and asking "what would this one become?" must not
88
+ * itself record that something was skipped — only a scheme the import actually needed does that.
89
+ */
90
+ export declare function mapScheme(scheme: OpenApiSecurityScheme): {
91
+ auth?: AuthConfig;
92
+ reason?: string;
93
+ };
94
+ /** {@link mapScheme}, recording in `skipped` when the scheme the import needed has no equivalent. */
95
+ export declare function authFromScheme(scheme: OpenApiSecurityScheme, skipped: OpenApiSkipped[]): AuthConfig | undefined;
96
+ /**
97
+ * Maps a parsed document onto one API.
98
+ *
99
+ * @param document a document already parsed and `$ref`-resolved (see `import.ts`)
100
+ * @returns the API, and a summary of what the mapping used and what it could not
101
+ */
102
+ export declare function apiFromDocument(document: OpenApiDocument, options?: MapApiOptions): MappedApi;