@toa.io/extensions.exposition 1.0.0-alpha.285 → 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 (611) 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 +16 -16
  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 +31 -21
  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/octets.cloudinary.feature +1 -1
  223. package/features/octets.download.feature +1 -0
  224. package/features/require.feature +1 -2
  225. package/features/steps/Captures.ts +1 -1
  226. package/features/steps/Cloudinary.ts +1 -2
  227. package/features/steps/Common.ts +4 -5
  228. package/features/steps/Components.ts +17 -12
  229. package/features/steps/Database.ts +42 -23
  230. package/features/steps/Gateway.ts +55 -72
  231. package/features/steps/HTTP.ts +12 -15
  232. package/features/steps/IDP.ts +118 -94
  233. package/features/steps/Identity.ts +3 -3
  234. package/features/steps/OTP.ts +3 -3
  235. package/features/steps/Parameters.ts +20 -10
  236. package/features/steps/Probe.ts +9 -7
  237. package/features/steps/Realtime.ts +40 -22
  238. package/features/steps/Workspace.ts +10 -7
  239. package/features/steps/components/audit/operations/record.js +1 -1
  240. package/features/steps/components/echo/operations/affect.js +1 -1
  241. package/features/steps/components/echo/operations/compute.js +1 -1
  242. package/features/steps/components/echo/operations/echo.js +1 -1
  243. package/features/steps/components/echo/operations/error.js +1 -1
  244. package/features/steps/components/echo/operations/identity.js +1 -1
  245. package/features/steps/components/echo/operations/parameters.js +1 -1
  246. package/features/steps/components/echo/operations/ping.js +1 -1
  247. package/features/steps/components/echo/operations/unwrap.js +1 -1
  248. package/features/steps/components/greeter/operations/greet.js +1 -1
  249. package/features/steps/components/notify/operations/send.js +1 -1
  250. package/features/steps/components/octets.tester/operations/authority.js +1 -1
  251. package/features/steps/components/octets.tester/operations/bar.js +1 -1
  252. package/features/steps/components/octets.tester/operations/baz.js +1 -1
  253. package/features/steps/components/octets.tester/operations/concat.js +1 -1
  254. package/features/steps/components/octets.tester/operations/echo.js +1 -1
  255. package/features/steps/components/octets.tester/operations/err.js +1 -1
  256. package/features/steps/components/octets.tester/operations/foo.js +1 -1
  257. package/features/steps/components/octets.tester/operations/id.js +1 -1
  258. package/features/steps/components/octets.tester/operations/identity.js +1 -1
  259. package/features/steps/components/octets.tester/operations/redirect.js +6 -4
  260. package/features/steps/components/octets.tester/operations/yex.js +1 -1
  261. package/features/steps/components/octets.tester/operations/yield.js +1 -1
  262. package/features/steps/components/orders/manifest.toa.yaml +10 -12
  263. package/features/steps/components/orders/operations/create.js +4 -2
  264. package/features/steps/components/pots/manifest.toa.yaml +15 -20
  265. package/features/steps/components/pots/migrations/0002-indexes.yaml +4 -0
  266. package/features/steps/components/pricing/operations/quote.js +1 -1
  267. package/features/steps/components/sequences/manifest.toa.yaml +0 -1
  268. package/features/steps/components/sequences/operations/numbers.js +1 -1
  269. package/features/steps/components/sequences/operations/tokens.js +3 -3
  270. package/features/steps/components/users/manifest.toa.yaml +3 -5
  271. package/features/steps/components/users/operations/create.js +1 -1
  272. package/features/steps/components/users.properties/manifest.toa.yaml +5 -6
  273. package/features/steps/map.ts +2 -2
  274. package/features/timestamps.feature +1 -1
  275. package/package.json +7 -7
  276. package/readme.md +11 -11
  277. package/schemas/annotation.cos.yaml +1 -3
  278. package/schemas/method.cos.yaml +2 -0
  279. package/source/Branch.test.ts +2 -2
  280. package/source/Branch.ts +3 -5
  281. package/source/Composition.ts +5 -5
  282. package/source/Directive.test.ts +38 -20
  283. package/source/Directive.ts +61 -47
  284. package/source/Endpoint.test.ts +1 -1
  285. package/source/Endpoint.ts +27 -92
  286. package/source/Factory.ts +26 -12
  287. package/source/Gateway.ts +87 -76
  288. package/source/HTTP/Context.ts +23 -30
  289. package/source/HTTP/Probe.ts +7 -9
  290. package/source/HTTP/Server.ts +88 -69
  291. package/source/HTTP/Timing.ts +6 -21
  292. package/source/HTTP/address.test.ts +8 -2
  293. package/source/HTTP/address.ts +2 -3
  294. package/source/HTTP/exceptions.ts +20 -18
  295. package/source/HTTP/formats/form.ts +1 -1
  296. package/source/HTTP/formats/json.ts +2 -2
  297. package/source/HTTP/formats/msgpack.ts +3 -4
  298. package/source/HTTP/formats/text.ts +2 -2
  299. package/source/HTTP/formats/yaml.test.ts +4 -1
  300. package/source/HTTP/formats/yaml.ts +14 -11
  301. package/source/HTTP/messages.test.ts +38 -28
  302. package/source/HTTP/messages.ts +44 -98
  303. package/source/Interception.ts +3 -4
  304. package/source/Introspection.ts +26 -14
  305. package/source/MCP/Server.ts +114 -54
  306. package/source/MCP/discover.ts +6 -7
  307. package/source/MCP/errors.ts +7 -8
  308. package/source/MCP/schema.test.ts +9 -3
  309. package/source/MCP/schema.ts +12 -16
  310. package/source/MCP/tools.ts +33 -28
  311. package/source/Mapping.ts +25 -27
  312. package/source/Query.ts +58 -44
  313. package/source/RPC/Context.ts +8 -11
  314. package/source/RPC/Dispatcher.ts +46 -26
  315. package/source/RPC/errors.test.ts +41 -16
  316. package/source/RPC/errors.ts +9 -10
  317. package/source/RPC/names.test.ts +35 -16
  318. package/source/RPC/names.ts +22 -29
  319. package/source/RTD/Directives.ts +21 -10
  320. package/source/RTD/Endpoint.ts +4 -1
  321. package/source/RTD/Method.ts +8 -6
  322. package/source/RTD/Node.ts +32 -34
  323. package/source/RTD/Route.ts +18 -21
  324. package/source/RTD/Tree.ts +18 -18
  325. package/source/RTD/factory.ts +13 -16
  326. package/source/RTD/segment.ts +12 -10
  327. package/source/RTD/syntax/parse.test.ts +12 -6
  328. package/source/RTD/syntax/parse.ts +30 -26
  329. package/source/RTD/syntax/types.ts +17 -1
  330. package/source/RTD/walk.test.ts +59 -22
  331. package/source/Remotes.test.ts +25 -4
  332. package/source/Remotes.ts +9 -4
  333. package/source/Tenant.ts +12 -12
  334. package/source/deployment.ts +20 -20
  335. package/source/directives/auth/Anonymous.test.ts +8 -2
  336. package/source/directives/auth/Anonymous.ts +5 -8
  337. package/source/directives/auth/Anyone.ts +3 -3
  338. package/source/directives/auth/Assert.ts +10 -10
  339. package/source/directives/auth/Authorization.ts +83 -69
  340. package/source/directives/auth/Delegate.test.ts +2 -2
  341. package/source/directives/auth/Delegate.ts +8 -10
  342. package/source/directives/auth/Echo.ts +5 -8
  343. package/source/directives/auth/Federation.ts +30 -21
  344. package/source/directives/auth/Id.ts +7 -4
  345. package/source/directives/auth/Incept.ts +32 -26
  346. package/source/directives/auth/Input.ts +36 -20
  347. package/source/directives/auth/Role.test.ts +49 -23
  348. package/source/directives/auth/Role.ts +29 -22
  349. package/source/directives/auth/Rule.ts +13 -8
  350. package/source/directives/auth/Scheme.ts +7 -7
  351. package/source/directives/auth/create.ts +1 -1
  352. package/source/directives/auth/schemes.ts +1 -1
  353. package/source/directives/auth/split.ts +2 -3
  354. package/source/directives/auth/types.ts +5 -2
  355. package/source/directives/cache/Cache.ts +44 -9
  356. package/source/directives/cache/Control.ts +25 -26
  357. package/source/directives/cache/Exact.ts +1 -1
  358. package/source/directives/cache/etag.ts +38 -0
  359. package/source/directives/cors/CORS.ts +9 -7
  360. package/source/directives/dev/Development.ts +3 -4
  361. package/source/directives/dev/Faulty.ts +11 -6
  362. package/source/directives/dev/Sleep.ts +5 -7
  363. package/source/directives/dev/Stub.ts +2 -2
  364. package/source/directives/dev/Throw.ts +2 -2
  365. package/source/directives/flow/Compose.ts +26 -20
  366. package/source/directives/flow/Fetch.ts +15 -15
  367. package/source/directives/flow/Flow.ts +9 -8
  368. package/source/directives/index.ts +11 -2
  369. package/source/directives/io/IO.ts +29 -20
  370. package/source/directives/io/Input.ts +9 -12
  371. package/source/directives/io/Output.ts +20 -23
  372. package/source/directives/io/Status.test.ts +12 -8
  373. package/source/directives/io/Status.ts +9 -8
  374. package/source/directives/io/Throttle.ts +6 -7
  375. package/source/directives/io/lib/throttle/Configuration.test.ts +32 -23
  376. package/source/directives/io/lib/throttle/Configuration.ts +14 -9
  377. package/source/directives/io/lib/throttle/Keys.ts +15 -10
  378. package/source/directives/io/lib/throttle/Quotas.test.ts +33 -17
  379. package/source/directives/io/lib/throttle/Quotas.ts +20 -26
  380. package/source/directives/io/lib/throttle/Sync.test.ts +14 -10
  381. package/source/directives/io/lib/throttle/Sync.ts +9 -12
  382. package/source/directives/io/lib/throttle/Warning.ts +3 -4
  383. package/source/directives/io/lib/throttle/components/IP.ts +4 -5
  384. package/source/directives/io/lib/throttle/components/Identity.ts +1 -1
  385. package/source/directives/io/lib/throttle/components/Path.ts +1 -1
  386. package/source/directives/io/lib/throttle/components/Route.ts +2 -2
  387. package/source/directives/io/lib/throttle/components/Segment.ts +2 -2
  388. package/source/directives/io/lib/throttle/conditions/Status.ts +2 -2
  389. package/source/directives/io/schemas.test.ts +12 -6
  390. package/source/directives/map/Authority.ts +2 -2
  391. package/source/directives/map/Buffer.ts +2 -2
  392. package/source/directives/map/Claims.ts +25 -20
  393. package/source/directives/map/Headers.ts +17 -13
  394. package/source/directives/map/Language.ts +8 -5
  395. package/source/directives/map/Languages.ts +9 -3
  396. package/source/directives/map/Map.ts +25 -12
  397. package/source/directives/map/Mapping.ts +9 -6
  398. package/source/directives/map/Properties.ts +1 -1
  399. package/source/directives/map/Segments.ts +22 -15
  400. package/source/directives/mcp/MCP.ts +9 -7
  401. package/source/directives/mcp/Tool.test.ts +21 -9
  402. package/source/directives/mcp/Tool.ts +23 -11
  403. package/source/directives/oauth/Discovery.ts +7 -11
  404. package/source/directives/oauth/documents.ts +11 -14
  405. package/source/directives/octets/Context.ts +6 -3
  406. package/source/directives/octets/Delete.ts +33 -25
  407. package/source/directives/octets/Directive.ts +5 -1
  408. package/source/directives/octets/Get.ts +13 -21
  409. package/source/directives/octets/Octets.ts +20 -15
  410. package/source/directives/octets/Put.ts +62 -27
  411. package/source/directives/octets/Workflow.ts +18 -12
  412. package/source/directives/octets/bytes.ts +1 -1
  413. package/source/directives/octets/schemas.test.ts +8 -14
  414. package/source/directives/octets/workflows/Execution.ts +19 -21
  415. package/source/directives/octets/workflows/Workflow.ts +10 -7
  416. package/source/directives/require/Headers.ts +3 -4
  417. package/source/directives/require/Require.ts +3 -4
  418. package/source/exceptions.ts +19 -12
  419. package/source/index.ts +1 -1
  420. package/source/manifest.test.ts +4 -1
  421. package/source/manifest.ts +19 -13
  422. package/source/octets.d.ts +1 -1
  423. package/source/root.ts +3 -2
  424. package/source/schemas.test.ts +17 -3
  425. package/transpiled/Branch.js.map +1 -1
  426. package/transpiled/Composition.js.map +1 -1
  427. package/transpiled/Directive.js +6 -2
  428. package/transpiled/Directive.js.map +1 -1
  429. package/transpiled/Endpoint.d.ts +0 -2
  430. package/transpiled/Endpoint.js +11 -52
  431. package/transpiled/Endpoint.js.map +1 -1
  432. package/transpiled/Factory.d.ts +2 -1
  433. package/transpiled/Factory.js +1 -0
  434. package/transpiled/Factory.js.map +1 -1
  435. package/transpiled/Gateway.d.ts +2 -1
  436. package/transpiled/Gateway.js +24 -15
  437. package/transpiled/Gateway.js.map +1 -1
  438. package/transpiled/HTTP/Context.d.ts +0 -3
  439. package/transpiled/HTTP/Context.js +7 -9
  440. package/transpiled/HTTP/Context.js.map +1 -1
  441. package/transpiled/HTTP/Probe.js.map +1 -1
  442. package/transpiled/HTTP/Server.js +19 -4
  443. package/transpiled/HTTP/Server.js.map +1 -1
  444. package/transpiled/HTTP/Timing.d.ts +1 -2
  445. package/transpiled/HTTP/Timing.js +2 -10
  446. package/transpiled/HTTP/Timing.js.map +1 -1
  447. package/transpiled/HTTP/address.js.map +1 -1
  448. package/transpiled/HTTP/exceptions.js.map +1 -1
  449. package/transpiled/HTTP/formats/form.js.map +1 -1
  450. package/transpiled/HTTP/formats/json.js.map +1 -1
  451. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  452. package/transpiled/HTTP/formats/text.js.map +1 -1
  453. package/transpiled/HTTP/formats/yaml.js +4 -1
  454. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  455. package/transpiled/HTTP/messages.d.ts +3 -2
  456. package/transpiled/HTTP/messages.js +1 -43
  457. package/transpiled/HTTP/messages.js.map +1 -1
  458. package/transpiled/Interception.js.map +1 -1
  459. package/transpiled/Introspection.js +13 -2
  460. package/transpiled/Introspection.js.map +1 -1
  461. package/transpiled/MCP/Server.js +15 -4
  462. package/transpiled/MCP/Server.js.map +1 -1
  463. package/transpiled/MCP/discover.js.map +1 -1
  464. package/transpiled/MCP/errors.js.map +1 -1
  465. package/transpiled/MCP/schema.js +1 -1
  466. package/transpiled/MCP/schema.js.map +1 -1
  467. package/transpiled/MCP/tools.js +10 -7
  468. package/transpiled/MCP/tools.js.map +1 -1
  469. package/transpiled/Mapping.d.ts +2 -2
  470. package/transpiled/Mapping.js +3 -5
  471. package/transpiled/Mapping.js.map +1 -1
  472. package/transpiled/Query.d.ts +6 -2
  473. package/transpiled/Query.js +23 -8
  474. package/transpiled/Query.js.map +1 -1
  475. package/transpiled/RPC/Context.js +0 -7
  476. package/transpiled/RPC/Context.js.map +1 -1
  477. package/transpiled/RPC/Dispatcher.js +4 -1
  478. package/transpiled/RPC/Dispatcher.js.map +1 -1
  479. package/transpiled/RPC/errors.js.map +1 -1
  480. package/transpiled/RPC/names.js.map +1 -1
  481. package/transpiled/RTD/Directives.d.ts +1 -1
  482. package/transpiled/RTD/Method.js +1 -3
  483. package/transpiled/RTD/Method.js.map +1 -1
  484. package/transpiled/RTD/Node.js +5 -4
  485. package/transpiled/RTD/Node.js.map +1 -1
  486. package/transpiled/RTD/Route.js +4 -1
  487. package/transpiled/RTD/Route.js.map +1 -1
  488. package/transpiled/RTD/Tree.js +1 -1
  489. package/transpiled/RTD/Tree.js.map +1 -1
  490. package/transpiled/RTD/factory.js.map +1 -1
  491. package/transpiled/RTD/segment.js.map +1 -1
  492. package/transpiled/RTD/syntax/parse.js.map +1 -1
  493. package/transpiled/RTD/syntax/types.d.ts +6 -0
  494. package/transpiled/RTD/syntax/types.js +10 -1
  495. package/transpiled/RTD/syntax/types.js.map +1 -1
  496. package/transpiled/Remotes.js.map +1 -1
  497. package/transpiled/Tenant.d.ts +1 -1
  498. package/transpiled/Tenant.js.map +1 -1
  499. package/transpiled/deployment.d.ts +3 -0
  500. package/transpiled/deployment.js +6 -1
  501. package/transpiled/deployment.js.map +1 -1
  502. package/transpiled/directives/auth/Anonymous.js +1 -3
  503. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  504. package/transpiled/directives/auth/Anyone.js.map +1 -1
  505. package/transpiled/directives/auth/Assert.js.map +1 -1
  506. package/transpiled/directives/auth/Authorization.js +7 -3
  507. package/transpiled/directives/auth/Authorization.js.map +1 -1
  508. package/transpiled/directives/auth/Delegate.js.map +1 -1
  509. package/transpiled/directives/auth/Echo.js +1 -3
  510. package/transpiled/directives/auth/Echo.js.map +1 -1
  511. package/transpiled/directives/auth/Federation.js +3 -7
  512. package/transpiled/directives/auth/Federation.js.map +1 -1
  513. package/transpiled/directives/auth/Id.js.map +1 -1
  514. package/transpiled/directives/auth/Incept.js +1 -1
  515. package/transpiled/directives/auth/Incept.js.map +1 -1
  516. package/transpiled/directives/auth/Input.js.map +1 -1
  517. package/transpiled/directives/auth/Role.js.map +1 -1
  518. package/transpiled/directives/auth/Rule.js.map +1 -1
  519. package/transpiled/directives/auth/Scheme.js +1 -2
  520. package/transpiled/directives/auth/Scheme.js.map +1 -1
  521. package/transpiled/directives/auth/create.js.map +1 -1
  522. package/transpiled/directives/auth/schemes.js.map +1 -1
  523. package/transpiled/directives/auth/split.js.map +1 -1
  524. package/transpiled/directives/auth/types.d.ts +3 -1
  525. package/transpiled/directives/cache/Cache.js +28 -2
  526. package/transpiled/directives/cache/Cache.js.map +1 -1
  527. package/transpiled/directives/cache/Control.js +1 -1
  528. package/transpiled/directives/cache/Control.js.map +1 -1
  529. package/transpiled/directives/cache/etag.d.ts +10 -0
  530. package/transpiled/directives/cache/etag.js +30 -0
  531. package/transpiled/directives/cache/etag.js.map +1 -0
  532. package/transpiled/directives/cors/CORS.js.map +1 -1
  533. package/transpiled/directives/dev/Development.js.map +1 -1
  534. package/transpiled/directives/dev/Faulty.js.map +1 -1
  535. package/transpiled/directives/dev/Sleep.js.map +1 -1
  536. package/transpiled/directives/dev/Stub.js.map +1 -1
  537. package/transpiled/directives/dev/Throw.js.map +1 -1
  538. package/transpiled/directives/flow/Compose.js +7 -3
  539. package/transpiled/directives/flow/Compose.js.map +1 -1
  540. package/transpiled/directives/flow/Fetch.js.map +1 -1
  541. package/transpiled/directives/flow/Flow.js.map +1 -1
  542. package/transpiled/directives/index.js +11 -1
  543. package/transpiled/directives/index.js.map +1 -1
  544. package/transpiled/directives/io/IO.d.ts +1 -1
  545. package/transpiled/directives/io/IO.js.map +1 -1
  546. package/transpiled/directives/io/Input.js +1 -1
  547. package/transpiled/directives/io/Input.js.map +1 -1
  548. package/transpiled/directives/io/Output.js +3 -3
  549. package/transpiled/directives/io/Output.js.map +1 -1
  550. package/transpiled/directives/io/Status.js.map +1 -1
  551. package/transpiled/directives/io/Throttle.js +1 -1
  552. package/transpiled/directives/io/Throttle.js.map +1 -1
  553. package/transpiled/directives/io/lib/throttle/Configuration.js +8 -2
  554. package/transpiled/directives/io/lib/throttle/Configuration.js.map +1 -1
  555. package/transpiled/directives/io/lib/throttle/Keys.js.map +1 -1
  556. package/transpiled/directives/io/lib/throttle/Quotas.js +4 -3
  557. package/transpiled/directives/io/lib/throttle/Quotas.js.map +1 -1
  558. package/transpiled/directives/io/lib/throttle/Sync.d.ts +1 -1
  559. package/transpiled/directives/io/lib/throttle/Sync.js.map +1 -1
  560. package/transpiled/directives/io/lib/throttle/Warning.js.map +1 -1
  561. package/transpiled/directives/io/lib/throttle/components/IP.js.map +1 -1
  562. package/transpiled/directives/io/lib/throttle/components/Identity.js.map +1 -1
  563. package/transpiled/directives/io/lib/throttle/components/Path.js.map +1 -1
  564. package/transpiled/directives/io/lib/throttle/components/Route.js.map +1 -1
  565. package/transpiled/directives/io/lib/throttle/components/Segment.js.map +1 -1
  566. package/transpiled/directives/io/lib/throttle/conditions/Status.js.map +1 -1
  567. package/transpiled/directives/map/Authority.js.map +1 -1
  568. package/transpiled/directives/map/Buffer.js.map +1 -1
  569. package/transpiled/directives/map/Claims.js.map +1 -1
  570. package/transpiled/directives/map/Headers.js.map +1 -1
  571. package/transpiled/directives/map/Language.js.map +1 -1
  572. package/transpiled/directives/map/Languages.js.map +1 -1
  573. package/transpiled/directives/map/Map.js.map +1 -1
  574. package/transpiled/directives/map/Mapping.js.map +1 -1
  575. package/transpiled/directives/map/Properties.js.map +1 -1
  576. package/transpiled/directives/map/Segments.js.map +1 -1
  577. package/transpiled/directives/mcp/MCP.js +1 -1
  578. package/transpiled/directives/mcp/MCP.js.map +1 -1
  579. package/transpiled/directives/mcp/Tool.js +3 -1
  580. package/transpiled/directives/mcp/Tool.js.map +1 -1
  581. package/transpiled/directives/oauth/Discovery.js.map +1 -1
  582. package/transpiled/directives/oauth/documents.js.map +1 -1
  583. package/transpiled/directives/octets/Context.js +1 -1
  584. package/transpiled/directives/octets/Context.js.map +1 -1
  585. package/transpiled/directives/octets/Delete.js.map +1 -1
  586. package/transpiled/directives/octets/Directive.js.map +1 -1
  587. package/transpiled/directives/octets/Get.js.map +1 -1
  588. package/transpiled/directives/octets/Octets.js +1 -1
  589. package/transpiled/directives/octets/Octets.js.map +1 -1
  590. package/transpiled/directives/octets/Put.js.map +1 -1
  591. package/transpiled/directives/octets/Workflow.js.map +1 -1
  592. package/transpiled/directives/octets/bytes.js.map +1 -1
  593. package/transpiled/directives/octets/workflows/Execution.js +1 -2
  594. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  595. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  596. package/transpiled/directives/require/Headers.js.map +1 -1
  597. package/transpiled/directives/require/Require.js.map +1 -1
  598. package/transpiled/exceptions.js.map +1 -1
  599. package/transpiled/index.d.ts +1 -1
  600. package/transpiled/index.js +1 -1
  601. package/transpiled/index.js.map +1 -1
  602. package/transpiled/manifest.js +5 -1
  603. package/transpiled/manifest.js.map +1 -1
  604. package/transpiled/root.js.map +1 -1
  605. package/tsconfig.tsbuildinfo +1 -1
  606. package/CHANGELOG.md +0 -552
  607. package/source/redact.test.ts +0 -27
  608. package/source/redact.ts +0 -21
  609. package/transpiled/redact.d.ts +0 -5
  610. package/transpiled/redact.js +0 -17
  611. package/transpiled/redact.js.map +0 -1
@@ -15,11 +15,13 @@ const FORBIDDEN = new Set(['host', 'origin'])
15
15
  export class Headers extends Mapping<Record<string, string>> {
16
16
  private readonly headers: string[]
17
17
 
18
- public constructor (map: Record<string, string>) {
18
+ public constructor(map: Record<string, string>) {
19
19
  assert.ok(map.constructor === Object, '`map:headers` must be an object')
20
20
 
21
- assert.ok(Object.values(map).every((value) => typeof value === 'string'),
22
- '`map:headers` must be an object with string values')
21
+ assert.ok(
22
+ Object.values(map).every((value) => typeof value === 'string'),
23
+ '`map:headers` must be an object with string values'
24
+ )
23
25
 
24
26
  super(map)
25
27
 
@@ -27,7 +29,7 @@ export class Headers extends Mapping<Record<string, string>> {
27
29
  this.headers.forEach((header) => cors.allow(header))
28
30
  }
29
31
 
30
- public override explain (introspection: Introspection): void {
32
+ public override explain(introspection: Introspection): void {
31
33
  for (const [property, header] of Object.entries(this.value)) {
32
34
  const schema = take(introspection, property)
33
35
 
@@ -36,21 +38,23 @@ export class Headers extends Mapping<Record<string, string>> {
36
38
  }
37
39
  }
38
40
 
39
- public properties (context: Input): Record<string, string> {
41
+ public properties(context: Input): Record<string, string> {
40
42
  context.pipelines.response.push((response) => {
41
43
  response.headers ??= new global.Headers()
42
44
 
43
- for (const header of this.headers)
44
- response.headers.append('vary', header)
45
+ for (const header of this.headers) response.headers.append('vary', header)
45
46
  })
46
47
 
47
- return Object.entries(this.value).reduce((properties: Record<string, string>, [property, header]) => {
48
- const value = context.request.headers[header]
48
+ return Object.entries(this.value).reduce(
49
+ (properties: Record<string, string>, [property, header]) => {
50
+ const value = context.request.headers[header]
49
51
 
50
- if (value !== undefined)
51
- properties[property] = Array.isArray(value) ? value.join(', ') : value
52
+ if (value !== undefined)
53
+ properties[property] = Array.isArray(value) ? value.join(', ') : value
52
54
 
53
- return properties
54
- }, {})
55
+ return properties
56
+ },
57
+ {}
58
+ )
55
59
  }
56
60
  }
@@ -10,14 +10,18 @@ import type { Directive } from './Directive.js'
10
10
  export class Language extends Mapping<string> {
11
11
  private languages: string[] | null = null
12
12
 
13
- public constructor (property: string) {
13
+ public constructor(property: string) {
14
14
  assert.ok(typeof property === 'string', '`map:language` must be a string')
15
15
 
16
16
  cors.allow('accept-language')
17
17
  super(property)
18
18
  }
19
19
 
20
- public properties (context: Input, parameters: Parameter[], directives: Directive[]): Record<string, string> {
20
+ public properties(
21
+ context: Input,
22
+ parameters: Parameter[],
23
+ directives: Directive[]
24
+ ): Record<string, string> {
21
25
  this.languages ??= this.resolve(directives)
22
26
 
23
27
  const negotiator = new Negotiator(context.request)
@@ -32,10 +36,9 @@ export class Language extends Mapping<string> {
32
36
  return { [this.value]: language }
33
37
  }
34
38
 
35
- private resolve (directives: Directive[]): string[] {
39
+ private resolve(directives: Directive[]): string[] {
36
40
  for (const directive of directives)
37
- if (directive instanceof Languages)
38
- return directive.value
41
+ if (directive instanceof Languages) return directive.value
39
42
 
40
43
  throw new Error('Supported languages are not defined, add `map:languages` directive')
41
44
  }
@@ -2,9 +2,15 @@ import assert from 'node:assert'
2
2
  import { Property } from './Properties.js'
3
3
 
4
4
  export class Languages extends Property<'languages'> {
5
- public constructor (value: string[]) {
6
- assert.ok(Array.isArray(value) && value.length > 0, '`map:languages` must be a non-empty array of strings')
7
- assert.ok(value.every((language) => typeof language === 'string'), '`map:languages` must be an array of strings')
5
+ public constructor(value: string[]) {
6
+ assert.ok(
7
+ Array.isArray(value) && value.length > 0,
8
+ '`map:languages` must be a non-empty array of strings'
9
+ )
10
+ assert.ok(
11
+ value.every((language) => typeof language === 'string'),
12
+ '`map:languages` must be an array of strings'
13
+ )
8
14
 
9
15
  super('languages', value)
10
16
  }
@@ -21,37 +21,50 @@ export class Map implements DirectiveFamily {
21
21
 
22
22
  private remotes!: Remotes
23
23
 
24
- public create (name: string, value: unknown, remotes: Remotes): Property | Mapping {
24
+ public create(name: string, value: unknown, remotes: Remotes): Property | Mapping {
25
25
  this.remotes = remotes
26
26
 
27
- return match(name,
28
- () => properties.has(name), (name: PN) => new Property(name, value as PV),
29
- () => name in mappings, (name: keyof typeof mappings) => new mappings[name](value, remotes),
27
+ return match(
28
+ name,
29
+ () => properties.has(name),
30
+ (name: PN) => new Property(name, value as PV),
31
+ () => name in mappings,
32
+ (name: keyof typeof mappings) => new mappings[name](value, remotes),
30
33
  () => {
31
34
  throw new Error(`Directive 'map:${name}' is not implemented`)
32
- })
35
+ }
36
+ )
33
37
  }
34
38
 
35
- public explain (directives: Directive[], _: Input, introspection: Introspection): Introspection {
39
+ public explain(
40
+ directives: Directive[],
41
+ _: Input,
42
+ introspection: Introspection
43
+ ): Introspection {
36
44
  for (const directive of directives)
37
- if (directive instanceof Mapping)
38
- directive.explain(introspection)
45
+ if (directive instanceof Mapping) directive.explain(introspection)
39
46
 
40
47
  return introspection
41
48
  }
42
49
 
43
- public async precall (directives: Directive[], context: Input, parameters: Parameter[]): Promise<Output> {
50
+ public async precall(
51
+ directives: Directive[],
52
+ context: Input,
53
+ parameters: Parameter[]
54
+ ): Promise<Output> {
44
55
  const properties = {}
45
56
 
46
57
  for (const directive of directives)
47
58
  if (directive instanceof Mapping)
48
- Object.assign(properties, await directive.properties(context, parameters, directives))
59
+ Object.assign(
60
+ properties,
61
+ await directive.properties(context, parameters, directives)
62
+ )
49
63
 
50
64
  context.pipelines.body.push((body: unknown) => {
51
65
  if (body === undefined || body === null || typeof body !== 'object')
52
66
  return properties
53
- else
54
- return Object.assign(body, properties)
67
+ else return Object.assign(body, properties)
55
68
  })
56
69
 
57
70
  return null
@@ -9,12 +9,16 @@ export abstract class Mapping<T = unknown> {
9
9
  protected value: T
10
10
  protected remotes?: Remotes
11
11
 
12
- protected constructor (value: T, remotes?: Remotes) {
12
+ protected constructor(value: T, remotes?: Remotes) {
13
13
  this.value = value
14
14
  this.remotes = remotes
15
15
  }
16
16
 
17
- public abstract properties (context: Input, parameters: Parameter[], directives: Directive[]): Output
17
+ public abstract properties(
18
+ context: Input,
19
+ parameters: Parameter[],
20
+ directives: Directive[]
21
+ ): Output
18
22
 
19
23
  /**
20
24
  * What this mapping does to what the method says about itself, which is the reverse of
@@ -25,13 +29,12 @@ export abstract class Mapping<T = unknown> {
25
29
  * from the request itself and there is nowhere for a caller to put one; a header and a
26
30
  * segment are the caller's, and those say where.
27
31
  */
28
- public explain (introspection: Introspection): void {
29
- for (const property of this.names())
30
- take(introspection, property)
32
+ public explain(introspection: Introspection): void {
33
+ for (const property of this.names()) take(introspection, property)
31
34
  }
32
35
 
33
36
  /** The input properties this mapping fills, however its value names them. */
34
- protected names (): string[] {
37
+ protected names(): string[] {
35
38
  return typeof this.value === 'string'
36
39
  ? [this.value]
37
40
  : Object.keys(this.value as object)
@@ -6,7 +6,7 @@ export class Property<K extends keyof Properties = keyof Properties> {
6
6
  public readonly name: K
7
7
  public readonly value: Properties[K]
8
8
 
9
- public constructor (name: K, value: Properties[K]) {
9
+ public constructor(name: K, value: Properties[K]) {
10
10
  this.name = name
11
11
  this.value = value
12
12
  }
@@ -5,17 +5,19 @@ import type { Parameter } from '../../RTD/index.js'
5
5
  import type { Introspection, Schema } from '../../Introspection.js'
6
6
 
7
7
  export class Segments extends Mapping<Record<string, string>> {
8
- public constructor (map: Record<string, string>) {
8
+ public constructor(map: Record<string, string>) {
9
9
  assert.ok(map.constructor === Object, '`map:segments` must be an object')
10
10
 
11
- assert.ok(Object.values(map).every((value) => typeof value === 'string'),
12
- '`map:segments ` must be an object with string values')
11
+ assert.ok(
12
+ Object.values(map).every((value) => typeof value === 'string'),
13
+ '`map:segments ` must be an object with string values'
14
+ )
13
15
 
14
16
  super(map)
15
17
  }
16
18
 
17
19
  /** A segment is the caller's, so it moves to the route rather than out of sight. */
18
- public override explain (introspection: Introspection): void {
20
+ public override explain(introspection: Introspection): void {
19
21
  for (const property of Object.keys(this.value)) {
20
22
  const schema = take(introspection, property)
21
23
 
@@ -24,22 +26,27 @@ export class Segments extends Mapping<Record<string, string>> {
24
26
  }
25
27
  }
26
28
 
27
- public override properties (_: unknown, parameters: Parameter[]): Record<string, string> {
28
- return Object.entries(this.value).reduce((properties: Record<string, string>, [property, parameter]) => {
29
- const cut = parameter[0] === '~'
29
+ public override properties(
30
+ _: unknown,
31
+ parameters: Parameter[]
32
+ ): Record<string, string> {
33
+ return Object.entries(this.value).reduce(
34
+ (properties: Record<string, string>, [property, parameter]) => {
35
+ const cut = parameter[0] === '~'
30
36
 
31
- if (cut) parameter = parameter.slice(1)
37
+ if (cut) parameter = parameter.slice(1)
32
38
 
33
- const index = parameters.findIndex(({ name }) => name === parameter)
39
+ const index = parameters.findIndex(({ name }) => name === parameter)
34
40
 
35
- assert.ok(index > -1, `Route parameter '${parameter}' is missing`)
41
+ assert.ok(index > -1, `Route parameter '${parameter}' is missing`)
36
42
 
37
- properties[property] = parameters[index].value
43
+ properties[property] = parameters[index].value
38
44
 
39
- if (cut)
40
- parameters.splice(index, 1)
45
+ if (cut) parameters.splice(index, 1)
41
46
 
42
- return properties
43
- }, {})
47
+ return properties
48
+ },
49
+ {}
50
+ )
44
51
  }
45
52
  }
@@ -12,29 +12,31 @@ export class MCP implements DirectiveFamily<Tool> {
12
12
  public readonly mandatory = false
13
13
 
14
14
  /** What this method is published as, which is what the nearest declaration says. */
15
- public static published (directives: Tool[] | undefined): Tool | null {
15
+ public static published(directives: Tool[] | undefined): Tool | null {
16
16
  return directives?.[0] ?? null
17
17
  }
18
18
 
19
19
  // eslint-disable-next-line max-params
20
- public create (name: string, value: unknown, _: unknown, route: string): Tool {
20
+ public create(name: string, value: unknown, _: unknown, route: string): Tool {
21
21
  assert.ok(name === 'tool', `Unknown directive: mcp:${name}`)
22
22
 
23
23
  return new Tool(value, route)
24
24
  }
25
25
 
26
26
  /** What the route states this method is, which is the only thing that states it. */
27
- public explain (directives: Tool[], _: Context,
28
- introspection: Introspection): Introspection {
27
+ public explain(
28
+ directives: Tool[],
29
+ _: Context,
30
+ introspection: Introspection
31
+ ): Introspection {
29
32
  const tool = MCP.published(directives)
30
33
 
31
- if (tool === null)
32
- return introspection
34
+ if (tool === null) return introspection
33
35
 
34
36
  return {
35
37
  ...introspection,
36
38
  description: tool.description,
37
- ...tool.title === undefined ? {} : { title: tool.title }
39
+ ...(tool.title === undefined ? {} : { title: tool.title })
38
40
  }
39
41
  }
40
42
  }
@@ -12,7 +12,10 @@ describe('mcp:tool', () => {
12
12
  })
13
13
 
14
14
  it('should take a title beside the description', () => {
15
- const tool = new Tool({ title: 'Hot pots', description: 'The pots that are hot.' }, '/pots')
15
+ const tool = new Tool(
16
+ { title: 'Hot pots', description: 'The pots that are hot.' },
17
+ '/pots'
18
+ )
16
19
 
17
20
  assert.strictEqual(tool.title, 'Hot pots')
18
21
  assert.strictEqual(tool.description, 'The pots that are hot.')
@@ -23,13 +26,17 @@ describe('mcp:tool', () => {
23
26
  })
24
27
 
25
28
  it('should not accept an empty title', () => {
26
- assert.throws(() => new Tool({ title: ' ', description: 'A pot.' }, '/pots'),
27
- /a title cannot be empty/)
29
+ assert.throws(
30
+ () => new Tool({ title: ' ', description: 'A pot.' }, '/pots'),
31
+ /a title cannot be empty/
32
+ )
28
33
  })
29
34
 
30
35
  it('should not accept what it does not know', () => {
31
- assert.throws(() => new Tool({ description: 'A pot.', name: 'pots' }, '/pots'),
32
- /unknown 'name'/)
36
+ assert.throws(
37
+ () => new Tool({ description: 'A pot.', name: 'pots' }, '/pots'),
38
+ /unknown 'name'/
39
+ )
33
40
  })
34
41
 
35
42
  it('should not accept an empty description', () => {
@@ -73,8 +80,11 @@ describe('mcp:tool inheritance', () => {
73
80
  })
74
81
 
75
82
  it('should describe a method with what the route states', () => {
76
- const described = family.explain([new Tool('What the route is.', '/pots')], null as never,
77
- { description: 'What the operation is.' })
83
+ const described = family.explain(
84
+ [new Tool('What the route is.', '/pots')],
85
+ null as never,
86
+ { description: 'What the operation is.' }
87
+ )
78
88
 
79
89
  assert.strictEqual(described.description, 'What the route is.')
80
90
  })
@@ -84,7 +94,9 @@ describe('mcp:tool inheritance', () => {
84
94
  })
85
95
 
86
96
  it('should refuse a directive it does not know', () => {
87
- assert.throws(() => family.create('resource', 'A pot.', null, '/pots'),
88
- /Unknown directive: mcp:resource/)
97
+ assert.throws(
98
+ () => family.create('resource', 'A pot.', null, '/pots'),
99
+ /Unknown directive: mcp:resource/
100
+ )
89
101
  })
90
102
  })
@@ -19,27 +19,39 @@ export class Tool {
19
19
  public readonly description: string
20
20
  public readonly title: string | undefined
21
21
 
22
- public constructor (value: unknown, route: string) {
22
+ public constructor(value: unknown, route: string) {
23
23
  const stated = typeof value === 'string' ? { description: value } : value
24
24
 
25
- assert.ok(typeof stated === 'object' && stated !== null && !Array.isArray(stated),
26
- 'Directive mcp:tool: the value is what the tool is, or a `title` and a `description`')
25
+ assert.ok(
26
+ typeof stated === 'object' && stated !== null && !Array.isArray(stated),
27
+ 'Directive mcp:tool: the value is what the tool is, or a `title` and a `description`'
28
+ )
27
29
 
28
30
  const { description, title, ...rest } = stated as Record<string, unknown>
29
31
 
30
- assert.ok(Object.keys(rest).length === 0,
31
- `Directive mcp:tool: unknown ${Object.keys(rest).map((key) => `'${key}'`).join(', ')}`)
32
+ assert.ok(
33
+ Object.keys(rest).length === 0,
34
+ `Directive mcp:tool: unknown ${Object.keys(rest)
35
+ .map((key) => `'${key}'`)
36
+ .join(', ')}`
37
+ )
32
38
 
33
- assert.ok(typeof description === 'string' && description.trim().length > 0,
34
- 'Directive mcp:tool: a description cannot be empty')
39
+ assert.ok(
40
+ typeof description === 'string' && description.trim().length > 0,
41
+ 'Directive mcp:tool: a description cannot be empty'
42
+ )
35
43
 
36
- assert.ok(title === undefined || (typeof title === 'string' && title.trim().length > 0),
37
- 'Directive mcp:tool: a title cannot be empty')
44
+ assert.ok(
45
+ title === undefined || (typeof title === 'string' && title.trim().length > 0),
46
+ 'Directive mcp:tool: a title cannot be empty'
47
+ )
38
48
 
39
49
  // a tool is called by name, so a route that cannot be named cannot be one — said where
40
50
  // the mistake is, rather than as a tool that is quietly never listed
41
- assert.ok(refusal(segment(route)) === null,
42
- `Directive mcp:tool: '${route}' holds a segment no tool name can spell`)
51
+ assert.ok(
52
+ refusal(segment(route)) === null,
53
+ `Directive mcp:tool: '${route}' holds a segment no tool name can spell`
54
+ )
43
55
 
44
56
  this.description = description
45
57
  this.title = title as string | undefined
@@ -20,11 +20,10 @@ export class Discovery implements Interceptor {
20
20
  */
21
21
  private readonly authorities = new Map<string, Documents>()
22
22
 
23
- public mount (options: http.Options): void {
23
+ public mount(options: http.Options): void {
24
24
  this.authorities.clear()
25
25
 
26
- if (options.oauth === undefined)
27
- return
26
+ if (options.oauth === undefined) return
28
27
 
29
28
  /*
30
29
  * `https` always: RFC 8414 has an issuer be one, and OAuth 2.1 has every endpoint of an
@@ -39,20 +38,18 @@ export class Discovery implements Interceptor {
39
38
  this.authorities.set(authority, documents(`https://${host}`, options.oauth))
40
39
  }
41
40
 
42
- public reset (): void {
41
+ public reset(): void {
43
42
  this.authorities.clear()
44
43
  }
45
44
 
46
- public intercept (input: Input): Output {
45
+ public intercept(input: Input): Output {
47
46
  const known = this.authorities.get(input.authority)
48
47
 
49
- if (known === undefined)
50
- return null
48
+ if (known === undefined) return null
51
49
 
52
50
  // every reply, not just a document's: the challenge is what points a client here
53
51
  input.pipelines.response.push((response) => {
54
- if (response.status !== UNAUTHORIZED)
55
- return
52
+ if (response.status !== UNAUTHORIZED) return
56
53
 
57
54
  response.headers ??= new Headers()
58
55
  response.headers.set('www-authenticate', known.challenge(input.url.pathname))
@@ -60,8 +57,7 @@ export class Discovery implements Interceptor {
60
57
 
61
58
  const body = known.read(input.url.pathname)
62
59
 
63
- if (body === undefined)
64
- return null
60
+ if (body === undefined) return null
65
61
 
66
62
  return { body, headers: new Headers({ 'cache-control': 'public, max-age=3600' }) }
67
63
  }
@@ -9,12 +9,12 @@ export interface Documents {
9
9
  challenge: (pathname: string) => string
10
10
  }
11
11
 
12
- export function documents (issuer: string, oauth: OAuth): Documents {
12
+ export function documents(issuer: string, oauth: OAuth): Documents {
13
13
  const server = authorizationServer(issuer, oauth)
14
14
  const resources = protectedResources(issuer, oauth)
15
15
  const scope = oauth.scopes === undefined ? '' : `, scope="${oauth.scopes.join(' ')}"`
16
16
 
17
- function read (pathname: string): object | undefined {
17
+ function read(pathname: string): object | undefined {
18
18
  if (pathname === AUTHORIZATION_SERVER || pathname === OPENID_CONFIGURATION)
19
19
  return server
20
20
 
@@ -24,7 +24,7 @@ export function documents (issuer: string, oauth: OAuth): Documents {
24
24
  return undefined
25
25
  }
26
26
 
27
- function challenge (pathname: string): string {
27
+ function challenge(pathname: string): string {
28
28
  return `Bearer resource_metadata="${issuer}${PROTECTED_RESOURCE}${suffix(oauth, pathname)}"${scope}`
29
29
  }
30
30
 
@@ -36,7 +36,7 @@ export function documents (issuer: string, oauth: OAuth): Documents {
36
36
  * everything else this extension serves. Both flags are load-bearing for a client that
37
37
  * prefers Client ID Metadata Documents: without either it falls back to registration.
38
38
  */
39
- function authorizationServer (issuer: string, oauth: OAuth): object {
39
+ function authorizationServer(issuer: string, oauth: OAuth): object {
40
40
  const metadata: Record<string, unknown> = {
41
41
  issuer,
42
42
  authorization_endpoint: oauth.authorize,
@@ -52,8 +52,7 @@ function authorizationServer (issuer: string, oauth: OAuth): object {
52
52
  if (oauth.registration === 'open')
53
53
  metadata.registration_endpoint = `${issuer}${REGISTRATION}`
54
54
 
55
- if (oauth.scopes !== undefined)
56
- metadata.scopes_supported = oauth.scopes
55
+ if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
57
56
 
58
57
  return metadata
59
58
  }
@@ -63,7 +62,7 @@ function authorizationServer (issuer: string, oauth: OAuth): object {
63
62
  * `https://host/mcp` reads `/.well-known/oauth-protected-resource/mcp`, and one that names
64
63
  * no path reads the document at the origin.
65
64
  */
66
- function protectedResources (issuer: string, oauth: OAuth): Map<string, object> {
65
+ function protectedResources(issuer: string, oauth: OAuth): Map<string, object> {
67
66
  const map = new Map<string, object>()
68
67
 
69
68
  for (const path of oauth.resources ?? [])
@@ -74,26 +73,24 @@ function protectedResources (issuer: string, oauth: OAuth): Map<string, object>
74
73
  return map
75
74
  }
76
75
 
77
- function resource (issuer: string, path: string, oauth: OAuth): object {
76
+ function resource(issuer: string, path: string, oauth: OAuth): object {
78
77
  const metadata: Record<string, unknown> = {
79
78
  resource: issuer + path,
80
79
  authorization_servers: [issuer],
81
80
  bearer_methods_supported: ['header']
82
81
  }
83
82
 
84
- if (oauth.scopes !== undefined)
85
- metadata.scopes_supported = oauth.scopes
83
+ if (oauth.scopes !== undefined) metadata.scopes_supported = oauth.scopes
86
84
 
87
85
  return metadata
88
86
  }
89
87
 
90
88
  /** The document a request to this path was refused against: the longest resource holding it. */
91
- function suffix (oauth: OAuth, pathname: string): string {
89
+ function suffix(oauth: OAuth, pathname: string): string {
92
90
  let longest = ''
93
91
 
94
92
  for (const path of oauth.resources ?? [])
95
- if (pathname.startsWith(path) && path.length > longest.length)
96
- longest = path
93
+ if (pathname.startsWith(path) && path.length > longest.length) longest = path
97
94
 
98
95
  return canonical(longest)
99
96
  }
@@ -102,7 +99,7 @@ function suffix (oauth: OAuth, pathname: string): string {
102
99
  * A resource is identified without its trailing slash — the form MCP asks for — while a
103
100
  * route is declared with one, so `/mcp/` identifies `…/mcp`.
104
101
  */
105
- function canonical (path: string): string {
102
+ function canonical(path: string): string {
106
103
  return path.endsWith('/') ? path.slice(0, -1) : path
107
104
  }
108
105
 
@@ -6,15 +6,18 @@ export class Context extends Directive {
6
6
  public readonly targeted = false
7
7
  public readonly storage: string
8
8
 
9
- public constructor (value: unknown) {
9
+ public constructor(value: unknown) {
10
10
  super()
11
11
 
12
- assert.ok(typeof value === 'string', 'Directive \'octets:context\' must must be a string')
12
+ assert.ok(
13
+ typeof value === 'string',
14
+ "Directive 'octets:context' must must be a string"
15
+ )
13
16
 
14
17
  this.storage = value
15
18
  }
16
19
 
17
- public async apply (): Promise<Output> {
20
+ public async apply(): Promise<Output> {
18
21
  return null
19
22
  }
20
23
  }