@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,477 @@
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 { generateId } from '../../project/model.js';
15
+ import { slugify, uniqueSlug } from '../../project/paths.js';
16
+ import { createApi, createFolder, createRestRequest, entry, RAW_LANGUAGE_CONTENT_TYPES } from '../model.js';
17
+ import { HTTP_METHODS, serverUrl } from './model.js';
18
+ import { sampleFromSchema, sampleXml } from './sample.js';
19
+ /** Header parameters OpenAPI itself says to ignore, because the message decides them. */
20
+ const RESERVED_HEADERS = new Set(['accept', 'content-type', 'authorization']);
21
+ /** The media types a *Binary* body is the honest reading of. */
22
+ function isBinaryMedia(type, schema) {
23
+ if (schema?.format === 'binary') {
24
+ return true;
25
+ }
26
+ return (type === 'application/octet-stream' ||
27
+ type === 'application/pdf' ||
28
+ type === 'application/zip' ||
29
+ type.startsWith('image/') ||
30
+ type.startsWith('audio/') ||
31
+ type.startsWith('video/'));
32
+ }
33
+ const isJson = (type) => type === 'application/json' || /^application\/[\w.+-]+\+json$/.test(type);
34
+ const isXml = (type) => type === 'application/xml' || type === 'text/xml' || /^application\/[\w.+-]+\+xml$/.test(type);
35
+ const isForm = (type) => type === 'application/x-www-form-urlencoded';
36
+ const isMultipart = (type) => type === 'multipart/form-data';
37
+ /** JSON > XML > form > multipart > anything else, as §3.6 orders them. */
38
+ const BODY_PREFERENCE = [isJson, isXml, isForm, isMultipart, () => true];
39
+ /** A value as a table cell or a header: a string stays itself, anything else is written as JSON. */
40
+ function cellText(value) {
41
+ if (value === undefined || value === null) {
42
+ return '';
43
+ }
44
+ return typeof value === 'string' ? value : JSON.stringify(value);
45
+ }
46
+ /** The first of a parameter's or media type's named `examples`, in document order. */
47
+ function firstNamedExample(examples) {
48
+ for (const example of Object.values(examples ?? {})) {
49
+ if (example.value !== undefined) {
50
+ return example.value;
51
+ }
52
+ }
53
+ return undefined;
54
+ }
55
+ /** A parameter's value: its `example`, else its schema's, else empty (§3.6). */
56
+ function parameterValue(parameter, options) {
57
+ const stated = parameter.example ?? firstNamedExample(parameter.examples);
58
+ if (stated !== undefined) {
59
+ return cellText(stated);
60
+ }
61
+ if (parameter.schema === undefined) {
62
+ return '';
63
+ }
64
+ const sampled = sampleFromSchema(parameter.schema, {
65
+ ...(options.sampleValues !== undefined ? { sampleValues: options.sampleValues } : {}),
66
+ });
67
+ // A composite parameter value has a `style` this client does not serialise; an empty cell asks
68
+ // the user for the one they want rather than inventing a JSON blob on the wire.
69
+ return typeof sampled === 'object' && sampled !== null ? '' : cellText(sampled);
70
+ }
71
+ /** One row per parameter in `location`, in document order. */
72
+ function parameterRows(operation, location, options, skipped) {
73
+ const rows = [];
74
+ for (const parameter of operation.parameters) {
75
+ if (parameter.in !== location) {
76
+ continue;
77
+ }
78
+ if (location === 'header' && RESERVED_HEADERS.has(parameter.name.toLowerCase())) {
79
+ skipped.push({
80
+ kind: 'parameter',
81
+ where: `${operation.method.toUpperCase()} ${operation.path}`,
82
+ reason: `The "${parameter.name}" header is decided by the request itself`,
83
+ });
84
+ continue;
85
+ }
86
+ rows.push(entry(parameter.name, parameterValue(parameter, options), {
87
+ // A path parameter is always part of the URL; a query one only when the document requires
88
+ // it; a header one never, so an import never silently changes what goes on the wire.
89
+ enabled: location === 'path' || (location === 'query' && parameter.required === true),
90
+ ...(parameter.description !== undefined ? { description: parameter.description } : {}),
91
+ }));
92
+ }
93
+ return rows;
94
+ }
95
+ /** Every cookie parameter, counted: this client has no cookie-parameter table. */
96
+ function noteCookieParameters(operation, skipped) {
97
+ for (const parameter of operation.parameters) {
98
+ if (parameter.in === 'cookie') {
99
+ skipped.push({
100
+ kind: 'parameter',
101
+ where: `${operation.method.toUpperCase()} ${operation.path}`,
102
+ reason: `Cookie parameter "${parameter.name}" is not imported`,
103
+ });
104
+ }
105
+ }
106
+ }
107
+ /** The media type an operation's body is built from, under {@link BODY_PREFERENCE}. */
108
+ function preferredMedia(content) {
109
+ const types = Object.keys(content);
110
+ for (const matches of BODY_PREFERENCE) {
111
+ const type = types.find((candidate) => matches(candidate));
112
+ const media = type === undefined ? undefined : content[type];
113
+ if (type !== undefined && media !== undefined) {
114
+ return { type, media };
115
+ }
116
+ }
117
+ return undefined;
118
+ }
119
+ /** The text a raw body starts with: the media type's example, else the first of its examples, else a sample. */
120
+ function rawText(media, language, options) {
121
+ const stated = media.example ?? firstNamedExample(media.examples);
122
+ if (stated !== undefined) {
123
+ if (typeof stated === 'string') {
124
+ return stated;
125
+ }
126
+ return JSON.stringify(stated, null, 2);
127
+ }
128
+ if (media.schema === undefined) {
129
+ return '';
130
+ }
131
+ const sampleOptions = {
132
+ ...(options.includeOptional !== undefined ? { includeOptional: options.includeOptional } : {}),
133
+ ...(options.sampleValues !== undefined ? { sampleValues: options.sampleValues } : {}),
134
+ };
135
+ if (language === 'xml') {
136
+ return sampleXml(media.schema, sampleOptions);
137
+ }
138
+ const sample = sampleFromSchema(media.schema, sampleOptions);
139
+ return language === 'json' ? JSON.stringify(sample, null, 2) : cellText(sample);
140
+ }
141
+ /** One row per property of a form schema, required ones enabled. */
142
+ function formFields(schema, options) {
143
+ const required = new Set(schema?.required ?? []);
144
+ return Object.entries(schema?.properties ?? {}).map(([name, property]) => entry(name, cellText(sampleFromSchema(property, { ...options, maxDepth: 1 })), {
145
+ enabled: required.has(name),
146
+ ...(property.description !== undefined ? { description: property.description } : {}),
147
+ }));
148
+ }
149
+ /** One part per property of a multipart schema; a `format: binary` property becomes a file part. */
150
+ function multipartParts(schema, options) {
151
+ const required = new Set(schema?.required ?? []);
152
+ return Object.entries(schema?.properties ?? {}).map(([name, property]) => {
153
+ const enabled = required.has(name);
154
+ if (property.format === 'binary') {
155
+ // No file is chosen yet, exactly as a hand-added file part starts out.
156
+ return { kind: 'file', name, source: { kind: 'path', path: '' }, enabled };
157
+ }
158
+ return { kind: 'text', name, value: cellText(sampleFromSchema(property, { ...options, maxDepth: 1 })), enabled };
159
+ });
160
+ }
161
+ /** The body an operation's `requestBody` maps to, and the header its media type may need. */
162
+ function bodyOf(operation, options, skipped) {
163
+ const content = operation.requestBody?.content;
164
+ if (content === undefined) {
165
+ return { kind: 'none' };
166
+ }
167
+ const chosen = preferredMedia(content);
168
+ if (chosen === undefined) {
169
+ return { kind: 'none' };
170
+ }
171
+ const { type, media } = chosen;
172
+ for (const other of Object.keys(content)) {
173
+ if (other !== type) {
174
+ skipped.push({
175
+ kind: 'media-type',
176
+ where: `${operation.method.toUpperCase()} ${operation.path}`,
177
+ reason: `Offers "${other}" as well; imported as "${type}"`,
178
+ });
179
+ }
180
+ }
181
+ if (isBinaryMedia(type, media.schema)) {
182
+ return { kind: 'binary', source: { kind: 'path', path: '' }, contentType: type };
183
+ }
184
+ if (isForm(type)) {
185
+ return { kind: 'form', fields: formFields(media.schema, options) };
186
+ }
187
+ if (isMultipart(type)) {
188
+ return { kind: 'multipart', parts: multipartParts(media.schema, options) };
189
+ }
190
+ const language = isJson(type) ? 'json' : isXml(type) ? 'xml' : 'text';
191
+ return {
192
+ kind: 'raw',
193
+ language,
194
+ // A vendor media type (`application/vnd.api+json`) edits as JSON but must travel as itself.
195
+ ...(RAW_LANGUAGE_CONTENT_TYPES[language] === type ? {} : { contentType: type }),
196
+ text: rawText(media, language, options),
197
+ };
198
+ }
199
+ /**
200
+ * The credentials one security scheme maps to, or the reason none does.
201
+ *
202
+ * Separate from {@link authFromScheme} because the summary lists *every* scheme the document
203
+ * declares as a candidate the user may pick, and asking "what would this one become?" must not
204
+ * itself record that something was skipped — only a scheme the import actually needed does that.
205
+ */
206
+ export function mapScheme(scheme) {
207
+ switch (scheme.type) {
208
+ case 'http':
209
+ if (scheme.scheme === 'basic') {
210
+ // Secrets are never invented: the fields are the user's to fill in (ADR-0004).
211
+ return { auth: { type: 'basic' } };
212
+ }
213
+ if (scheme.scheme === 'bearer') {
214
+ return { auth: { type: 'bearer' } };
215
+ }
216
+ return { reason: `HTTP scheme "${scheme.scheme ?? 'unnamed'}" is not supported` };
217
+ case 'apiKey':
218
+ if (scheme.in === 'header' || scheme.in === 'query') {
219
+ return { auth: { type: 'api-key', name: scheme.keyName ?? '', in: scheme.in } };
220
+ }
221
+ return { reason: 'An API key in a cookie is not supported' };
222
+ case 'oauth2': {
223
+ const clientCredentials = scheme.flows?.clientCredentials;
224
+ const authorizationCode = scheme.flows?.authorizationCode;
225
+ const flow = clientCredentials ?? authorizationCode;
226
+ if (flow === undefined) {
227
+ return { reason: 'Only the client-credentials and authorization-code flows are supported' };
228
+ }
229
+ return {
230
+ auth: {
231
+ type: 'oauth2',
232
+ grant: clientCredentials !== undefined ? 'client-credentials' : 'authorization-code',
233
+ tokenUrl: flow.tokenUrl ?? '',
234
+ ...(flow.authorizationUrl !== undefined ? { authorizationUrl: flow.authorizationUrl } : {}),
235
+ clientId: '',
236
+ scopes: Object.keys(flow.scopes ?? {}),
237
+ clientAuth: 'basic',
238
+ // PKCE is what makes an authorization-code flow safe in a public client; a
239
+ // client-credentials flow has no authorization request to protect.
240
+ pkce: clientCredentials === undefined,
241
+ },
242
+ };
243
+ }
244
+ default:
245
+ return { reason: `Security scheme type "${scheme.type}" is not supported` };
246
+ }
247
+ }
248
+ /** {@link mapScheme}, recording in `skipped` when the scheme the import needed has no equivalent. */
249
+ export function authFromScheme(scheme, skipped) {
250
+ const mapped = mapScheme(scheme);
251
+ if (mapped.auth === undefined) {
252
+ skipped.push({
253
+ kind: 'security-scheme',
254
+ where: scheme.name,
255
+ reason: mapped.reason ?? 'Not supported',
256
+ });
257
+ }
258
+ return mapped.auth;
259
+ }
260
+ /** The scheme a requirement names, when it names exactly one this client can use. */
261
+ function schemeOfRequirement(requirements, schemes) {
262
+ const names = Object.keys(requirements?.[0] ?? {});
263
+ const first = names[0];
264
+ return first === undefined ? undefined : schemes.find((scheme) => scheme.name === first);
265
+ }
266
+ /** A request's own credentials, set only where the operation departs from the document's default. */
267
+ function operationAuth(operation, document, skipped) {
268
+ if (operation.security === undefined) {
269
+ return undefined;
270
+ }
271
+ if (operation.security.length === 0) {
272
+ // "Explicitly unauthenticated" is a statement, and `none` is how this client says it.
273
+ return { type: 'none' };
274
+ }
275
+ const own = schemeOfRequirement(operation.security, document.securitySchemes);
276
+ const global = schemeOfRequirement(document.security, document.securitySchemes);
277
+ if (own === undefined || own.name === global?.name) {
278
+ return undefined;
279
+ }
280
+ return authFromScheme(own, skipped);
281
+ }
282
+ /** The first segment of a path, which is the folder a tagless operation falls into. */
283
+ function firstPathSegment(path) {
284
+ for (const segment of path.split('/')) {
285
+ if (segment.length > 0 && !segment.startsWith('{')) {
286
+ return segment;
287
+ }
288
+ }
289
+ return undefined;
290
+ }
291
+ /** The folder an operation belongs in: its first tag, else `Deprecated`, else its first path segment. */
292
+ function folderNameOf(operation) {
293
+ const tag = operation.tags?.[0];
294
+ if (tag !== undefined && tag.length > 0) {
295
+ // A tag is the document's own answer, and it wins even for a deprecated operation: the author
296
+ // filed it with its live siblings, and moving it would hide a rename the user has to make.
297
+ return tag;
298
+ }
299
+ // Untagged and deprecated is the operation that would otherwise be lost among the live ones in a
300
+ // path-segment folder, so this is where `Deprecated` earns its keep.
301
+ if (operation.deprecated === true) {
302
+ return 'Deprecated';
303
+ }
304
+ return firstPathSegment(operation.path);
305
+ }
306
+ /** A request's name: its summary, else its operation id, else what it does. */
307
+ function requestName(operation) {
308
+ const summary = operation.summary?.trim();
309
+ if (summary !== undefined && summary.length > 0) {
310
+ return summary;
311
+ }
312
+ if (operation.operationId !== undefined && operation.operationId.length > 0) {
313
+ return operation.operationId;
314
+ }
315
+ const method = HTTP_METHODS.includes(operation.method.toLowerCase())
316
+ ? operation.method.toUpperCase()
317
+ : operation.method;
318
+ return `${method} ${operation.path}`;
319
+ }
320
+ /** A request's description, with a deprecation marked where the operation says so. */
321
+ function requestDescription(operation) {
322
+ const body = operation.description?.trim();
323
+ if (operation.deprecated !== true) {
324
+ return body !== undefined && body.length > 0 ? body : undefined;
325
+ }
326
+ return body !== undefined && body.length > 0 ? `**Deprecated.**\n\n${body}` : '**Deprecated.**';
327
+ }
328
+ /** Operations grouped by folder name, each group in document order, groups in first-met order. */
329
+ function groupByFolder(operations) {
330
+ const groups = new Map();
331
+ for (const operation of operations) {
332
+ const name = folderNameOf(operation);
333
+ const group = groups.get(name);
334
+ if (group === undefined) {
335
+ groups.set(name, [operation]);
336
+ }
337
+ else {
338
+ group.push(operation);
339
+ }
340
+ }
341
+ return groups;
342
+ }
343
+ /**
344
+ * Maps a parsed document onto one API.
345
+ *
346
+ * @param document a document already parsed and `$ref`-resolved (see `import.ts`)
347
+ * @returns the API, and a summary of what the mapping used and what it could not
348
+ */
349
+ export function apiFromDocument(document, options = {}) {
350
+ const newId = options.newId ?? generateId;
351
+ const skipped = [...document.skipped];
352
+ const servers = document.servers.map((server) => ({
353
+ url: serverUrl(server),
354
+ ...(server.description !== undefined ? { description: server.description } : {}),
355
+ }));
356
+ const title = document.info.title.trim();
357
+ const name = options.name?.trim() ?? (title.length > 0 ? title : 'API');
358
+ const baseUrl = options.baseUrl ?? servers[0]?.url ?? '';
359
+ const chosenScheme = options.securityScheme !== undefined
360
+ ? document.securitySchemes.find((scheme) => scheme.name === options.securityScheme)
361
+ : document.security?.length === 1
362
+ ? schemeOfRequirement(document.security, document.securitySchemes)
363
+ : undefined;
364
+ const apiAuth = chosenScheme === undefined ? undefined : authFromScheme(chosenScheme, skipped);
365
+ const tagDescriptions = new Map(document.tags.map((tag) => [tag.name, tag.description]));
366
+ const groups = groupByFolder(document.operations);
367
+ const rootRequests = [];
368
+ const folders = [];
369
+ const folderSlugs = new Set();
370
+ const rootSlugs = new Set();
371
+ let deprecated = 0;
372
+ let requests = 0;
373
+ const buildRequest = (operation, order, taken) => {
374
+ noteCookieParameters(operation, skipped);
375
+ if (operation.deprecated === true) {
376
+ deprecated += 1;
377
+ }
378
+ requests += 1;
379
+ const label = requestName(operation);
380
+ const auth = operationAuth(operation, document, skipped);
381
+ const description = requestDescription(operation);
382
+ return createRestRequest(label, {
383
+ id: newId(),
384
+ slug: uniqueSlug(label, taken),
385
+ order,
386
+ method: HTTP_METHODS.includes(operation.method.toLowerCase()) ? operation.method.toUpperCase() : operation.method,
387
+ url: operation.path,
388
+ ...(description !== undefined ? { description } : {}),
389
+ pathParams: parameterRows(operation, 'path', options, skipped),
390
+ query: parameterRows(operation, 'query', options, skipped),
391
+ headers: parameterRows(operation, 'header', options, skipped),
392
+ body: bodyOf(operation, options, skipped),
393
+ ...(auth !== undefined ? { auth } : {}),
394
+ });
395
+ };
396
+ for (const [folderName, operations] of groups) {
397
+ if (folderName === undefined) {
398
+ operations.forEach((operation, index) => {
399
+ const request = buildRequest(operation, index, rootSlugs);
400
+ rootSlugs.add(request.slug);
401
+ rootRequests.push(request);
402
+ });
403
+ continue;
404
+ }
405
+ const taken = new Set();
406
+ const inside = operations.map((operation, index) => {
407
+ const request = buildRequest(operation, index, taken);
408
+ taken.add(request.slug);
409
+ return request;
410
+ });
411
+ const description = tagDescriptions.get(folderName);
412
+ const slug = uniqueSlug(folderName, folderSlugs);
413
+ folderSlugs.add(slug);
414
+ folders.push(createFolder(folderName, {
415
+ id: newId(),
416
+ slug,
417
+ order: folders.length,
418
+ ...(description !== undefined ? { description } : {}),
419
+ requests: inside,
420
+ }));
421
+ }
422
+ const api = createApi(name, {
423
+ id: newId(),
424
+ slug: slugify(name),
425
+ order: options.order ?? 0,
426
+ baseUrl,
427
+ servers,
428
+ ...(document.info.description !== undefined ? { description: document.info.description } : {}),
429
+ ...(apiAuth !== undefined ? { auth: apiAuth } : {}),
430
+ ...(options.definition !== undefined ? { definition: options.definition } : {}),
431
+ folders,
432
+ requests: rootRequests,
433
+ });
434
+ return {
435
+ api,
436
+ summary: {
437
+ name,
438
+ title,
439
+ declaredVersion: document.declaredVersion,
440
+ ...(document.info.version !== undefined ? { apiVersion: document.info.version } : {}),
441
+ baseUrl,
442
+ servers,
443
+ folders: folders.length,
444
+ requests,
445
+ deprecated,
446
+ ...(apiAuth !== undefined ? { auth: apiAuth.type } : {}),
447
+ securitySchemes: document.securitySchemes.map((scheme) => {
448
+ const mapped = mapScheme(scheme);
449
+ return {
450
+ name: scheme.name,
451
+ type: scheme.type,
452
+ ...(scheme.description !== undefined ? { description: scheme.description } : {}),
453
+ ...(mapped.auth !== undefined ? { auth: mapped.auth } : {}),
454
+ ...(mapped.reason !== undefined ? { reason: mapped.reason } : {}),
455
+ applied: scheme.name === chosenScheme?.name,
456
+ };
457
+ }),
458
+ skipped: uniqueSkipped(skipped),
459
+ },
460
+ };
461
+ }
462
+ /**
463
+ * The skipped list without repeats. A scheme this client cannot map is met once per operation
464
+ * that names it — twenty operations behind one implicit flow would otherwise say the same thing
465
+ * twenty times, and the summary is for reading.
466
+ */
467
+ function uniqueSkipped(skipped) {
468
+ const seen = new Set();
469
+ return skipped.filter((entry) => {
470
+ const key = `${entry.kind}\u0000${entry.where}\u0000${entry.reason}`;
471
+ if (seen.has(key)) {
472
+ return false;
473
+ }
474
+ seen.add(key);
475
+ return true;
476
+ });
477
+ }
@@ -0,0 +1,203 @@
1
+ /**
2
+ * The subset of OpenAPI 3.0.x and 3.1.x this client consumes, as readonly types.
3
+ *
4
+ * Deliberately a *subset*: an import turns a description into requests you can send, so the model
5
+ * carries what decides a request — where it goes, what it carries, and what it authenticates with —
6
+ * and nothing else. Everything else a document says (callbacks, links, webhooks, vendor extensions)
7
+ * is kept only as a count, so the import summary can say what it did not understand rather than
8
+ * quietly dropping it.
9
+ *
10
+ * Every field is optional where the specification allows it, because a document in the wild will
11
+ * omit anything that is not required, and a parser that insists otherwise refuses documents users
12
+ * legitimately have.
13
+ */
14
+ /** A JSON value, as a document literally contains it (an `example`, a `default`, an `enum` member). */
15
+ export type JsonValue = string | number | boolean | null | readonly JsonValue[] | {
16
+ readonly [key: string]: JsonValue;
17
+ };
18
+ /** Which specification version a document declares. */
19
+ export type OpenApiVersion = '1.0' | '1.1' | '1.2' | '2.0' | '3.0' | '3.1' | '3.2';
20
+ /** `info`: what the API is called, and which version of *it* this document describes. */
21
+ export interface OpenApiInfo {
22
+ readonly title: string;
23
+ readonly version?: string;
24
+ readonly description?: string;
25
+ }
26
+ /** One `servers` entry, with the variables its template names. */
27
+ export interface OpenApiServer {
28
+ readonly url: string;
29
+ readonly description?: string;
30
+ readonly variables?: Readonly<Record<string, OpenApiServerVariable>>;
31
+ }
32
+ /**
33
+ * One server-template variable: its default, and the values it is allowed to take.
34
+ *
35
+ * `default` is required by the specification but routinely omitted in the wild, and a variable with
36
+ * none has nothing to substitute — so it is optional here, and {@link serverUrl} leaves the template
37
+ * in place for it rather than collapsing the URL to `https://.api.test`.
38
+ */
39
+ export interface OpenApiServerVariable {
40
+ readonly default?: string;
41
+ readonly enum?: readonly string[];
42
+ readonly description?: string;
43
+ }
44
+ /** Where a parameter travels. `cookie` is modelled so the import can say it skipped one. */
45
+ export type ParameterLocation = 'path' | 'query' | 'header' | 'cookie';
46
+ /** One parameter, after `$ref` resolution. */
47
+ export interface OpenApiParameter {
48
+ readonly name: string;
49
+ readonly in: ParameterLocation;
50
+ readonly required?: boolean;
51
+ readonly deprecated?: boolean;
52
+ readonly description?: string;
53
+ readonly schema?: JsonSchema;
54
+ readonly example?: JsonValue;
55
+ readonly examples?: Readonly<Record<string, OpenApiExample>>;
56
+ /** How an array or object parameter is serialised; carried so the import can note what it ignored. */
57
+ readonly style?: string;
58
+ readonly explode?: boolean;
59
+ }
60
+ /** One named example, either inline or (unsupported here) external. */
61
+ export interface OpenApiExample {
62
+ readonly value?: JsonValue;
63
+ readonly summary?: string;
64
+ readonly externalValue?: string;
65
+ /** OpenAPI 3.2: structured data value, distinct from raw/serialized format. */
66
+ readonly dataValue?: JsonValue;
67
+ /** OpenAPI 3.2: serialized string representation of the example. */
68
+ readonly serializedValue?: string;
69
+ }
70
+ /** One media type of a request or response body. */
71
+ export interface OpenApiMediaType {
72
+ readonly schema?: JsonSchema;
73
+ /** OpenAPI 3.2: item schema for sequential/streaming media types (e.g. text/event-stream). */
74
+ readonly itemSchema?: JsonSchema;
75
+ readonly example?: JsonValue;
76
+ readonly examples?: Readonly<Record<string, OpenApiExample>>;
77
+ }
78
+ /** A request body: its media types, and whether the operation insists on one. */
79
+ export interface OpenApiRequestBody {
80
+ readonly required?: boolean;
81
+ readonly description?: string;
82
+ readonly content: Readonly<Record<string, OpenApiMediaType>>;
83
+ }
84
+ /**
85
+ * The JSON Schema subset the sample generator reads — Draft 2020-12 as 3.1 uses it, and 3.0's own
86
+ * dialect, which differs in the two ways noted on the fields.
87
+ */
88
+ export interface JsonSchema {
89
+ /** 3.0 allows one type; 3.1 allows a list, which is how it spells "nullable". */
90
+ readonly type?: string | readonly string[];
91
+ readonly format?: string;
92
+ readonly title?: string;
93
+ readonly description?: string;
94
+ readonly default?: JsonValue;
95
+ readonly example?: JsonValue;
96
+ /** 3.1 spelling; 3.0 uses `example`. Both are read. */
97
+ readonly examples?: readonly JsonValue[];
98
+ readonly enum?: readonly JsonValue[];
99
+ readonly const?: JsonValue;
100
+ readonly properties?: Readonly<Record<string, JsonSchema>>;
101
+ readonly required?: readonly string[];
102
+ readonly items?: JsonSchema;
103
+ readonly additionalProperties?: boolean | JsonSchema;
104
+ readonly allOf?: readonly JsonSchema[];
105
+ readonly oneOf?: readonly JsonSchema[];
106
+ readonly anyOf?: readonly JsonSchema[];
107
+ /** 3.0 only: 3.1 spells this as a `type` list including `'null'`. */
108
+ readonly nullable?: boolean;
109
+ readonly deprecated?: boolean;
110
+ readonly readOnly?: boolean;
111
+ readonly writeOnly?: boolean;
112
+ /** The `xml` object an XML body's shape honours. */
113
+ readonly xml?: OpenApiXml;
114
+ /** Left in place when a reference could not be resolved, so a sample can say so rather than guess. */
115
+ readonly $ref?: string;
116
+ }
117
+ /** The `xml` object: how a schema's value is spelled as XML. */
118
+ export interface OpenApiXml {
119
+ readonly name?: string;
120
+ readonly namespace?: string;
121
+ readonly prefix?: string;
122
+ readonly attribute?: boolean;
123
+ readonly wrapped?: boolean;
124
+ }
125
+ /** One operation of one path. */
126
+ export interface OpenApiOperation {
127
+ /** Lower-case HTTP method, as the document's key spells it. */
128
+ readonly method: string;
129
+ /** The templated path, exactly as the document writes it, `{braces}` and all. */
130
+ readonly path: string;
131
+ readonly operationId?: string;
132
+ readonly summary?: string;
133
+ readonly description?: string;
134
+ readonly tags?: readonly string[];
135
+ readonly deprecated?: boolean;
136
+ /** Path-level and operation-level parameters merged, the operation's winning on name and location. */
137
+ readonly parameters: readonly OpenApiParameter[];
138
+ readonly requestBody?: OpenApiRequestBody;
139
+ /** An operation's own security requirements; an empty array means "explicitly unauthenticated". */
140
+ readonly security?: readonly OpenApiSecurityRequirement[];
141
+ }
142
+ /** One security requirement: scheme name to the scopes it needs. */
143
+ export type OpenApiSecurityRequirement = Readonly<Record<string, readonly string[]>>;
144
+ /** One `securitySchemes` entry. */
145
+ export interface OpenApiSecurityScheme {
146
+ /** The name the document files it under, which is what a requirement refers to. */
147
+ readonly name: string;
148
+ readonly type: 'http' | 'apiKey' | 'oauth2' | 'openIdConnect' | 'mutualTLS';
149
+ readonly description?: string;
150
+ /** `http`: the scheme, lower-cased — `basic`, `bearer`, anything else. */
151
+ readonly scheme?: string;
152
+ readonly bearerFormat?: string;
153
+ /** `apiKey`: the parameter's name and where it travels. */
154
+ readonly in?: ParameterLocation;
155
+ readonly keyName?: string;
156
+ /** `oauth2`: the flows the document offers, by name. */
157
+ readonly flows?: Readonly<Record<string, OpenApiOAuthFlow>>;
158
+ }
159
+ /** One OAuth2 flow. */
160
+ export interface OpenApiOAuthFlow {
161
+ readonly authorizationUrl?: string;
162
+ readonly tokenUrl?: string;
163
+ readonly refreshUrl?: string;
164
+ readonly scopes?: Readonly<Record<string, string>>;
165
+ }
166
+ /** One `tags` entry, for a folder's description. */
167
+ export interface OpenApiTag {
168
+ readonly name: string;
169
+ readonly description?: string;
170
+ }
171
+ /** What a parser could not use, so the summary can report it rather than the import losing it silently. */
172
+ export interface OpenApiSkipped {
173
+ /** What kind of thing was skipped — `operation`, `parameter`, `callback`, `webhook`, `extension`… */
174
+ readonly kind: string;
175
+ /** Where it was, as a JSON pointer or a `METHOD /path` — enough for the user to find it. */
176
+ readonly where: string;
177
+ readonly reason: string;
178
+ }
179
+ /** The document, as this client understands it. */
180
+ export interface OpenApiDocument {
181
+ readonly version: OpenApiVersion;
182
+ /** The exact `openapi` string the document declared, for the definition card. */
183
+ readonly declaredVersion: string;
184
+ readonly info: OpenApiInfo;
185
+ readonly servers: readonly OpenApiServer[];
186
+ /** Every operation of every path, in document order. */
187
+ readonly operations: readonly OpenApiOperation[];
188
+ readonly securitySchemes: readonly OpenApiSecurityScheme[];
189
+ /** The document-level security requirements, when it declares any. */
190
+ readonly security?: readonly OpenApiSecurityRequirement[];
191
+ readonly tags: readonly OpenApiTag[];
192
+ /** Everything the model does not carry, counted and located. */
193
+ readonly skipped: readonly OpenApiSkipped[];
194
+ }
195
+ /** The HTTP methods an operation key may name, per OpenAPI's Path Item Object. */
196
+ export declare const HTTP_METHODS: readonly string[];
197
+ /**
198
+ * The base URL a server entry resolves to, with each `{variable}` replaced by its default.
199
+ *
200
+ * A variable with no default is left as it is: the API's base URL then still shows the template,
201
+ * which is honest — the user has to decide what it should be, and the field is editable.
202
+ */
203
+ export declare function serverUrl(server: OpenApiServer): string;