@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
@@ -0,0 +1,215 @@
1
+ import { SCRIPT_OUTPUT_LIMITS } from '../model.js';
2
+ const COMMON = String.raw `
3
+ const input = JSON.parse(__host.inputJson);
4
+ const hasOwn = (object, key) => object !== null && typeof object === 'object' && Object.prototype.hasOwnProperty.call(object, key);
5
+ const state = { tests: [], values: new Map(), request: undefined };
6
+
7
+ class ScriptSecretDenied extends Error { constructor(message) { super(message); this.name = 'ScriptSecretDenied'; } }
8
+ class ScriptValueInvalid extends Error { constructor(message) { super(message); this.name = 'ScriptValueInvalid'; } }
9
+ class ScriptUnsupported extends Error { constructor(message) { super(message); this.name = 'ScriptUnsupported'; } }
10
+ class ExpectationFailed extends Error { constructor(message) { super(message); this.name = 'ExpectationFailed'; } }
11
+
12
+ const define = (name, value) => {
13
+ Object.defineProperty(globalThis, name, { value, writable: false, configurable: true, enumerable: false });
14
+ };
15
+
16
+ const show = (value) => {
17
+ if (typeof value === 'string') return value;
18
+ if (typeof value === 'function') return '[function]';
19
+ try {
20
+ const text = JSON.stringify(value);
21
+ return text === undefined ? String(value) : text;
22
+ } catch {
23
+ return String(value);
24
+ }
25
+ };
26
+
27
+ const utf8Length = (text) => {
28
+ let bytes = 0;
29
+ for (let i = 0; i < text.length; i++) {
30
+ const code = text.charCodeAt(i);
31
+ if (code < 0x80) bytes += 1;
32
+ else if (code < 0x800) bytes += 2;
33
+ else if (code >= 0xd800 && code <= 0xdbff) { bytes += 4; i++; }
34
+ else bytes += 3;
35
+ }
36
+ return bytes;
37
+ };
38
+
39
+ const writeLog = (...values) => __host.log(values.map(show).join(' '));
40
+ define('log', writeLog);
41
+ define('console', Object.freeze({ log: writeLog, info: writeLog, warn: writeLog, error: writeLog, debug: writeLog }));
42
+
43
+ const NAME = /^[A-Za-z_][A-Za-z0-9_.-]{0,63}$/;
44
+ define('vars', Object.freeze({
45
+ get(name) {
46
+ const key = String(name);
47
+ if (state.values.has(key)) return state.values.get(key).value;
48
+ return hasOwn(input.vars, key) ? input.vars[key] : undefined;
49
+ },
50
+ set(name, value, options) {
51
+ const key = String(name);
52
+ if (!NAME.test(key)) {
53
+ throw new ScriptValueInvalid('A value name must start with a letter or _ and hold only letters, digits, _, . and -: "' + key + '"');
54
+ }
55
+ if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean') {
56
+ throw new ScriptValueInvalid('vars.set("' + key + '") takes a string, number or boolean');
57
+ }
58
+ const text = String(value);
59
+ if (utf8Length(text) > ${String(SCRIPT_OUTPUT_LIMITS.valueBytes)}) {
60
+ throw new ScriptValueInvalid('vars.set("' + key + '") is over ${String(SCRIPT_OUTPUT_LIMITS.valueBytes / 1024)} KiB');
61
+ }
62
+ if (!state.values.has(key) && state.values.size >= ${String(SCRIPT_OUTPUT_LIMITS.values)}) {
63
+ throw new ScriptValueInvalid('A script may set at most ${String(SCRIPT_OUTPUT_LIMITS.values)} values');
64
+ }
65
+ state.values.set(key, { value: text, secret: options !== null && typeof options === 'object' && options.secret === true });
66
+ },
67
+ }));
68
+
69
+ define('props', Object.freeze({
70
+ get(name) {
71
+ const key = String(name);
72
+ return hasOwn(input.props, key) ? input.props[key] : undefined;
73
+ },
74
+ }));
75
+
76
+ define('secrets', Object.freeze({
77
+ get(name) {
78
+ const key = String(name);
79
+ if (hasOwn(input.secrets, key)) return input.secrets[key];
80
+ throw new ScriptSecretDenied('The secret "' + key + '" is not listed in this request\'s scripts.secrets');
81
+ },
82
+ }));
83
+
84
+ define('crypto', Object.freeze({
85
+ hash: (algorithm, data, encoding) => __host.hash(String(algorithm), String(data), encoding === undefined ? undefined : String(encoding)),
86
+ hmac: (algorithm, key, data, encoding) =>
87
+ __host.hmac(String(algorithm), String(key), String(data), encoding === undefined ? undefined : String(encoding)),
88
+ randomUUID: () => __host.uuid(),
89
+ }));
90
+
91
+ define('encoding', Object.freeze({
92
+ base64: (text) => __host.base64(String(text)),
93
+ fromBase64: (text) => __host.fromBase64(String(text)),
94
+ base64url: (text) => __host.base64url(String(text)),
95
+ urlEncode: (text) => __host.urlEncode(String(text)),
96
+ }));
97
+
98
+ const deepEqual = (a, b) => {
99
+ if (Object.is(a, b)) return true;
100
+ if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;
101
+ if (Array.isArray(a) !== Array.isArray(b)) return false;
102
+ if (Array.isArray(a)) return a.length === b.length && a.every((item, i) => deepEqual(item, b[i]));
103
+ const keysA = Object.keys(a).filter((k) => a[k] !== undefined);
104
+ const keysB = Object.keys(b).filter((k) => b[k] !== undefined);
105
+ return keysA.length === keysB.length && keysA.every((k) => hasOwn(b, k) && deepEqual(a[k], b[k]));
106
+ };
107
+
108
+ const makeExpectation = (actual, negated) => {
109
+ const check = (passed, description) => {
110
+ if (passed === negated) {
111
+ throw new ExpectationFailed('Expected ' + show(actual) + (negated ? ' not ' : ' ') + description);
112
+ }
113
+ };
114
+ const matchers = {
115
+ toBe: (expected) => check(Object.is(actual, expected), 'to be ' + show(expected)),
116
+ toEqual: (expected) => check(deepEqual(actual, expected), 'to equal ' + show(expected)),
117
+ toBeDefined: () => check(actual !== undefined, 'to be defined'),
118
+ toBeUndefined: () => check(actual === undefined, 'to be undefined'),
119
+ toBeNull: () => check(actual === null, 'to be null'),
120
+ toBeTruthy: () => check(Boolean(actual), 'to be truthy'),
121
+ toBeFalsy: () => check(!actual, 'to be falsy'),
122
+ toContain: (item) =>
123
+ check(
124
+ typeof actual === 'string' ? actual.includes(String(item)) : Array.isArray(actual) && actual.some((x) => deepEqual(x, item)),
125
+ 'to contain ' + show(item),
126
+ ),
127
+ toMatch: (pattern) =>
128
+ check(typeof actual === 'string' && (pattern instanceof RegExp ? pattern.test(actual) : actual.includes(String(pattern))),
129
+ 'to match ' + String(pattern)),
130
+ toBeGreaterThan: (n) => check(typeof actual === 'number' && actual > n, 'to be greater than ' + show(n)),
131
+ toBeLessThan: (n) => check(typeof actual === 'number' && actual < n, 'to be less than ' + show(n)),
132
+ toHaveLength: (n) => check(actual !== null && actual !== undefined && actual.length === n, 'to have length ' + show(n)),
133
+ toHaveProperty: (key, ...value) => {
134
+ const path = Array.isArray(key) ? key : String(key).split('.');
135
+ let current = actual;
136
+ let found = true;
137
+ for (const part of path) {
138
+ if (current !== null && typeof current === 'object' && part in current) current = current[part];
139
+ else { found = false; break; }
140
+ }
141
+ check(found && (value.length === 0 || deepEqual(current, value[0])),
142
+ 'to have property ' + path.join('.') + (value.length === 0 ? '' : ' equal to ' + show(value[0])));
143
+ },
144
+ };
145
+ return matchers;
146
+ };
147
+
148
+ define('expect', (actual) => {
149
+ const expectation = makeExpectation(actual, false);
150
+ Object.defineProperty(expectation, 'not', { value: makeExpectation(actual, true) });
151
+ return Object.freeze(expectation);
152
+ });
153
+
154
+ define('test', (name, check) => {
155
+ if (state.tests.length >= ${String(SCRIPT_OUTPUT_LIMITS.tests)}) {
156
+ throw new ScriptValueInvalid('A script may record at most ${String(SCRIPT_OUTPUT_LIMITS.tests)} tests');
157
+ }
158
+ try {
159
+ check();
160
+ state.tests.push({ name: String(name), passed: true });
161
+ } catch (error) {
162
+ state.tests.push({ name: String(name), passed: false, message: error instanceof Error ? error.message : show(error) });
163
+ }
164
+ });
165
+
166
+ const hasCrlf = (text) => /[\r\n\0]/.test(text);
167
+
168
+ /** A case-insensitive view of an ordered list of [name, value] pairs. */
169
+ const pairsApi = (pairs, writable, what) => {
170
+ const lower = (name) => String(name).toLowerCase();
171
+ const refuse = () => { throw new TypeError('The ' + what + ' of a sent request cannot be changed'); };
172
+ const guard = (name, value) => {
173
+ if (hasCrlf(name) || hasCrlf(value)) {
174
+ throw new ScriptValueInvalid('A ' + what + ' name or value may not hold CR, LF or NUL: "' + name + '"');
175
+ }
176
+ };
177
+ return Object.freeze({
178
+ get: (name) => { const hit = pairs.find(([n]) => lower(n) === lower(name)); return hit === undefined ? undefined : hit[1]; },
179
+ getAll: (name) => pairs.filter(([n]) => lower(n) === lower(name)).map(([, v]) => v),
180
+ has: (name) => pairs.some(([n]) => lower(n) === lower(name)),
181
+ list: () => pairs.map(([name, value]) => ({ name, value })),
182
+ toObject: () => Object.fromEntries(pairs.map(([n, v]) => [n, v])),
183
+ set: writable ? (name, value) => {
184
+ const n = String(name); const v = String(value); guard(n, v);
185
+ const at = pairs.findIndex(([x]) => lower(x) === lower(n));
186
+ for (let i = pairs.length - 1; i >= 0; i--) if (lower(pairs[i][0]) === lower(n)) pairs.splice(i, 1);
187
+ pairs.splice(at === -1 ? pairs.length : at, 0, [n, v]);
188
+ } : refuse,
189
+ add: writable ? (name, value) => { const n = String(name); const v = String(value); guard(n, v); pairs.push([n, v]); } : refuse,
190
+ delete: writable ? (name) => { for (let i = pairs.length - 1; i >= 0; i--) if (lower(pairs[i][0]) === lower(name)) pairs.splice(i, 1); } : refuse,
191
+ });
192
+ };
193
+
194
+ const deepFreeze = (value) => {
195
+ if (value !== null && typeof value === 'object' && !Object.isFrozen(value)) {
196
+ Object.freeze(value);
197
+ for (const key of Object.keys(value)) deepFreeze(value[key]);
198
+ }
199
+ return value;
200
+ };
201
+ `;
202
+ const FINISH = String.raw `
203
+ globalThis.__finish = () => ({
204
+ tests: state.tests,
205
+ values: [...state.values.entries()].map(([name, entry]) => ({ name, value: entry.value, secret: entry.secret })),
206
+ request: state.request === undefined ? undefined : state.request(),
207
+ });
208
+ `;
209
+ /**
210
+ * The prelude for one script: the common API, the protocol's `request`/`response` from its
211
+ * scripting facet, any extra layer and `__finish`.
212
+ */
213
+ export function buildPrelude(scripting, phase, api, layer = '') {
214
+ return `'use strict';\n(() => {\n${COMMON}\n${scripting.prelude(phase)}\n${api === 'postman' ? layer : ''}\n${FINISH}\n})();\n`;
215
+ }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Checks what a pre-request script changed before any of it is sent (spec §What a pre-request
3
+ * script can change; ADR-0016).
4
+ *
5
+ * The request a script hands back is untrusted input: a script can call `__finish` itself and
6
+ * return any shape. So it is parsed against its protocol's schema first, then held to the rules.
7
+ * The rules are the same for every protocol. A module says what its snapshot holds
8
+ * (`ProtocolScripting.inspect`) and this file decides, so a module cannot forget a rule:
9
+ *
10
+ * 1. the value parses against the module's `requestSchema` and keeps its `protocol`
11
+ * (`script-error`);
12
+ * 2. no single-line value holds CR, LF or NUL (`script-value-invalid`);
13
+ * 3. the destination keeps its scheme, host and port, and one that is not a URL stays exactly as it
14
+ * was (`script-origin-change`);
15
+ * 4. what the module calls fixed comes back unchanged (`script-error`);
16
+ * 5. no header or metadata pair holds CR, LF or NUL (`script-value-invalid`);
17
+ * 6. no `${secret:…}` reference appears that the request's own text did not already hold
18
+ * (`script-secret-denied`) — otherwise a script could read any secret by naming it;
19
+ * 7. the module's own rules (`validate`), when it has any.
20
+ *
21
+ * The order is fixed for every protocol, so a request that breaks two rules at once is reported the
22
+ * same way whatever its protocol. It is not quite the order of 2.x: REST used to check first that
23
+ * the method is an HTTP method, and that check now runs last, in its `validate` (spec R5).
24
+ */
25
+ import { z } from 'zod';
26
+ import type { ProtocolScripting, RequestSnapshotBase, ResponseSnapshotBase } from '../protocol/module.js';
27
+ import type { ScriptFailure } from './model.js';
28
+ /** A header or metadata pair as a script hands it back; every module's `requestSchema` uses it. */
29
+ export declare const headerPairSchema: z.ZodTuple<[z.ZodString, z.ZodString], null>;
30
+ /** The checked request a pre-request script hands back, or why it is refused. */
31
+ export type ApplyResult<Q extends RequestSnapshotBase = RequestSnapshotBase> = {
32
+ readonly ok: true;
33
+ readonly request: Q;
34
+ } | {
35
+ readonly ok: false;
36
+ readonly error: ScriptFailure;
37
+ };
38
+ /** Every `${secret:name}` that `texts` name: a module's `inspect(snapshot).texts`. */
39
+ export declare function secretReferencesIn(texts: readonly string[]): Set<string>;
40
+ /**
41
+ * The checked request a pre-request script hands back, or why it is refused. `scripting` is the
42
+ * facet of the protocol `before` belongs to.
43
+ */
44
+ export declare function applyRequestChanges<Q extends RequestSnapshotBase, R extends ResponseSnapshotBase>(scripting: ProtocolScripting<Q, R>, before: Q, returned: unknown): ApplyResult<Q>;
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Checks what a pre-request script changed before any of it is sent (spec §What a pre-request
3
+ * script can change; ADR-0016).
4
+ *
5
+ * The request a script hands back is untrusted input: a script can call `__finish` itself and
6
+ * return any shape. So it is parsed against its protocol's schema first, then held to the rules.
7
+ * The rules are the same for every protocol. A module says what its snapshot holds
8
+ * (`ProtocolScripting.inspect`) and this file decides, so a module cannot forget a rule:
9
+ *
10
+ * 1. the value parses against the module's `requestSchema` and keeps its `protocol`
11
+ * (`script-error`);
12
+ * 2. no single-line value holds CR, LF or NUL (`script-value-invalid`);
13
+ * 3. the destination keeps its scheme, host and port, and one that is not a URL stays exactly as it
14
+ * was (`script-origin-change`);
15
+ * 4. what the module calls fixed comes back unchanged (`script-error`);
16
+ * 5. no header or metadata pair holds CR, LF or NUL (`script-value-invalid`);
17
+ * 6. no `${secret:…}` reference appears that the request's own text did not already hold
18
+ * (`script-secret-denied`) — otherwise a script could read any secret by naming it;
19
+ * 7. the module's own rules (`validate`), when it has any.
20
+ *
21
+ * The order is fixed for every protocol, so a request that breaks two rules at once is reported the
22
+ * same way whatever its protocol. It is not quite the order of 2.x: REST used to check first that
23
+ * the method is an HTTP method, and that check now runs last, in its `validate` (spec R5).
24
+ */
25
+ import { z } from 'zod';
26
+ /** A header or metadata pair as a script hands it back; every module's `requestSchema` uses it. */
27
+ export const headerPairSchema = z.tuple([z.string(), z.string()]);
28
+ const CONTROL = /[\r\n\0]/;
29
+ const SECRET_OPEN = '${secret:';
30
+ const refuse = (code, message) => ({ ok: false, error: { code, message } });
31
+ /** Every `${secret:name}` that `texts` name: a module's `inspect(snapshot).texts`. */
32
+ export function secretReferencesIn(texts) {
33
+ const names = new Set();
34
+ for (const text of texts) {
35
+ addSecretNames(text, names);
36
+ }
37
+ return names;
38
+ }
39
+ /**
40
+ * Adds the name of every `${secret:name}` in `text` to `names`: the text from each `${secret:` to
41
+ * the first `}` after it. A scan rather than a regex, so text a server chose — many `${secret:`
42
+ * with no closing brace — costs linear time, never quadratic.
43
+ */
44
+ function addSecretNames(text, names) {
45
+ let from = 0;
46
+ for (;;) {
47
+ const open = text.indexOf(SECRET_OPEN, from);
48
+ if (open === -1)
49
+ return;
50
+ const start = open + SECRET_OPEN.length;
51
+ const close = text.indexOf('}', start);
52
+ // No `}` after this opening means none after any later one either.
53
+ if (close === -1)
54
+ return;
55
+ names.add(text.slice(start, close));
56
+ from = close + 1;
57
+ }
58
+ }
59
+ function badPair(pairs) {
60
+ return pairs.find(([name, value]) => CONTROL.test(name) || CONTROL.test(value))?.[0];
61
+ }
62
+ /**
63
+ * The origin of a destination that is a URL with a host; undefined for anything else. A gRPC
64
+ * `host:port` target parses as a scheme and a path with no host, and so does `localhost:8080/x`:
65
+ * neither has an origin a path could change under, so both have to stay exactly as they were.
66
+ */
67
+ function originOf(destination) {
68
+ let url;
69
+ try {
70
+ url = new URL(destination);
71
+ }
72
+ catch {
73
+ return undefined;
74
+ }
75
+ if (url.host === '')
76
+ return undefined;
77
+ // A non-special scheme (`grpc:`) has an opaque `origin` of "null"; host and port still say where
78
+ // the request goes.
79
+ return url.origin !== 'null' ? url.origin : `${url.protocol}//${url.host}`;
80
+ }
81
+ function sameDestination(before, after) {
82
+ const was = originOf(before);
83
+ return was === undefined ? before === after : was === originOf(after);
84
+ }
85
+ /**
86
+ * The checked request a pre-request script hands back, or why it is refused. `scripting` is the
87
+ * facet of the protocol `before` belongs to.
88
+ */
89
+ export function applyRequestChanges(scripting, before, returned) {
90
+ const parsed = scripting.requestSchema.safeParse(returned);
91
+ if (!parsed.success || parsed.data.protocol !== before.protocol) {
92
+ return refuse('script-error', 'The script handed back a request the engine cannot read');
93
+ }
94
+ const after = parsed.data;
95
+ const was = scripting.inspect(before);
96
+ const now = scripting.inspect(after);
97
+ if (now.lines.some((line) => CONTROL.test(line))) {
98
+ return refuse('script-value-invalid', 'A single-line value of the request may not hold CR, LF or NUL');
99
+ }
100
+ if (!sameDestination(was.destination, now.destination)) {
101
+ return refuse('script-origin-change', 'A script cannot change the scheme, host or port the request is sent to');
102
+ }
103
+ if (JSON.stringify(now.fixed) !== JSON.stringify(was.fixed)) {
104
+ return refuse('script-error', 'A script cannot change a part of the request that is fixed');
105
+ }
106
+ const pair = badPair(now.pairs);
107
+ if (pair !== undefined) {
108
+ return refuse('script-value-invalid', `The header or metadata entry "${pair}" may not hold CR, LF or NUL`);
109
+ }
110
+ const allowed = secretReferencesIn(was.texts);
111
+ const added = [...secretReferencesIn(now.texts)].filter((name) => !allowed.has(name));
112
+ if (added.length > 0) {
113
+ return refuse('script-secret-denied', `A script cannot add a reference to a secret the request does not already use: ${added.join(', ')}`);
114
+ }
115
+ const failure = scripting.validate?.(before, after);
116
+ if (failure !== undefined) {
117
+ return { ok: false, error: failure };
118
+ }
119
+ return { ok: true, request: after };
120
+ }
@@ -0,0 +1,41 @@
1
+ import type { ScriptCompletion, ScriptDiagnostic, ScriptModel, ScriptQuickInfo, ScriptSignatureHelp } from './service.js';
2
+ export type { ScriptCompletion, ScriptDiagnostic, ScriptModel, ScriptQuickInfo, ScriptSignatureHelp, } from './service.js';
3
+ /** One request to the checker worker. */
4
+ export type CheckerRequest = {
5
+ readonly op: 'check';
6
+ readonly model: ScriptModel;
7
+ } | {
8
+ readonly op: 'remove';
9
+ readonly modelId: string;
10
+ } | {
11
+ readonly op: 'diagnostics';
12
+ readonly modelId: string;
13
+ readonly model: ScriptModel;
14
+ } | {
15
+ readonly op: 'completions' | 'quickInfo' | 'signatureHelp';
16
+ readonly modelId: string;
17
+ readonly model: ScriptModel;
18
+ readonly line: number;
19
+ readonly column: number;
20
+ };
21
+ /** How long one request may take, a fresh worker's start-up included. */
22
+ export declare const CHECK_DEADLINE_MS = 20000;
23
+ export interface ScriptCheckerOptions {
24
+ readonly deadlineMs?: number;
25
+ readonly workerUrl?: URL;
26
+ }
27
+ export interface ScriptChecker {
28
+ /** Checks a script once, keeping no model. */
29
+ check(model: ScriptModel): Promise<readonly ScriptDiagnostic[]>;
30
+ diagnostics(modelId: string, model: ScriptModel): Promise<readonly ScriptDiagnostic[]>;
31
+ completions(modelId: string, model: ScriptModel, line: number, column: number): Promise<readonly ScriptCompletion[]>;
32
+ quickInfo(modelId: string, model: ScriptModel, line: number, column: number): Promise<ScriptQuickInfo | undefined>;
33
+ signatureHelp(modelId: string, model: ScriptModel, line: number, column: number): Promise<ScriptSignatureHelp | undefined>;
34
+ /** Drops a model the editor closed. */
35
+ remove(modelId: string): Promise<void>;
36
+ dispose(): Promise<void>;
37
+ }
38
+ /** Thrown by a checker request that could not be answered (overrun, a stopped checker, a crash). */
39
+ export declare class ScriptCheckerError extends Error {
40
+ }
41
+ export declare function createScriptChecker(options?: ScriptCheckerOptions): ScriptChecker;
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Script type-checking and editor help off the calling thread (spec §Type-checking).
3
+ *
4
+ * The TypeScript language service is heavy, so it runs on one long-lived worker, one request at a
5
+ * time, each with a deadline. A worker that overruns is terminated and replaced, and the request
6
+ * fails. Every request that concerns a model carries the model, so a replaced worker loses nothing:
7
+ * the next request rebuilds it. The pattern is the sandbox host's (`../sandbox/host.ts`).
8
+ */
9
+ import { existsSync } from 'node:fs';
10
+ import { fileURLToPath } from 'node:url';
11
+ import { Worker } from 'node:worker_threads';
12
+ /** How long one request may take, a fresh worker's start-up included. */
13
+ export const CHECK_DEADLINE_MS = 20_000;
14
+ const QUEUE_LIMIT = 64;
15
+ /** Thrown by a checker request that could not be answered (overrun, a stopped checker, a crash). */
16
+ export class ScriptCheckerError extends Error {
17
+ }
18
+ function defaultWorkerUrl() {
19
+ const sibling = new URL('./worker.js', import.meta.url);
20
+ if (existsSync(fileURLToPath(sibling))) {
21
+ return sibling;
22
+ }
23
+ const fallback = import.meta.url.replace(/\/src\/script\/check\/host\.ts$/, '/dist/script/check/worker.js');
24
+ /* v8 ignore next 3 -- only reachable when the engine package has never been built */
25
+ if (fallback === import.meta.url) {
26
+ throw new Error('script checker worker not found: build the engine package first');
27
+ }
28
+ return new URL(fallback);
29
+ }
30
+ export function createScriptChecker(options = {}) {
31
+ const deadlineMs = options.deadlineMs ?? CHECK_DEADLINE_MS;
32
+ let url = options.workerUrl;
33
+ let worker;
34
+ let disposed = false;
35
+ let nextId = 0;
36
+ let current;
37
+ let timer;
38
+ const queue = [];
39
+ const settle = (outcome) => {
40
+ const job = current;
41
+ if (job === undefined)
42
+ return;
43
+ current = undefined;
44
+ if (timer !== undefined)
45
+ clearTimeout(timer);
46
+ timer = undefined;
47
+ if ('error' in outcome)
48
+ job.reject(new ScriptCheckerError(outcome.error));
49
+ else
50
+ job.resolve(outcome.result);
51
+ pump();
52
+ };
53
+ const discard = () => {
54
+ const dead = worker;
55
+ worker = undefined;
56
+ if (dead !== undefined) {
57
+ dead.removeAllListeners();
58
+ dead.on('error', () => undefined);
59
+ void dead.terminate();
60
+ }
61
+ };
62
+ const spawn = () => {
63
+ url ??= defaultWorkerUrl();
64
+ const next = new Worker(url);
65
+ next.unref();
66
+ next.on('message', (answer) => {
67
+ if (current?.id !== answer.id)
68
+ return;
69
+ settle(answer.error !== undefined ? { error: answer.error } : { result: answer.result });
70
+ });
71
+ const broken = (why) => {
72
+ if (worker !== next)
73
+ return;
74
+ discard();
75
+ settle({ error: why });
76
+ };
77
+ next.on('error', (error) => broken(`The checker stopped: ${error instanceof Error ? error.message : String(error)}`));
78
+ next.on('exit', () => broken('The checker stopped unexpectedly'));
79
+ return next;
80
+ };
81
+ function pump() {
82
+ if (current !== undefined || disposed)
83
+ return;
84
+ const job = queue.shift();
85
+ if (job === undefined)
86
+ return;
87
+ current = job;
88
+ try {
89
+ worker ??= spawn();
90
+ worker.postMessage({ id: job.id, request: job.request });
91
+ }
92
+ catch (error) {
93
+ discard();
94
+ settle({ error: `The checker could not start: ${error instanceof Error ? error.message : String(error)}` });
95
+ return;
96
+ }
97
+ timer = setTimeout(() => {
98
+ discard();
99
+ settle({ error: `The check took longer than ${String(deadlineMs)} ms` });
100
+ }, deadlineMs);
101
+ timer.unref?.();
102
+ }
103
+ const send = (request) => {
104
+ if (disposed)
105
+ return Promise.reject(new ScriptCheckerError('The checker was stopped'));
106
+ if (queue.length >= QUEUE_LIMIT)
107
+ return Promise.reject(new ScriptCheckerError('Too many checks waiting'));
108
+ return new Promise((resolve, reject) => {
109
+ nextId += 1;
110
+ queue.push({ id: nextId, request, resolve: resolve, reject });
111
+ pump();
112
+ });
113
+ };
114
+ return {
115
+ check: (model) => send({ op: 'check', model }),
116
+ diagnostics: (modelId, model) => send({ op: 'diagnostics', modelId, model }),
117
+ completions: (modelId, model, line, column) => send({ op: 'completions', modelId, model, line, column }),
118
+ quickInfo: async (modelId, model, line, column) => (await send({ op: 'quickInfo', modelId, model, line, column })) ?? undefined,
119
+ signatureHelp: async (modelId, model, line, column) => (await send({ op: 'signatureHelp', modelId, model, line, column })) ?? undefined,
120
+ remove: async (modelId) => {
121
+ await send({ op: 'remove', modelId });
122
+ },
123
+ async dispose() {
124
+ if (disposed)
125
+ return;
126
+ disposed = true;
127
+ const dead = worker;
128
+ worker = undefined;
129
+ if (timer !== undefined)
130
+ clearTimeout(timer);
131
+ timer = undefined;
132
+ const waiting = [...(current !== undefined ? [current] : []), ...queue.splice(0)];
133
+ current = undefined;
134
+ for (const job of waiting)
135
+ job.reject(new ScriptCheckerError('The checker was stopped'));
136
+ if (dead !== undefined) {
137
+ dead.removeAllListeners();
138
+ dead.on('error', () => undefined);
139
+ await dead.terminate();
140
+ }
141
+ },
142
+ };
143
+ }
@@ -0,0 +1,52 @@
1
+ import ts from 'typescript';
2
+ import type { ScriptApi } from '../model.js';
3
+ /** Most script models kept at once. */
4
+ export declare const MAX_MODELS = 32;
5
+ export interface ScriptDiagnostic {
6
+ /** 1-based. */
7
+ readonly line: number;
8
+ /** 1-based. */
9
+ readonly column: number;
10
+ readonly endLine: number;
11
+ readonly endColumn: number;
12
+ readonly message: string;
13
+ readonly code: number;
14
+ readonly severity: 'error' | 'warning';
15
+ }
16
+ export interface ScriptCompletion {
17
+ readonly name: string;
18
+ readonly kind: string;
19
+ readonly detail?: string;
20
+ }
21
+ export interface ScriptQuickInfo {
22
+ readonly text: string;
23
+ readonly documentation?: string;
24
+ }
25
+ export interface ScriptSignatureHelp {
26
+ readonly label: string;
27
+ readonly parameters: readonly string[];
28
+ readonly activeParameter: number;
29
+ readonly documentation?: string;
30
+ }
31
+ /** What a model holds: the script and the declarations it is checked against. */
32
+ export interface ScriptModel {
33
+ readonly source: string;
34
+ readonly declarations: string;
35
+ readonly api: ScriptApi;
36
+ }
37
+ export declare const COMPILER_OPTIONS: ts.CompilerOptions;
38
+ /** Sets a model's text, creating its service if it is new. */
39
+ export declare function updateModel(id: string, model: ScriptModel): void;
40
+ export declare function removeModel(id: string): void;
41
+ /**
42
+ * The script's diagnostics. A Postman script (JavaScript) gets only its syntax errors; a typed one
43
+ * gets syntax and type errors. Errors in the declarations themselves are not the script's and are
44
+ * left out.
45
+ */
46
+ export declare function diagnosticsOf(id: string): ScriptDiagnostic[];
47
+ /** Completions at a 1-based position, at most 200. */
48
+ export declare function completionsAt(id: string, line: number, column: number): ScriptCompletion[];
49
+ export declare function quickInfoAt(id: string, line: number, column: number): ScriptQuickInfo | undefined;
50
+ export declare function signatureHelpAt(id: string, line: number, column: number): ScriptSignatureHelp | undefined;
51
+ /** One-shot check of a script against declarations, without keeping a model. */
52
+ export declare function checkOnce(model: ScriptModel): ScriptDiagnostic[];