@wirebench/engine 2.2.0 → 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
package/dist/run/run.js CHANGED
@@ -5,17 +5,25 @@
5
5
  * picture, not the first thing that went wrong. An errored assertion outranks a failed one for the
6
6
  * request's outcome, because "we could not tell" is a different problem from "it is wrong".
7
7
  */
8
- import { evaluateAssertions } from '../assert/index.js';
9
- import { isWirebenchError } from '../errors.js';
10
- import { definitionCacheDir } from '../project/paths.js';
11
- import { sendRest } from '../rest/send.js';
12
- import { sendSoapRequest } from '../send.js';
13
- import { bindingContextFor, validateMessage } from '../validate/index.js';
14
- import { summarizeWsa } from '../wsa/policy-detect.js';
15
- import { parseWsdlBundle } from '../wsdl/merge.js';
16
- import { readDefinitionCache } from '../wsdl/cache.js';
17
- import { buildSchemaSet } from '../xsd/schema-set.js';
18
- import { prepareSend } from './prepare.js';
8
+ import { sendAwaitingCallbacks } from '../assert/callback.js';
9
+ import { checkRequestAssertions } from '../assert/check.js';
10
+ import { isWirebenchError, WirebenchError } from '../errors.js';
11
+ import { featureDisabled } from '../protocol/registry.js';
12
+ import { defaultRegistry } from '../protocols.js';
13
+ import { scriptProperties } from '../script/props.js';
14
+ import { activeScripts } from '../script/request-scripts.js';
15
+ import { SecretPlaceholders } from '../script/send.js';
16
+ import { finishBaselineUpdate, planBaselineUpdate } from './baseline-update.js';
17
+ import { BASELINE_PROTOCOLS, checkBaseline } from './baseline.js';
18
+ import { scopesFor } from './context.js';
19
+ import { openExchange } from './open.js';
20
+ import { createRunTokenSource } from './oauth2-token.js';
21
+ import { createRunScope, scopeWith } from './scope.js';
22
+ import { listedSecrets, mergeScriptValues, scriptAssertions, scriptSession, } from './script-support.js';
23
+ /** A request's own assertions; a gRPC request that never had any, and a protocol without them, carry none. */
24
+ const assertionsOf = (item) => ('assertions' in item.request ? item.request.assertions : undefined) ?? [];
25
+ /** A request's scripts, as saved; a protocol without scripts has none. */
26
+ const scriptsOf = (item) => 'scripts' in item.request ? item.request.scripts : undefined;
19
27
  /** Enough of each exchange to keep for a report: a failing response can be megabytes. */
20
28
  const EXCHANGE_CAP_BYTES = 64 * 1024;
21
29
  function capped(bytes) {
@@ -33,138 +41,268 @@ function erroredResult(item, error) {
33
41
  outcome: 'errored',
34
42
  assertions: [],
35
43
  error,
36
- unasserted: item.request.assertions.length === 0,
44
+ unasserted: assertionsOf(item).length === 0,
37
45
  };
38
46
  }
39
- function parseClark(clark) {
40
- const match = /^\{([^}]*)\}(.*)$/.exec(clark);
41
- return match === null
42
- ? { namespaceUri: '', localName: clark }
43
- : { namespaceUri: match[1] ?? '', localName: match[2] ?? '' };
47
+ function outcomeOf(assertions) {
48
+ if (assertions.some((a) => a.outcome === 'errored'))
49
+ return 'errored';
50
+ if (assertions.some((a) => a.outcome === 'failed'))
51
+ return 'failed';
52
+ return 'passed';
53
+ }
54
+ /** The run facet of the module for `item`'s kind. */
55
+ function runOf(registry, item) {
56
+ const run = registry.require(item.kind).run;
57
+ if (run === undefined) {
58
+ throw new Error(`The "${item.kind}" protocol cannot run requests`);
59
+ }
60
+ return run;
44
61
  }
45
62
  /**
46
- * Reads the interface's definition from `interfaces/<slug>/definition/`, as the app hydrates it
47
- * with `prefer-cache` — minus the network fallback: a run never fetches a WSDL. An interface that
48
- * does not cache its definition, or whose cache is absent or unreadable, has no contract here.
63
+ * The scripts of one send, opened when the module first runs one. The secrets a request lists for
64
+ * its scripts are read then and not before, so they are asked for after everything resolving the
65
+ * request asks for, and before anything connecting it does. Exported for the desktop's sends,
66
+ * which pass `options` to record each secret value a script sets as the app's other sends do.
49
67
  */
50
- async function loadDefinition(projectDir, iface) {
51
- if (!iface.cacheDefinition) {
68
+ export function deferredSession(scripting, scripted, context, options = {}) {
69
+ let opening;
70
+ const open = () => {
71
+ opening ??= listedSecrets(scripted.scripts.secrets, context.host.getSecret).then((secrets) =>
72
+ // The run records a value as it merges it (`mergeScriptValues`); nothing about the send is
73
+ // shown before that.
74
+ scriptSession(scripting, scripted, {
75
+ vars: context.sequence ?? {},
76
+ props: scriptProperties(scopesFor(context)),
77
+ secrets,
78
+ }, options));
79
+ return opening;
80
+ };
81
+ return {
82
+ pre: async (before) => (await open()).pre(before),
83
+ post: async (sent, response) => (await open()).post(sent, response),
84
+ };
85
+ }
86
+ /**
87
+ * Why a request's active scripts cannot run in this registry, as the error its send reports (spec
88
+ * §5.3, §9): the `scripts` feature is off, or the request's protocol has no scripting facet.
89
+ * Undefined when they can run, and for a protocol the registry does not hold: looking its module up
90
+ * refuses that request first, with the protocol's own `feature-disabled`.
91
+ */
92
+ function scriptsRefusal(item, registry) {
93
+ const module = registry.find(item.kind);
94
+ if (module === undefined)
52
95
  return undefined;
96
+ if (!registry.features.isEnabled('scripts')) {
97
+ return featureDisabled(registry.features, 'scripts');
53
98
  }
54
- try {
55
- const bundle = await readDefinitionCache(definitionCacheDir(projectDir, iface.slug));
56
- const definition = parseWsdlBundle(bundle);
57
- return {
58
- definition,
59
- bundle,
60
- schemaSet: buildSchemaSet(bundle),
61
- defaultActionByOperation: summarizeWsa(definition).defaultActionByOperation,
62
- };
63
- }
64
- catch {
65
- return undefined;
99
+ if (module.scripting === undefined) {
100
+ return new WirebenchError('script-unsupported', `"${item.path}" has scripts, and ${item.kind} requests cannot have them`, {
101
+ details: { path: item.path, protocol: item.kind },
102
+ });
66
103
  }
104
+ return undefined;
67
105
  }
68
- function soapSubject(exchange, loaded, item) {
69
- const fault = exchange.response?.fault;
70
- const bodyText = exchange.response?.envelopeXml ?? new TextDecoder().decode(exchange.http.body);
71
- const binding = loaded === undefined
72
- ? undefined
73
- : bindingContextFor(loaded.definition, { bindingName: parseClark(item.operation.bindingName), operationName: item.operation.name }, 'response');
74
- const contentType = exchange.http.headers['content-type'];
75
- return {
76
- protocol: 'soap',
77
- status: exchange.http.status,
78
- durationMs: exchange.durationMs,
79
- bodyText,
80
- bodyKind: exchange.response?.isSoap === true ? 'xml' : 'other',
81
- fault: {
82
- present: fault !== undefined,
83
- ...(fault !== undefined ? { summary: [fault.code, fault.reason].filter((s) => s.length > 0).join(' — ') } : {}),
84
- },
85
- ...(loaded !== undefined && binding !== undefined
86
- ? {
87
- validateContract: () => validateMessage({
88
- xml: bodyText,
89
- direction: 'response',
90
- schemaSet: loaded.schemaSet,
91
- bundle: loaded.bundle,
92
- binding,
93
- http: { ...(contentType !== undefined ? { contentType } : {}) },
94
- }).then((r) => r.problems),
95
- }
96
- : {}),
106
+ /**
107
+ * A sender for one run: whatever a protocol loads for a container (a definition, a schema, an
108
+ * OpenAPI document) is loaded once, and one OAuth2 token source serves every request behind the same
109
+ * configuration. `runRequests` sends through it, and so does a sequence run, so a step is sent
110
+ * exactly as a selected request is. Which protocol sends a request is the registry's answer
111
+ * (`context.registry`, the built-in protocols by default).
112
+ *
113
+ * A request with scripts (#63) is type-checked first; its module then resolves it with its secrets
114
+ * behind placeholders, runs the pre-request script on that, puts the secrets back, connects, sends,
115
+ * and runs the post-response script on the response.
116
+ */
117
+ export function createRunSender(context) {
118
+ const registry = context.registry ?? defaultRegistry();
119
+ // One token source for the whole run: requests behind the same OAuth2 configuration share a token.
120
+ const host = {
121
+ ...context.host,
122
+ tokens: context.host.tokens ??
123
+ createRunTokenSource({
124
+ getSecret: context.host.getSecret,
125
+ ...(context.host.onSecretValue !== undefined ? { onSecretValue: context.host.onSecretValue } : {}),
126
+ }),
97
127
  };
98
- }
99
- function restSubject(exchange) {
100
- return {
101
- protocol: 'rest',
102
- status: exchange.status,
103
- durationMs: exchange.durationMs,
104
- bodyText: exchange.text,
105
- bodyKind: exchange.language === 'json' ? 'json' : exchange.language === 'xml' ? 'xml' : 'other',
128
+ const scope = createRunScope({ ...context, host });
129
+ return async (item, overrides = {}) => {
130
+ const itemContext = {
131
+ ...scope.context,
132
+ ...(overrides.sequence !== undefined ? { sequence: overrides.sequence } : {}),
133
+ ...(overrides.timeoutMs !== undefined ? { timeoutMs: overrides.timeoutMs } : {}),
134
+ };
135
+ const itemScope = scopeWith(scope, itemContext);
136
+ const run = runOf(registry, item);
137
+ const scripts = activeScripts(scriptsOf(item));
138
+ if (scripts === undefined) {
139
+ const sent = await openExchange(item, itemContext.host, { scope: itemScope, interactive: false, run: true })
140
+ .result;
141
+ return scriptsOf(item) !== undefined ? { ...sent, scriptsOff: true } : sent;
142
+ }
143
+ const refused = scriptsRefusal(item, registry);
144
+ if (refused !== undefined)
145
+ throw refused;
146
+ const scripting = context.scripting;
147
+ if (scripting === undefined) {
148
+ throw new WirebenchError('script-unavailable', `"${item.path}" has scripts, and this run cannot run them`, {
149
+ details: { path: item.path },
150
+ });
151
+ }
152
+ const scripted = {
153
+ protocol: item.kind,
154
+ path: item.path,
155
+ name: item.request.name,
156
+ slug: item.request.slug,
157
+ scripts,
158
+ types: await run.scriptTypes(item, itemScope),
159
+ };
160
+ await scripting.check(scripted);
161
+ return openExchange(item, itemContext.host, {
162
+ scope: itemScope,
163
+ interactive: false,
164
+ run: true,
165
+ scripts: { session: deferredSession(scripting, scripted, itemContext), placeholders: new SecretPlaceholders() },
166
+ }).result;
106
167
  };
107
168
  }
108
- function outcomeOf(assertions) {
109
- if (assertions.some((a) => a.outcome === 'errored'))
110
- return 'errored';
111
- if (assertions.some((a) => a.outcome === 'failed'))
112
- return 'failed';
113
- return 'passed';
169
+ /**
170
+ * Type-checks the scripts of every selected request before a run sends anything (spec
171
+ * §Type-checking): each request whose scripts are switched on, against its own contract's types.
172
+ * Returns one error per request that fails, in selection order; empty when all pass.
173
+ */
174
+ export async function checkRunScripts(selected, context) {
175
+ const scripting = context.scripting;
176
+ const errors = [];
177
+ if (scripting === undefined)
178
+ return errors;
179
+ const registry = context.registry ?? defaultRegistry();
180
+ const scope = createRunScope(context);
181
+ for (const item of selected) {
182
+ const scripts = activeScripts(scriptsOf(item));
183
+ if (scripts === undefined)
184
+ continue;
185
+ const refused = scriptsRefusal(item, registry);
186
+ if (refused !== undefined) {
187
+ errors.push(refused);
188
+ continue;
189
+ }
190
+ try {
191
+ await scripting.check({
192
+ protocol: item.kind,
193
+ path: item.path,
194
+ name: item.request.name,
195
+ slug: item.request.slug,
196
+ scripts,
197
+ types: await runOf(registry, item).scriptTypes(item, scope),
198
+ });
199
+ }
200
+ catch (error) {
201
+ errors.push(isWirebenchError(error)
202
+ ? error
203
+ : new WirebenchError('script-type-error', error instanceof Error ? error.message : String(error)));
204
+ }
205
+ }
206
+ return errors;
207
+ }
208
+ /** The `--baseline` check for one sent request: `unsupported` for a protocol without goldens. */
209
+ async function baselineOf(item, subject, baseline) {
210
+ if (!BASELINE_PROTOCOLS.has(item.kind)) {
211
+ return { report: { status: 'unsupported' } };
212
+ }
213
+ return checkBaseline(await baseline.source(item), subject, baseline.require);
214
+ }
215
+ /** The `--update-baseline` step for one sent request whose own outcome did not error. */
216
+ async function baselineUpdateOf(item, subject, failed, update, containsKnownSecret) {
217
+ if (!BASELINE_PROTOCOLS.has(item.kind)) {
218
+ return { report: { status: 'unsupported' } };
219
+ }
220
+ const plan = planBaselineUpdate({
221
+ read: await update.source(item),
222
+ subject,
223
+ failed,
224
+ ...(containsKnownSecret !== undefined ? { containsKnownSecret } : {}),
225
+ now: () => new Date(),
226
+ });
227
+ if (plan.kind === 'done')
228
+ return plan.check;
229
+ let outcome;
230
+ try {
231
+ outcome = await update.sink(item, plan.golden);
232
+ }
233
+ catch (error) {
234
+ outcome = { status: 'failed', message: error instanceof Error ? error.message : String(error) };
235
+ }
236
+ return finishBaselineUpdate(plan.report, outcome);
114
237
  }
115
238
  /** Runs one request; a throw anywhere on the way becomes an errored result, never a stopped run. */
116
- async function runOne(item, context, options, definitionFor) {
239
+ async function runOne(item, send, options, overrides, context) {
117
240
  try {
118
- const loaded = item.kind === 'soap' ? await definitionFor(item.iface) : undefined;
119
- const prepared = await prepareSend(item, {
120
- ...context,
121
- ...(loaded !== undefined
122
- ? {
123
- defaultWsaActionFor: (s) => loaded.defaultActionByOperation[`${s.operation.bindingName}|${s.operation.name}`] ?? '',
124
- }
125
- : {}),
241
+ const own = assertionsOf(item);
242
+ // The cursor is taken inside this helper, before the send (§2.3 step 1).
243
+ const { sent, callbacks } = await sendAwaitingCallbacks(own, () => scopesFor({ ...context, ...(overrides.sequence !== undefined ? { sequence: overrides.sequence } : {}) }), () => send(item, overrides), {
244
+ ...(options.captures !== undefined ? { captures: options.captures } : {}),
245
+ ...(options.callbackClock !== undefined ? { clock: options.callbackClock } : {}),
246
+ ...(options.callbackPollMs !== undefined ? { pollIntervalMs: options.callbackPollMs } : {}),
247
+ ...(context.signal !== undefined ? { signal: context.signal } : {}),
248
+ onWaiting: (waiting) => options.onCallbackWaiting?.(item.path, waiting),
126
249
  });
127
- let subject;
128
- let raw;
129
- if (prepared.kind === 'soap' && item.kind === 'soap') {
130
- const exchange = await sendSoapRequest(prepared.input, { scopes: prepared.scopes });
131
- subject = soapSubject(exchange, loaded, item);
132
- raw = exchange.http;
133
- }
134
- else if (prepared.kind === 'rest') {
135
- const exchange = await sendRest(prepared.input);
136
- subject = restSubject(exchange);
137
- raw = exchange;
138
- }
139
- else {
140
- throw new Error('prepareSend returned a send of the wrong protocol');
141
- }
142
- const own = item.request.assertions;
143
- const withDefault = options.defaultSlaMs !== undefined && !own.some((a) => a.type === 'sla')
144
- ? [...own, { type: 'sla', maxMs: options.defaultSlaMs }]
145
- : own;
146
- const assertions = await evaluateAssertions(subject, withDefault);
147
- const outcome = outcomeOf(assertions);
250
+ options.onSent?.(item, sent);
251
+ const { subject, raw, script } = sent;
252
+ const immediate = await checkRequestAssertions(subject, own, options.defaultSlaMs !== undefined ? { defaultSlaMs: options.defaultSlaMs } : {});
253
+ const checked = [...immediate, ...callbacks, ...scriptAssertions(script?.tests ?? [])];
254
+ // `--update-baseline` writes only for a request its own checks did not error (#217).
255
+ const ownOutcome = script?.error === undefined ? outcomeOf(checked) : 'errored';
256
+ const compared = options.baseline !== undefined
257
+ ? await baselineOf(item, subject, options.baseline)
258
+ : options.updateBaseline !== undefined && ownOutcome !== 'errored'
259
+ ? await baselineUpdateOf(item, subject, ownOutcome === 'failed', options.updateBaseline, context.containsKnownSecret)
260
+ : undefined;
261
+ const assertions = compared?.assertion !== undefined ? [...checked, compared.assertion] : checked;
262
+ const error = script?.error ?? compared?.error;
263
+ const outcome = error !== undefined ? 'errored' : outcomeOf(assertions);
148
264
  return {
149
- ...identity(item),
150
- outcome,
151
- status: subject.status,
152
- durationMs: subject.durationMs,
153
- assertions,
154
- unasserted: own.length === 0,
155
- ...(outcome !== 'passed'
156
- ? { exchange: { request: capped(raw.rawRequest), response: capped(raw.rawResponse) } }
157
- : {}),
265
+ sent,
266
+ result: {
267
+ ...identity(item),
268
+ outcome,
269
+ status: subject.status,
270
+ durationMs: subject.durationMs,
271
+ assertions,
272
+ // The synthetic baseline assertion does not count: --require-assertions keeps its meaning.
273
+ unasserted: own.length === 0 && (script?.tests.length ?? 0) === 0,
274
+ ...(error !== undefined ? { error } : {}),
275
+ ...(compared !== undefined ? { baseline: compared.report } : {}),
276
+ ...scriptReport(script, sent.scriptsOff === true),
277
+ ...(outcome !== 'passed'
278
+ ? { exchange: { request: capped(raw.rawRequest), response: capped(raw.rawResponse) } }
279
+ : {}),
280
+ },
158
281
  };
159
282
  }
160
283
  catch (e) {
161
- return erroredResult(item, {
162
- code: isWirebenchError(e) ? e.code : 'internal-error',
163
- message: e instanceof Error ? e.message : String(e),
164
- ...(isWirebenchError(e) && e.details !== undefined ? { details: e.details } : {}),
165
- });
284
+ return { result: erroredResult(item, errorOf(e)) };
166
285
  }
167
286
  }
287
+ /** What a result reports of a request's scripts: their log, or that they were switched off. */
288
+ export function scriptReport(script, scriptsOff) {
289
+ return {
290
+ ...(script !== undefined && script.log.lines.length > 0 ? { scriptLog: script.log.lines } : {}),
291
+ ...(scriptsOff ? { scriptsOff: true } : {}),
292
+ };
293
+ }
294
+ /** A thrown value as a result's `error`, with the engine's code when it has one. */
295
+ export function errorOf(e) {
296
+ return {
297
+ code: isWirebenchError(e) ? e.code : 'internal-error',
298
+ message: e instanceof Error ? e.message : String(e),
299
+ ...(isWirebenchError(e) && e.details !== undefined ? { details: e.details } : {}),
300
+ };
301
+ }
302
+ /** A failed or errored exchange as a report keeps it: each side capped, not yet redacted. */
303
+ export function cappedExchange(raw) {
304
+ return { request: capped(raw.rawRequest), response: capped(raw.rawResponse) };
305
+ }
168
306
  /**
169
307
  * Sends `selected` in order and reports each. A request after an abort, or after the first
170
308
  * failure under `bail`, is `skipped` and never sent.
@@ -172,16 +310,10 @@ async function runOne(item, context, options, definitionFor) {
172
310
  export async function runRequests(selected, context, options = {}) {
173
311
  const started = performance.now();
174
312
  const startedAt = new Date().toISOString();
175
- const definitions = new Map();
176
- const definitionFor = (iface) => {
177
- let loaded = definitions.get(iface.id);
178
- if (loaded === undefined) {
179
- loaded = loadDefinition(context.projectDir, iface);
180
- definitions.set(iface.id, loaded);
181
- }
182
- return loaded;
183
- };
313
+ const send = createRunSender(context);
184
314
  const results = [];
315
+ // Values scripts set, which later requests of the run read as `${#Sequence#name}` (#63).
316
+ const runValues = new Map(Object.entries(context.sequence ?? {}));
185
317
  let stopped = false;
186
318
  for (const item of selected) {
187
319
  let result;
@@ -190,14 +322,18 @@ export async function runRequests(selected, context, options = {}) {
190
322
  ...identity(item),
191
323
  outcome: 'skipped',
192
324
  assertions: [],
193
- unasserted: item.request.assertions.length === 0,
325
+ unasserted: assertionsOf(item).length === 0,
194
326
  };
195
327
  }
196
- else if (item.request.assertions.length === 0 && options.requireAssertions === true) {
328
+ else if (assertionsOf(item).length === 0 &&
329
+ activeScripts(scriptsOf(item))?.post === undefined &&
330
+ options.requireAssertions === true) {
197
331
  result = erroredResult(item, { code: 'assertions-required', message: 'This request has no assertions.' });
198
332
  }
199
333
  else {
200
- result = await runOne(item, context, options, definitionFor);
334
+ const ran = await runOne(item, send, options, { sequence: Object.fromEntries(runValues) }, context);
335
+ result = ran.result;
336
+ mergeScriptValues(runValues, ran.sent?.script?.values ?? [], context.host.onSecretValue, context.containsKnownSecret);
201
337
  }
202
338
  results.push(result);
203
339
  options.onRequestDone?.(result);
@@ -206,7 +342,10 @@ export async function runRequests(selected, context, options = {}) {
206
342
  }
207
343
  }
208
344
  const count = (outcome) => results.filter((r) => r.outcome === outcome).length;
209
- const environment = context.project.environments.find((e) => e.id === context.environmentId)?.name;
345
+ const baselineCount = (status) => results.filter((r) => r.baseline?.status === status).length;
346
+ // Inside a workspace the environment a run names is the workspace's.
347
+ const environments = context.workspace?.workspace.environments ?? context.project.environments;
348
+ const environment = environments.find((e) => e.id === context.environmentId)?.name;
210
349
  return {
211
350
  startedAt,
212
351
  ...(environment !== undefined ? { environment } : {}),
@@ -217,6 +356,26 @@ export async function runRequests(selected, context, options = {}) {
217
356
  errored: count('errored'),
218
357
  skipped: count('skipped'),
219
358
  durationMs: Math.round(performance.now() - started),
359
+ ...(options.baseline !== undefined
360
+ ? {
361
+ baseline: {
362
+ matched: baselineCount('matched'),
363
+ differs: baselineCount('differs'),
364
+ missing: baselineCount('missing'),
365
+ },
366
+ }
367
+ : {}),
368
+ ...(options.updateBaseline !== undefined
369
+ ? {
370
+ baselineUpdate: {
371
+ updated: baselineCount('updated'),
372
+ created: baselineCount('created'),
373
+ matched: baselineCount('matched'),
374
+ skipped: baselineCount('skipped'),
375
+ refused: baselineCount('refused'),
376
+ },
377
+ }
378
+ : {}),
220
379
  },
221
380
  requests: results,
222
381
  };
@@ -0,0 +1,11 @@
1
+ /** What a protocol module is given for one run: the run's context and its one cache (spec §3.3). */
2
+ import type { RunScope } from '../protocol/module.js';
3
+ import type { RunContext } from './context.js';
4
+ /**
5
+ * A scope for one run. `memo` keeps one value per key for the scope's lifetime: a compiled WSDL, a
6
+ * proto set, an OpenAPI document. A load that rejects is remembered too, since nothing in a run can
7
+ * fix a cache, and every later request behind the key reports the same error.
8
+ */
9
+ export declare function createRunScope(context: RunContext): RunScope;
10
+ /** `scope` with another context and the same cache: what one request of the run is sent with. */
11
+ export declare function scopeWith(scope: RunScope, context: RunContext): RunScope;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * A scope for one run. `memo` keeps one value per key for the scope's lifetime: a compiled WSDL, a
3
+ * proto set, an OpenAPI document. A load that rejects is remembered too, since nothing in a run can
4
+ * fix a cache, and every later request behind the key reports the same error.
5
+ */
6
+ export function createRunScope(context) {
7
+ const loads = new Map();
8
+ return {
9
+ context,
10
+ memo(key, load) {
11
+ const known = loads.get(key);
12
+ if (known !== undefined) {
13
+ return known;
14
+ }
15
+ const loading = load();
16
+ // Observed here so a rejection nobody awaits yet is never reported as unhandled.
17
+ loading.catch(() => undefined);
18
+ loads.set(key, loading);
19
+ return loading;
20
+ },
21
+ };
22
+ }
23
+ /** `scope` with another context and the same cache: what one request of the run is sent with. */
24
+ export function scopeWith(scope, context) {
25
+ return { context, memo: (key, load) => scope.memo(key, load) };
26
+ }
@@ -0,0 +1,53 @@
1
+ /**
2
+ * What a run needs to run a request's scripts (#63): the script's view of properties and listed
3
+ * secrets, and the results a report shows — tests as assertions, values for later requests.
4
+ */
5
+ import type { AssertionResult } from '../assert/model.js';
6
+ import { type GetSecret } from '../secrets/resolve.js';
7
+ import type { RequestSnapshotBase, ResponseSnapshotBase } from '../protocol/module.js';
8
+ import type { ScriptLog, ScriptTest, ScriptValue } from '../script/model.js';
9
+ import { type RequestScripting, type ScriptedRequest, type ScriptRunValues } from '../script/request-scripts.js';
10
+ /** What running a request's scripts produced, carried with the sent request. */
11
+ export interface SentScripts {
12
+ readonly tests: readonly ScriptTest[];
13
+ readonly values: readonly ScriptValue[];
14
+ readonly log: ScriptLog;
15
+ /** A post-response script that failed: the response is kept, the request errors. */
16
+ readonly error?: {
17
+ readonly code: string;
18
+ readonly message: string;
19
+ };
20
+ }
21
+ /** The values of the secrets a request's scripts list. */
22
+ export declare function listedSecrets(names: readonly string[], getSecret: GetSecret): Promise<Record<string, string>>;
23
+ /** A script's tests as a report's assertions. */
24
+ export declare function scriptAssertions(tests: readonly ScriptTest[]): AssertionResult[];
25
+ /**
26
+ * Adds a script's values to a run's values. A value marked secret, or holding a credential the run
27
+ * knows, is reported for masking first (ADR-0015).
28
+ */
29
+ export declare function mergeScriptValues(target: Map<string, string>, values: readonly ScriptValue[], onSecretValue: ((value: string) => void) | undefined, containsKnownSecret: ((value: string) => boolean) | undefined): void;
30
+ /** One send's scripts: the pre-request script on the prepared request, the post-response script on the response. */
31
+ export interface ScriptSession {
32
+ /**
33
+ * Runs the pre-request script, if there is one, on `before`; the request as it will be sent.
34
+ *
35
+ * @throws WirebenchError the script's failure: the request is not sent
36
+ */
37
+ readonly pre: <S extends RequestSnapshotBase>(before: S) => Promise<S>;
38
+ /**
39
+ * Runs the post-response script, if there is one, and returns what both scripts did. The
40
+ * post-response script sees the pre-request script's values; its failure is returned, not thrown.
41
+ */
42
+ readonly post: (sent: RequestSnapshotBase, response: ResponseSnapshotBase) => Promise<SentScripts>;
43
+ }
44
+ export interface ScriptSessionOptions {
45
+ /** Told each value a script sets that is secret, or holds a known secret, as soon as it is set. */
46
+ readonly onSecretValue?: (value: string) => void;
47
+ readonly containsKnownSecret?: (value: string) => boolean;
48
+ }
49
+ /**
50
+ * The scripts of one send of `scripted`. The run and the app both send through this, so a value a
51
+ * script marks secret is masked before anything about the send is shown, in either.
52
+ */
53
+ export declare function scriptSession(scripting: RequestScripting, scripted: ScriptedRequest, values: ScriptRunValues, options?: ScriptSessionOptions): ScriptSession;