@wirebench/engine 2.2.1 → 3.1.0-rc.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 (566) hide show
  1. package/README.md +134 -1
  2. package/dist/account/schema.d.ts +34 -0
  3. package/dist/account/schema.js +29 -0
  4. package/dist/assert/callback.d.ts +76 -0
  5. package/dist/assert/callback.js +320 -0
  6. package/dist/assert/capture-source.d.ts +50 -0
  7. package/dist/assert/capture-source.js +89 -0
  8. package/dist/assert/check.d.ts +8 -0
  9. package/dist/assert/check.js +18 -0
  10. package/dist/assert/header.d.ts +5 -0
  11. package/dist/assert/header.js +48 -0
  12. package/dist/assert/index.d.ts +2 -2
  13. package/dist/assert/index.js +12 -0
  14. package/dist/assert/match.d.ts +6 -0
  15. package/dist/assert/match.js +13 -4
  16. package/dist/assert/model.d.ts +110 -3
  17. package/dist/assert/model.js +16 -1
  18. package/dist/assert/schema.d.ts +194 -1
  19. package/dist/assert/schema.js +154 -12
  20. package/dist/assert/status-names.d.ts +9 -0
  21. package/dist/assert/status-names.js +27 -0
  22. package/dist/assert/status.d.ts +4 -1
  23. package/dist/assert/status.js +27 -3
  24. package/dist/asyncapi/browser.d.ts +7 -0
  25. package/dist/asyncapi/browser.js +6 -0
  26. package/dist/asyncapi/frame-check-worker-host.d.ts +44 -0
  27. package/dist/asyncapi/frame-check-worker-host.js +175 -0
  28. package/dist/asyncapi/frame-check-worker.d.ts +12 -0
  29. package/dist/asyncapi/frame-check-worker.js +25 -0
  30. package/dist/asyncapi/frame-check.d.ts +25 -0
  31. package/dist/asyncapi/frame-check.js +78 -0
  32. package/dist/asyncapi/import.d.ts +25 -0
  33. package/dist/asyncapi/import.js +34 -0
  34. package/dist/asyncapi/map.d.ts +40 -0
  35. package/dist/asyncapi/map.js +230 -0
  36. package/dist/asyncapi/model.d.ts +84 -0
  37. package/dist/asyncapi/model.js +7 -0
  38. package/dist/asyncapi/normalise-2.d.ts +13 -0
  39. package/dist/asyncapi/normalise-2.js +113 -0
  40. package/dist/asyncapi/normalise-3.d.ts +14 -0
  41. package/dist/asyncapi/normalise-3.js +133 -0
  42. package/dist/asyncapi/parse.d.ts +31 -0
  43. package/dist/asyncapi/parse.js +85 -0
  44. package/dist/asyncapi/read.d.ts +35 -0
  45. package/dist/asyncapi/read.js +186 -0
  46. package/dist/asyncapi/security.d.ts +14 -0
  47. package/dist/asyncapi/security.js +55 -0
  48. package/dist/asyncapi/update.d.ts +53 -0
  49. package/dist/asyncapi/update.js +220 -0
  50. package/dist/errors.d.ts +16 -0
  51. package/dist/errors.js +22 -0
  52. package/dist/grpc/events.d.ts +22 -0
  53. package/dist/grpc/events.js +1 -0
  54. package/dist/grpc/expand.d.ts +1 -1
  55. package/dist/grpc/expand.js +15 -5
  56. package/dist/grpc/files.d.ts +271 -0
  57. package/dist/grpc/files.js +62 -0
  58. package/dist/grpc/model.d.ts +11 -1
  59. package/dist/grpc/module.d.ts +2 -0
  60. package/dist/grpc/module.js +13 -0
  61. package/dist/grpc/run.d.ts +73 -0
  62. package/dist/grpc/run.js +407 -0
  63. package/dist/grpc/script-types.d.ts +8 -0
  64. package/dist/grpc/script-types.js +149 -0
  65. package/dist/grpc/scripting.d.ts +34 -0
  66. package/dist/grpc/scripting.js +147 -0
  67. package/dist/grpc/send-input.d.ts +46 -0
  68. package/dist/grpc/send-input.js +42 -0
  69. package/dist/grpc/send.d.ts +2 -2
  70. package/dist/grpc/status.d.ts +9 -2
  71. package/dist/grpc/status.js +11 -24
  72. package/dist/grpc/storage.d.ts +9 -0
  73. package/dist/grpc/storage.js +167 -0
  74. package/dist/{rest/auth.d.ts → http/auth/apply-auth.d.ts} +4 -4
  75. package/dist/{rest/auth.js → http/auth/apply-auth.js} +1 -1
  76. package/dist/http/auth/apply.d.ts +1 -1
  77. package/dist/{rest → http/auth}/oauth2.d.ts +2 -2
  78. package/dist/{rest → http/auth}/oauth2.js +1 -1
  79. package/dist/http/auth/send-auth.d.ts +57 -0
  80. package/dist/http/auth/send-auth.js +7 -0
  81. package/dist/http/client.js +150 -8
  82. package/dist/http/cookies.d.ts +79 -0
  83. package/dist/http/cookies.js +81 -0
  84. package/dist/http/curl.d.ts +4 -14
  85. package/dist/http/curl.js +4 -154
  86. package/dist/http/decompress.d.ts +7 -0
  87. package/dist/http/decompress.js +23 -1
  88. package/dist/http/document-fetch.d.ts +42 -0
  89. package/dist/http/document-fetch.js +207 -0
  90. package/dist/http/entries.d.ts +27 -0
  91. package/dist/http/entries.js +16 -0
  92. package/dist/http/escape.d.ts +18 -0
  93. package/dist/http/escape.js +30 -0
  94. package/dist/http/fetch-document.d.ts +28 -0
  95. package/dist/{wsdl/fetch.js → http/fetch-document.js} +8 -16
  96. package/dist/http/media-type.d.ts +9 -0
  97. package/dist/http/media-type.js +12 -0
  98. package/dist/http/transcript-cap.d.ts +26 -0
  99. package/dist/http/transcript-cap.js +36 -0
  100. package/dist/http/types.d.ts +59 -0
  101. package/dist/http/webhook-signature.d.ts +81 -0
  102. package/dist/http/webhook-signature.js +227 -0
  103. package/dist/import-detect.d.ts +2 -2
  104. package/dist/import-detect.js +10 -1
  105. package/dist/index.d.ts +207 -55
  106. package/dist/index.js +129 -32
  107. package/dist/json/cursor.d.ts +2 -0
  108. package/dist/json/cursor.js +1 -0
  109. package/dist/json/pointer-range.d.ts +18 -0
  110. package/dist/json/pointer-range.js +157 -0
  111. package/dist/json/schema/model.d.ts +59 -0
  112. package/dist/json/schema/model.js +8 -0
  113. package/dist/json/schema/parse-text.d.ts +16 -0
  114. package/dist/json/schema/parse-text.js +37 -0
  115. package/dist/{rest/openapi → json/schema}/refs.d.ts +2 -2
  116. package/dist/{rest/openapi → json/schema}/refs.js +3 -3
  117. package/dist/{rest/openapi → json/schema}/sample.d.ts +4 -0
  118. package/dist/{rest/openapi → json/schema}/sample.js +2 -2
  119. package/dist/json/schema/source.d.ts +21 -0
  120. package/dist/json/schema/source.js +8 -0
  121. package/dist/json/schema-validate.d.ts +49 -0
  122. package/dist/json/schema-validate.js +557 -0
  123. package/dist/{wss/keystore → keystore}/index.js +1 -1
  124. package/dist/{wss/keystore → keystore}/pem.js +1 -1
  125. package/dist/{wss/keystore → keystore}/pkcs12.js +1 -1
  126. package/dist/project/attachments-cache.d.ts +3 -1
  127. package/dist/{wsdl → project}/cache-naming.js +1 -1
  128. package/dist/project/endpoints.d.ts +18 -8
  129. package/dist/project/endpoints.js +21 -6
  130. package/dist/project/environments.d.ts +7 -5
  131. package/dist/project/history.d.ts +105 -9
  132. package/dist/project/history.js +195 -23
  133. package/dist/project/inherit.d.ts +7 -0
  134. package/dist/project/inherit.js +9 -0
  135. package/dist/project/keystores.d.ts +1 -1
  136. package/dist/project/load-helpers.d.ts +89 -0
  137. package/dist/project/load-helpers.js +177 -0
  138. package/dist/project/load.d.ts +30 -4
  139. package/dist/project/load.js +168 -545
  140. package/dist/project/managed-files.d.ts +36 -0
  141. package/dist/project/managed-files.js +97 -0
  142. package/dist/project/migrate.d.ts +2 -2
  143. package/dist/project/migrate.js +2 -2
  144. package/dist/project/model.d.ts +92 -14
  145. package/dist/project/model.js +50 -4
  146. package/dist/project/paths.d.ts +10 -1
  147. package/dist/project/paths.js +10 -1
  148. package/dist/project/preferences.d.ts +11 -2
  149. package/dist/project/preferences.js +5 -1
  150. package/dist/project/properties.d.ts +31 -17
  151. package/dist/project/properties.js +89 -70
  152. package/dist/project/request-location.d.ts +20 -0
  153. package/dist/project/request-location.js +62 -0
  154. package/dist/project/save.d.ts +12 -2
  155. package/dist/project/save.js +186 -141
  156. package/dist/project/schema-parts.d.ts +337 -0
  157. package/dist/project/schema-parts.js +248 -0
  158. package/dist/project/schema.d.ts +72 -928
  159. package/dist/project/schema.js +17 -466
  160. package/dist/project/sequence-guards.d.ts +43 -0
  161. package/dist/project/sequence-guards.js +109 -0
  162. package/dist/project/serialize-helpers.d.ts +60 -0
  163. package/dist/project/serialize-helpers.js +108 -0
  164. package/dist/project/serialize.d.ts +7 -8
  165. package/dist/project/serialize.js +34 -293
  166. package/dist/protocol/features.d.ts +51 -0
  167. package/dist/protocol/features.js +64 -0
  168. package/dist/protocol/index.d.ts +7 -0
  169. package/dist/protocol/index.js +4 -0
  170. package/dist/protocol/module.d.ts +247 -0
  171. package/dist/protocol/module.js +48 -0
  172. package/dist/protocol/registry.d.ts +42 -0
  173. package/dist/protocol/registry.js +47 -0
  174. package/dist/protocols.d.ts +77 -0
  175. package/dist/protocols.js +40 -0
  176. package/dist/redact/index.d.ts +12 -1
  177. package/dist/redact/index.js +55 -7
  178. package/dist/redact/literal.d.ts +10 -0
  179. package/dist/redact/literal.js +110 -12
  180. package/dist/rest/body.d.ts +2 -10
  181. package/dist/rest/body.js +3 -25
  182. package/dist/rest/browser.d.ts +4 -0
  183. package/dist/rest/browser.js +5 -0
  184. package/dist/rest/contract-check-worker-host.d.ts +36 -0
  185. package/dist/rest/contract-check-worker-host.js +158 -0
  186. package/dist/rest/contract-check-worker.d.ts +7 -0
  187. package/dist/rest/contract-check-worker.js +28 -0
  188. package/dist/rest/contract-check.d.ts +43 -0
  189. package/dist/rest/contract-check.js +217 -0
  190. package/dist/rest/cookie-jar.d.ts +62 -0
  191. package/dist/rest/cookie-jar.js +262 -0
  192. package/dist/rest/cookies.d.ts +6 -22
  193. package/dist/rest/cookies.js +6 -42
  194. package/dist/rest/curl.js +5 -1
  195. package/dist/rest/events.d.ts +12 -0
  196. package/dist/rest/events.js +1 -0
  197. package/dist/rest/expand.d.ts +6 -1
  198. package/dist/rest/expand.js +29 -11
  199. package/dist/rest/files.d.ts +439 -0
  200. package/dist/rest/files.js +107 -0
  201. package/dist/rest/json-form.d.ts +97 -0
  202. package/dist/rest/json-form.js +396 -0
  203. package/dist/rest/model.d.ts +35 -24
  204. package/dist/rest/model.js +6 -9
  205. package/dist/rest/module.d.ts +2 -0
  206. package/dist/rest/module.js +13 -0
  207. package/dist/rest/openapi/cache.d.ts +7 -2
  208. package/dist/rest/openapi/cache.js +2 -2
  209. package/dist/rest/openapi/import.d.ts +11 -16
  210. package/dist/rest/openapi/import.js +6 -2
  211. package/dist/rest/openapi/map.d.ts +38 -1
  212. package/dist/rest/openapi/map.js +151 -41
  213. package/dist/rest/openapi/match.d.ts +20 -0
  214. package/dist/rest/openapi/match.js +117 -0
  215. package/dist/rest/openapi/model.d.ts +33 -45
  216. package/dist/rest/openapi/parse.d.ts +3 -12
  217. package/dist/rest/openapi/parse.js +138 -67
  218. package/dist/rest/openapi/responses.d.ts +23 -0
  219. package/dist/rest/openapi/responses.js +59 -0
  220. package/dist/rest/openapi/runtime-expression.d.ts +69 -0
  221. package/dist/rest/openapi/runtime-expression.js +213 -0
  222. package/dist/rest/openapi/update.d.ts +116 -0
  223. package/dist/rest/openapi/update.js +456 -0
  224. package/dist/rest/postman/map.d.ts +1 -0
  225. package/dist/rest/postman/map.js +66 -4
  226. package/dist/rest/postman/model.d.ts +9 -0
  227. package/dist/rest/postman/parse.js +33 -10
  228. package/dist/rest/response.d.ts +2 -23
  229. package/dist/rest/response.js +3 -75
  230. package/dist/rest/run.d.ts +56 -0
  231. package/dist/rest/run.js +395 -0
  232. package/dist/rest/script-types.d.ts +7 -0
  233. package/dist/rest/script-types.js +83 -0
  234. package/dist/rest/scripting.d.ts +38 -0
  235. package/dist/rest/scripting.js +282 -0
  236. package/dist/rest/send-input.d.ts +54 -0
  237. package/dist/rest/send-input.js +73 -0
  238. package/dist/rest/send.d.ts +77 -4
  239. package/dist/rest/send.js +128 -7
  240. package/dist/rest/sse-transcript.d.ts +25 -0
  241. package/dist/rest/sse-transcript.js +95 -0
  242. package/dist/rest/sse.d.ts +43 -0
  243. package/dist/rest/sse.js +195 -0
  244. package/dist/rest/storage.d.ts +26 -0
  245. package/dist/rest/storage.js +262 -0
  246. package/dist/rest/url.d.ts +10 -4
  247. package/dist/rest/url.js +38 -5
  248. package/dist/run/baseline-update.d.ts +35 -0
  249. package/dist/run/baseline-update.js +97 -0
  250. package/dist/run/baseline.d.ts +42 -0
  251. package/dist/run/baseline.js +93 -0
  252. package/dist/run/context.d.ts +86 -0
  253. package/dist/run/context.js +31 -0
  254. package/dist/run/current-values.d.ts +32 -0
  255. package/dist/run/current-values.js +43 -0
  256. package/dist/run/event-queue.d.ts +14 -0
  257. package/dist/run/event-queue.js +46 -0
  258. package/dist/run/exchange.d.ts +62 -0
  259. package/dist/run/exchange.js +65 -0
  260. package/dist/run/host.d.ts +89 -0
  261. package/dist/run/host.js +1 -0
  262. package/dist/run/index.d.ts +20 -7
  263. package/dist/run/index.js +12 -4
  264. package/dist/run/oauth2-token.d.ts +42 -0
  265. package/dist/run/oauth2-token.js +92 -0
  266. package/dist/run/open.d.ts +12 -0
  267. package/dist/run/open.js +16 -0
  268. package/dist/run/run.d.ts +124 -4
  269. package/dist/run/run.js +293 -134
  270. package/dist/run/scope.d.ts +11 -0
  271. package/dist/run/scope.js +26 -0
  272. package/dist/run/script-support.d.ts +53 -0
  273. package/dist/run/script-support.js +68 -0
  274. package/dist/run/secret-needs.d.ts +11 -4
  275. package/dist/run/secret-needs.js +48 -96
  276. package/dist/run/select.d.ts +34 -25
  277. package/dist/run/select.js +45 -54
  278. package/dist/run/send-helpers.d.ts +93 -0
  279. package/dist/run/send-helpers.js +255 -0
  280. package/dist/run/tree.d.ts +50 -0
  281. package/dist/run/tree.js +54 -0
  282. package/dist/script/api/postman.d.ts +10 -0
  283. package/dist/script/api/postman.js +264 -0
  284. package/dist/script/api/prelude.d.ts +20 -0
  285. package/dist/script/api/prelude.js +215 -0
  286. package/dist/script/apply.d.ts +44 -0
  287. package/dist/script/apply.js +120 -0
  288. package/dist/script/check/host.d.ts +41 -0
  289. package/dist/script/check/host.js +143 -0
  290. package/dist/script/check/service.d.ts +52 -0
  291. package/dist/script/check/service.js +195 -0
  292. package/dist/script/check/worker.d.ts +1 -0
  293. package/dist/script/check/worker.js +40 -0
  294. package/dist/script/index.d.ts +16 -0
  295. package/dist/script/index.js +10 -0
  296. package/dist/script/lookup.d.ts +10 -0
  297. package/dist/script/lookup.js +23 -0
  298. package/dist/script/model.d.ts +82 -0
  299. package/dist/script/model.js +18 -0
  300. package/dist/script/props.d.ts +8 -0
  301. package/dist/script/props.js +28 -0
  302. package/dist/script/request-scripts.d.ts +83 -0
  303. package/dist/script/request-scripts.js +160 -0
  304. package/dist/script/run.d.ts +47 -0
  305. package/dist/script/run.js +146 -0
  306. package/dist/script/sandbox/execute.d.ts +26 -0
  307. package/dist/script/sandbox/execute.js +212 -0
  308. package/dist/script/sandbox/host-api.d.ts +27 -0
  309. package/dist/script/sandbox/host-api.js +101 -0
  310. package/dist/script/sandbox/host.d.ts +18 -0
  311. package/dist/script/sandbox/host.js +172 -0
  312. package/dist/script/sandbox/model.d.ts +69 -0
  313. package/dist/script/sandbox/model.js +24 -0
  314. package/dist/script/sandbox/worker.d.ts +1 -0
  315. package/dist/script/sandbox/worker.js +20 -0
  316. package/dist/script/send.d.ts +27 -0
  317. package/dist/script/send.js +76 -0
  318. package/dist/script/strip.d.ts +5 -0
  319. package/dist/script/strip.js +43 -0
  320. package/dist/script/types/api.d.ts +38 -0
  321. package/dist/script/types/api.js +113 -0
  322. package/dist/script/types/json-schema.d.ts +26 -0
  323. package/dist/script/types/json-schema.js +206 -0
  324. package/dist/secrets/env-names.d.ts +9 -1
  325. package/dist/secrets/env-names.js +17 -1
  326. package/dist/secrets/resolve.d.ts +44 -4
  327. package/dist/secrets/resolve.js +58 -1
  328. package/dist/secrets/scan/apply.d.ts +36 -0
  329. package/dist/secrets/scan/apply.js +194 -0
  330. package/dist/secrets/scan/rules.d.ts +32 -0
  331. package/dist/secrets/scan/rules.js +346 -0
  332. package/dist/secrets/scan/scan.d.ts +6 -0
  333. package/dist/secrets/scan/scan.js +57 -0
  334. package/dist/secrets/scan/walk.d.ts +70 -0
  335. package/dist/secrets/scan/walk.js +156 -0
  336. package/dist/secrets/secret-refs.d.ts +8 -0
  337. package/dist/secrets/secret-refs.js +25 -0
  338. package/dist/secrets/secret-token.d.ts +17 -0
  339. package/dist/secrets/secret-token.js +25 -0
  340. package/dist/sequence/file.d.ts +169 -0
  341. package/dist/sequence/file.js +237 -0
  342. package/dist/sequence/index.d.ts +7 -0
  343. package/dist/sequence/index.js +5 -0
  344. package/dist/sequence/load.d.ts +32 -0
  345. package/dist/sequence/load.js +56 -0
  346. package/dist/sequence/model.d.ts +115 -0
  347. package/dist/sequence/model.js +53 -0
  348. package/dist/sequence/run.d.ts +131 -0
  349. package/dist/sequence/run.js +191 -0
  350. package/dist/sequence/transfer.d.ts +24 -0
  351. package/dist/sequence/transfer.js +75 -0
  352. package/dist/server-api/audit.d.ts +455 -0
  353. package/dist/server-api/audit.js +186 -0
  354. package/dist/server-api/ci-tokens.d.ts +50 -0
  355. package/dist/server-api/ci-tokens.js +35 -0
  356. package/dist/server-api/hooks.d.ts +337 -0
  357. package/dist/server-api/hooks.js +152 -0
  358. package/dist/server-api/identity.d.ts +210 -0
  359. package/dist/server-api/identity.js +115 -0
  360. package/dist/server-api/licensing.d.ts +80 -0
  361. package/dist/server-api/licensing.js +53 -0
  362. package/dist/server-api/live.d.ts +132 -0
  363. package/dist/server-api/live.js +102 -0
  364. package/dist/server-api/meta.d.ts +31 -0
  365. package/dist/server-api/meta.js +21 -0
  366. package/dist/server-api/sync.d.ts +179 -0
  367. package/dist/server-api/sync.js +124 -0
  368. package/dist/server-api/teams.d.ts +306 -0
  369. package/dist/server-api/teams.js +113 -0
  370. package/dist/snapshot/diff.d.ts +30 -0
  371. package/dist/snapshot/diff.js +75 -0
  372. package/dist/snapshot/format.d.ts +17 -0
  373. package/dist/snapshot/format.js +40 -0
  374. package/dist/snapshot/golden-file.d.ts +45 -0
  375. package/dist/snapshot/golden-file.js +173 -0
  376. package/dist/snapshot/ignore.d.ts +14 -0
  377. package/dist/snapshot/ignore.js +79 -0
  378. package/dist/snapshot/index.d.ts +9 -0
  379. package/dist/snapshot/index.js +9 -0
  380. package/dist/snapshot/json-diff.d.ts +3 -0
  381. package/dist/snapshot/json-diff.js +93 -0
  382. package/dist/snapshot/xml-diff.d.ts +10 -0
  383. package/dist/snapshot/xml-diff.js +194 -0
  384. package/dist/soap/auth.d.ts +26 -0
  385. package/dist/soap/auth.js +54 -0
  386. package/dist/soap/curl.d.ts +20 -0
  387. package/dist/soap/curl.js +161 -0
  388. package/dist/soap/expand.d.ts +24 -0
  389. package/dist/soap/expand.js +95 -0
  390. package/dist/soap/files.d.ts +384 -0
  391. package/dist/soap/files.js +114 -0
  392. package/dist/soap/form-request.d.ts +13 -0
  393. package/dist/soap/form-request.js +2 -2
  394. package/dist/soap/generate.d.ts +12 -0
  395. package/dist/{generate.js → soap/generate.js} +4 -4
  396. package/dist/{import.d.ts → soap/import.d.ts} +4 -4
  397. package/dist/{import.js → soap/import.js} +13 -13
  398. package/dist/soap/json-operation.d.ts +35 -0
  399. package/dist/soap/json-operation.js +225 -0
  400. package/dist/soap/legacy-project/env-refs.d.ts +19 -0
  401. package/dist/soap/legacy-project/env-refs.js +105 -0
  402. package/dist/soap/legacy-project/map.d.ts +2 -2
  403. package/dist/soap/legacy-project/map.js +6 -0
  404. package/dist/soap/mime/multipart.d.ts +2 -2
  405. package/dist/soap/mime/multipart.js +2 -5
  406. package/dist/soap/mime/send-pipeline.d.ts +1 -1
  407. package/dist/soap/mime/send-pipeline.js +1 -1
  408. package/dist/soap/mime/types.d.ts +1 -3
  409. package/dist/soap/module.d.ts +2 -0
  410. package/dist/soap/module.js +13 -0
  411. package/dist/soap/namespace-scope.js +1 -1
  412. package/dist/soap/operations.d.ts +12 -0
  413. package/dist/{operations.js → soap/operations.js} +4 -4
  414. package/dist/soap/run.d.ts +70 -0
  415. package/dist/soap/run.js +549 -0
  416. package/dist/soap/script-types.d.ts +65 -0
  417. package/dist/soap/script-types.js +379 -0
  418. package/dist/soap/scripting.d.ts +45 -0
  419. package/dist/soap/scripting.js +221 -0
  420. package/dist/soap/send-input.d.ts +61 -0
  421. package/dist/{send-options.js → soap/send-input.js} +5 -109
  422. package/dist/{send.d.ts → soap/send.d.ts} +1 -1
  423. package/dist/{send.js → soap/send.js} +28 -12
  424. package/dist/soap/storage.d.ts +9 -0
  425. package/dist/soap/storage.js +237 -0
  426. package/dist/soap/transforms.d.ts +3 -12
  427. package/dist/soap/transforms.js +3 -14
  428. package/dist/{types.d.ts → soap/types.d.ts} +34 -84
  429. package/dist/sync/git-cli.d.ts +202 -0
  430. package/dist/sync/git-cli.js +684 -0
  431. package/dist/sync/three-way-merge.d.ts +41 -0
  432. package/dist/sync/three-way-merge.js +85 -0
  433. package/dist/sync/tree-paths.d.ts +34 -0
  434. package/dist/sync/tree-paths.js +131 -0
  435. package/dist/team-secrets/envelope.d.ts +10 -0
  436. package/dist/team-secrets/envelope.js +121 -0
  437. package/dist/team-secrets/errors.d.ts +26 -0
  438. package/dist/team-secrets/errors.js +27 -0
  439. package/dist/team-secrets/index.d.ts +14 -0
  440. package/dist/team-secrets/index.js +8 -0
  441. package/dist/team-secrets/keys.d.ts +52 -0
  442. package/dist/team-secrets/keys.js +158 -0
  443. package/dist/team-secrets/log.d.ts +48 -0
  444. package/dist/team-secrets/log.js +175 -0
  445. package/dist/team-secrets/resolve-conflict.d.ts +7 -0
  446. package/dist/team-secrets/resolve-conflict.js +14 -0
  447. package/dist/team-secrets/schema.d.ts +97 -0
  448. package/dist/team-secrets/schema.js +157 -0
  449. package/dist/team-secrets/sign.d.ts +24 -0
  450. package/dist/team-secrets/sign.js +71 -0
  451. package/dist/team-secrets/vault.d.ts +49 -0
  452. package/dist/team-secrets/vault.js +148 -0
  453. package/dist/validate/wsi/run-message.d.ts +2 -2
  454. package/dist/validate/wsi/run-message.js +1 -1
  455. package/dist/validate/wsi/run-wsdl.d.ts +2 -2
  456. package/dist/validate/wsi/run-wsdl.js +1 -1
  457. package/dist/validate/wsi/types.d.ts +1 -1
  458. package/dist/webhooks/model.d.ts +138 -0
  459. package/dist/webhooks/model.js +150 -0
  460. package/dist/workspace/commit-message.d.ts +1 -1
  461. package/dist/workspace/commit-message.js +6 -1
  462. package/dist/workspace/environments.d.ts +11 -4
  463. package/dist/workspace/environments.js +12 -0
  464. package/dist/workspace/index.d.ts +3 -3
  465. package/dist/workspace/index.js +2 -2
  466. package/dist/workspace/paths.d.ts +5 -2
  467. package/dist/workspace/paths.js +5 -2
  468. package/dist/workspace/schema.d.ts +7 -3
  469. package/dist/workspace/schema.js +24 -3
  470. package/dist/workspace/share.d.ts +30 -11
  471. package/dist/workspace/share.js +32 -6
  472. package/dist/ws/call.d.ts +1 -1
  473. package/dist/ws/call.js +2 -2
  474. package/dist/ws/connect.d.ts +60 -0
  475. package/dist/ws/connect.js +131 -0
  476. package/dist/ws/events.d.ts +17 -0
  477. package/dist/ws/events.js +1 -0
  478. package/dist/ws/expand.d.ts +1 -1
  479. package/dist/ws/expand.js +1 -1
  480. package/dist/ws/files.d.ts +284 -0
  481. package/dist/ws/files.js +71 -0
  482. package/dist/ws/history-entry.d.ts +44 -0
  483. package/dist/ws/history-entry.js +93 -0
  484. package/dist/ws/model.d.ts +44 -3
  485. package/dist/ws/model.js +3 -0
  486. package/dist/ws/module.d.ts +2 -0
  487. package/dist/ws/module.js +11 -0
  488. package/dist/ws/run.d.ts +63 -0
  489. package/dist/ws/run.js +470 -0
  490. package/dist/ws/session.d.ts +18 -0
  491. package/dist/ws/session.js +52 -25
  492. package/dist/ws/storage.d.ts +9 -0
  493. package/dist/ws/storage.js +176 -0
  494. package/dist/ws/transcript.d.ts +3 -4
  495. package/dist/ws/transcript.js +26 -17
  496. package/dist/ws/url.d.ts +1 -1
  497. package/dist/wsdl/cache.js +1 -1
  498. package/dist/wsdl/docs-generator.d.ts +3 -3
  499. package/dist/wsdl/docs-generator.js +1 -1
  500. package/dist/wsdl/export-definition.js +1 -1
  501. package/dist/wsdl/qname.d.ts +2 -5
  502. package/dist/wsdl/resolver.d.ts +4 -11
  503. package/dist/wsdl/resolver.js +3 -3
  504. package/dist/wsdl/update-definition.d.ts +5 -5
  505. package/dist/wsdl/update-definition.js +6 -6
  506. package/dist/wss/apply.js +1 -1
  507. package/dist/{project/wss-configs.d.ts → wss/configs.d.ts} +2 -2
  508. package/dist/{project/wss-configs.js → wss/configs.js} +2 -2
  509. package/dist/wss/incoming/decrypt.d.ts +1 -1
  510. package/dist/wss/incoming/index.js +1 -1
  511. package/dist/wss/incoming/verify.d.ts +1 -1
  512. package/dist/wss/incoming/verify.js +1 -1
  513. package/dist/wss/key-identifiers.js +1 -1
  514. package/dist/wss/model.d.ts +1 -1
  515. package/dist/wss/outgoing/encryption.d.ts +1 -1
  516. package/dist/wss/outgoing/signature.d.ts +1 -1
  517. package/dist/xml/decode.d.ts +15 -0
  518. package/dist/xml/decode.js +22 -0
  519. package/dist/xml/entitize.d.ts +17 -0
  520. package/dist/xml/entitize.js +19 -0
  521. package/dist/xml/index.d.ts +1 -1
  522. package/dist/xml/index.js +1 -1
  523. package/dist/xml/locate.d.ts +39 -0
  524. package/dist/xml/locate.js +117 -0
  525. package/dist/xml/qname.d.ts +12 -0
  526. package/dist/xml/qname.js +8 -0
  527. package/dist/xpath/evaluate-async.d.ts +19 -0
  528. package/dist/xpath/evaluate-async.js +31 -11
  529. package/dist/xpath/evaluate.d.ts +1 -1
  530. package/dist/xpath/namespaces.js +1 -1
  531. package/dist/xpath/worker.d.ts +11 -5
  532. package/dist/xpath/worker.js +24 -7
  533. package/dist/xsd/form-model.d.ts +19 -2
  534. package/dist/xsd/form-model.js +14 -2
  535. package/dist/xsd/json-bridge.d.ts +152 -0
  536. package/dist/xsd/json-bridge.js +1213 -0
  537. package/dist/xsd/locate.d.ts +2 -30
  538. package/dist/xsd/locate.js +1 -109
  539. package/dist/xsd/xml-scan.d.ts +2 -0
  540. package/dist/xsd/xml-scan.js +1 -1
  541. package/dist/xsd/xml-writer.d.ts +2 -0
  542. package/dist/xsd/xml-writer.js +4 -0
  543. package/package.json +12 -1
  544. package/dist/generate.d.ts +0 -12
  545. package/dist/operations.d.ts +0 -12
  546. package/dist/run/effective-auth.d.ts +0 -10
  547. package/dist/run/effective-auth.js +0 -19
  548. package/dist/run/prepare.d.ts +0 -43
  549. package/dist/run/prepare.js +0 -280
  550. package/dist/send-options.d.ts +0 -141
  551. package/dist/wsdl/fetch.d.ts +0 -13
  552. /package/dist/{soap → http}/charset.d.ts +0 -0
  553. /package/dist/{soap → http}/charset.js +0 -0
  554. /package/dist/{wsdl → http}/ref-policy.d.ts +0 -0
  555. /package/dist/{wsdl → http}/ref-policy.js +0 -0
  556. /package/dist/{wss/keystore → keystore}/certificate.d.ts +0 -0
  557. /package/dist/{wss/keystore → keystore}/certificate.js +0 -0
  558. /package/dist/{wss/keystore → keystore}/index.d.ts +0 -0
  559. /package/dist/{wss/keystore → keystore}/model.d.ts +0 -0
  560. /package/dist/{wss/keystore → keystore}/model.js +0 -0
  561. /package/dist/{wss/keystore → keystore}/pem.d.ts +0 -0
  562. /package/dist/{wss/keystore → keystore}/pkcs12.d.ts +0 -0
  563. /package/dist/{wsdl → project}/cache-naming.d.ts +0 -0
  564. /package/dist/{types.js → soap/types.js} +0 -0
  565. /package/dist/{soap → xml}/prefixes.d.ts +0 -0
  566. /package/dist/{soap → xml}/prefixes.js +0 -0
@@ -7,24 +7,13 @@
7
7
  * importOpenApi} then adds the mapping from `map.ts`, so a caller that already has the text (a
8
8
  * re-import from the cache, a test) can do either half on its own.
9
9
  */
10
- import type { FetchDocument } from '../../wsdl/resolver.js';
10
+ import type { FetchDocument } from '../../http/fetch-document.js';
11
+ import type { OpenApiSource } from '../../json/schema/source.js';
12
+ import type { WebhookFolder } from '../../webhooks/model.js';
11
13
  import type { MapApiOptions, MappedApi } from './map.js';
12
14
  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
- };
15
+ import { type RefProblem, type ResolvedDocument } from '../../json/schema/refs.js';
16
+ export type { OpenApiSource };
28
17
  export interface ParseOpenApiOptions {
29
18
  readonly fetchDocument: FetchDocument;
30
19
  readonly signal?: AbortSignal;
@@ -46,6 +35,10 @@ export interface ParsedOpenApi {
46
35
  export declare function parseOpenApi(source: OpenApiSource, options: ParseOpenApiOptions): Promise<ParsedOpenApi>;
47
36
  /** Options for {@link importOpenApi}: how to fetch, and how to map what was fetched. */
48
37
  export interface ImportOpenApiOptions extends ParseOpenApiOptions, MapApiOptions {
38
+ /** Also map the document's webhooks and callbacks into a group. Defaults to `true`. */
39
+ readonly webhooks?: boolean;
40
+ /** The id the webhook group links back to. Defaults to the imported API's own id. */
41
+ readonly apiId?: string;
49
42
  }
50
43
  /** An imported API, every document it was made of, and what the mapping could not use. */
51
44
  export interface ImportedOpenApi extends MappedApi {
@@ -55,6 +48,8 @@ export interface ImportedOpenApi extends MappedApi {
55
48
  readonly refProblems: readonly RefProblem[];
56
49
  /** The document itself, for a caller that wants to offer a choice and map again. */
57
50
  readonly document: OpenApiDocument;
51
+ /** The document's webhooks and callbacks, mapped into one group, when there were any to map. */
52
+ readonly webhooks?: WebhookFolder;
58
53
  }
59
54
  /**
60
55
  * Fetches, resolves, parses and maps one OpenAPI document into an API.
@@ -8,9 +8,9 @@
8
8
  * re-import from the cache, a test) can do either half on its own.
9
9
  */
10
10
  import { OpenApiError } from '../../errors.js';
11
- import { apiFromDocument } from './map.js';
11
+ import { apiFromDocument, webhooksFromDocument } from './map.js';
12
12
  import { parseOpenApiDocument } from './parse.js';
13
- import { resolveRefs } from './refs.js';
13
+ import { resolveRefs } from '../../json/schema/refs.js';
14
14
  /** The absolute location a source resolves references against. */
15
15
  function locationOf(source) {
16
16
  if (source.kind === 'url') {
@@ -73,8 +73,11 @@ export async function parseOpenApi(source, options) {
73
73
  export async function importOpenApi(source, options) {
74
74
  const parsed = await parseOpenApi(source, options);
75
75
  const mapped = apiFromDocument(parsed.document, options);
76
+ const webhookOptions = { ...options, apiId: options.apiId ?? mapped.api.id };
77
+ const hooks = options.webhooks === false ? undefined : webhooksFromDocument(parsed.document, webhookOptions);
76
78
  const skipped = [
77
79
  ...mapped.summary.skipped,
80
+ ...(hooks?.skipped ?? []),
78
81
  ...parsed.refProblems.map((problem) => ({
79
82
  kind: 'reference',
80
83
  where: problem.at,
@@ -87,5 +90,6 @@ export async function importOpenApi(source, options) {
87
90
  documents: parsed.documents,
88
91
  refProblems: parsed.refProblems,
89
92
  document: parsed.document,
93
+ ...(hooks !== undefined ? { webhooks: hooks.folder } : {}),
90
94
  };
91
95
  }
@@ -12,8 +12,10 @@
12
12
  * the summary rather than dropped in silence.
13
13
  */
14
14
  import type { AuthConfig, IdGenerator } from '../../project/model.js';
15
+ import type { HookLink } from '../../webhooks/model.js';
16
+ import { type WebhookFolder } from '../../webhooks/model.js';
15
17
  import type { RestApi, RestDefinitionRef, RestServer } from '../model.js';
16
- import type { OpenApiDocument, OpenApiSecurityScheme, OpenApiSkipped } from './model.js';
18
+ import type { OpenApiDocument, OpenApiOperation, OpenApiSecurityScheme, OpenApiSkipped } from './model.js';
17
19
  /** How the caller wants the document read. Every field has a documented default. */
18
20
  export interface MapApiOptions {
19
21
  /** The API's name. Defaults to `info.title`, which the import dialog offers for editing. */
@@ -68,6 +70,8 @@ export interface OpenApiImportSummary {
68
70
  readonly folders: number;
69
71
  readonly requests: number;
70
72
  readonly deprecated: number;
73
+ /** Every webhook and callback method the document offers, whether or not this import maps them. */
74
+ readonly webhooks: number;
71
75
  /** The auth the API ended up with, by type, when it got any. */
72
76
  readonly auth?: AuthConfig['type'];
73
77
  /** Every scheme the document declares, so the dialog can offer a different one. */
@@ -93,6 +97,39 @@ export declare function mapScheme(scheme: OpenApiSecurityScheme): {
93
97
  };
94
98
  /** {@link mapScheme}, recording in `skipped` when the scheme the import needed has no equivalent. */
95
99
  export declare function authFromScheme(scheme: OpenApiSecurityScheme, skipped: OpenApiSkipped[]): AuthConfig | undefined;
100
+ /** One webhook or callback method a document offers, keyed as *Update definition* matches it. */
101
+ export interface WebhookItemRef {
102
+ readonly key: string;
103
+ readonly kind: 'webhook' | 'callback';
104
+ readonly name: string;
105
+ readonly method: string;
106
+ readonly operation?: string;
107
+ readonly expression?: string;
108
+ readonly label: string;
109
+ }
110
+ /** A document's webhook and callback methods with their operations. Internal to the OpenAPI modules. */
111
+ export declare function webhookSourcesOf(document: OpenApiDocument): {
112
+ readonly ref: WebhookItemRef;
113
+ readonly operation: OpenApiOperation;
114
+ readonly link: HookLink;
115
+ /** The item's own name for the first method, `name (METHOD)` for a later one — no parent label. */
116
+ readonly displayName: string;
117
+ }[];
118
+ /** Every webhook and callback method `document` offers, in document order. */
119
+ export declare function webhookItemsOf(document: OpenApiDocument): WebhookItemRef[];
120
+ /** Options for {@link webhooksFromDocument}. */
121
+ export interface MapWebhooksOptions extends MapApiOptions {
122
+ /** The API the group is linked to. */
123
+ readonly apiId: string;
124
+ /** Keys ({@link WebhookItemRef.key}) to keep; all when absent. */
125
+ readonly only?: ReadonlySet<string>;
126
+ }
127
+ /** The document's webhooks and callbacks as one group for the project's webhook collection. */
128
+ export declare function webhooksFromDocument(document: OpenApiDocument, options: MapWebhooksOptions): {
129
+ readonly folder: WebhookFolder;
130
+ readonly items: number;
131
+ readonly skipped: readonly OpenApiSkipped[];
132
+ } | undefined;
96
133
  /**
97
134
  * Maps a parsed document onto one API.
98
135
  *
@@ -13,11 +13,12 @@
13
13
  */
14
14
  import { generateId } from '../../project/model.js';
15
15
  import { slugify, uniqueSlug } from '../../project/paths.js';
16
+ import { createWebhookFolder, hookKey } from '../../webhooks/model.js';
16
17
  import { createApi, createFolder, createRestRequest, entry, RAW_LANGUAGE_CONTENT_TYPES } from '../model.js';
17
18
  import { HTTP_METHODS, serverUrl } from './model.js';
18
- import { sampleFromSchema, sampleXml } from './sample.js';
19
+ import { sampleFromSchema, sampleXml } from '../../json/schema/sample.js';
19
20
  /** Header parameters OpenAPI itself says to ignore, because the message decides them. */
20
- const RESERVED_HEADERS = new Set(['accept', 'content-type', 'authorization']);
21
+ const RESERVED_HEADERS = new Set(['accept', 'content-type', 'authorization', 'cookie']);
21
22
  /** The media types a *Binary* body is the honest reading of. */
22
23
  function isBinaryMedia(type, schema) {
23
24
  if (schema?.format === 'binary') {
@@ -92,17 +93,26 @@ function parameterRows(operation, location, options, skipped) {
92
93
  }
93
94
  return rows;
94
95
  }
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
- }
96
+ /**
97
+ * Cookie parameters, and an API key the operation's scheme puts in a cookie, as one `Cookie`
98
+ * header row: this client has no cookie table, and a header is how a cookie travels anyway. Off,
99
+ * like every imported header, and an API key's value is left blank — secrets are never invented.
100
+ */
101
+ function cookieHeader(operation, scheme, options) {
102
+ const pairs = operation.parameters
103
+ .filter((parameter) => parameter.in === 'cookie')
104
+ .map((parameter) => `${parameter.name}=${parameterValue(parameter, options)}`);
105
+ if (scheme?.type === 'apiKey' && scheme.in === 'cookie' && scheme.keyName !== undefined) {
106
+ pairs.push(`${scheme.keyName}=`);
107
+ }
108
+ return pairs.length === 0 ? [] : [entry('Cookie', pairs.join('; '), { enabled: false })];
109
+ }
110
+ /** The scheme an operation is sent under: its own when it states one, else the one the API was given. */
111
+ function effectiveScheme(operation, document, apiScheme) {
112
+ if (operation.security !== undefined) {
113
+ return schemeOfRequirement(operation.security, document.securitySchemes);
105
114
  }
115
+ return apiScheme;
106
116
  }
107
117
  /** The media type an operation's body is built from, under {@link BODY_PREFERENCE}. */
108
118
  function preferredMedia(content) {
@@ -218,7 +228,7 @@ export function mapScheme(scheme) {
218
228
  if (scheme.in === 'header' || scheme.in === 'query') {
219
229
  return { auth: { type: 'api-key', name: scheme.keyName ?? '', in: scheme.in } };
220
230
  }
221
- return { reason: 'An API key in a cookie is not supported' };
231
+ return { reason: 'An API key in a cookie is sent as a Cookie header on each request instead' };
222
232
  case 'oauth2': {
223
233
  const clientCredentials = scheme.flows?.clientCredentials;
224
234
  const authorizationCode = scheme.flows?.authorizationCode;
@@ -340,6 +350,122 @@ function groupByFolder(operations) {
340
350
  }
341
351
  return groups;
342
352
  }
353
+ /**
354
+ * One operation as a request. Shared by an API's own paths and by a webhook group's items —
355
+ * `overrides` is how the latter departs: its own name and URL, a {@link HookLink} instead of a
356
+ * `contract`, and no path parameters, since a webhook or callback URL is the caller's to fill in.
357
+ */
358
+ function requestFromOperation(operation, order, taken, context, overrides) {
359
+ const { document, options, newId, skipped, counts } = context;
360
+ if (operation.deprecated === true) {
361
+ counts.deprecated += 1;
362
+ }
363
+ counts.requests += 1;
364
+ const label = overrides?.name ?? requestName(operation);
365
+ const auth = operationAuth(operation, document, skipped);
366
+ const description = requestDescription(operation);
367
+ return createRestRequest(label, {
368
+ id: newId(),
369
+ slug: uniqueSlug(label, taken),
370
+ order,
371
+ method: HTTP_METHODS.includes(operation.method.toLowerCase()) ? operation.method.toUpperCase() : operation.method,
372
+ url: overrides?.url ?? operation.path,
373
+ ...(description !== undefined ? { description } : {}),
374
+ pathParams: overrides !== undefined ? [] : parameterRows(operation, 'path', options, skipped),
375
+ query: parameterRows(operation, 'query', options, skipped),
376
+ headers: [
377
+ ...parameterRows(operation, 'header', options, skipped),
378
+ ...cookieHeader(operation, effectiveScheme(operation, document, context.apiScheme), options),
379
+ ],
380
+ body: bodyOf(operation, options, skipped),
381
+ ...(auth !== undefined ? { auth } : {}),
382
+ ...(overrides !== undefined
383
+ ? { hook: overrides.hook }
384
+ : { contract: { method: operation.method.toLowerCase(), path: operation.path } }),
385
+ });
386
+ }
387
+ /** A document's webhook and callback methods with their operations. Internal to the OpenAPI modules. */
388
+ export function webhookSourcesOf(document) {
389
+ const sources = [];
390
+ const named = (name, method, first) => (first ? name : `${name} (${method.toUpperCase()})`);
391
+ for (const hook of document.webhooks ?? []) {
392
+ hook.operations.forEach((operation, index) => {
393
+ const link = { kind: 'webhook', name: hook.name };
394
+ const displayName = named(hook.name, operation.method, index === 0);
395
+ sources.push({
396
+ operation,
397
+ link,
398
+ displayName,
399
+ ref: {
400
+ key: hookKey(link, operation.method),
401
+ kind: 'webhook',
402
+ name: hook.name,
403
+ method: operation.method,
404
+ label: displayName,
405
+ },
406
+ });
407
+ });
408
+ }
409
+ for (const parent of document.operations) {
410
+ const parentKey = `${parent.method.toLowerCase()} ${parent.path}`;
411
+ const parentLabel = parent.operationId ?? `${parent.method.toUpperCase()} ${parent.path}`;
412
+ for (const callback of parent.callbacks ?? []) {
413
+ callback.operations.forEach((operation, index) => {
414
+ const link = {
415
+ kind: 'callback',
416
+ operation: parentKey,
417
+ name: callback.name,
418
+ expression: callback.expression,
419
+ };
420
+ const displayName = named(callback.name, operation.method, index === 0);
421
+ sources.push({
422
+ operation,
423
+ link,
424
+ displayName,
425
+ ref: {
426
+ key: hookKey(link, operation.method),
427
+ kind: 'callback',
428
+ name: callback.name,
429
+ method: operation.method,
430
+ operation: parentKey,
431
+ expression: callback.expression,
432
+ label: `${displayName} · ${parentLabel}`,
433
+ },
434
+ });
435
+ });
436
+ }
437
+ }
438
+ return sources;
439
+ }
440
+ /** Every webhook and callback method `document` offers, in document order. */
441
+ export function webhookItemsOf(document) {
442
+ return webhookSourcesOf(document).map((source) => source.ref);
443
+ }
444
+ /** The document's webhooks and callbacks as one group for the project's webhook collection. */
445
+ export function webhooksFromDocument(document, options) {
446
+ const chosen = webhookSourcesOf(document).filter((source) => options.only?.has(source.ref.key) ?? true);
447
+ if (chosen.length === 0)
448
+ return undefined;
449
+ const newId = options.newId ?? generateId;
450
+ const context = { document, options, newId, skipped: [], counts: { requests: 0, deprecated: 0 } };
451
+ const taken = new Set();
452
+ const requests = chosen.map((source, index) => {
453
+ const request = requestFromOperation(source.operation, index, taken, context, {
454
+ name: source.displayName,
455
+ url: `/${source.ref.name}`,
456
+ hook: source.link,
457
+ });
458
+ taken.add(request.slug);
459
+ return request;
460
+ });
461
+ const title = document.info.title.trim();
462
+ const name = options.name?.trim() ?? (title.length > 0 ? title : 'API');
463
+ return {
464
+ folder: createWebhookFolder(name, { id: newId(), source: { apiId: options.apiId }, requests }),
465
+ items: requests.length,
466
+ skipped: context.skipped,
467
+ };
468
+ }
343
469
  /**
344
470
  * Maps a parsed document onto one API.
345
471
  *
@@ -368,35 +494,18 @@ export function apiFromDocument(document, options = {}) {
368
494
  const folders = [];
369
495
  const folderSlugs = new Set();
370
496
  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
- });
497
+ const context = {
498
+ document,
499
+ options,
500
+ newId,
501
+ skipped,
502
+ counts: { requests: 0, deprecated: 0 },
503
+ ...(chosenScheme !== undefined ? { apiScheme: chosenScheme } : {}),
395
504
  };
396
505
  for (const [folderName, operations] of groups) {
397
506
  if (folderName === undefined) {
398
507
  operations.forEach((operation, index) => {
399
- const request = buildRequest(operation, index, rootSlugs);
508
+ const request = requestFromOperation(operation, index, rootSlugs, context);
400
509
  rootSlugs.add(request.slug);
401
510
  rootRequests.push(request);
402
511
  });
@@ -404,7 +513,7 @@ export function apiFromDocument(document, options = {}) {
404
513
  }
405
514
  const taken = new Set();
406
515
  const inside = operations.map((operation, index) => {
407
- const request = buildRequest(operation, index, taken);
516
+ const request = requestFromOperation(operation, index, taken, context);
408
517
  taken.add(request.slug);
409
518
  return request;
410
519
  });
@@ -441,8 +550,9 @@ export function apiFromDocument(document, options = {}) {
441
550
  baseUrl,
442
551
  servers,
443
552
  folders: folders.length,
444
- requests,
445
- deprecated,
553
+ requests: context.counts.requests,
554
+ deprecated: context.counts.deprecated,
555
+ webhooks: webhookItemsOf(document).length,
446
556
  ...(apiAuth !== undefined ? { auth: apiAuth.type } : {}),
447
557
  securitySchemes: document.securitySchemes.map((scheme) => {
448
558
  const mapped = mapScheme(scheme);
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Finding the operation of a definition a request calls, from its method and URL alone.
3
+ *
4
+ * Variables cannot be expanded here, so a `{{…}}` or `${…}` in the URL is opaque: at the start it
5
+ * stands for a base URL, and as a whole segment it matches any segment, as a `{param}` does. Pure,
6
+ * so the importer, the editor and the tests share it.
7
+ */
8
+ /** An operation as the definition names it: the lower-case method and the templated path. */
9
+ export interface RestOperationRef {
10
+ readonly method: string;
11
+ readonly path: string;
12
+ }
13
+ /**
14
+ * The one operation `method` and `url` call. As in OpenAPI, a concrete path wins over a templated
15
+ * one: of several matches, the one with the most literal segments; `undefined` on a tie or no match.
16
+ * A URL whose host matches no server still matches by path, once its origin is dropped and, if it
17
+ * starts with one, a server's own path prefix.
18
+ * `baseUrls` are the API's servers and base URL; the longest one the URL starts with is stripped.
19
+ */
20
+ export declare function matchOperation(operations: readonly RestOperationRef[], method: string, url: string, baseUrls: readonly string[]): RestOperationRef | undefined;
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Finding the operation of a definition a request calls, from its method and URL alone.
3
+ *
4
+ * Variables cannot be expanded here, so a `{{…}}` or `${…}` in the URL is opaque: at the start it
5
+ * stands for a base URL, and as a whole segment it matches any segment, as a `{param}` does. Pure,
6
+ * so the importer, the editor and the tests share it.
7
+ */
8
+ const VARIABLE = /^(?:\{\{[^}]*\}\}|\$\{[^}]*\}|\{[^}]*\})$/;
9
+ const LEADING_VARIABLE = /^(?:\{\{[^}]*\}\}|\$\{[^}]*\})/;
10
+ const ORIGIN = /^[a-z][a-z0-9+.-]*:\/\/[^/?#]*/i;
11
+ function withoutQuery(url) {
12
+ const end = url.search(/[?#]/);
13
+ return end === -1 ? url : url.slice(0, end);
14
+ }
15
+ /** `value` without trailing slashes; a loop, since `/\/+$/` backtracks on a long run of them. */
16
+ function trimSlash(value) {
17
+ let end = value.length;
18
+ while (end > 0 && value.charCodeAt(end - 1) === 47 /* '/' */) {
19
+ end -= 1;
20
+ }
21
+ return value.slice(0, end);
22
+ }
23
+ /** The URL's path relative to the API: the longest matching base URL, a leading variable, or the origin gone. */
24
+ function relativePath(url, baseUrls) {
25
+ const bases = baseUrls
26
+ .map((base) => trimSlash(withoutQuery(base.trim())))
27
+ .filter((base) => base.length > 0)
28
+ .sort((a, b) => b.length - a.length);
29
+ for (const base of bases) {
30
+ if (url === base || url.startsWith(`${base}/`)) {
31
+ return url.slice(base.length);
32
+ }
33
+ }
34
+ const variable = LEADING_VARIABLE.exec(url);
35
+ if (variable !== null) {
36
+ return url.slice(variable[0].length);
37
+ }
38
+ const origin = ORIGIN.exec(url);
39
+ const path = origin === null ? url : url.slice(origin[0].length);
40
+ // No base matched whole, as when the URL is sent to another host (staging, a mock) than the
41
+ // servers name: a base's own path prefix (`/v1`) is still not part of the operation's path.
42
+ const prefixes = bases
43
+ .map((base) => basePath(base))
44
+ .filter((prefix) => prefix.length > 0)
45
+ .sort((a, b) => b.length - a.length);
46
+ for (const prefix of prefixes) {
47
+ if (path === prefix || path.startsWith(`${prefix}/`)) {
48
+ return path.slice(prefix.length);
49
+ }
50
+ }
51
+ return path;
52
+ }
53
+ /** A base URL's path after its origin, or after a leading variable standing for one (`{scheme}://…` stays opaque). */
54
+ function basePath(base) {
55
+ const origin = ORIGIN.exec(base) ?? LEADING_VARIABLE.exec(base);
56
+ if (origin !== null)
57
+ return trimSlash(base.slice(origin[0].length));
58
+ return base.startsWith('/') ? trimSlash(base) : '';
59
+ }
60
+ function segments(path) {
61
+ return path.split('/').filter((segment) => segment.length > 0);
62
+ }
63
+ function decoded(segment) {
64
+ try {
65
+ return decodeURIComponent(segment);
66
+ }
67
+ catch {
68
+ return segment;
69
+ }
70
+ }
71
+ /** How many of `declared`'s segments are literal when it matches `actual`, or -1 when it does not. */
72
+ function literalMatch(declared, actual) {
73
+ if (declared.length !== actual.length) {
74
+ return -1;
75
+ }
76
+ let literals = 0;
77
+ for (const [index, segment] of declared.entries()) {
78
+ const other = actual[index];
79
+ if (VARIABLE.test(segment) || VARIABLE.test(other)) {
80
+ continue;
81
+ }
82
+ if (decoded(segment) !== decoded(other)) {
83
+ return -1;
84
+ }
85
+ literals += 1;
86
+ }
87
+ return literals;
88
+ }
89
+ /**
90
+ * The one operation `method` and `url` call. As in OpenAPI, a concrete path wins over a templated
91
+ * one: of several matches, the one with the most literal segments; `undefined` on a tie or no match.
92
+ * A URL whose host matches no server still matches by path, once its origin is dropped and, if it
93
+ * starts with one, a server's own path prefix.
94
+ * `baseUrls` are the API's servers and base URL; the longest one the URL starts with is stripped.
95
+ */
96
+ export function matchOperation(operations, method, url, baseUrls) {
97
+ const actual = segments(withoutQuery(relativePath(url.trim(), baseUrls)));
98
+ const wanted = method.toLowerCase();
99
+ let best;
100
+ let bestLiterals = -1;
101
+ let tied = false;
102
+ for (const operation of operations) {
103
+ if (operation.method.toLowerCase() !== wanted) {
104
+ continue;
105
+ }
106
+ const literals = literalMatch(segments(operation.path), actual);
107
+ if (literals > bestLiterals) {
108
+ best = operation;
109
+ bestLiterals = literals;
110
+ tied = false;
111
+ }
112
+ else if (literals >= 0 && literals === bestLiterals) {
113
+ tied = true;
114
+ }
115
+ }
116
+ return best === undefined || tied ? undefined : { method: best.method, path: best.path };
117
+ }
@@ -11,10 +11,8 @@
11
11
  * omit anything that is not required, and a parser that insists otherwise refuses documents users
12
12
  * legitimately have.
13
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
- };
14
+ import type { JsonSchema, JsonValue, OpenApiXml } from '../../json/schema/model.js';
15
+ export type { JsonSchema, JsonValue, OpenApiXml };
18
16
  /** Which specification version a document declares. */
19
17
  export type OpenApiVersion = '1.0' | '1.1' | '1.2' | '2.0' | '3.0' | '3.1' | '3.2';
20
18
  /** `info`: what the API is called, and which version of *it* this document describes. */
@@ -81,47 +79,6 @@ export interface OpenApiRequestBody {
81
79
  readonly description?: string;
82
80
  readonly content: Readonly<Record<string, OpenApiMediaType>>;
83
81
  }
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
82
  /** One operation of one path. */
126
83
  export interface OpenApiOperation {
127
84
  /** Lower-case HTTP method, as the document's key spells it. */
@@ -138,7 +95,36 @@ export interface OpenApiOperation {
138
95
  readonly requestBody?: OpenApiRequestBody;
139
96
  /** An operation's own security requirements; an empty array means "explicitly unauthenticated". */
140
97
  readonly security?: readonly OpenApiSecurityRequirement[];
98
+ /** The declared responses, keyed as the document keys them (`'200'`, `'4XX'`, `'default'`). */
99
+ readonly responses?: OpenApiResponses;
100
+ /** This operation's `callbacks`, when it declares any. */
101
+ readonly callbacks?: readonly OpenApiCallback[];
102
+ }
103
+ /** A root `webhooks` entry (OpenAPI 3.1+): its name and one operation per method. */
104
+ export interface OpenApiHook {
105
+ readonly name: string;
106
+ /** Each operation's `path` is the hook's name; `method` is lower-case. */
107
+ readonly operations: readonly OpenApiOperation[];
108
+ }
109
+ /** One `callbacks` entry of an operation: its name, its path-item key, and that item's operations. */
110
+ export interface OpenApiCallback {
111
+ readonly name: string;
112
+ /** The path-item key verbatim, e.g. `{$request.body#/callbackUrl}`. */
113
+ readonly expression: string;
114
+ /** Each operation's `path` is the expression. */
115
+ readonly operations: readonly OpenApiOperation[];
116
+ }
117
+ /** One declared response media type. The schema is the `$ref`-resolved node, kept as plain data. */
118
+ export interface OpenApiResponseMediaType {
119
+ readonly schema?: unknown;
120
+ }
121
+ /** One declared response. No `content` means the contract declares no body. */
122
+ export interface OpenApiResponse {
123
+ readonly description?: string;
124
+ readonly content?: Readonly<Record<string, OpenApiResponseMediaType>>;
141
125
  }
126
+ /** An operation's responses, keyed by status (`'200'`), range (`'4XX'`) or `'default'`. */
127
+ export type OpenApiResponses = Readonly<Record<string, OpenApiResponse>>;
142
128
  /** One security requirement: scheme name to the scopes it needs. */
143
129
  export type OpenApiSecurityRequirement = Readonly<Record<string, readonly string[]>>;
144
130
  /** One `securitySchemes` entry. */
@@ -189,6 +175,8 @@ export interface OpenApiDocument {
189
175
  /** The document-level security requirements, when it declares any. */
190
176
  readonly security?: readonly OpenApiSecurityRequirement[];
191
177
  readonly tags: readonly OpenApiTag[];
178
+ /** Root `webhooks` entries (OpenAPI 3.1+), when the document declares any. */
179
+ readonly webhooks?: readonly OpenApiHook[];
192
180
  /** Everything the model does not carry, counted and located. */
193
181
  readonly skipped: readonly OpenApiSkipped[];
194
182
  }
@@ -8,21 +8,13 @@
8
8
  * YAML, and a document that does not declare a supported OpenAPI or Swagger version. Swagger 1.x
9
9
  * and 2.0 documents are converted into the intermediate OpenAPI representation.
10
10
  *
11
- * The parser reads a document that is already resolved: `refs.ts` inlines every `$ref` first, so
11
+ * The parser reads a document that is already resolved: `json/schema/refs.ts` inlines every `$ref` first, so
12
12
  * nothing here has to fetch anything.
13
13
  */
14
14
  import type { JsonSchema, OpenApiDocument, OpenApiVersion } from './model.js';
15
15
  /** A plain object, which is all this parser ever walks into. */
16
16
  type Record_ = Readonly<Record<string, unknown>>;
17
- /**
18
- * Parses text as JSON when it looks like JSON, and as YAML otherwise.
19
- *
20
- * JSON is a subset of YAML, so one parser would do — but a JSON document with a syntax error gets a
21
- * far better message from `JSON.parse`, and that message is what the user has to act on.
22
- *
23
- * @throws OpenApiError `openapi-malformed` when the text parses as neither.
24
- */
25
- export declare function parseDocumentText(text: string, where?: string): unknown;
17
+ export { parseDocumentText } from '../../json/schema/parse-text.js';
26
18
  /**
27
19
  * The version a document declares, as a major-minor this client supports.
28
20
  *
@@ -36,9 +28,8 @@ export declare function versionOf(root: unknown): {
36
28
  /**
37
29
  * Reads a resolved OpenAPI document.
38
30
  *
39
- * @param root the parsed document, with every `$ref` already inlined (see `refs.ts`)
31
+ * @param root the parsed document, with every `$ref` already inlined (see `json/schema/refs.ts`)
40
32
  * @throws OpenApiError `openapi-not-a-document` / `openapi-unsupported-version` as {@link versionOf} does
41
33
  */
42
34
  export declare function parseOpenApiDocument(root: unknown): OpenApiDocument;
43
35
  export declare function parseSchema(value: Record_): JsonSchema;
44
- export {};