@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
@@ -7,65 +7,79 @@ import { address, name, refusal } from './names.js'
7
7
 
8
8
  describe('address', () => {
9
9
  it('should resolve a name without variables', () => {
10
- assert.deepEqual(address('pots/GET', {}),
11
- { path: '/pots/', verb: 'GET', variables: [] })
10
+ assert.deepEqual(address('pots.GET', {}), {
11
+ path: '/pots/',
12
+ verb: 'GET',
13
+ variables: []
14
+ })
12
15
  })
13
16
 
14
17
  it('should resolve the trunk', () => {
15
- assert.deepEqual(address('GET', {}),
16
- { path: '/', verb: 'GET', variables: [] })
18
+ assert.deepEqual(address('GET', {}), { path: '/', verb: 'GET', variables: [] })
17
19
  })
18
20
 
19
21
  it('should substitute a variable and report it taken', () => {
20
- assert.deepEqual(address('pots/_id/GET', { id: 'a1b2', title: 'Kettle' }),
21
- { path: '/pots/a1b2/', verb: 'GET', variables: ['id'] })
22
+ assert.deepEqual(address('pots._id.GET', { id: 'a1b2', title: 'Kettle' }), {
23
+ path: '/pots/a1b2/',
24
+ verb: 'GET',
25
+ variables: ['id']
26
+ })
22
27
  })
23
28
 
24
29
  it('should substitute every variable', () => {
25
- assert.deepEqual(address('users/_user/pots/_id/PATCH', { user: 'bob', id: 'a1b2' }),
26
- { path: '/users/bob/pots/a1b2/', verb: 'PATCH', variables: ['user', 'id'] })
30
+ assert.deepEqual(address('users._user.pots._id.PATCH', { user: 'bob', id: 'a1b2' }), {
31
+ path: '/users/bob/pots/a1b2/',
32
+ verb: 'PATCH',
33
+ variables: ['user', 'id']
34
+ })
27
35
  })
28
36
 
29
37
  it('should let a tail carry separators', () => {
30
- assert.deepEqual(address('files/__/GET', { '**': 'a/b/c' }),
31
- { path: '/files/a/b/c/', verb: 'GET', variables: ['**'] })
38
+ assert.deepEqual(address('files.__.GET', { '**': 'a/b/c' }), {
39
+ path: '/files/a/b/c/',
40
+ verb: 'GET',
41
+ variables: ['**']
42
+ })
32
43
  })
33
44
 
34
45
  it('should not confuse a trailing literal with a verb', () => {
35
- assert.deepEqual(address('pots/GET/POST', {}),
36
- { path: '/pots/GET/', verb: 'POST', variables: [] })
46
+ assert.deepEqual(address('pots.GET.POST', {}), {
47
+ path: '/pots/GET/',
48
+ verb: 'POST',
49
+ variables: []
50
+ })
37
51
  })
38
52
 
39
53
  it('should refuse a name that states no verb', () => {
40
- assert.throws(() => address('pots/_id', { id: 'a1b2' }), http.NotFound)
54
+ assert.throws(() => address('pots._id', { id: 'a1b2' }), http.NotFound)
41
55
  })
42
56
 
43
57
  it('should refuse a verb no method uses', () => {
44
- assert.throws(() => address('pots/FETCH', {}), http.NotFound)
58
+ assert.throws(() => address('pots.FETCH', {}), http.NotFound)
45
59
  })
46
60
 
47
61
  it('should refuse a segment no name can spell', () => {
48
- assert.throws(() => address('pots/v1.0/GET', {}), http.NotFound)
49
- assert.throws(() => address('a_b/GET', {}), http.NotFound)
50
- assert.throws(() => address('pots//GET', {}), http.NotFound)
62
+ assert.throws(() => address('pots/v1.GET', {}), http.NotFound)
63
+ assert.throws(() => address('a_b.GET', {}), http.NotFound)
64
+ assert.throws(() => address('pots..GET', {}), http.NotFound)
51
65
  })
52
66
 
53
67
  it('should refuse a variable of no name', () => {
54
- assert.throws(() => address('pots/_/GET', { '': 'a1b2' }), http.NotFound)
68
+ assert.throws(() => address('pots._.GET', { '': 'a1b2' }), http.NotFound)
55
69
  })
56
70
 
57
71
  it('should refuse a missing variable', () => {
58
- assert.throws(() => address('pots/_id/GET', {}), http.BadRequest)
72
+ assert.throws(() => address('pots._id.GET', {}), http.BadRequest)
59
73
  })
60
74
 
61
75
  it('should refuse a variable that would divide the path', () => {
62
- assert.throws(() => address('pots/_id/GET', { id: 'a/b' }), http.BadRequest)
63
- assert.throws(() => address('pots/_id/GET', { id: 'a?b' }), http.BadRequest)
64
- assert.throws(() => address('pots/_id/GET', { id: 'a#b' }), http.BadRequest)
76
+ assert.throws(() => address('pots._id.GET', { id: 'a/b' }), http.BadRequest)
77
+ assert.throws(() => address('pots._id.GET', { id: 'a?b' }), http.BadRequest)
78
+ assert.throws(() => address('pots._id.GET', { id: 'a#b' }), http.BadRequest)
65
79
  })
66
80
 
67
81
  it('should refuse a tail that would end the path', () => {
68
- assert.throws(() => address('files/__/GET', { '**': 'a?b' }), http.BadRequest)
82
+ assert.throws(() => address('files.__.GET', { '**': 'a?b' }), http.BadRequest)
69
83
  })
70
84
  })
71
85
 
@@ -75,22 +89,24 @@ describe('name', () => {
75
89
  })
76
90
 
77
91
  it('should name a route', () => {
78
- assert.equal(name(segment('/pots'), 'GET'), 'pots/GET')
79
- assert.equal(name(segment('/identity/tokens'), 'POST'), 'identity/tokens/POST')
92
+ assert.equal(name(segment('/pots'), 'GET'), 'pots.GET')
93
+ assert.equal(name(segment('/identity/tokens'), 'POST'), 'identity.tokens.POST')
80
94
  })
81
95
 
82
96
  it('should mark a variable', () => {
83
- assert.equal(name(segment('/pots/:id'), 'GET'), 'pots/_id/GET')
84
- assert.equal(name(segment('/identity/tokens/:identity'), 'POST'),
85
- 'identity/tokens/_identity/POST')
97
+ assert.equal(name(segment('/pots/:id'), 'GET'), 'pots._id.GET')
98
+ assert.equal(
99
+ name(segment('/identity/tokens/:identity'), 'POST'),
100
+ 'identity.tokens._identity.POST'
101
+ )
86
102
  })
87
103
 
88
104
  it('should mark a tail', () => {
89
- assert.equal(name(segment('/files/**'), 'GET'), 'files/__/GET')
105
+ assert.equal(name(segment('/files/**'), 'GET'), 'files.__.GET')
90
106
  })
91
107
 
92
108
  it('should keep a hyphen', () => {
93
- assert.equal(name(segment('/jpeg-or-png'), 'GET'), 'jpeg-or-png/GET')
109
+ assert.equal(name(segment('/jpeg-or-png'), 'GET'), 'jpeg-or-png.GET')
94
110
  })
95
111
 
96
112
  it('should name nothing where a segment cannot be spelled', () => {
@@ -103,8 +119,11 @@ describe('name', () => {
103
119
  it('should round-trip what it names', () => {
104
120
  const named = name(segment('/pots/:id'), 'GET')!
105
121
 
106
- assert.deepEqual(address(named, { id: 'a1b2' }),
107
- { path: '/pots/a1b2/', verb: 'GET', variables: ['id'] })
122
+ assert.deepEqual(address(named, { id: 'a1b2' }), {
123
+ path: '/pots/a1b2/',
124
+ verb: 'GET',
125
+ variables: ['id']
126
+ })
108
127
  })
109
128
  })
110
129
 
@@ -7,8 +7,9 @@ import { QUERY, type Params } from './types.js'
7
7
  * What a name resolves to: the path the call is made at, and the verb it is made with.
8
8
  *
9
9
  * A name is the route template with its variables marked and the verb appended as a segment
10
- * of its own — `pots/_id/GET`. Neither `/` nor a verb can be mistaken for anything else: the
11
- * verb is always the last segment, and `/` cannot occur inside one.
10
+ * of its own — `pots._id.GET`. The revision names the characters a tool's name may hold, and
11
+ * `/` is not among them, so segments are joined by `.` — which a segment cannot hold either,
12
+ * so nothing in a name can be mistaken for anything else, and the verb is always last.
12
13
  */
13
14
  export interface Address {
14
15
  path: string
@@ -18,12 +19,11 @@ export interface Address {
18
19
  variables: string[]
19
20
  }
20
21
 
21
- export function address (method: string, params: Params): Address {
22
+ export function address(method: string, params: Params): Address {
22
23
  const parts = method.split(SEPARATOR)
23
24
  const verb = parts.pop()!
24
25
 
25
- if (!verbs.has(verb))
26
- throw new http.NotFound(`'${method}' names no method`)
26
+ if (!verbs.has(verb)) throw new http.NotFound(`'${method}' names no method`)
27
27
 
28
28
  const variables: string[] = []
29
29
  const fragments: string[] = []
@@ -65,13 +65,15 @@ export function address (method: string, params: Params): Address {
65
65
  * What the call carries, as a request carries it: the path took its variables, `query` is
66
66
  * the querystring, and the rest is the body.
67
67
  */
68
- export function split (params: Params, variables: string[]): { query?: Params, input?: Params } {
68
+ export function split(
69
+ params: Params,
70
+ variables: string[]
71
+ ): { query?: Params; input?: Params } {
69
72
  const input: Params = {}
70
73
  let query: Params | undefined
71
74
 
72
75
  for (const [key, value] of Object.entries(params)) {
73
- if (variables.includes(key))
74
- continue
76
+ if (variables.includes(key)) continue
75
77
 
76
78
  if (key !== QUERY) {
77
79
  input[key] = value
@@ -90,30 +92,27 @@ export function split (params: Params, variables: string[]): { query?: Params, i
90
92
  }
91
93
 
92
94
  /** The parameter a part reads, or nothing where the part is a literal segment. */
93
- function parameter (part: string): string | null {
94
- if (part === TAIL)
95
- return WILDCARD
95
+ function parameter(part: string): string | null {
96
+ if (part === TAIL) return WILDCARD
96
97
 
97
98
  return part[0] === VARIABLE ? part.slice(1) : null
98
99
  }
99
100
 
100
101
  /** A segment a name cannot spell is a segment no name has, so this one names nothing. */
101
- function literal (part: string, method: string): string {
102
- if (!NAMEABLE.test(part))
103
- throw new http.NotFound(`'${method}' names no procedure`)
102
+ function literal(part: string, method: string): string {
103
+ if (!NAMEABLE.test(part)) throw new http.NotFound(`'${method}' names no procedure`)
104
104
 
105
105
  return part
106
106
  }
107
107
 
108
108
  /** The name of a method on this route, or nothing where the route has none. */
109
- export function name (segments: Segment[], verb: string): string | null {
109
+ export function name(segments: Segment[], verb: string): string | null {
110
110
  const parts: string[] = []
111
111
 
112
112
  for (const segment of segments) {
113
113
  const part = component(segment)
114
114
 
115
- if (part === null)
116
- return null
115
+ if (part === null) return null
117
116
 
118
117
  parts.push(part)
119
118
  }
@@ -124,44 +123,39 @@ export function name (segments: Segment[], verb: string): string | null {
124
123
  }
125
124
 
126
125
  /** The segment that leaves a route unnameable, as it was declared, or nothing where none does. */
127
- export function refusal (segments: Segment[]): string | null {
126
+ export function refusal(segments: Segment[]): string | null {
128
127
  for (const segment of segments)
129
- if (component(segment) === null)
130
- return declared(segment)
128
+ if (component(segment) === null) return declared(segment)
131
129
 
132
130
  return null
133
131
  }
134
132
 
135
- function component (segment: Segment): string | null {
133
+ function component(segment: Segment): string | null {
136
134
  if (segment.fragment !== null)
137
135
  return NAMEABLE.test(segment.fragment) ? segment.fragment : null
138
136
 
139
- if (segment.wildcard === true)
140
- return TAIL
137
+ if (segment.wildcard === true) return TAIL
141
138
 
142
139
  // it stands for a segment the caller cannot name, so there is nothing to substitute
143
- if (segment.placeholder === null)
144
- return null
140
+ if (segment.placeholder === null) return null
145
141
 
146
142
  return NAMEABLE.test(segment.placeholder) ? VARIABLE + segment.placeholder : null
147
143
  }
148
144
 
149
145
  /** The route as it was declared, which is how a message about it should read. */
150
- export function template (segments: Segment[]): string {
146
+ export function template(segments: Segment[]): string {
151
147
  return '/' + segments.map(declared).join('/')
152
148
  }
153
149
 
154
- function declared (segment: Segment): string {
155
- if (segment.fragment !== null)
156
- return segment.fragment
150
+ function declared(segment: Segment): string {
151
+ if (segment.fragment !== null) return segment.fragment
157
152
 
158
- if (segment.wildcard === true)
159
- return '**'
153
+ if (segment.wildcard === true) return '**'
160
154
 
161
155
  return segment.placeholder === null ? '*' : ':' + segment.placeholder
162
156
  }
163
157
 
164
- const SEPARATOR = '/'
158
+ const SEPARATOR = '.'
165
159
  const VARIABLE = '_'
166
160
  const TAIL = '__'
167
161
 
@@ -3,7 +3,7 @@ import type * as syntax from './syntax/index.js'
3
3
  import type { Context, OutgoingMessage, Options } from '../HTTP/index.js'
4
4
  import type { Output } from '../io.js'
5
5
  import type { Introspection } from '../Introspection.js'
6
- import type { extensions } from '@toa.io/core'
6
+ import type { extensions } from '@toa.io/core/types'
7
7
 
8
8
  type Host = extensions.Host
9
9
 
@@ -18,7 +18,10 @@ export interface Directives {
18
18
  precall: (context: Context, parameters: Parameter[]) => Promise<Output>
19
19
 
20
20
  /** What this route's directives make of what its method says about itself. */
21
- explain: (context: Context, introspection: Introspection) => Promise<Introspection | null>
21
+ explain: (
22
+ context: Context,
23
+ introspection: Introspection
24
+ ) => Promise<Introspection | null>
22
25
  settle: (context: Context, response: OutgoingMessage) => Promise<void>
23
26
  dispose: () => void
24
27
  }
@@ -71,9 +74,11 @@ export interface DirectiveFamily<TDirective = any, TExtension = any> {
71
74
  preflight?: (request: Context & TExtension) => void | Promise<void>
72
75
 
73
76
  /** Call-scoped, with what the node declares. Runs once per call. */
74
- precall?: (directives: TDirective[],
77
+ precall?: (
78
+ directives: TDirective[],
75
79
  request: Context & TExtension,
76
- parameters: Parameter[]) => Output | Promise<Output>
80
+ parameters: Parameter[]
81
+ ) => Output | Promise<Output>
77
82
 
78
83
  /**
79
84
  * What this family's directives make of what the method says about itself, which is
@@ -84,22 +89,28 @@ export interface DirectiveFamily<TDirective = any, TExtension = any> {
84
89
  * is why no parameters are passed — so a directive that can only tell from one hands back
85
90
  * what it was given.
86
91
  */
87
- explain?: (directives: TDirective[],
92
+ explain?: (
93
+ directives: TDirective[],
88
94
  request: Context & TExtension,
89
- introspection: Introspection) => Introspection | null | Promise<Introspection | null>
95
+ introspection: Introspection
96
+ ) => Introspection | null | Promise<Introspection | null>
90
97
 
91
98
  /** Call-scoped, on the message that call produced. */
92
- settle?: (directives: TDirective[],
99
+ settle?: (
100
+ directives: TDirective[],
93
101
  request: Context & TExtension,
94
- response: OutgoingMessage) => void | Promise<void>
102
+ response: OutgoingMessage
103
+ ) => void | Promise<void>
95
104
 
96
105
  /**
97
106
  * Request-scoped, on the message going back — the counterpart of `preflight`, and
98
107
  * likewise without directives. A reply the whole request carries, such as a re-issued
99
108
  * credential, is written here rather than by a call that would not own it.
100
109
  */
101
- depart?: (request: Context & TExtension,
102
- response: OutgoingMessage) => void | Promise<void>
110
+ depart?: (
111
+ request: Context & TExtension,
112
+ response: OutgoingMessage
113
+ ) => void | Promise<void>
103
114
 
104
115
  dispose?: (directives: TDirective[]) => void
105
116
  }
@@ -5,7 +5,10 @@ import type * as RTD from './index.js'
5
5
  import type { Introspection } from '../Introspection.js'
6
6
 
7
7
  export interface Endpoint {
8
- call: (context: http.Context, parameters: RTD.Parameter[]) => Promise<http.OutgoingMessage>
8
+ call: (
9
+ context: http.Context,
10
+ parameters: RTD.Parameter[]
11
+ ) => Promise<http.OutgoingMessage>
9
12
 
10
13
  explain: (parameters: RTD.Parameter[]) => Promise<Introspection>
11
14
 
@@ -9,7 +9,7 @@ export class Method {
9
9
  public readonly endpoint: Endpoint | null
10
10
  public readonly directives: Directives
11
11
 
12
- public constructor (endpoint: Endpoint | null, directives: Directives) {
12
+ public constructor(endpoint: Endpoint | null, directives: Directives) {
13
13
  this.endpoint = endpoint
14
14
  this.directives = directives
15
15
  }
@@ -19,17 +19,19 @@ export class Method {
19
19
  * refuse this caller. A method of no endpoint — one a directive answers on its own —
20
20
  * states nothing of its own, and its directives still have their say.
21
21
  */
22
- public async explain (context: Context, parameters: Parameter[]): Promise<Introspection | null> {
23
- const introspection = this.endpoint === null
24
- ? {}
25
- : await this.endpoint.explain(parameters)
22
+ public async explain(
23
+ context: Context,
24
+ parameters: Parameter[]
25
+ ): Promise<Introspection | null> {
26
+ const introspection =
27
+ this.endpoint === null ? {} : await this.endpoint.explain(parameters)
26
28
 
27
29
  const described = await this.directives.explain(context, introspection)
28
30
 
29
31
  return described === null ? null : order(described)
30
32
  }
31
33
 
32
- public async close (): Promise<void> {
34
+ public async close(): Promise<void> {
33
35
  await this.endpoint?.close()
34
36
  }
35
37
  }
@@ -13,7 +13,7 @@ export class Node {
13
13
  private readonly protected: boolean
14
14
  private routes: Route[]
15
15
 
16
- public constructor (routes: Route[], methods: Methods, properties: Properties) {
16
+ public constructor(routes: Route[], methods: Methods, properties: Properties) {
17
17
  this.routes = routes
18
18
  this.methods = methods
19
19
  this.protected = properties.protected
@@ -24,13 +24,16 @@ export class Node {
24
24
  this.sort()
25
25
  }
26
26
 
27
- public match (fragments: string[], parameters: Parameter[] = []): Match | null {
27
+ public match(fragments: string[], parameters: Parameter[] = []): Match | null {
28
+ // a route only pushes, so what a failed one added is cut off rather than the array copied
29
+ const mark = parameters.length
30
+
28
31
  for (const route of this.routes) {
29
- const params = parameters.slice()
30
- const match = route.match(fragments, params)
32
+ const match = route.match(fragments, parameters)
33
+
34
+ if (match !== null) return match
31
35
 
32
- if (match !== null)
33
- return match
36
+ parameters.length = mark
34
37
  }
35
38
 
36
39
  return null
@@ -40,7 +43,7 @@ export class Node {
40
43
  * Returns the nodes the merged branch has landed on, so that its expiration
41
44
  * can later be extended without rebuilding anything.
42
45
  */
43
- public merge (node: Node): Node[] {
46
+ public merge(node: Node): Node[] {
44
47
  this.intermediate = node.intermediate
45
48
 
46
49
  const nodes = this.protected ? this.append(node) : this.replace(node)
@@ -50,9 +53,8 @@ export class Node {
50
53
  return nodes
51
54
  }
52
55
 
53
- public touch (expiration: number): void {
54
- if (!this.protected)
55
- this.expiration = expiration
56
+ public touch(expiration: number): void {
57
+ if (!this.protected) this.expiration = expiration
56
58
  }
57
59
 
58
60
  /**
@@ -62,33 +64,34 @@ export class Node {
62
64
  * answers at the same place and is reached instead. The trunk is the exception `match`
63
65
  * makes for it — `'/'` answers the trunk itself, whatever it holds.
64
66
  */
65
- public * walk (segments: Segment[], trunk = false): Generator<Mount> {
67
+ public *walk(segments: Segment[], trunk = false): Generator<Mount> {
66
68
  if (trunk || !this.intermediate)
67
69
  for (const [verb, method] of Object.entries(this.methods))
68
70
  yield { segments, verb, method }
69
71
 
70
- for (const route of this.routes)
71
- yield * route.walk(segments)
72
+ for (const route of this.routes) yield* route.walk(segments)
72
73
  }
73
74
 
74
75
  /** Every method of this node that this caller may reach, in the order they were declared. */
75
- public async explain (context: Context,
76
- parameters: Parameter[]): Promise<Record<string, Introspection>> {
76
+ public async explain(
77
+ context: Context,
78
+ parameters: Parameter[]
79
+ ): Promise<Record<string, Introspection>> {
77
80
  const entries = Object.entries(this.methods)
78
81
 
79
- const explained = await Promise.all(entries
80
- .map(async ([, method]) => await method.explain(context, parameters)))
82
+ const explained = await Promise.all(
83
+ entries.map(async ([, method]) => await method.explain(context, parameters))
84
+ )
81
85
 
82
86
  const methods: Record<string, Introspection> = {}
83
87
 
84
88
  for (let i = 0; i < entries.length; i++)
85
- if (explained[i] !== null)
86
- methods[entries[i][0]] = explained[i]!
89
+ if (explained[i] !== null) methods[entries[i][0]] = explained[i]!
87
90
 
88
91
  return methods
89
92
  }
90
93
 
91
- private replace (node: Node): Node[] {
94
+ private replace(node: Node): Node[] {
92
95
  const methods = Object.values(this.methods)
93
96
 
94
97
  this.routes = node.routes
@@ -97,44 +100,39 @@ export class Node {
97
100
  this.forward = node.forward
98
101
 
99
102
  // race condition is really unlikely
100
- for (const method of methods)
101
- void method.close()
103
+ for (const method of methods) void method.close()
102
104
 
103
105
  return this.nodes()
104
106
  }
105
107
 
106
- private append (node: Node): Node[] {
108
+ private append(node: Node): Node[] {
107
109
  const nodes: Node[] = []
108
110
 
109
- for (const route of node.routes)
110
- nodes.push(...this.route(route))
111
+ for (const route of node.routes) nodes.push(...this.route(route))
111
112
 
112
- for (const [verb, method] of Object.entries(node.methods))
113
- this.methods[verb] = method
113
+ for (const [verb, method] of Object.entries(node.methods)) this.methods[verb] = method
114
114
 
115
115
  return nodes
116
116
  }
117
117
 
118
- private route (candidate: Route): Node[] {
118
+ private route(candidate: Route): Node[] {
119
119
  for (const route of this.routes)
120
- if (candidate.equals(route))
121
- return route.merge(candidate)
120
+ if (candidate.equals(route)) return route.merge(candidate)
122
121
 
123
122
  this.routes.push(candidate)
124
123
 
125
124
  return candidate.node.nodes()
126
125
  }
127
126
 
128
- private nodes (): Node[] {
127
+ private nodes(): Node[] {
129
128
  const nodes: Node[] = [this]
130
129
 
131
- for (const route of this.routes)
132
- nodes.push(...route.node.nodes())
130
+ for (const route of this.routes) nodes.push(...route.node.nodes())
133
131
 
134
132
  return nodes
135
133
  }
136
134
 
137
- private sort (): void {
135
+ private sort(): void {
138
136
  this.routes.sort((a, b) => {
139
137
  return a.variables === b.variables
140
138
  ? b.segments.length - a.segments.length // routes with more segments should be matched first
@@ -9,7 +9,7 @@ export class Route {
9
9
  public readonly node: Node
10
10
  private readonly wildcard: boolean = false
11
11
 
12
- public constructor (segments: Segment[], node: Node) {
12
+ public constructor(segments: Segment[], node: Node) {
13
13
  this.root = segments.length === 0
14
14
  this.segments = segments
15
15
  this.node = node
@@ -21,15 +21,13 @@ export class Route {
21
21
  }
22
22
  }
23
23
 
24
- public match (fragments: string[], parameters: Parameter[]): Match | null {
25
- if (Date.now() >= this.node.expiration)
26
- return null
24
+ public match(fragments: string[], parameters: Parameter[]): Match | null {
25
+ if (Date.now() >= this.node.expiration) return null
27
26
 
28
27
  for (let i = 0; i < this.segments.length; i++) {
29
28
  const segment = this.segments[i]
30
29
 
31
- if (segment.fragment !== null && segment.fragment !== fragments[i])
32
- return null
30
+ if (segment.fragment !== null && segment.fragment !== fragments[i]) return null
33
31
 
34
32
  if (segment.fragment === null && segment.placeholder !== null)
35
33
  parameters.push({ name: segment.placeholder, value: decode(fragments[i]) })
@@ -37,7 +35,10 @@ export class Route {
37
35
  if (segment.fragment === null && segment.wildcard === true)
38
36
  parameters.push({
39
37
  name: '**',
40
- value: fragments.slice(this.segments.length - 1).map(decode).join('/')
38
+ value: fragments
39
+ .slice(this.segments.length - 1)
40
+ .map(decode)
41
+ .join('/')
41
42
  })
42
43
  }
43
44
 
@@ -45,34 +46,30 @@ export class Route {
45
46
 
46
47
  if ((exact && !this.node.intermediate) || this.wildcard)
47
48
  return { node: this.node, parameters }
48
- else
49
- return this.matchNested(fragments, parameters)
49
+ else return this.matchNested(fragments, parameters)
50
50
  }
51
51
 
52
- public * walk (prefix: Segment[]): Generator<Mount> {
52
+ public *walk(prefix: Segment[]): Generator<Mount> {
53
53
  // an expired branch is not matched, so nothing under it is reachable to name
54
- if (Date.now() >= this.node.expiration)
55
- return
54
+ if (Date.now() >= this.node.expiration) return
56
55
 
57
- yield * this.node.walk(prefix.concat(this.segments))
56
+ yield* this.node.walk(prefix.concat(this.segments))
58
57
  }
59
58
 
60
- public equals (route: Route): boolean {
61
- if (route.segments.length !== this.segments.length)
62
- return false
59
+ public equals(route: Route): boolean {
60
+ if (route.segments.length !== this.segments.length) return false
63
61
 
64
62
  for (let i = 0; i < this.segments.length; i++)
65
- if (this.segments[i].fragment !== route.segments[i].fragment)
66
- return false
63
+ if (this.segments[i].fragment !== route.segments[i].fragment) return false
67
64
 
68
65
  return true
69
66
  }
70
67
 
71
- public merge (route: Route): Node[] {
68
+ public merge(route: Route): Node[] {
72
69
  return this.node.merge(route.node)
73
70
  }
74
71
 
75
- private matchNested (fragments: string[], parameters: Parameter[]): Match | null {
72
+ private matchNested(fragments: string[], parameters: Parameter[]): Match | null {
76
73
  fragments = fragments.slice(this.segments.length)
77
74
 
78
75
  return this.node.match(fragments, parameters)
@@ -87,7 +84,7 @@ export class Route {
87
84
  * An escape that decodes to nothing valid is left as it stands; refusing the route over it
88
85
  * would answer `404` to a request whose only fault is its spelling.
89
86
  */
90
- function decode (fragment: string): string {
87
+ function decode(fragment: string): string {
91
88
  try {
92
89
  return decodeURIComponent(fragment)
93
90
  } catch {