@toa.io/extensions.exposition 1.0.0-alpha.284 → 1.0.0-alpha.286

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 (620) hide show
  1. package/components/exposition.octets/operations/delete.js +1 -1
  2. package/components/exposition.octets/operations/get.js +5 -2
  3. package/components/exposition.octets/operations/head.js +1 -1
  4. package/components/exposition.octets/operations/put.js +29 -37
  5. package/components/exposition.octets/types/toa.d.ts +1 -1
  6. package/components/identity.bans/manifest.toa.yaml +12 -13
  7. package/components/identity.bans/migrations/0001-system-properties.yaml +14 -0
  8. package/components/identity.bans/operations/transit.js +1 -1
  9. package/components/identity.bans/source/transit.ts +1 -1
  10. package/components/identity.bans/tsconfig.tsbuildinfo +1 -1
  11. package/components/identity.bans/types/toa.d.ts +5 -5
  12. package/components/identity.basic/events/principal.js +3 -1
  13. package/components/identity.basic/manifest.toa.yaml +17 -23
  14. package/components/identity.basic/migrations/0001-system-properties.yaml +14 -0
  15. package/components/identity.basic/migrations/0002-indexes.yaml +13 -0
  16. package/components/identity.basic/operations/add.js +1 -1
  17. package/components/identity.basic/operations/authenticate.js +2 -2
  18. package/components/identity.basic/operations/check.js +4 -2
  19. package/components/identity.basic/operations/delete.js +1 -1
  20. package/components/identity.basic/operations/incept.js +1 -1
  21. package/components/identity.basic/operations/info.js +1 -1
  22. package/components/identity.basic/operations/lib/credentials.js +1 -1
  23. package/components/identity.basic/operations/transit.js +7 -8
  24. package/components/identity.basic/source/add.ts +5 -2
  25. package/components/identity.basic/source/authenticate.ts +11 -13
  26. package/components/identity.basic/source/check.ts +9 -6
  27. package/components/identity.basic/source/delete.ts +4 -1
  28. package/components/identity.basic/source/incept.ts +13 -10
  29. package/components/identity.basic/source/info.ts +4 -1
  30. package/components/identity.basic/source/lib/credentials.ts +2 -3
  31. package/components/identity.basic/source/transit.ts +27 -21
  32. package/components/identity.basic/tsconfig.tsbuildinfo +1 -1
  33. package/components/identity.basic/types/index.d.ts +7 -3
  34. package/components/identity.basic/types/toa.d.ts +5 -5
  35. package/components/identity.clients/manifest.toa.yaml +36 -40
  36. package/components/identity.clients/migrations/0001-system-properties.yaml +14 -0
  37. package/components/identity.clients/migrations/0002-indexes.yaml +4 -0
  38. package/components/identity.clients/operations/describe.js +1 -1
  39. package/components/identity.clients/operations/lib/canonical.js +1 -1
  40. package/components/identity.clients/operations/lib/cimd.js +3 -2
  41. package/components/identity.clients/operations/lib/redirect.js +7 -4
  42. package/components/identity.clients/operations/register.js +2 -2
  43. package/components/identity.clients/source/describe.ts +6 -8
  44. package/components/identity.clients/source/lib/Context.ts +6 -3
  45. package/components/identity.clients/source/lib/Entity.ts +1 -1
  46. package/components/identity.clients/source/lib/canonical.ts +1 -1
  47. package/components/identity.clients/source/lib/cimd.test.ts +8 -6
  48. package/components/identity.clients/source/lib/cimd.ts +24 -19
  49. package/components/identity.clients/source/lib/redirect.test.ts +8 -2
  50. package/components/identity.clients/source/lib/redirect.ts +12 -8
  51. package/components/identity.clients/source/register.ts +18 -18
  52. package/components/identity.clients/tsconfig.tsbuildinfo +1 -1
  53. package/components/identity.clients/types/toa.d.ts +5 -5
  54. package/components/identity.credentials/manifest.toa.yaml +4 -4
  55. package/components/identity.credentials/operations/list.js +8 -4
  56. package/components/identity.credentials/source/list.test.ts +39 -20
  57. package/components/identity.credentials/source/list.ts +12 -8
  58. package/components/identity.credentials/tsconfig.tsbuildinfo +1 -1
  59. package/components/identity.credentials/types/toa.d.ts +2 -2
  60. package/components/identity.federation/manifest.toa.yaml +23 -32
  61. package/components/identity.federation/migrations/0001-system-properties.yaml +14 -0
  62. package/components/identity.federation/migrations/0002-indexes.yaml +25 -0
  63. package/components/identity.federation/operations/authenticate.js +4 -2
  64. package/components/identity.federation/operations/create.js +2 -2
  65. package/components/identity.federation/operations/decode.js +1 -1
  66. package/components/identity.federation/operations/delete.js +1 -1
  67. package/components/identity.federation/operations/incept.js +1 -1
  68. package/components/identity.federation/operations/lib/decode.js +1 -1
  69. package/components/identity.federation/operations/lib/discovery.js +2 -2
  70. package/components/identity.federation/operations/lib/exchange.js +8 -4
  71. package/components/identity.federation/operations/lib/principal.js +1 -1
  72. package/components/identity.federation/operations/lib/resolve.js +1 -1
  73. package/components/identity.federation/operations/list.js +2 -2
  74. package/components/identity.federation/source/authenticate.ts +19 -17
  75. package/components/identity.federation/source/create.ts +6 -7
  76. package/components/identity.federation/source/decode.ts +4 -1
  77. package/components/identity.federation/source/delete.ts +4 -1
  78. package/components/identity.federation/source/incept.ts +2 -3
  79. package/components/identity.federation/source/lib/decode.ts +4 -7
  80. package/components/identity.federation/source/lib/discovery.test.ts +15 -5
  81. package/components/identity.federation/source/lib/discovery.ts +10 -9
  82. package/components/identity.federation/source/lib/exchange.ts +18 -15
  83. package/components/identity.federation/source/lib/jose.d.ts +1 -1
  84. package/components/identity.federation/source/lib/principal.ts +5 -3
  85. package/components/identity.federation/source/lib/resolve.ts +5 -1
  86. package/components/identity.federation/source/list.test.ts +26 -10
  87. package/components/identity.federation/source/list.ts +5 -2
  88. package/components/identity.federation/source/types/context.ts +5 -2
  89. package/components/identity.federation/source/types/entity.ts +2 -2
  90. package/components/identity.federation/tsconfig.tsbuildinfo +1 -1
  91. package/components/identity.federation/types/toa.d.ts +5 -5
  92. package/components/identity.grants/manifest.toa.yaml +27 -31
  93. package/components/identity.grants/migrations/0001-system-properties.yaml +14 -0
  94. package/components/identity.grants/migrations/0002-indexes.yaml +5 -0
  95. package/components/identity.grants/operations/authorize.js +1 -1
  96. package/components/identity.grants/operations/exchange.js +5 -2
  97. package/components/identity.grants/operations/lib/code.js +1 -1
  98. package/components/identity.grants/operations/lib/identify.js +1 -1
  99. package/components/identity.grants/operations/list.js +1 -1
  100. package/components/identity.grants/operations/revoke.js +3 -2
  101. package/components/identity.grants/source/authorize.ts +27 -19
  102. package/components/identity.grants/source/exchange.ts +15 -11
  103. package/components/identity.grants/source/lib/code.ts +20 -8
  104. package/components/identity.grants/source/lib/identify.ts +1 -1
  105. package/components/identity.grants/source/list.ts +2 -2
  106. package/components/identity.grants/source/revoke.ts +9 -7
  107. package/components/identity.grants/tsconfig.tsbuildinfo +1 -1
  108. package/components/identity.grants/types/index.d.ts +3 -3
  109. package/components/identity.grants/types/toa.d.ts +5 -5
  110. package/components/identity.keys/manifest.toa.yaml +18 -23
  111. package/components/identity.keys/migrations/0001-system-properties.yaml +14 -0
  112. package/components/identity.keys/migrations/0002-indexes.yaml +4 -0
  113. package/components/identity.keys/operations/create.js +1 -1
  114. package/components/identity.keys/operations/disable.js +1 -1
  115. package/components/identity.keys/operations/revoke.js +1 -1
  116. package/components/identity.keys/source/create.ts +2 -3
  117. package/components/identity.keys/source/disable.ts +1 -1
  118. package/components/identity.keys/source/revoke.ts +2 -2
  119. package/components/identity.keys/tsconfig.tsbuildinfo +1 -1
  120. package/components/identity.keys/types/toa.d.ts +5 -5
  121. package/components/identity.otp/manifest.toa.yaml +16 -24
  122. package/components/identity.otp/migrations/0001-system-properties.yaml +14 -0
  123. package/components/identity.otp/migrations/0002-indexes.yaml +5 -0
  124. package/components/identity.otp/operations/authenticate.js +1 -1
  125. package/components/identity.otp/operations/issue.js +1 -1
  126. package/components/identity.otp/source/authenticate.ts +4 -7
  127. package/components/identity.otp/source/issue.ts +1 -1
  128. package/components/identity.otp/source/lib/Context.ts +1 -1
  129. package/components/identity.otp/tsconfig.tsbuildinfo +1 -1
  130. package/components/identity.otp/types/toa.d.ts +5 -5
  131. package/components/identity.passkeys/manifest.toa.yaml +45 -53
  132. package/components/identity.passkeys/migrations/0001-system-properties.yaml +14 -0
  133. package/components/identity.passkeys/migrations/0002-indexes.yaml +11 -0
  134. package/components/identity.passkeys/operations/authenticate.js +1 -1
  135. package/components/identity.passkeys/operations/challenge.js +6 -3
  136. package/components/identity.passkeys/operations/create.js +1 -1
  137. package/components/identity.passkeys/operations/delete.js +1 -1
  138. package/components/identity.passkeys/operations/list.js +1 -1
  139. package/components/identity.passkeys/operations/use.js +1 -1
  140. package/components/identity.passkeys/source/authenticate.ts +3 -4
  141. package/components/identity.passkeys/source/challenge.ts +29 -25
  142. package/components/identity.passkeys/source/create.ts +8 -6
  143. package/components/identity.passkeys/source/delete.ts +4 -1
  144. package/components/identity.passkeys/source/list.ts +4 -1
  145. package/components/identity.passkeys/source/types/Context.ts +1 -1
  146. package/components/identity.passkeys/source/use.ts +12 -10
  147. package/components/identity.passkeys/tsconfig.tsbuildinfo +1 -1
  148. package/components/identity.passkeys/types/toa.d.ts +5 -5
  149. package/components/identity.roles/manifest.toa.yaml +12 -16
  150. package/components/identity.roles/migrations/0001-system-properties.yaml +14 -0
  151. package/components/identity.roles/migrations/0002-indexes.yaml +8 -0
  152. package/components/identity.roles/operations/grant.js +1 -1
  153. package/components/identity.roles/operations/list.js +1 -1
  154. package/components/identity.roles/operations/principal.js +2 -2
  155. package/components/identity.roles/source/grant.ts +7 -6
  156. package/components/identity.roles/source/list.ts +1 -1
  157. package/components/identity.roles/source/principal.ts +5 -7
  158. package/components/identity.roles/tsconfig.tsbuildinfo +1 -1
  159. package/components/identity.roles/types/toa.d.ts +5 -5
  160. package/components/identity.tokens/manifest.toa.yaml +17 -15
  161. package/components/identity.tokens/migrations/0001-system-properties.yaml +14 -0
  162. package/components/identity.tokens/operations/authenticate.js +2 -2
  163. package/components/identity.tokens/operations/decrypt.js +11 -5
  164. package/components/identity.tokens/operations/encrypt.js +2 -2
  165. package/components/identity.tokens/operations/issue.js +2 -4
  166. package/components/identity.tokens/operations/lib/form.js +1 -1
  167. package/components/identity.tokens/operations/lib/key.js +1 -1
  168. package/components/identity.tokens/operations/revoke.js +1 -1
  169. package/components/identity.tokens/source/authenticate.test.ts +22 -16
  170. package/components/identity.tokens/source/authenticate.ts +7 -10
  171. package/components/identity.tokens/source/decrypt.test.ts +62 -29
  172. package/components/identity.tokens/source/decrypt.ts +30 -27
  173. package/components/identity.tokens/source/encrypt.test.ts +21 -16
  174. package/components/identity.tokens/source/encrypt.ts +8 -11
  175. package/components/identity.tokens/source/issue.test.ts +4 -2
  176. package/components/identity.tokens/source/issue.ts +6 -8
  177. package/components/identity.tokens/source/lib/form.ts +5 -9
  178. package/components/identity.tokens/source/lib/jose.d.ts +1 -1
  179. package/components/identity.tokens/source/lib/key.ts +1 -1
  180. package/components/identity.tokens/source/lib/paseto.test.ts +17 -6
  181. package/components/identity.tokens/source/revoke.ts +1 -1
  182. package/components/identity.tokens/tsconfig.tsbuildinfo +1 -1
  183. package/components/identity.tokens/types/index.d.ts +13 -4
  184. package/components/identity.tokens/types/toa.d.ts +5 -5
  185. package/context.toa.yaml +2 -2
  186. package/cucumber.mjs +3 -0
  187. package/documentation/access.md +4 -3
  188. package/documentation/cache.md +17 -3
  189. package/documentation/components.md +2 -2
  190. package/documentation/credentials.md +2 -2
  191. package/documentation/identity.md +7 -9
  192. package/documentation/map.md +2 -2
  193. package/documentation/mcp.md +23 -17
  194. package/documentation/notes/peers.md +1 -1
  195. package/documentation/notes/throttling.md +1 -1
  196. package/documentation/octets.md +4 -4
  197. package/documentation/protocol.md +3 -3
  198. package/documentation/query.md +14 -8
  199. package/documentation/rpc.md +45 -31
  200. package/documentation/tracing.md +3 -3
  201. package/documentation/tree.md +1 -1
  202. package/features/auth.assert.feature +2 -2
  203. package/features/auth.bearer.feature +1 -1
  204. package/features/auth.claims.feature +5 -5
  205. package/features/auth.incept.feature +2 -2
  206. package/features/authorities.federation.feature +1 -1
  207. package/features/configuration.feature +3 -4
  208. package/features/credentials.feature +9 -9
  209. package/features/dev.feature +1 -0
  210. package/features/dynamic.feature +1 -0
  211. package/features/errors.feature +21 -0
  212. package/features/etag.feature +0 -86
  213. package/features/identity.bans.feature +3 -3
  214. package/features/identity.basic.feature +9 -9
  215. package/features/identity.federation.feature +11 -11
  216. package/features/identity.tokens.custom.feature +5 -5
  217. package/features/identity.tokens.feature +2 -2
  218. package/features/interruptions.feature +1 -0
  219. package/features/introspection.map.feature +4 -4
  220. package/features/io.throttle.feature +1 -0
  221. package/features/map.feature +2 -2
  222. package/features/mcp.feature +32 -28
  223. package/features/oauth.grants.feature +1 -1
  224. package/features/octets.cloudinary.feature +1 -1
  225. package/features/octets.download.feature +1 -0
  226. package/features/require.feature +1 -2
  227. package/features/rpc.feature +21 -21
  228. package/features/steps/Captures.ts +1 -1
  229. package/features/steps/Cloudinary.ts +1 -2
  230. package/features/steps/Common.ts +4 -5
  231. package/features/steps/Components.ts +17 -12
  232. package/features/steps/Database.ts +42 -23
  233. package/features/steps/Gateway.ts +55 -71
  234. package/features/steps/HTTP.ts +12 -15
  235. package/features/steps/IDP.ts +118 -94
  236. package/features/steps/Identity.ts +3 -3
  237. package/features/steps/OTP.ts +3 -3
  238. package/features/steps/Parameters.ts +20 -10
  239. package/features/steps/Probe.ts +9 -7
  240. package/features/steps/Realtime.ts +40 -22
  241. package/features/steps/Workspace.ts +10 -7
  242. package/features/steps/components/audit/operations/record.js +1 -1
  243. package/features/steps/components/echo/operations/affect.js +1 -1
  244. package/features/steps/components/echo/operations/compute.js +1 -1
  245. package/features/steps/components/echo/operations/echo.js +1 -1
  246. package/features/steps/components/echo/operations/error.js +1 -1
  247. package/features/steps/components/echo/operations/identity.js +1 -1
  248. package/features/steps/components/echo/operations/parameters.js +1 -1
  249. package/features/steps/components/echo/operations/ping.js +1 -1
  250. package/features/steps/components/echo/operations/unwrap.js +1 -1
  251. package/features/steps/components/greeter/operations/greet.js +1 -1
  252. package/features/steps/components/notify/operations/send.js +1 -1
  253. package/features/steps/components/octets.tester/operations/authority.js +1 -1
  254. package/features/steps/components/octets.tester/operations/bar.js +1 -1
  255. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  256. package/features/steps/components/octets.tester/operations/concat.js +1 -1
  257. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  258. package/features/steps/components/octets.tester/operations/err.js +1 -1
  259. package/features/steps/components/octets.tester/operations/foo.js +1 -1
  260. package/features/steps/components/octets.tester/operations/id.js +1 -1
  261. package/features/steps/components/octets.tester/operations/identity.js +1 -1
  262. package/features/steps/components/octets.tester/operations/redirect.js +6 -4
  263. package/features/steps/components/octets.tester/operations/yex.js +1 -1
  264. package/features/steps/components/octets.tester/operations/yield.js +1 -1
  265. package/features/steps/components/orders/manifest.toa.yaml +10 -12
  266. package/features/steps/components/orders/operations/create.js +4 -2
  267. package/features/steps/components/pots/manifest.toa.yaml +15 -20
  268. package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
  269. package/features/steps/components/pricing/operations/quote.js +1 -1
  270. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  271. package/features/steps/components/sequences/operations/numbers.js +1 -1
  272. package/features/steps/components/sequences/operations/tokens.js +3 -3
  273. package/features/steps/components/users/manifest.toa.yaml +3 -5
  274. package/features/steps/components/users/operations/create.js +1 -1
  275. package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
  276. package/features/steps/map.ts +2 -2
  277. package/features/timestamps.feature +1 -1
  278. package/package.json +7 -7
  279. package/readme.md +11 -11
  280. package/schemas/annotation.cos.yaml +1 -3
  281. package/schemas/method.cos.yaml +2 -0
  282. package/source/Branch.test.ts +2 -2
  283. package/source/Branch.ts +3 -5
  284. package/source/Composition.ts +5 -5
  285. package/source/Directive.test.ts +38 -20
  286. package/source/Directive.ts +61 -47
  287. package/source/Endpoint.test.ts +1 -1
  288. package/source/Endpoint.ts +27 -92
  289. package/source/Factory.ts +26 -12
  290. package/source/Gateway.ts +87 -76
  291. package/source/HTTP/Context.ts +23 -30
  292. package/source/HTTP/Probe.ts +7 -9
  293. package/source/HTTP/Server.ts +88 -69
  294. package/source/HTTP/Timing.ts +6 -21
  295. package/source/HTTP/address.test.ts +8 -2
  296. package/source/HTTP/address.ts +2 -3
  297. package/source/HTTP/exceptions.ts +20 -18
  298. package/source/HTTP/formats/form.ts +1 -1
  299. package/source/HTTP/formats/json.ts +2 -2
  300. package/source/HTTP/formats/msgpack.ts +3 -4
  301. package/source/HTTP/formats/text.ts +2 -2
  302. package/source/HTTP/formats/yaml.test.ts +4 -1
  303. package/source/HTTP/formats/yaml.ts +14 -11
  304. package/source/HTTP/messages.test.ts +38 -28
  305. package/source/HTTP/messages.ts +44 -98
  306. package/source/Interception.ts +3 -4
  307. package/source/Introspection.ts +29 -14
  308. package/source/MCP/Server.ts +114 -54
  309. package/source/MCP/discover.ts +6 -7
  310. package/source/MCP/errors.ts +7 -8
  311. package/source/MCP/schema.test.ts +9 -3
  312. package/source/MCP/schema.ts +12 -16
  313. package/source/MCP/tools.ts +33 -27
  314. package/source/MCP/types.ts +4 -1
  315. package/source/Mapping.ts +25 -27
  316. package/source/Query.ts +58 -44
  317. package/source/RPC/Context.ts +8 -11
  318. package/source/RPC/Dispatcher.ts +46 -26
  319. package/source/RPC/errors.test.ts +41 -16
  320. package/source/RPC/errors.ts +9 -10
  321. package/source/RPC/names.test.ts +51 -32
  322. package/source/RPC/names.ts +26 -32
  323. package/source/RTD/Directives.ts +21 -10
  324. package/source/RTD/Endpoint.ts +4 -1
  325. package/source/RTD/Method.ts +8 -6
  326. package/source/RTD/Node.ts +32 -34
  327. package/source/RTD/Route.ts +18 -21
  328. package/source/RTD/Tree.ts +18 -18
  329. package/source/RTD/factory.ts +13 -16
  330. package/source/RTD/segment.ts +12 -10
  331. package/source/RTD/syntax/parse.test.ts +12 -6
  332. package/source/RTD/syntax/parse.ts +30 -26
  333. package/source/RTD/syntax/types.ts +17 -1
  334. package/source/RTD/walk.test.ts +64 -27
  335. package/source/Remotes.test.ts +25 -4
  336. package/source/Remotes.ts +9 -4
  337. package/source/Tenant.ts +12 -12
  338. package/source/deployment.ts +20 -20
  339. package/source/directives/auth/Anonymous.test.ts +8 -2
  340. package/source/directives/auth/Anonymous.ts +5 -8
  341. package/source/directives/auth/Anyone.ts +3 -3
  342. package/source/directives/auth/Assert.ts +10 -10
  343. package/source/directives/auth/Authorization.ts +83 -69
  344. package/source/directives/auth/Delegate.test.ts +2 -2
  345. package/source/directives/auth/Delegate.ts +8 -10
  346. package/source/directives/auth/Echo.ts +5 -8
  347. package/source/directives/auth/Federation.ts +30 -21
  348. package/source/directives/auth/Id.ts +7 -4
  349. package/source/directives/auth/Incept.ts +32 -26
  350. package/source/directives/auth/Input.ts +36 -20
  351. package/source/directives/auth/Role.test.ts +49 -23
  352. package/source/directives/auth/Role.ts +29 -22
  353. package/source/directives/auth/Rule.ts +13 -8
  354. package/source/directives/auth/Scheme.ts +7 -7
  355. package/source/directives/auth/create.ts +1 -1
  356. package/source/directives/auth/schemes.ts +1 -1
  357. package/source/directives/auth/split.ts +2 -3
  358. package/source/directives/auth/types.ts +5 -2
  359. package/source/directives/cache/Cache.ts +44 -9
  360. package/source/directives/cache/Control.ts +25 -26
  361. package/source/directives/cache/Exact.ts +1 -1
  362. package/source/directives/cache/etag.ts +38 -0
  363. package/source/directives/cors/CORS.ts +9 -7
  364. package/source/directives/dev/Development.ts +3 -4
  365. package/source/directives/dev/Faulty.ts +11 -6
  366. package/source/directives/dev/Sleep.ts +5 -7
  367. package/source/directives/dev/Stub.ts +2 -2
  368. package/source/directives/dev/Throw.ts +2 -2
  369. package/source/directives/flow/Compose.ts +26 -20
  370. package/source/directives/flow/Fetch.ts +15 -15
  371. package/source/directives/flow/Flow.ts +9 -8
  372. package/source/directives/index.ts +11 -2
  373. package/source/directives/io/IO.ts +29 -20
  374. package/source/directives/io/Input.ts +9 -12
  375. package/source/directives/io/Output.ts +20 -23
  376. package/source/directives/io/Status.test.ts +12 -8
  377. package/source/directives/io/Status.ts +9 -8
  378. package/source/directives/io/Throttle.ts +6 -7
  379. package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
  380. package/source/directives/io/lib/throttle/Configuration.ts +14 -9
  381. package/source/directives/io/lib/throttle/Keys.ts +15 -10
  382. package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
  383. package/source/directives/io/lib/throttle/Quotas.ts +20 -26
  384. package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
  385. package/source/directives/io/lib/throttle/Sync.ts +9 -12
  386. package/source/directives/io/lib/throttle/Warning.ts +3 -4
  387. package/source/directives/io/lib/throttle/components/IP.ts +4 -5
  388. package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
  389. package/source/directives/io/lib/throttle/components/Path.ts +1 -1
  390. package/source/directives/io/lib/throttle/components/Route.ts +2 -2
  391. package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
  392. package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
  393. package/source/directives/io/schemas.test.ts +12 -6
  394. package/source/directives/map/Authority.ts +2 -2
  395. package/source/directives/map/Buffer.ts +2 -2
  396. package/source/directives/map/Claims.ts +25 -20
  397. package/source/directives/map/Headers.ts +17 -13
  398. package/source/directives/map/Language.ts +8 -5
  399. package/source/directives/map/Languages.ts +9 -3
  400. package/source/directives/map/Map.ts +25 -12
  401. package/source/directives/map/Mapping.ts +9 -6
  402. package/source/directives/map/Properties.ts +1 -1
  403. package/source/directives/map/Segments.ts +22 -15
  404. package/source/directives/mcp/MCP.ts +14 -5
  405. package/source/directives/mcp/Tool.test.ts +42 -6
  406. package/source/directives/mcp/Tool.ts +38 -7
  407. package/source/directives/oauth/Discovery.ts +7 -11
  408. package/source/directives/oauth/documents.ts +11 -14
  409. package/source/directives/octets/Context.ts +6 -3
  410. package/source/directives/octets/Delete.ts +33 -25
  411. package/source/directives/octets/Directive.ts +5 -1
  412. package/source/directives/octets/Get.ts +13 -21
  413. package/source/directives/octets/Octets.ts +20 -15
  414. package/source/directives/octets/Put.ts +62 -27
  415. package/source/directives/octets/Workflow.ts +18 -12
  416. package/source/directives/octets/bytes.ts +1 -1
  417. package/source/directives/octets/schemas.test.ts +8 -14
  418. package/source/directives/octets/workflows/Execution.ts +19 -21
  419. package/source/directives/octets/workflows/Workflow.ts +10 -7
  420. package/source/directives/require/Headers.ts +3 -4
  421. package/source/directives/require/Require.ts +3 -4
  422. package/source/exceptions.ts +19 -12
  423. package/source/index.ts +1 -1
  424. package/source/manifest.test.ts +4 -1
  425. package/source/manifest.ts +19 -13
  426. package/source/octets.d.ts +1 -1
  427. package/source/root.ts +3 -2
  428. package/source/schemas.test.ts +17 -3
  429. package/transpiled/Branch.js.map +1 -1
  430. package/transpiled/Composition.js.map +1 -1
  431. package/transpiled/Directive.js +6 -2
  432. package/transpiled/Directive.js.map +1 -1
  433. package/transpiled/Endpoint.d.ts +0 -2
  434. package/transpiled/Endpoint.js +11 -52
  435. package/transpiled/Endpoint.js.map +1 -1
  436. package/transpiled/Factory.d.ts +2 -1
  437. package/transpiled/Factory.js +1 -0
  438. package/transpiled/Factory.js.map +1 -1
  439. package/transpiled/Gateway.d.ts +2 -1
  440. package/transpiled/Gateway.js +24 -15
  441. package/transpiled/Gateway.js.map +1 -1
  442. package/transpiled/HTTP/Context.d.ts +0 -3
  443. package/transpiled/HTTP/Context.js +7 -9
  444. package/transpiled/HTTP/Context.js.map +1 -1
  445. package/transpiled/HTTP/Probe.js.map +1 -1
  446. package/transpiled/HTTP/Server.js +19 -4
  447. package/transpiled/HTTP/Server.js.map +1 -1
  448. package/transpiled/HTTP/Timing.d.ts +1 -2
  449. package/transpiled/HTTP/Timing.js +2 -10
  450. package/transpiled/HTTP/Timing.js.map +1 -1
  451. package/transpiled/HTTP/address.js.map +1 -1
  452. package/transpiled/HTTP/exceptions.js.map +1 -1
  453. package/transpiled/HTTP/formats/form.js.map +1 -1
  454. package/transpiled/HTTP/formats/json.js.map +1 -1
  455. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  456. package/transpiled/HTTP/formats/text.js.map +1 -1
  457. package/transpiled/HTTP/formats/yaml.js +4 -1
  458. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  459. package/transpiled/HTTP/messages.d.ts +3 -2
  460. package/transpiled/HTTP/messages.js +1 -43
  461. package/transpiled/HTTP/messages.js.map +1 -1
  462. package/transpiled/Interception.js.map +1 -1
  463. package/transpiled/Introspection.d.ts +2 -0
  464. package/transpiled/Introspection.js +13 -2
  465. package/transpiled/Introspection.js.map +1 -1
  466. package/transpiled/MCP/Server.js +15 -4
  467. package/transpiled/MCP/Server.js.map +1 -1
  468. package/transpiled/MCP/discover.js.map +1 -1
  469. package/transpiled/MCP/errors.js.map +1 -1
  470. package/transpiled/MCP/schema.js +1 -1
  471. package/transpiled/MCP/schema.js.map +1 -1
  472. package/transpiled/MCP/tools.js +10 -6
  473. package/transpiled/MCP/tools.js.map +1 -1
  474. package/transpiled/MCP/types.d.ts +3 -1
  475. package/transpiled/Mapping.d.ts +2 -2
  476. package/transpiled/Mapping.js +3 -5
  477. package/transpiled/Mapping.js.map +1 -1
  478. package/transpiled/Query.d.ts +6 -2
  479. package/transpiled/Query.js +23 -8
  480. package/transpiled/Query.js.map +1 -1
  481. package/transpiled/RPC/Context.js +0 -7
  482. package/transpiled/RPC/Context.js.map +1 -1
  483. package/transpiled/RPC/Dispatcher.js +4 -1
  484. package/transpiled/RPC/Dispatcher.js.map +1 -1
  485. package/transpiled/RPC/errors.js.map +1 -1
  486. package/transpiled/RPC/names.d.ts +3 -2
  487. package/transpiled/RPC/names.js +1 -1
  488. package/transpiled/RPC/names.js.map +1 -1
  489. package/transpiled/RTD/Directives.d.ts +1 -1
  490. package/transpiled/RTD/Method.js +1 -3
  491. package/transpiled/RTD/Method.js.map +1 -1
  492. package/transpiled/RTD/Node.js +5 -4
  493. package/transpiled/RTD/Node.js.map +1 -1
  494. package/transpiled/RTD/Route.js +4 -1
  495. package/transpiled/RTD/Route.js.map +1 -1
  496. package/transpiled/RTD/Tree.js +1 -1
  497. package/transpiled/RTD/Tree.js.map +1 -1
  498. package/transpiled/RTD/factory.js.map +1 -1
  499. package/transpiled/RTD/segment.js.map +1 -1
  500. package/transpiled/RTD/syntax/parse.js.map +1 -1
  501. package/transpiled/RTD/syntax/types.d.ts +6 -0
  502. package/transpiled/RTD/syntax/types.js +10 -1
  503. package/transpiled/RTD/syntax/types.js.map +1 -1
  504. package/transpiled/Remotes.js.map +1 -1
  505. package/transpiled/Tenant.d.ts +1 -1
  506. package/transpiled/Tenant.js.map +1 -1
  507. package/transpiled/deployment.d.ts +3 -0
  508. package/transpiled/deployment.js +6 -1
  509. package/transpiled/deployment.js.map +1 -1
  510. package/transpiled/directives/auth/Anonymous.js +1 -3
  511. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  512. package/transpiled/directives/auth/Anyone.js.map +1 -1
  513. package/transpiled/directives/auth/Assert.js.map +1 -1
  514. package/transpiled/directives/auth/Authorization.js +7 -3
  515. package/transpiled/directives/auth/Authorization.js.map +1 -1
  516. package/transpiled/directives/auth/Delegate.js.map +1 -1
  517. package/transpiled/directives/auth/Echo.js +1 -3
  518. package/transpiled/directives/auth/Echo.js.map +1 -1
  519. package/transpiled/directives/auth/Federation.js +3 -7
  520. package/transpiled/directives/auth/Federation.js.map +1 -1
  521. package/transpiled/directives/auth/Id.js.map +1 -1
  522. package/transpiled/directives/auth/Incept.js +1 -1
  523. package/transpiled/directives/auth/Incept.js.map +1 -1
  524. package/transpiled/directives/auth/Input.js.map +1 -1
  525. package/transpiled/directives/auth/Role.js.map +1 -1
  526. package/transpiled/directives/auth/Rule.js.map +1 -1
  527. package/transpiled/directives/auth/Scheme.js +1 -2
  528. package/transpiled/directives/auth/Scheme.js.map +1 -1
  529. package/transpiled/directives/auth/create.js.map +1 -1
  530. package/transpiled/directives/auth/schemes.js.map +1 -1
  531. package/transpiled/directives/auth/split.js.map +1 -1
  532. package/transpiled/directives/auth/types.d.ts +3 -1
  533. package/transpiled/directives/cache/Cache.js +28 -2
  534. package/transpiled/directives/cache/Cache.js.map +1 -1
  535. package/transpiled/directives/cache/Control.js +1 -1
  536. package/transpiled/directives/cache/Control.js.map +1 -1
  537. package/transpiled/directives/cache/etag.d.ts +10 -0
  538. package/transpiled/directives/cache/etag.js +30 -0
  539. package/transpiled/directives/cache/etag.js.map +1 -0
  540. package/transpiled/directives/cors/CORS.js.map +1 -1
  541. package/transpiled/directives/dev/Development.js.map +1 -1
  542. package/transpiled/directives/dev/Faulty.js.map +1 -1
  543. package/transpiled/directives/dev/Sleep.js.map +1 -1
  544. package/transpiled/directives/dev/Stub.js.map +1 -1
  545. package/transpiled/directives/dev/Throw.js.map +1 -1
  546. package/transpiled/directives/flow/Compose.js +7 -3
  547. package/transpiled/directives/flow/Compose.js.map +1 -1
  548. package/transpiled/directives/flow/Fetch.js.map +1 -1
  549. package/transpiled/directives/flow/Flow.js.map +1 -1
  550. package/transpiled/directives/index.js +11 -1
  551. package/transpiled/directives/index.js.map +1 -1
  552. package/transpiled/directives/io/IO.d.ts +1 -1
  553. package/transpiled/directives/io/IO.js.map +1 -1
  554. package/transpiled/directives/io/Input.js +1 -1
  555. package/transpiled/directives/io/Input.js.map +1 -1
  556. package/transpiled/directives/io/Output.js +3 -3
  557. package/transpiled/directives/io/Output.js.map +1 -1
  558. package/transpiled/directives/io/Status.js.map +1 -1
  559. package/transpiled/directives/io/Throttle.js +1 -1
  560. package/transpiled/directives/io/Throttle.js.map +1 -1
  561. package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
  562. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
  563. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
  564. package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
  565. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  566. package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
  567. package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
  568. package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
  569. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
  570. package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
  571. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
  572. package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
  573. package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
  574. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
  575. package/transpiled/directives/map/Authority.js.map +1 -1
  576. package/transpiled/directives/map/Buffer.js.map +1 -1
  577. package/transpiled/directives/map/Claims.js.map +1 -1
  578. package/transpiled/directives/map/Headers.js.map +1 -1
  579. package/transpiled/directives/map/Language.js.map +1 -1
  580. package/transpiled/directives/map/Languages.js.map +1 -1
  581. package/transpiled/directives/map/Map.js.map +1 -1
  582. package/transpiled/directives/map/Mapping.js.map +1 -1
  583. package/transpiled/directives/map/Properties.js.map +1 -1
  584. package/transpiled/directives/map/Segments.js.map +1 -1
  585. package/transpiled/directives/mcp/MCP.js +7 -1
  586. package/transpiled/directives/mcp/MCP.js.map +1 -1
  587. package/transpiled/directives/mcp/Tool.d.ts +6 -1
  588. package/transpiled/directives/mcp/Tool.js +16 -3
  589. package/transpiled/directives/mcp/Tool.js.map +1 -1
  590. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  591. package/transpiled/directives/oauth/documents.js.map +1 -1
  592. package/transpiled/directives/octets/Context.js +1 -1
  593. package/transpiled/directives/octets/Context.js.map +1 -1
  594. package/transpiled/directives/octets/Delete.js.map +1 -1
  595. package/transpiled/directives/octets/Directive.js.map +1 -1
  596. package/transpiled/directives/octets/Get.js.map +1 -1
  597. package/transpiled/directives/octets/Octets.js +1 -1
  598. package/transpiled/directives/octets/Octets.js.map +1 -1
  599. package/transpiled/directives/octets/Put.js.map +1 -1
  600. package/transpiled/directives/octets/Workflow.js.map +1 -1
  601. package/transpiled/directives/octets/bytes.js.map +1 -1
  602. package/transpiled/directives/octets/workflows/Execution.js +1 -2
  603. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  604. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  605. package/transpiled/directives/require/Headers.js.map +1 -1
  606. package/transpiled/directives/require/Require.js.map +1 -1
  607. package/transpiled/exceptions.js.map +1 -1
  608. package/transpiled/index.d.ts +1 -1
  609. package/transpiled/index.js +1 -1
  610. package/transpiled/index.js.map +1 -1
  611. package/transpiled/manifest.js +5 -1
  612. package/transpiled/manifest.js.map +1 -1
  613. package/transpiled/root.js.map +1 -1
  614. package/tsconfig.tsbuildinfo +1 -1
  615. package/CHANGELOG.md +0 -541
  616. package/source/redact.test.ts +0 -27
  617. package/source/redact.ts +0 -21
  618. package/transpiled/redact.d.ts +0 -5
  619. package/transpiled/redact.js +0 -17
  620. package/transpiled/redact.js.map +0 -1
@@ -43,7 +43,7 @@ Feature: JSON-RPC
43
43
  accept: application/yaml
44
44
  content-type: application/json
45
45
 
46
- {"jsonrpc": "2.0", "id": 1, "method": "pots/_id/GET",
46
+ {"jsonrpc": "2.0", "id": 1, "method": "pots._id.GET",
47
47
  "params": {"id": "4c4759e6f9c74da989d64511df42d6f4"}}
48
48
  """
49
49
  Then the following reply is sent:
@@ -67,7 +67,7 @@ Feature: JSON-RPC
67
67
  accept: application/yaml
68
68
  content-type: application/json
69
69
 
70
- {"jsonrpc": "2.0", "id": 2, "method": "pots/POST",
70
+ {"jsonrpc": "2.0", "id": 2, "method": "pots.POST",
71
71
  "params": {"title": "Kettle", "volume": 1.7}}
72
72
  """
73
73
  Then the following reply is sent:
@@ -88,7 +88,7 @@ Feature: JSON-RPC
88
88
  accept: application/yaml
89
89
  content-type: application/json
90
90
 
91
- {"jsonrpc": "2.0", "id": 3, "method": "pots/GET",
91
+ {"jsonrpc": "2.0", "id": 3, "method": "pots.GET",
92
92
  "params": {"query": {"limit": 1}}}
93
93
  """
94
94
  Then the following reply is sent:
@@ -108,7 +108,7 @@ Feature: JSON-RPC
108
108
  host: nex.toa.io
109
109
  content-type: application/json
110
110
 
111
- {"jsonrpc": "2.0", "method": "pots/POST", "params": {"title": "Pot", "volume": 1}}
111
+ {"jsonrpc": "2.0", "method": "pots.POST", "params": {"title": "Pot", "volume": 1}}
112
112
  """
113
113
  Then the following reply is sent:
114
114
  """
@@ -123,7 +123,7 @@ Feature: JSON-RPC
123
123
  accept: application/yaml
124
124
  content-type: application/json
125
125
 
126
- {"jsonrpc": "2.0", "id": 4, "method": "kettles/GET", "params": {}}
126
+ {"jsonrpc": "2.0", "id": 4, "method": "kettles.GET", "params": {}}
127
127
  """
128
128
  Then the following reply is sent:
129
129
  """
@@ -163,7 +163,7 @@ Feature: JSON-RPC
163
163
  accept: application/yaml
164
164
  content-type: application/json
165
165
 
166
- {"jsonrpc": "2.0", "id": 17, "method": "pots/GET", "params": {}}
166
+ {"jsonrpc": "2.0", "id": 17, "method": "pots.GET", "params": {}}
167
167
  """
168
168
  Then the following reply is sent:
169
169
  """
@@ -216,7 +216,7 @@ Feature: JSON-RPC
216
216
  accept: application/yaml
217
217
  content-type: application/json
218
218
 
219
- {"jsonrpc": "2.0", "id": 5, "method": "pots/_id/GET", "params": {}}
219
+ {"jsonrpc": "2.0", "id": 5, "method": "pots._id.GET", "params": {}}
220
220
  """
221
221
  Then the following reply is sent:
222
222
  """
@@ -236,7 +236,7 @@ Feature: JSON-RPC
236
236
  accept: application/yaml
237
237
  content-type: application/json
238
238
 
239
- {"jsonrpc": "2.0", "id": 6, "method": "pots/faulty/GET", "params": {}}
239
+ {"jsonrpc": "2.0", "id": 6, "method": "pots.faulty.GET", "params": {}}
240
240
  """
241
241
  Then the following reply is sent:
242
242
  """
@@ -256,7 +256,7 @@ Feature: JSON-RPC
256
256
  accept: application/yaml
257
257
  content-type: application/json
258
258
 
259
- {"jsonrpc": "2.0", "id": 7, "method": "pots/guarded/GET", "params": {}}
259
+ {"jsonrpc": "2.0", "id": 7, "method": "pots.guarded.GET", "params": {}}
260
260
  """
261
261
  Then the following reply is sent:
262
262
  """
@@ -271,10 +271,10 @@ Feature: JSON-RPC
271
271
  accept: application/yaml
272
272
  content-type: application/json
273
273
 
274
- [{"jsonrpc": "2.0", "id": 8, "method": "pots/_id/GET",
274
+ [{"jsonrpc": "2.0", "id": 8, "method": "pots._id.GET",
275
275
  "params": {"id": "4c4759e6f9c74da989d64511df42d6f4"}},
276
- {"jsonrpc": "2.0", "id": 9, "method": "kettles/GET", "params": {}},
277
- {"jsonrpc": "2.0", "method": "pots/POST", "params": {"title": "Pot", "volume": 1}}]
276
+ {"jsonrpc": "2.0", "id": 9, "method": "kettles.GET", "params": {}},
277
+ {"jsonrpc": "2.0", "method": "pots.POST", "params": {"title": "Pot", "volume": 1}}]
278
278
  """
279
279
  Then the following reply is sent:
280
280
  """
@@ -299,9 +299,9 @@ Feature: JSON-RPC
299
299
  accept: application/yaml
300
300
  content-type: application/json
301
301
 
302
- [{"jsonrpc": "2.0", "id": 13, "method": "pots/GET", "params": {}},
303
- {"jsonrpc": "2.0", "id": 14, "method": "pots/GET", "params": {}},
304
- {"jsonrpc": "2.0", "id": 15, "method": "pots/GET", "params": {}}]
302
+ [{"jsonrpc": "2.0", "id": 13, "method": "pots.GET", "params": {}},
303
+ {"jsonrpc": "2.0", "id": 14, "method": "pots.GET", "params": {}},
304
+ {"jsonrpc": "2.0", "id": 15, "method": "pots.GET", "params": {}}]
305
305
  """
306
306
  Then the following reply is sent:
307
307
  """
@@ -320,8 +320,8 @@ Feature: JSON-RPC
320
320
  host: nex.toa.io
321
321
  content-type: application/json
322
322
 
323
- [{"jsonrpc": "2.0", "method": "pots/POST", "params": {"title": "One", "volume": 1}},
324
- {"jsonrpc": "2.0", "method": "pots/POST", "params": {"title": "Two", "volume": 2}}]
323
+ [{"jsonrpc": "2.0", "method": "pots.POST", "params": {"title": "One", "volume": 1}},
324
+ {"jsonrpc": "2.0", "method": "pots.POST", "params": {"title": "Two", "volume": 2}}]
325
325
  """
326
326
  Then the following reply is sent:
327
327
  """
@@ -356,7 +356,7 @@ Feature: JSON-RPC
356
356
  accept: application/yaml
357
357
  content-type: application/json
358
358
 
359
- {"jsonrpc": "1.0", "id": 10, "method": "pots/GET"}
359
+ {"jsonrpc": "1.0", "id": 10, "method": "pots.GET"}
360
360
  """
361
361
  Then the following reply is sent:
362
362
  """
@@ -394,8 +394,8 @@ Feature: JSON-RPC
394
394
  accept: application/yaml
395
395
  content-type: application/json
396
396
 
397
- [{"jsonrpc": "2.0", "id": 11, "method": "pots/GET", "params": {}},
398
- {"jsonrpc": "2.0", "id": 12, "method": "pots/GET", "params": {}}]
397
+ [{"jsonrpc": "2.0", "id": 11, "method": "pots.GET", "params": {}},
398
+ {"jsonrpc": "2.0", "id": 12, "method": "pots.GET", "params": {}}]
399
399
  """
400
400
  Then the following reply is sent:
401
401
  """
@@ -421,7 +421,7 @@ Feature: JSON-RPC
421
421
  accept: application/yaml
422
422
  content-type: application/json
423
423
 
424
- {"jsonrpc": "2.0", "id": 9, "method": "pots/GET", "params": {}}
424
+ {"jsonrpc": "2.0", "id": 9, "method": "pots.GET", "params": {}}
425
425
  """
426
426
  Then the following reply is sent:
427
427
  """
@@ -5,7 +5,7 @@ const { binding } = tsflow
5
5
 
6
6
  @binding()
7
7
  export class Captures extends http.Captures {
8
- public constructor () {
8
+ public constructor() {
9
9
  super(functions)
10
10
  }
11
11
  }
@@ -8,6 +8,5 @@ import { Before } from '@cucumber/cucumber'
8
8
  * fresh machine; with one they run, no flag to remember.
9
9
  */
10
10
  Before({ tags: '@cloudinary' }, function () {
11
- if (process.env.CLOUDINARY_ENVIRONMENT === undefined)
12
- return 'skipped'
11
+ if (process.env.CLOUDINARY_ENVIRONMENT === undefined) return 'skipped'
13
12
  })
@@ -9,25 +9,24 @@ const { binding, given } = tsflow
9
9
  export class Common {
10
10
  private readonly captures: Captures
11
11
 
12
- public constructor (captures: Captures) {
12
+ public constructor(captures: Captures) {
13
13
  this.captures = captures
14
14
  }
15
15
 
16
16
  @given('after {float} second(s)')
17
- public async timeout (interval: number): Promise<void> {
17
+ public async timeout(interval: number): Promise<void> {
18
18
  await timeout(interval * 1000)
19
19
  }
20
20
 
21
21
  @given('the process is running')
22
- public async noop (): Promise<void> {
23
- }
22
+ public async noop(): Promise<void> {}
24
23
 
25
24
  /**
26
25
  * A remote resource is whatever it is today. A scenario downloading one compares the reply
27
26
  * against what the origin actually serves, not against a literal that goes stale when it changes.
28
27
  */
29
28
  @given('the length of `{}` is captured as `{word}`')
30
- public async length (url: string, name: string): Promise<void> {
29
+ public async length(url: string, name: string): Promise<void> {
31
30
  const response = await fetch(url)
32
31
 
33
32
  assert.equal(response.status, 200, `${url} answered ${response.status}`)
@@ -23,18 +23,18 @@ export class Components {
23
23
  private readonly gateway: Gateway
24
24
  private compositions: Record<string, Connector> = {}
25
25
 
26
- public constructor (workspace: Workspace, gateway: Gateway) {
26
+ public constructor(workspace: Workspace, gateway: Gateway) {
27
27
  this.workspace = workspace
28
28
  this.gateway = gateway
29
29
  }
30
30
 
31
31
  @given('the `{word}` is running')
32
- public async run (name: string): Promise<void> {
32
+ public async run(name: string): Promise<void> {
33
33
  await this.runComponent(name)
34
34
  }
35
35
 
36
36
  @given('the `{word}` is running with the following manifest:')
37
- public async patchAndRun (name: string, yaml: string): Promise<void> {
37
+ public async patchAndRun(name: string, yaml: string): Promise<void> {
38
38
  const manifest = parse(yaml) as object
39
39
 
40
40
  await this.runComponent(name, manifest)
@@ -42,7 +42,7 @@ export class Components {
42
42
 
43
43
  /** One composition, as the explorer hosts them. */
44
44
  @given('the introspection components are running')
45
- public async runMap (): Promise<void> {
45
+ public async runMap(): Promise<void> {
46
46
  assert.ok(!(MAP in this.compositions), `Composition '${MAP}' is already running`)
47
47
 
48
48
  this.compositions[MAP] = await boot.composition(map())
@@ -52,8 +52,11 @@ export class Components {
52
52
 
53
53
  /** The values component, as the configuration extension ships it; the service hosts it alone. */
54
54
  @given('the configuration values are running')
55
- public async runValues (): Promise<void> {
56
- assert.ok(!(VALUES in this.compositions), `Composition '${VALUES}' is already running`)
55
+ public async runValues(): Promise<void> {
56
+ assert.ok(
57
+ !(VALUES in this.compositions),
58
+ `Composition '${VALUES}' is already running`
59
+ )
57
60
 
58
61
  await this.gateway.start()
59
62
 
@@ -64,12 +67,12 @@ export class Components {
64
67
 
65
68
  /** What the deployment would tell the values service, as the scenario needs it. */
66
69
  @given('the configuration values are deployed:')
67
- public deployValues (yaml: string): void {
70
+ public deployValues(yaml: string): void {
68
71
  process.env.TOA_CONFIGURATION_VALUES = JSON.stringify(parse(yaml))
69
72
  }
70
73
 
71
74
  @given('the `{word}` is stopped')
72
- public async stop (name: string): Promise<void> {
75
+ public async stop(name: string): Promise<void> {
73
76
  assert.ok(name in this.compositions, `Composition '${name}' is not running`)
74
77
 
75
78
  await this.compositions[name].disconnect()
@@ -77,15 +80,17 @@ export class Components {
77
80
  }
78
81
 
79
82
  @after()
80
- public async shutdown (): Promise<void> {
81
- const promises = Object.values(this.compositions).map((composition) => composition.disconnect())
83
+ public async shutdown(): Promise<void> {
84
+ const promises = Object.values(this.compositions).map((composition) =>
85
+ composition.disconnect()
86
+ )
82
87
 
83
88
  await Promise.all(promises)
84
89
 
85
90
  delete process.env.TOA_CONFIGURATION_VALUES
86
91
  }
87
92
 
88
- private async runComponent (name: string, manifest?: object): Promise<void> {
93
+ private async runComponent(name: string, manifest?: object): Promise<void> {
89
94
  assert.ok(!(name in this.compositions), `Composition '${name}' is already running`)
90
95
 
91
96
  // the gateway first: a component announces itself when it opens, and that only
@@ -101,7 +106,7 @@ export class Components {
101
106
  }
102
107
  }
103
108
 
104
- function values (): string {
109
+ function values(): string {
105
110
  const root = dirname(require.resolve('@toa.io/extensions.configuration/package.json'))
106
111
 
107
112
  return join(root, 'components', 'configuration.values')
@@ -11,66 +11,84 @@ export class Database {
11
11
  private static client: MongoClient
12
12
 
13
13
  @given('the `{word}` database contains:')
14
- public async upsert (id: string, table: DataTable): Promise<void> {
14
+ public async upsert(id: string, table: DataTable): Promise<void> {
15
15
  const collection = this.collection(id)
16
16
  const columns = table.raw()[0]
17
17
  const rows = table.rows()
18
18
  const documents: Document[] = []
19
19
 
20
20
  for (let r = 0; r < rows.length; r++) {
21
- const document: Document = {}
21
+ const document = {} as Document
22
22
 
23
23
  for (let c = 0; c < columns.length; c++) {
24
24
  const str = rows[r][c]
25
25
  const int = parseInt(str)
26
26
 
27
- document[columns[c]] = int.toString() === str
28
- ? int
29
- : str === 'null'
30
- ? null
31
- : str === 'true'
32
- ? true
33
- : str === 'false'
34
- ? false
35
- : str
27
+ document[columns[c]] =
28
+ int.toString() === str
29
+ ? int
30
+ : str === 'null'
31
+ ? null
32
+ : str === 'true'
33
+ ? true
34
+ : str === 'false'
35
+ ? false
36
+ : str
36
37
  }
37
38
 
38
39
  /*
39
40
  * A record that has never been written carries no timestamps, and the entity stamps
40
41
  * the ones it is missing as it is read — with the time it was read. The same row then
41
- * enumerates differently on every request, which is a moving `etag` and a collection
42
- * that is never unmodified.
42
+ * enumerates differently on every request, which is a `last-modified` that moves and a
43
+ * collection that is never unmodified.
43
44
  */
44
- document._created ??= Date.now()
45
- document._updated ??= document._created
45
+ document.CREATED ??= Date.now()
46
+ document.UPDATED ??= document.CREATED
46
47
 
47
48
  documents.push(document)
48
49
  }
49
50
 
50
- await collection.deleteMany({})
51
+ /*
52
+ * A component the scenario has already started writes to this collection too, and it may
53
+ * write the very row named here — introspection records a node under the same `_id` this
54
+ * derives. Emptying the collection and inserting leaves a window for it to land in
55
+ * between, and the insert then fails on a duplicate key. Replacing each row named, and
56
+ * deleting only what is not, has no such window.
57
+ */
58
+ const ids = documents.map((document) => document._id)
59
+
60
+ await collection.deleteMany({ _id: { $nin: ids } })
51
61
 
52
62
  if (documents.length > 0)
53
- await collection.insertMany(documents)
63
+ await collection.bulkWrite(
64
+ documents.map((document) => ({
65
+ replaceOne: {
66
+ filter: { _id: document._id },
67
+ replacement: document,
68
+ upsert: true
69
+ }
70
+ }))
71
+ )
54
72
  }
55
73
 
56
74
  @given('the `{word}` database is empty')
57
- public async truncate (id: string): Promise<void> {
75
+ public async truncate(id: string): Promise<void> {
58
76
  await this.collection(id).deleteMany({})
59
77
  }
60
78
 
61
79
  @beforeAll()
62
- public static async connect (): Promise<void> {
63
- this.client = new MongoClient('mongodb://developer:secret@localhost:27017')
80
+ public static async connect(): Promise<void> {
81
+ this.client = new MongoClient('mongodb://developer:secret@localhost:31020')
64
82
 
65
83
  await this.client.connect()
66
84
  }
67
85
 
68
86
  @afterAll()
69
- public static async disconnect (): Promise<void> {
87
+ public static async disconnect(): Promise<void> {
70
88
  await this.client.close()
71
89
  }
72
90
 
73
- private collection (id: string): Collection {
91
+ private collection(id: string): Collection<Document> {
74
92
  const [name, namespace = 'default'] = id.split('.').reverse()
75
93
  const collection = `${namespace}_${name}`.toLowerCase()
76
94
 
@@ -78,4 +96,5 @@ export class Database {
78
96
  }
79
97
  }
80
98
 
81
- type Document = Record<string, string | number | boolean | null>
99
+ /** Every fixture table names an `_id`, which is what a row is replaced by. */
100
+ type Document = Record<string, string | number | boolean | null> & { _id: string }
@@ -3,24 +3,24 @@ import tsflow from 'cucumber-tsflow'
3
3
  import * as boot from '@toa.io/boot'
4
4
  import { type Connector } from '@toa.io/core'
5
5
  import { load as parse } from 'js-yaml'
6
- import { timeout } from '@toa.io/generic'
7
6
  import { Factory } from '../../source/index.js'
8
7
  import * as syntax from '../../source/RTD/syntax/index.js'
9
8
  import { shortcuts } from '../../source/Directive.js'
10
9
  import { manifests } from './map.js'
10
+ import { PORT, PROBE } from './Parameters.js'
11
11
  import type * as http from '../../source/HTTP/index.js'
12
12
 
13
13
  const { after, afterAll, binding, given } = tsflow
14
14
 
15
15
  let instance: Connector | null = null
16
+ let deployment: string | null = null
16
17
 
17
18
  @binding()
18
19
  export class Gateway {
19
- private default: boolean = true
20
20
  private written: string[] = []
21
21
 
22
22
  @given('the annotation:')
23
- public async annotate (yaml: string): Promise<void> {
23
+ public async annotate(yaml: string): Promise<void> {
24
24
  const annotation = parse(yaml) as Partial<http.Options> & { '/'?: object }
25
25
 
26
26
  if (annotation['/'] !== undefined) {
@@ -32,32 +32,21 @@ export class Gateway {
32
32
  const { debug, authorities, bouncer, ip, oauth, rpc, mcp } = annotation
33
33
  const properties = Object.assign({}, DEFAULT_PROPERTIES)
34
34
 
35
- if (debug !== undefined)
36
- properties.debug = debug
35
+ if (debug !== undefined) properties.debug = debug
37
36
 
38
- if (bouncer !== undefined)
39
- properties.bouncer = bouncer
37
+ if (bouncer !== undefined) properties.bouncer = bouncer
40
38
 
41
- if (ip !== undefined)
42
- properties.ip = ip
39
+ if (ip !== undefined) properties.ip = ip
43
40
 
44
- if (authorities !== undefined)
45
- properties.authorities = authorities
41
+ if (authorities !== undefined) properties.authorities = authorities
46
42
 
47
- if (oauth !== undefined)
48
- properties.oauth = oauth
43
+ if (oauth !== undefined) properties.oauth = oauth
49
44
 
50
- if (rpc !== undefined)
51
- properties.rpc = rpc
45
+ if (rpc !== undefined) properties.rpc = rpc
52
46
 
53
- if (mcp !== undefined)
54
- properties.mcp = mcp
47
+ if (mcp !== undefined) properties.mcp = mcp
55
48
 
56
49
  process.env.TOA_EXPOSITION_PROPERTIES = JSON.stringify(properties)
57
-
58
- await Gateway.stop()
59
-
60
- this.default = false
61
50
  }
62
51
 
63
52
  /**
@@ -65,16 +54,17 @@ export class Gateway {
65
54
  * exposition extension over them, so what lands here is what a deployment would carry.
66
55
  */
67
56
  @given('the annotation of the introspection map')
68
- public async annotateMap (): Promise<void> {
57
+ public async annotateMap(): Promise<void> {
69
58
  await this.annotateMapUnder()
70
59
  }
71
60
 
72
61
  /** The same routes under a root of the scenario's own: what an application declares around the map. */
73
62
  @given('the annotation of the introspection map under:')
74
- public async annotateMapUnder (yaml?: string): Promise<void> {
75
- const tree: syntax.Node = yaml === undefined
76
- ? { routes: [], methods: [], directives: [] }
77
- : syntax.parse((parse(yaml) as { '/': object })['/'], shortcuts)
63
+ public async annotateMapUnder(yaml?: string): Promise<void> {
64
+ const tree: syntax.Node =
65
+ yaml === undefined
66
+ ? { routes: [], methods: [], directives: [] }
67
+ : syntax.parse((parse(yaml) as { '/': object })['/'], shortcuts)
78
68
 
79
69
  for (const manifest of await manifests()) {
80
70
  const node = manifest.extensions?.[EXPOSITION] as syntax.Node | undefined
@@ -87,14 +77,10 @@ export class Gateway {
87
77
 
88
78
  process.env.TOA_EXPOSITION = JSON.stringify(tree)
89
79
  process.env.TOA_EXPOSITION_PROPERTIES = JSON.stringify(DEFAULT_PROPERTIES)
90
-
91
- await Gateway.stop()
92
-
93
- this.default = false
94
80
  }
95
81
 
96
82
  @given('the `{word}` configuration:')
97
- public async configure (id: string, yaml: string): Promise<void> {
83
+ public async configure(id: string, yaml: string): Promise<void> {
98
84
  const [name, namespace = 'default'] = id.split('.').reverse()
99
85
  const key = `TOA_CONFIGURATION_${namespace.toUpperCase()}_${name.toUpperCase()}`
100
86
  const def = DEFAULT_CONFIGURATION[id] ?? {}
@@ -105,90 +91,89 @@ export class Gateway {
105
91
  // outlives the secrets it points at, and the next scenario cannot resolve them
106
92
  this.written.push(key)
107
93
  process.env[key] = JSON.stringify(configuration)
108
-
109
- await Gateway.stop()
110
-
111
- this.default = false
112
94
  }
113
95
 
114
96
  /** The secrets a scenario's configuration refers to. */
115
97
  @given('the configuration secrets:')
116
- public async secrets (yaml: string): Promise<void> {
98
+ public async secrets(yaml: string): Promise<void> {
117
99
  const secrets = parse(yaml) as Record<string, string>
118
100
 
119
101
  for (const [name, value] of Object.entries(secrets)) {
120
102
  this.written.push(SECRET + name)
121
103
  process.env[SECRET + name] = value
122
104
  }
123
-
124
- await Gateway.stop()
125
-
126
- this.default = false
127
105
  }
128
106
 
129
107
  @given('the branch TTL is {float} second(s)')
130
- public async setBranchTTL (seconds: number): Promise<void> {
108
+ public async setBranchTTL(seconds: number): Promise<void> {
131
109
  process.env.__TESTING_EXPOSITION_BRANCH_TTL = String(seconds * 1000)
132
-
133
- await Gateway.stop()
134
-
135
- this.default = false
136
110
  }
137
111
 
138
112
  @given('the Gateway is running')
139
- public async start (): Promise<void> {
140
- if (instance !== null)
141
- return
142
-
113
+ public async start(): Promise<void> {
143
114
  process.env.TOA_EXPOSITION ??= DEFAULT_TREE
144
115
  process.env.TOA_EXPOSITION_PROPERTIES ??= JSON.stringify(DEFAULT_PROPERTIES)
145
116
 
146
117
  this.writeConfiguration()
147
118
 
119
+ const signature = Gateway.signature()
120
+
121
+ /*
122
+ * A component is published without restarting the gateway, and a scenario that asks for
123
+ * the deployment already running gets that one. Only a different deployment is a restart,
124
+ * which is what an annotation, a configuration or a branch TTL of its own amounts to.
125
+ */
126
+ if (instance !== null && signature === deployment) return
127
+
128
+ await Gateway.stop()
129
+
148
130
  const factory = new Factory(boot.host())
149
131
  const service = await factory.service()
150
132
 
151
- if (service === null)
152
- throw new Error('?')
133
+ if (service === null) throw new Error('?')
153
134
 
154
135
  instance = service
155
136
 
156
137
  await service.connect()
157
138
 
158
- /*
159
- * The gateway waits for the branches it discovers, but a component's own resources —
160
- * a storage, a queue — are still connecting when it answers. Fifty milliseconds was
161
- * enough until the composition grew; a scenario that asks too early reads the 404 that
162
- * precedes the route.
163
- */
164
- await timeout(DISCOVERY)
139
+ deployment = signature
140
+ }
141
+
142
+ /** What the running gateway was built from: a different value is a different deployment. */
143
+ private static signature(): string {
144
+ const configuration = Object.keys(process.env)
145
+ .filter((key) => key.startsWith('TOA_CONFIGURATION_'))
146
+ .sort()
147
+ .map((key) => [key, process.env[key]])
148
+
149
+ return JSON.stringify([
150
+ process.env.TOA_EXPOSITION,
151
+ process.env.TOA_EXPOSITION_PROPERTIES,
152
+ process.env.__TESTING_EXPOSITION_BRANCH_TTL,
153
+ configuration
154
+ ])
165
155
  }
166
156
 
167
157
  @after()
168
- public async cleanup (): Promise<void> {
158
+ public async cleanup(): Promise<void> {
169
159
  delete process.env.__TESTING_EXPOSITION_BRANCH_TTL
170
160
 
171
- for (const key of this.written)
172
- delete process.env[key]
161
+ for (const key of this.written) delete process.env[key]
173
162
 
174
163
  this.written = []
175
164
 
176
- if (this.default)
177
- return
178
-
179
165
  delete process.env.TOA_EXPOSITION
180
166
  delete process.env.TOA_EXPOSITION_PROPERTIES
181
-
182
- await Gateway.stop()
183
167
  }
184
168
 
185
169
  @afterAll()
186
- public static async stop (): Promise<void> {
170
+ public static async stop(): Promise<void> {
187
171
  await instance?.disconnect()
188
172
  instance = null
173
+ deployment = null
189
174
  }
190
175
 
191
- private writeConfiguration (): void {
176
+ private writeConfiguration(): void {
192
177
  for (const [id, configuration] of Object.entries(DEFAULT_CONFIGURATION)) {
193
178
  const [name, namespace = 'default'] = id.split('.').reverse()
194
179
  const key = `TOA_CONFIGURATION_${namespace.toUpperCase()}_${name.toUpperCase()}`
@@ -216,13 +201,12 @@ const DEFAULT_TREE = JSON.stringify({
216
201
  ]
217
202
  } satisfies syntax.Node)
218
203
 
219
- /** Milliseconds a composition is given to finish connecting what it needs. */
220
- const DISCOVERY = 100
221
-
222
204
  const DEFAULT_PROPERTIES: Partial<http.Options> = {
223
205
  authorities: {
224
206
  nex: 'nex.toa.io'
225
207
  },
208
+ port: PORT,
209
+ probe: PROBE,
226
210
  // `npm run features:h2c` runs the whole suite over cleartext HTTP/2
227
211
  protocol: process.env.TOA_EXPOSITION_PROTOCOL === 'h2c' ? 'h2c' : 'h1'
228
212
  }