@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
@@ -17,147 +17,20 @@
17
17
  * project the first time an older build saves. "Additive is safe" is true of
18
18
  * formats that round-trip unknown keys; this one deliberately does not. See
19
19
  * ADR-0003.
20
+ *
21
+ * This file holds the core documents only: the manifest, an environment, the keystore registry, the
22
+ * WS-Security configurations, the webhook collection and the definition-cache manifests. A
23
+ * protocol's container and request files are in its own folder (`soap/files.ts`, `rest/files.ts`,
24
+ * `grpc/files.ts`, `ws/files.ts`), and the pieces they share in `schema-parts.ts`.
20
25
  */
21
26
  import { z } from 'zod';
22
- import { assertionsSchema } from '../assert/schema.js';
23
- import { ProjectError } from '../errors.js';
24
27
  import { FORMAT_VERSION } from './model.js';
25
28
  import { DEFAULT_WSS_ENCRYPTION_PARTS, DEFAULT_WSS_SIGNATURE_PARTS } from '../wss/model.js';
26
- const nonEmpty = z.string().min(1);
29
+ import { authConfigSchema, envName, nonEmpty, restFolderFileSchema, webhookSigningSchema } from './schema-parts.js';
30
+ // The pieces the protocols' file schemas share are declared in `schema-parts.ts` and keep their
31
+ // old names here. A protocol's own file schemas are exported from its folder.
32
+ export { assertSupportedKind, attachmentSourceSchema, authConfigSchema, definitionAuthSchema, endpointAuthSchema, hookLinkSchema, keyValueEntrySchema, parseFile, restFolderFileSchema, scriptsSchema, soapOwnerAuthSchema, webhookSigningSchema, } from './schema-parts.js';
27
33
  const propertyMapSchema = z.record(z.string(), z.string());
28
- /**
29
- * A committed, human-chosen name for a secret reference — not the secret itself — used to build
30
- * the environment variable a CI run reads it from (see `secrets/env-names.ts`).
31
- */
32
- const envName = z
33
- .string()
34
- .regex(/^[A-Z][A-Z0-9_]*$/)
35
- .optional();
36
- /**
37
- * Credentials as persisted: usernames and a `secretRef`, never a password
38
- * value. Unlike every other schema here, a plaintext `password` key is
39
- * explicitly rejected rather than merely ignored — secrets must never be
40
- * written to a project file, in any format.
41
- */
42
- export const endpointAuthSchema = z
43
- .looseObject({
44
- type: z.enum(['none', 'basic', 'ntlm']),
45
- username: z.string().optional(),
46
- passwordRef: z.string().optional(),
47
- passwordEnv: envName,
48
- domain: z.string().optional(),
49
- workstation: z.string().optional(),
50
- preemptive: z.boolean().optional(),
51
- })
52
- .refine((value) => !('password' in value), {
53
- message: 'endpoint auth must not contain a plaintext "password" field; use passwordRef',
54
- path: ['password'],
55
- });
56
- /**
57
- * Keys that would hold a credential *value* rather than a reference to one. A project file must
58
- * never carry one, in any authentication scheme, so they are rejected outright rather than
59
- * ignored — the same rule `endpointAuthSchema` applies to `password`, stated once for the
60
- * schemes added with the REST client (ADR-0004).
61
- */
62
- const PLAINTEXT_SECRET_KEYS = [
63
- 'password',
64
- 'token',
65
- 'secret',
66
- 'clientSecret',
67
- 'client_secret',
68
- 'apiKey',
69
- 'refreshToken',
70
- ];
71
- /** Adds the {@link PLAINTEXT_SECRET_KEYS} rejection to one authentication schema. */
72
- function refuseSecretValues(schema) {
73
- return schema.superRefine((value, ctx) => {
74
- for (const key of PLAINTEXT_SECRET_KEYS) {
75
- if (key in value) {
76
- ctx.addIssue({
77
- code: 'custom',
78
- path: [key],
79
- message: `auth must not contain a plaintext "${key}" field; use a secretRef`,
80
- });
81
- }
82
- }
83
- });
84
- }
85
- const inheritAuthSchema = z.looseObject({ type: z.literal('inherit') });
86
- const bearerAuthSchema = refuseSecretValues(z.looseObject({
87
- type: z.literal('bearer'),
88
- tokenRef: z.string().optional(),
89
- tokenEnv: envName,
90
- scheme: z.string().optional(),
91
- }));
92
- const apiKeyAuthSchema = refuseSecretValues(z.looseObject({
93
- type: z.literal('api-key'),
94
- name: z.string(),
95
- valueRef: z.string().optional(),
96
- valueEnv: envName,
97
- in: z.enum(['header', 'query']),
98
- }));
99
- const oauth2AuthSchema = refuseSecretValues(z.looseObject({
100
- type: z.literal('oauth2'),
101
- grant: z.enum(['client-credentials', 'authorization-code']),
102
- tokenUrl: z.string(),
103
- authorizationUrl: z.string().optional(),
104
- clientId: z.string(),
105
- clientSecretRef: z.string().optional(),
106
- clientSecretEnv: envName,
107
- scopes: z.array(z.string()).default([]),
108
- audience: z.string().optional(),
109
- clientAuth: z.enum(['basic', 'body']).default('basic'),
110
- pkce: z.boolean().default(true),
111
- refreshTokenRef: z.string().optional(),
112
- }));
113
- /**
114
- * Authentication as persisted anywhere a project configures it. `endpointAuthSchema` is one arm,
115
- * so a file written before the REST client — which only ever held `none`/`basic`/`ntlm` — parses
116
- * unchanged. `inherit` is accepted here and rejected by the SOAP schemas that reuse
117
- * `endpointAuthSchema` instead, since an interface has nothing to inherit from.
118
- */
119
- export const authConfigSchema = z.union([
120
- endpointAuthSchema,
121
- inheritAuthSchema,
122
- bearerAuthSchema,
123
- apiKeyAuthSchema,
124
- oauth2AuthSchema,
125
- ]);
126
- const endpointSchema = z.looseObject({
127
- id: nonEmpty,
128
- name: z.string(),
129
- url: z.string(),
130
- auth: endpointAuthSchema.optional(),
131
- authMode: z.enum(['override', 'complement']),
132
- trustInvalid: z.boolean().optional(),
133
- });
134
- /**
135
- * A stored WS-Addressing configuration. Every field beyond `enabled` is optional so a project
136
- * written before the WS-Addressing task — which only ever held `{ enabled, version? }` — still
137
- * loads; `normalizeWsa` fills the rest in with the v1 defaults.
138
- */
139
- const wsaSchema = z.looseObject({
140
- enabled: z.boolean(),
141
- version: z.enum(['2005/08', '2004/08']).optional(),
142
- mustUnderstand: z.enum(['none', 'true', 'false']).optional(),
143
- action: z.string().optional(),
144
- to: z.string().optional(),
145
- messageId: z.string().optional(),
146
- replyTo: z.string().optional(),
147
- from: z.string().optional(),
148
- faultTo: z.string().optional(),
149
- relatesTo: z.string().optional(),
150
- relationshipType: z.string().optional(),
151
- addDefaultAction: z.boolean().optional(),
152
- addDefaultTo: z.boolean().optional(),
153
- generateMessageId: z.boolean().optional(),
154
- });
155
- const operationEntrySchema = z.looseObject({
156
- name: nonEmpty,
157
- bindingName: z.string(),
158
- slug: nonEmpty,
159
- order: z.number().int(),
160
- });
161
34
  /** `wirebench.yaml`. */
162
35
  export const manifestSchema = z.looseObject({
163
36
  formatVersion: z.literal(FORMAT_VERSION),
@@ -177,322 +50,18 @@ export const manifestSchema = z.looseObject({
177
50
  /** Name of the Wirebench build that last wrote this manifest; informational only. */
178
51
  writtenBy: z.string().optional(),
179
52
  });
180
- /** `interfaces/<slug>/interface.yaml`. */
181
- export const interfaceFileSchema = z.looseObject({
182
- kind: z.literal('soap'),
183
- id: nonEmpty,
184
- name: z.string(),
185
- order: z.number().int(),
186
- definitionUrl: z.string(),
187
- cacheDefinition: z.boolean(),
188
- targetNamespace: z.string().optional(),
189
- endpoints: z.array(endpointSchema),
190
- defaultEndpointId: z.string().optional(),
191
- wsa: wsaSchema,
192
- auth: endpointAuthSchema.optional(),
193
- operations: z.array(operationEntrySchema),
194
- });
195
- const requestPropertiesSchema = z.looseObject({
196
- encoding: z.string(),
197
- timeoutMs: z.number().int().nonnegative().optional(),
198
- bindAddress: z.string().optional(),
199
- followRedirects: z.boolean(),
200
- skipSoapAction: z.boolean(),
201
- enableMtom: z.boolean(),
202
- forceMtom: z.boolean(),
203
- inlineResponseAttachments: z.boolean(),
204
- expandMtomAttachments: z.boolean(),
205
- disableMultiparts: z.boolean(),
206
- encodeAttachments: z.boolean(),
207
- enableInlineFiles: z.boolean(),
208
- removeEmptyContent: z.boolean(),
209
- entitizeProperties: z.boolean(),
210
- prettyPrint: z.boolean(),
211
- stripWhitespaces: z.boolean(),
212
- dumpFile: z.string().optional(),
213
- maxSizeBytes: z.number().int().nonnegative().optional(),
214
- wssPasswordType: z.enum(['text', 'digest']).optional(),
215
- wssTimeToLive: z.number().int().nonnegative().optional(),
216
- sslKeystoreRef: z.string().optional(),
217
- });
218
- /** Where a file's bytes live: the project's content-addressed cache, or a path on disk. */
219
- export const attachmentSourceSchema = z.union([
220
- z.looseObject({ kind: z.literal('cache'), sha256: nonEmpty }),
221
- z.looseObject({ kind: z.literal('path'), path: nonEmpty }),
222
- ]);
223
- const attachmentSchema = z.looseObject({
224
- id: nonEmpty,
225
- name: z.string(),
226
- contentType: z.string(),
227
- size: z.number().int().nonnegative(),
228
- part: z.string().optional(),
229
- type: z.enum(['XOP', 'MIME', 'SWAREF', 'CONTENT', 'UNKNOWN']),
230
- contentId: z.string(),
231
- cached: z.boolean(),
232
- source: attachmentSourceSchema,
233
- });
234
- /** `interfaces/<slug>/operations/<slug>/<name>.request.yaml` (the envelope lives in the sibling `.xml`). */
235
- export const requestFileSchema = z.looseObject({
236
- kind: z.literal('soap'),
237
- id: nonEmpty,
238
- name: z.string(),
239
- order: z.number().int(),
240
- description: z.string().optional(),
241
- endpointId: z.string().optional(),
242
- endpointUrl: z.string().optional(),
243
- soapVersion: z.enum(['1.1', '1.2']),
244
- soapAction: z.string().optional(),
245
- headers: z.array(z.looseObject({ name: z.string(), value: z.string() })),
246
- attachments: z.array(attachmentSchema),
247
- auth: endpointAuthSchema.optional(),
248
- wsa: wsaSchema.optional(),
249
- wssOutgoingRef: z.string().optional(),
250
- wssIncomingRef: z.string().optional(),
251
- properties: requestPropertiesSchema,
252
- assertions: assertionsSchema.default([]),
253
- orphaned: z.boolean().optional(),
254
- });
255
- /**
256
- * One table row as persisted. `enabled` is written only when `false`, so a missing key means
257
- * enabled; names may repeat and their order is the wire order.
258
- */
259
- export const keyValueEntrySchema = z.looseObject({
260
- name: z.string(),
261
- value: z.string(),
262
- enabled: z.boolean().default(true),
263
- description: z.string().optional(),
264
- });
265
- /**
266
- * An HTTP method: any RFC 9110 token, not just the seven the editor names. A service that speaks
267
- * `PURGE` or `REPORT` is not a malformed project.
268
- */
269
- const methodSchema = z
270
- .string()
271
- .min(1)
272
- .regex(/^[A-Za-z0-9!#$%&'*+.^_`|~-]+$/, 'a method must be an HTTP token');
273
- const multipartPartSchema = z.union([
274
- z.looseObject({
275
- kind: z.literal('text'),
276
- name: z.string(),
277
- value: z.string(),
278
- enabled: z.boolean().default(true),
279
- contentType: z.string().optional(),
280
- }),
281
- z.looseObject({
282
- kind: z.literal('file'),
283
- name: z.string(),
284
- source: attachmentSourceSchema,
285
- enabled: z.boolean().default(true),
286
- fileName: z.string().optional(),
287
- contentType: z.string().optional(),
288
- }),
289
- ]);
290
- /**
291
- * A request body as persisted. A raw body names its sibling file rather than carrying its text:
292
- * `file` is a bare file name in the request's own directory, validated as a path segment before
293
- * anything is read or written (ADR-0005).
294
- */
295
- export const restBodySchema = z.union([
296
- z.looseObject({ kind: z.literal('none') }),
297
- z.looseObject({
298
- kind: z.literal('raw'),
299
- language: z.enum(['json', 'xml', 'text', 'html', 'javascript']),
300
- contentType: z.string().optional(),
301
- file: nonEmpty,
302
- }),
303
- z.looseObject({ kind: z.literal('form'), fields: z.array(keyValueEntrySchema).default([]) }),
304
- z.looseObject({ kind: z.literal('multipart'), parts: z.array(multipartPartSchema).default([]) }),
305
- z.looseObject({ kind: z.literal('binary'), source: attachmentSourceSchema, contentType: z.string() }),
306
- ]);
307
- const restSettingsSchema = z.looseObject({
308
- timeoutMs: z.number().int().nonnegative().optional(),
309
- followRedirects: z.boolean().optional(),
310
- maxRedirects: z.number().int().nonnegative().optional(),
311
- keepBodyOnRedirect: z.boolean().optional(),
312
- encodeUrl: z.boolean().optional(),
313
- trustInvalid: z.boolean().optional(),
314
- sslKeystoreRef: z.string().optional(),
315
- bindAddress: z.string().optional(),
316
- maxSizeBytes: z.number().int().nonnegative().optional(),
317
- sendCookies: z.boolean().optional(),
318
- escapeProperties: z.boolean().optional(),
319
- });
320
- /** `apis/<slug>/requests/[<folder>/…]<name>.request.yaml`. */
321
- export const restRequestFileSchema = z.looseObject({
322
- kind: z.literal('rest'),
323
- id: nonEmpty,
324
- name: z.string(),
325
- order: z.number().int(),
326
- description: z.string().optional(),
327
- method: methodSchema,
328
- url: z.string(),
329
- pathParams: z.array(keyValueEntrySchema).default([]),
330
- query: z.array(keyValueEntrySchema).default([]),
331
- headers: z.array(keyValueEntrySchema).default([]),
332
- body: restBodySchema.default({ kind: 'none' }),
333
- auth: authConfigSchema.default({ type: 'inherit' }),
334
- settings: restSettingsSchema.default({}),
335
- assertions: assertionsSchema.default([]),
336
- orphaned: z.boolean().optional(),
337
- });
338
- /** `apis/<slug>/requests/[<folder>/…]folder.yaml`. */
339
- export const restFolderFileSchema = z.looseObject({
340
- id: nonEmpty,
341
- name: z.string(),
342
- order: z.number().int(),
343
- description: z.string().optional(),
344
- auth: authConfigSchema.optional(),
345
- });
346
- /** `apis/<slug>/api.yaml`. */
347
- export const apiFileSchema = z.looseObject({
348
- kind: z.literal('rest'),
349
- id: nonEmpty,
350
- name: z.string(),
351
- order: z.number().int(),
352
- description: z.string().optional(),
353
- baseUrl: z.string(),
354
- servers: z.array(z.looseObject({ url: z.string(), description: z.string().optional() })).default([]),
355
- auth: authConfigSchema.optional(),
356
- definition: z
357
- .looseObject({ source: nonEmpty, cache: z.boolean().default(true), version: z.string().default('') })
358
- .optional(),
359
- });
360
- const grpcSettingsSchema = z.looseObject({
361
- timeoutMs: z.number().int().nonnegative().optional(),
362
- trustInvalid: z.boolean().optional(),
363
- sslKeystoreRef: z.string().optional(),
364
- bindAddress: z.string().optional(),
365
- maxSizeBytes: z.number().int().nonnegative().optional(),
366
- escapeProperties: z.boolean().optional(),
367
- });
368
- /** The four shapes a gRPC method can take. */
369
- export const grpcMethodKindSchema = z.enum(['unary', 'server-streaming', 'client-streaming', 'bidi-streaming']);
370
- /**
371
- * `apis/<slug>/requests/[<folder>/…]<name>.request.yaml` for a gRPC request. The message text lives
372
- * in the sibling file `message` names, validated as a path segment before it is read (ADR-0005),
373
- * so a JSON message is a JSON file in git like a REST raw body.
374
- */
375
- export const grpcRequestFileSchema = z.looseObject({
376
- kind: z.literal('grpc'),
377
- id: nonEmpty,
378
- name: z.string(),
379
- order: z.number().int(),
380
- description: z.string().optional(),
381
- service: z.string(),
382
- method: z.string(),
383
- methodKind: grpcMethodKindSchema.default('unary'),
384
- metadata: z.array(keyValueEntrySchema).default([]),
385
- message: nonEmpty.optional(),
386
- auth: authConfigSchema.default({ type: 'inherit' }),
387
- settings: grpcSettingsSchema.default({}),
388
- orphaned: z.boolean().optional(),
389
- });
390
- /** `apis/<slug>/api.yaml` for a gRPC API. */
391
- export const grpcApiFileSchema = z.looseObject({
392
- kind: z.literal('grpc'),
393
- id: nonEmpty,
394
- name: z.string(),
395
- order: z.number().int(),
396
- description: z.string().optional(),
53
+ /** `webhooks/webhooks.yaml`. */
54
+ export const webhooksFileSchema = z.looseObject({
397
55
  target: z.string(),
398
- tls: z.boolean().default(false),
399
- metadata: z.array(keyValueEntrySchema).default([]),
400
56
  auth: authConfigSchema.optional(),
401
- definition: z
402
- .looseObject({
403
- // Absent in every project written before server reflection, which is an imported set.
404
- kind: z.enum(['proto', 'reflection']).default('proto'),
405
- source: nonEmpty,
406
- cache: z.boolean().default(true),
407
- roots: z.array(nonEmpty).default([]),
408
- reflectionVersion: z.enum(['auto', 'v1', 'v1alpha']).optional(),
409
- trustInvalid: z.boolean().optional(),
410
- })
411
- .optional(),
412
- });
413
- const wsSettingsSchema = z.looseObject({
414
- handshakeTimeoutMs: z.number().int().nonnegative().optional(),
415
- trustInvalid: z.boolean().optional(),
416
- sslKeystoreRef: z.string().optional(),
417
- bindAddress: z.string().optional(),
418
- maxMessageBytes: z.number().int().nonnegative().optional(),
419
- escapeProperties: z.boolean().optional(),
57
+ signing: webhookSigningSchema.optional(),
420
58
  });
421
- /**
422
- * One saved message as persisted: its text (or, for `binary`, base64) lives in the sibling file
423
- * `file` names, validated as a path segment before it is read (ADR-0005) — the same convention a
424
- * gRPC message or a REST raw body follows.
425
- */
426
- const wsSavedMessageSchema = z.looseObject({
427
- id: nonEmpty,
428
- name: z.string(),
429
- format: z.enum(['text', 'binary']).default('text'),
430
- file: nonEmpty,
59
+ /** `webhooks/requests/[<folder>/…]folder.yaml`: a REST folder plus a target override and its source API. */
60
+ export const webhookFolderFileSchema = restFolderFileSchema.extend({
61
+ target: z.string().optional(),
62
+ source: z.looseObject({ apiId: nonEmpty }).optional(),
63
+ signing: webhookSigningSchema.optional(),
431
64
  });
432
- /**
433
- * `apis/<slug>/requests/[<folder>/…]<name>.request.yaml` for a WebSocket request. Each saved
434
- * message's own text lives in its own sibling file, so a JSON message is a JSON file in git.
435
- */
436
- export const wsRequestFileSchema = z.looseObject({
437
- kind: z.literal('websocket'),
438
- id: nonEmpty,
439
- name: z.string(),
440
- order: z.number().int(),
441
- description: z.string().optional(),
442
- url: z.string(),
443
- query: z.array(keyValueEntrySchema).default([]),
444
- headers: z.array(keyValueEntrySchema).default([]),
445
- subprotocols: z.array(z.string()).default([]),
446
- auth: authConfigSchema.default({ type: 'inherit' }),
447
- settings: wsSettingsSchema.default({}),
448
- messages: z.array(wsSavedMessageSchema).default([]),
449
- });
450
- /** `apis/<slug>/api.yaml` for a WebSocket API. */
451
- export const wsApiFileSchema = z.looseObject({
452
- kind: z.literal('websocket'),
453
- id: nonEmpty,
454
- name: z.string(),
455
- order: z.number().int(),
456
- description: z.string().optional(),
457
- url: z.string(),
458
- headers: z.array(keyValueEntrySchema).default([]),
459
- auth: authConfigSchema.optional(),
460
- definition: z
461
- .looseObject({ kind: z.literal('asyncapi'), source: nonEmpty, cache: z.boolean().default(true) })
462
- .optional(),
463
- });
464
- /** Every protocol this build can load. A `kind` outside this list is refused by name, never guessed at. */
465
- const SUPPORTED_KINDS = ['soap', 'rest', 'grpc', 'websocket'];
466
- /**
467
- * Refuses a document whose `kind` this build does not know how to honour — a protocol a later
468
- * release adds, or a typo — before schema validation, so the error says what is actually wrong
469
- * ("this build cannot open a graphql document") instead of "expected 'rest', received 'graphql'",
470
- * and so a project written by a future build fails loudly rather than losing its requests to a
471
- * dropped unknown key. `grpc` was the reserved name this guard existed for until the gRPC client
472
- * arrived; it stays for whatever comes next.
473
- *
474
- * @throws ProjectError `project-kind-not-supported`
475
- */
476
- export function assertSupportedKind(document, file) {
477
- if (typeof document !== 'object' || document === null || Array.isArray(document)) {
478
- return;
479
- }
480
- const kind = document['kind'];
481
- if (typeof kind !== 'string' || SUPPORTED_KINDS.includes(kind)) {
482
- return;
483
- }
484
- throw new ProjectError('project-kind-not-supported', `${file} is a "${kind}" document, which this build cannot open`, {
485
- details: { file, kind, supported: SUPPORTED_KINDS },
486
- });
487
- }
488
- /** The `kind` of an `api.yaml`, read ahead of full validation so the loader knows which schema applies. */
489
- export function apiKindOf(document) {
490
- const kind = typeof document === 'object' && document !== null ? document['kind'] : undefined;
491
- if (kind === 'grpc' || kind === 'websocket') {
492
- return kind;
493
- }
494
- return 'rest';
495
- }
496
65
  /** `environments/<slug>.yaml`. */
497
66
  export const environmentFileSchema = z.looseObject({
498
67
  id: nonEmpty,
@@ -717,21 +286,3 @@ export const descriptorDefinitionCacheManifestSchema = z.looseObject({
717
286
  /** The descriptor set itself: its path under `definition/`, its SHA-256 and its size. */
718
287
  file: protoDefinitionCacheFileSchema,
719
288
  });
720
- /**
721
- * Validates `value` against `schema`, raising
722
- * `ProjectError('project-file-invalid')` carrying the file path and the
723
- * individual zod issues when it does not match.
724
- */
725
- export function parseFile(schema, value, file) {
726
- const result = schema.safeParse(value);
727
- if (result.success) {
728
- return result.data;
729
- }
730
- const issues = result.error.issues.map((issue) => ({
731
- path: issue.path.join('.'),
732
- message: issue.message,
733
- }));
734
- throw new ProjectError('project-file-invalid', `Invalid project file ${file}`, {
735
- details: { file, issues },
736
- });
737
- }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The checks ADR-0015 puts on `${#Sequence#…}` values wherever a request is expanded: text a server
3
+ * chose may be escaped into a body, but it may never pick where the request goes, and it may never
4
+ * carry a line break or NUL into a URL, a header or metadata. Each per-protocol expander calls these
5
+ * only when the scopes hold Sequence values, so a send outside a sequence pays nothing.
6
+ */
7
+ import type { ExpandResult, PropertyScopes } from './properties.js';
8
+ /** True when `scopes` carry at least one Sequence value, which is when the guards apply. */
9
+ export declare function hasSequenceValues(scopes: PropertyScopes): boolean;
10
+ /** Full XML escaping, quotes included, so a value is safe in element text and in an attribute alike. */
11
+ export declare function escapeXmlValue(value: string): string;
12
+ /**
13
+ * Expands with every Sequence value escaped by `escape` exactly once, wherever it lands and however it
14
+ * is reached, directly or through a chained property.
15
+ *
16
+ * Escaping the Sequence map up front is not enough: a request that escapes its own values would escape
17
+ * a Sequence value a second time. So each value is first replaced by a placeholder no user text can
18
+ * contain (a fresh random nonce per call) and made only of letters and digits, which no escaping
19
+ * touches. `expandText` runs with the request's own escaping, and then each placeholder is swapped
20
+ * for its escaped value.
21
+ */
22
+ export declare function expandWithSequenceEscaped(expandText: (scopes: PropertyScopes) => string, scopes: PropertyScopes, escape: (value: string) => string): string;
23
+ /** The origin of an absolute URL (`scheme://host:port`), or `undefined` when `text` is not one. */
24
+ export declare function urlOrigin(text: string): string | undefined;
25
+ /**
26
+ * Refuses a send whose destination depends on a Sequence value: `resolve` is expanded once with the
27
+ * real values and once with every Sequence value replaced by a fixed marker, and the two results must
28
+ * have the same origin under `originOf`. A value in the path, query or fragment changes neither;
29
+ * one in the scheme, host or port changes it.
30
+ *
31
+ * @param place what is being sent to, for the message ("The request URL")
32
+ * @param resolve builds the destination text from a set of scopes
33
+ * @param originOf reduces that text to what must not change
34
+ * @throws SequenceError `sequence-origin-from-response`
35
+ */
36
+ export declare function assertOriginIndependent(place: string, resolve: (scopes: PropertyScopes) => string, scopes: PropertyScopes, originOf?: (text: string) => string | undefined): void;
37
+ /**
38
+ * Refuses a Sequence value holding CR, LF or NUL wherever `result` put one: a URL, a header name or
39
+ * value, gRPC metadata, a SOAP action. A body may carry them; a line-oriented place may not.
40
+ *
41
+ * @throws SequenceError `sequence-value-invalid`
42
+ */
43
+ export declare function assertNoControlCharacters(place: string, result: ExpandResult, scopes: PropertyScopes): void;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * The checks ADR-0015 puts on `${#Sequence#…}` values wherever a request is expanded: text a server
3
+ * chose may be escaped into a body, but it may never pick where the request goes, and it may never
4
+ * carry a line break or NUL into a URL, a header or metadata. Each per-protocol expander calls these
5
+ * only when the scopes hold Sequence values, so a send outside a sequence pays nothing.
6
+ */
7
+ import { randomUUID } from 'node:crypto';
8
+ import { SequenceError } from '../errors.js';
9
+ /** What every Sequence value becomes in the comparison expansion: plain, host-safe, unlikely to be real. */
10
+ const MARKER = 'wbseq';
11
+ /** CR, LF and NUL: what splits a header or a request line. */
12
+ const CONTROL_CHARACTERS = /[\r\n\0]/;
13
+ /** True when `scopes` carry at least one Sequence value, which is when the guards apply. */
14
+ export function hasSequenceValues(scopes) {
15
+ return scopes.sequence !== undefined && Object.keys(scopes.sequence).length > 0;
16
+ }
17
+ function mapValues(map, transform) {
18
+ const out = {};
19
+ for (const [name, value] of Object.entries(map)) {
20
+ out[name] = transform(value);
21
+ }
22
+ return out;
23
+ }
24
+ /** Full XML escaping, quotes included, so a value is safe in element text and in an attribute alike. */
25
+ export function escapeXmlValue(value) {
26
+ return value
27
+ .replace(/&/g, '&amp;')
28
+ .replace(/</g, '&lt;')
29
+ .replace(/>/g, '&gt;')
30
+ .replace(/"/g, '&quot;')
31
+ .replace(/'/g, '&apos;');
32
+ }
33
+ /**
34
+ * Expands with every Sequence value escaped by `escape` exactly once, wherever it lands and however it
35
+ * is reached, directly or through a chained property.
36
+ *
37
+ * Escaping the Sequence map up front is not enough: a request that escapes its own values would escape
38
+ * a Sequence value a second time. So each value is first replaced by a placeholder no user text can
39
+ * contain (a fresh random nonce per call) and made only of letters and digits, which no escaping
40
+ * touches. `expandText` runs with the request's own escaping, and then each placeholder is swapped
41
+ * for its escaped value.
42
+ */
43
+ export function expandWithSequenceEscaped(expandText, scopes, escape) {
44
+ if (!hasSequenceValues(scopes) || scopes.sequence === undefined) {
45
+ return expandText(scopes);
46
+ }
47
+ const prefix = `wbseq${randomUUID().replace(/-/g, '')}x`;
48
+ const escaped = new Map();
49
+ const placeholders = {};
50
+ let index = 0;
51
+ for (const [name, value] of Object.entries(scopes.sequence)) {
52
+ // The trailing `z` ends the index, so placeholder 1 followed by a digit is never read as 15.
53
+ const placeholder = `${prefix}${index++}z`;
54
+ placeholders[name] = placeholder;
55
+ escaped.set(placeholder, escape(value));
56
+ }
57
+ const text = expandText({ ...scopes, sequence: placeholders });
58
+ return text.replace(new RegExp(`${prefix}\\d+z`, 'g'), (placeholder) => escaped.get(placeholder) ?? placeholder);
59
+ }
60
+ /** The origin of an absolute URL (`scheme://host:port`), or `undefined` when `text` is not one. */
61
+ export function urlOrigin(text) {
62
+ try {
63
+ const url = new URL(text);
64
+ // A non-special scheme (`grpc:`, `ws+unix:`) has an opaque `origin` of "null"; host and port
65
+ // still say where the request goes.
66
+ return url.origin !== 'null' ? url.origin : `${url.protocol}//${url.host}`;
67
+ }
68
+ catch {
69
+ return undefined;
70
+ }
71
+ }
72
+ /**
73
+ * Refuses a send whose destination depends on a Sequence value: `resolve` is expanded once with the
74
+ * real values and once with every Sequence value replaced by a fixed marker, and the two results must
75
+ * have the same origin under `originOf`. A value in the path, query or fragment changes neither;
76
+ * one in the scheme, host or port changes it.
77
+ *
78
+ * @param place what is being sent to, for the message ("The request URL")
79
+ * @param resolve builds the destination text from a set of scopes
80
+ * @param originOf reduces that text to what must not change
81
+ * @throws SequenceError `sequence-origin-from-response`
82
+ */
83
+ export function assertOriginIndependent(place, resolve, scopes, originOf = urlOrigin) {
84
+ if (!hasSequenceValues(scopes) || scopes.sequence === undefined) {
85
+ return;
86
+ }
87
+ const marked = { ...scopes, sequence: mapValues(scopes.sequence, () => MARKER) };
88
+ if (originOf(resolve(scopes)) !== originOf(resolve(marked))) {
89
+ throw new SequenceError('sequence-origin-from-response', `${place} would take its scheme, host or port from a value a response supplied; ` +
90
+ 'use ${#Sequence#…} only in the path, query or fragment', { details: { place } });
91
+ }
92
+ }
93
+ /**
94
+ * Refuses a Sequence value holding CR, LF or NUL wherever `result` put one: a URL, a header name or
95
+ * value, gRPC metadata, a SOAP action. A body may carry them; a line-oriented place may not.
96
+ *
97
+ * @throws SequenceError `sequence-value-invalid`
98
+ */
99
+ export function assertNoControlCharacters(place, result, scopes) {
100
+ if (scopes.sequence === undefined) {
101
+ return;
102
+ }
103
+ for (const { scope, name } of result.used) {
104
+ const value = scope === 'Sequence' && Object.hasOwn(scopes.sequence, name) ? scopes.sequence[name] : undefined;
105
+ if (value !== undefined && CONTROL_CHARACTERS.test(value)) {
106
+ throw new SequenceError('sequence-value-invalid', `${place} would carry a line break or NUL from \${#Sequence#${name}}`, { details: { place, name } });
107
+ }
108
+ }
109
+ }