@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
@@ -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 {
@@ -15,7 +15,11 @@ export class Tree {
15
15
  private readonly endpoints: EndpointsFactory
16
16
  private readonly directives: DirectiveFactory
17
17
 
18
- public constructor (node: syntax.Node, endpoints: EndpointsFactory, directives: DirectiveFactory) {
18
+ public constructor(
19
+ node: syntax.Node,
20
+ endpoints: EndpointsFactory,
21
+ directives: DirectiveFactory
22
+ ) {
19
23
  this.endpoints = endpoints
20
24
  this.directives = directives
21
25
  this.root = node
@@ -24,7 +28,7 @@ export class Tree {
24
28
  unnameable(this.trunk)
25
29
  }
26
30
 
27
- public match (path: string): Match | null {
31
+ public match(path: string): Match | null {
28
32
  if (path === '/')
29
33
  return {
30
34
  node: this.trunk,
@@ -37,11 +41,11 @@ export class Tree {
37
41
  }
38
42
 
39
43
  /** Every method in the tree, with the template it answers at. */
40
- public walk (): Generator<Mount> {
44
+ public walk(): Generator<Mount> {
41
45
  return this.trunk.walk([], TRUNK)
42
46
  }
43
47
 
44
- public merge (node: syntax.Node, extension: unknown): Node[] {
48
+ public merge(node: syntax.Node, extension: unknown): Node[] {
45
49
  const branch = this.createNode(node, !PROTECTED, extension)
46
50
 
47
51
  unnameable(branch)
@@ -53,18 +57,17 @@ export class Tree {
53
57
  * Extends the expiration of an already merged branch, leaving its endpoints
54
58
  * and their remotes intact.
55
59
  */
56
- public refresh (nodes: Node[]): void {
60
+ public refresh(nodes: Node[]): void {
57
61
  const expiration = Date.now() + branchTTL()
58
62
 
59
- for (const node of nodes)
60
- node.touch(expiration)
63
+ for (const node of nodes) node.touch(expiration)
61
64
  }
62
65
 
63
- public dispose (): void {
66
+ public dispose(): void {
64
67
  this.directives.dispose()
65
68
  }
66
69
 
67
- private createNode (node: syntax.Node, protect: boolean, extension?: unknown): Node {
70
+ private createNode(node: syntax.Node, protect: boolean, extension?: unknown): Node {
68
71
  const context: Context = {
69
72
  protected: protect,
70
73
  endpoints: this.endpoints,
@@ -73,7 +76,7 @@ export class Tree {
73
76
  // A merged branch is mounted under the root, so it inherits the root's
74
77
  // directives. The trunk is the root: createNode adds them itself, and
75
78
  // seeding them here too would apply every one of them twice.
76
- stack: node === this.root ? [] : this.root.directives ?? []
79
+ stack: node === this.root ? [] : (this.root.directives ?? [])
77
80
  },
78
81
  path: label(extension),
79
82
  extension
@@ -87,19 +90,17 @@ export class Tree {
87
90
  * What is served but cannot be called by name. Said once per route as it is built, because a
88
91
  * procedure that is missing is otherwise noticed only by the caller who cannot find it.
89
92
  */
90
- function unnameable (node: Node): void {
93
+ function unnameable(node: Node): void {
91
94
  const said = new Set<string>()
92
95
 
93
96
  for (const { segments } of node.walk([], TRUNK)) {
94
97
  const segment = refusal(segments)
95
98
 
96
- if (segment === null)
97
- continue
99
+ if (segment === null) continue
98
100
 
99
101
  const route = template(segments)
100
102
 
101
- if (said.has(route))
102
- continue
103
+ if (said.has(route)) continue
103
104
 
104
105
  said.add(route)
105
106
 
@@ -112,9 +113,8 @@ function unnameable (node: Node): void {
112
113
  * known while it is being built — so the component it came from is what keeps two
113
114
  * branches from looking like the same route.
114
115
  */
115
- function label (extension: unknown): string {
116
- if (extension === null || typeof extension !== 'object')
117
- return ''
116
+ function label(extension: unknown): string {
117
+ if (extension === null || typeof extension !== 'object') return ''
118
118
 
119
119
  const { namespace, component } = extension as Record<string, unknown>
120
120
 
@@ -6,17 +6,14 @@ import { Method, type Methods } from './Method.js'
6
6
  import type { Context } from './Context.js'
7
7
  import type * as syntax from './syntax/index.js'
8
8
 
9
- export function createNode (node: syntax.Node, context: Context): Node {
10
- if (node.isolated === true)
11
- context.directives.stack = node.directives
12
- else
13
- context.directives.stack = node.directives.concat(context.directives.stack)
9
+ export function createNode(node: syntax.Node, context: Context): Node {
10
+ if (node.isolated === true) context.directives.stack = node.directives
11
+ else context.directives.stack = node.directives.concat(context.directives.stack)
14
12
 
15
13
  const routes: Route[] = node.routes.map((route) => createRoute(route, context))
16
14
  const methods: Methods = {}
17
15
 
18
- for (const method of node.methods)
19
- methods[method.verb] = createMethod(method, context)
16
+ for (const method of node.methods) methods[method.verb] = createMethod(method, context)
20
17
 
21
18
  const protect = node.protected ?? context.protected
22
19
 
@@ -29,18 +26,17 @@ export function createNode (node: syntax.Node, context: Context): Node {
29
26
  return new Node(routes, methods, properties)
30
27
  }
31
28
 
32
- export function branchTTL (): number {
29
+ export function branchTTL(): number {
33
30
  const value = process.env.__TESTING_EXPOSITION_BRANCH_TTL
34
31
 
35
- if (value === undefined || value === '')
36
- return BRANCH_TTL
32
+ if (value === undefined || value === '') return BRANCH_TTL
37
33
 
38
34
  const parsed = Number(value)
39
35
 
40
36
  return Number.isFinite(parsed) ? parsed : BRANCH_TTL
41
37
  }
42
38
 
43
- function createRoute (route: syntax.Route, context: Context): Route {
39
+ function createRoute(route: syntax.Route, context: Context): Route {
44
40
  const stack = context.directives.stack.slice()
45
41
  const path = context.path
46
42
  const segments = segment(route.path)
@@ -55,18 +51,19 @@ function createRoute (route: syntax.Route, context: Context): Route {
55
51
  return new Route(segments, node)
56
52
  }
57
53
 
58
- function join (base: string, path: string): string {
54
+ function join(base: string, path: string): string {
59
55
  // '/one/' and '/two/' would otherwise read as '/one//two/'
60
56
  return (base + path).replace(/\/+/g, '/').replace(/(.)\/$/, '$1')
61
57
  }
62
58
 
63
- function createMethod (method: syntax.Method, context: Context): Method {
59
+ function createMethod(method: syntax.Method, context: Context): Method {
64
60
  const stack = method.directives.concat(context.directives.stack)
65
61
  const directives = context.directives.factory.create(stack, context.path)
66
62
 
67
- const endpoint = method.mapping?.endpoint === undefined
68
- ? null
69
- : context.endpoints.create(method, context)
63
+ const endpoint =
64
+ method.mapping?.endpoint === undefined
65
+ ? null
66
+ : context.endpoints.create(method, context)
70
67
 
71
68
  return new Method(endpoint, directives)
72
69
  }
@@ -1,8 +1,8 @@
1
- export function segment (path: string): Segment[] {
1
+ export function segment(path: string): Segment[] {
2
2
  return fragment(path).map(parse)
3
3
  }
4
4
 
5
- export function fragment (path: string): string[] {
5
+ export function fragment(path: string): string[] {
6
6
  const parts = path.split('/')
7
7
 
8
8
  // trailing slash
@@ -12,17 +12,19 @@ export function fragment (path: string): string[] {
12
12
  return parts.splice(1)
13
13
  }
14
14
 
15
- function parse (segment: string): Segment {
15
+ function parse(segment: string): Segment {
16
16
  if (segment[0] === ':') return { fragment: null, placeholder: segment.substring(1) }
17
17
  else if (segment === '*') return { fragment: null, placeholder: null }
18
18
  else if (segment === '**') return { fragment: null, placeholder: null, wildcard: true }
19
19
  else return { fragment: segment }
20
20
  }
21
21
 
22
- export type Segment = {
23
- fragment: string
24
- } | {
25
- fragment: null
26
- placeholder: string | null
27
- wildcard?: boolean
28
- }
22
+ export type Segment =
23
+ | {
24
+ fragment: string
25
+ }
26
+ | {
27
+ fragment: null
28
+ placeholder: string | null
29
+ wildcard?: boolean
30
+ }
@@ -120,7 +120,9 @@ describe('methods', () => {
120
120
  const node = parse(declaration)
121
121
  const root = node.routes[0].node
122
122
 
123
- assert.deepStrictEqual(root.methods[0].directives, [{ family: 'auth', name: 'incept', value: 'id' }])
123
+ assert.deepStrictEqual(root.methods[0].directives, [
124
+ { family: 'auth', name: 'incept', value: 'id' }
125
+ ])
124
126
  })
125
127
  })
126
128
 
@@ -132,9 +134,7 @@ describe('directives', () => {
132
134
  }
133
135
  }
134
136
 
135
- const shortcuts = new Map<string, string>([
136
- ['foo', 'dev:foo']
137
- ])
137
+ const shortcuts = new Map<string, string>([['foo', 'dev:foo']])
138
138
 
139
139
  const node = parse(declaration, shortcuts)
140
140
  const root = node.routes[0].node
@@ -150,7 +150,10 @@ describe('validation', () => {
150
150
  it('should throw on unknown key', async () => {
151
151
  const declaration = { hello: 'world' }
152
152
 
153
- assert.throws(() => parse(declaration), (error: any) => /RTD parse error: unknown key 'hello'/.test(error.message))
153
+ assert.throws(
154
+ () => parse(declaration),
155
+ (error: any) => /RTD parse error: unknown key 'hello'/.test(error.message)
156
+ )
154
157
  })
155
158
 
156
159
  it('should throw on invalid mapping', async () => {
@@ -163,7 +166,10 @@ describe('validation', () => {
163
166
  }
164
167
  }
165
168
 
166
- assert.throws(() => parse(declaration), (error: any) => /\/methods\/0\/mapping/.test(error.message))
169
+ assert.throws(
170
+ () => parse(declaration),
171
+ (error: any) => /\/methods\/0\/mapping/.test(error.message)
172
+ )
167
173
  })
168
174
  })
169
175
 
@@ -9,7 +9,7 @@ import {
9
9
  type Range
10
10
  } from './types.js'
11
11
 
12
- export function parse (input: object, shortcuts?: Shortcuts): Node {
12
+ export function parse(input: object, shortcuts?: Shortcuts): Node {
13
13
  const node = parseNode(input, shortcuts)
14
14
 
15
15
  schemas.node.validate(node)
@@ -17,7 +17,7 @@ export function parse (input: object, shortcuts?: Shortcuts): Node {
17
17
  return node
18
18
  }
19
19
 
20
- function parseNode (input: object | string, shortcuts?: Shortcuts): Node {
20
+ function parseNode(input: object | string, shortcuts?: Shortcuts): Node {
21
21
  const node = createNode()
22
22
 
23
23
  if (typeof input === 'string') {
@@ -71,7 +71,7 @@ function parseNode (input: object | string, shortcuts?: Shortcuts): Node {
71
71
  return node
72
72
  }
73
73
 
74
- export function createNode (): Node {
74
+ export function createNode(): Node {
75
75
  return {
76
76
  routes: [],
77
77
  methods: [],
@@ -79,17 +79,21 @@ export function createNode (): Node {
79
79
  }
80
80
  }
81
81
 
82
- function parseRoute (path: string, value: Node, shortcuts?: Shortcuts): Route {
82
+ function parseRoute(path: string, value: Node, shortcuts?: Shortcuts): Route {
83
83
  const node = parse(value, shortcuts)
84
84
 
85
85
  return createRoute(path, node)
86
86
  }
87
87
 
88
- function createRoute (path: string, node: Node): Route {
88
+ function createRoute(path: string, node: Node): Route {
89
89
  return { path, node }
90
90
  }
91
91
 
92
- function parseMethod (verb: string, value: Mapping | string, shortcuts?: Shortcuts): Method {
92
+ function parseMethod(
93
+ verb: string,
94
+ value: Mapping | string,
95
+ shortcuts?: Shortcuts
96
+ ): Method {
93
97
  const mapping = typeof value === 'string' ? { endpoint: value } : value
94
98
 
95
99
  parseEndpoint(mapping)
@@ -100,9 +104,8 @@ function parseMethod (verb: string, value: Mapping | string, shortcuts?: Shortcu
100
104
  return { verb, mapping, directives }
101
105
  }
102
106
 
103
- function parseEndpoint (mapping: Mapping): void {
104
- if (mapping.endpoint === undefined)
105
- return
107
+ function parseEndpoint(mapping: Mapping): void {
108
+ if (mapping.endpoint === undefined) return
106
109
 
107
110
  const [endpoiont, component, namespace] = mapping.endpoint.split('.').reverse()
108
111
 
@@ -113,27 +116,26 @@ function parseEndpoint (mapping: Mapping): void {
113
116
  }
114
117
  }
115
118
 
116
- function parseQuery (mapping: any): void {
119
+ function parseQuery(mapping: any): void {
117
120
  const query = mapping.query
118
121
 
119
- if (query === undefined || query === null)
120
- return
122
+ if (query === undefined || query === null) return
121
123
 
122
- if (typeof query.limit === 'number')
123
- query.limit = expandRange(query.limit as number)
124
+ if (typeof query.limit === 'number') query.limit = expandRange(query.limit as number)
124
125
 
125
- if (typeof query.omit === 'number')
126
- query.omit = expandRange(query.omit as number)
126
+ if (typeof query.omit === 'number') query.omit = expandRange(query.omit as number)
127
127
  }
128
128
 
129
- function parseDirectives (mapping: Record<string, any>, shortcuts?: Shortcuts): Directive[] {
129
+ function parseDirectives(
130
+ mapping: Record<string, any>,
131
+ shortcuts?: Shortcuts
132
+ ): Directive[] {
130
133
  const directives: Directive[] = []
131
134
 
132
135
  for (const [key, value] of Object.entries(mapping)) {
133
136
  const directive = parseDirective(key, value, shortcuts)
134
137
 
135
- if (directive === null)
136
- continue
138
+ if (directive === null) continue
137
139
 
138
140
  directives.push(directive)
139
141
 
@@ -144,21 +146,23 @@ function parseDirectives (mapping: Record<string, any>, shortcuts?: Shortcuts):
144
146
  return directives
145
147
  }
146
148
 
147
- function parseDirective (key: string, value: any, shortcuts?: Shortcuts): Directive | null {
148
- if (shortcuts?.has(key) === true)
149
- key = shortcuts.get(key)! // eslint-disable-line @typescript-eslint/no-non-null-assertion
149
+ function parseDirective(
150
+ key: string,
151
+ value: any,
152
+ shortcuts?: Shortcuts
153
+ ): Directive | null {
154
+ if (shortcuts?.has(key) === true) key = shortcuts.get(key)! // eslint-disable-line @typescript-eslint/no-non-null-assertion
150
155
 
151
156
  const match = key.match(DIRECTIVE_RX)
152
157
 
153
- if (match === null)
154
- return null
158
+ if (match === null) return null
155
159
 
156
- const { family, name } = match.groups as { family: string, name: string }
160
+ const { family, name } = match.groups as { family: string; name: string }
157
161
 
158
162
  return { family, name, value }
159
163
  }
160
164
 
161
- function expandRange (range: number): Range {
165
+ function expandRange(range: number): Range {
162
166
  return { value: range, range: [range, range] }
163
167
  }
164
168
 
@@ -29,6 +29,13 @@ export interface Mapping {
29
29
  component?: string
30
30
  endpoint: string
31
31
  query?: Query | null
32
+
33
+ /**
34
+ * Whether the operation this maps to answers a page of a collection, and so takes the
35
+ * `omit` and `limit` a page is taken by. Written where the component's manifest is read,
36
+ * beside `namespace` and `component`, and not declared.
37
+ */
38
+ paged?: boolean
32
39
  }
33
40
 
34
41
  export interface Query {
@@ -50,4 +57,13 @@ export interface Range {
50
57
  range: [number, number]
51
58
  }
52
59
 
53
- export const verbs = new Set<string>(['GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE', 'LOCK', 'UNLOCK'])
60
+ export const verbs = new Set<string>([
61
+ 'GET',
62
+ 'HEAD',
63
+ 'POST',
64
+ 'PUT',
65
+ 'PATCH',
66
+ 'DELETE',
67
+ 'LOCK',
68
+ 'UNLOCK'
69
+ ])
@@ -18,7 +18,11 @@ const directives = {
18
18
  dispose: mock.fn()
19
19
  } as unknown as DirectiveFactory
20
20
 
21
- const node = (path: string, verbs: string[] = [], routes: syntax.Route[] = []): syntax.Route => ({
21
+ const node = (
22
+ path: string,
23
+ verbs: string[] = [],
24
+ routes: syntax.Route[] = []
25
+ ): syntax.Route => ({
22
26
  path,
23
27
  node: {
24
28
  routes,
@@ -34,8 +38,9 @@ const trunk = (routes: syntax.Route[], verbs: string[] = []): syntax.Node => ({
34
38
  })
35
39
 
36
40
  /** What a walk names, which is what a caller of `/.rpc` would write. */
37
- function names (tree: Tree): string[] {
38
- return [...tree.walk()].map(({ segments, verb }) => name(segments, verb))
41
+ function names(tree: Tree): string[] {
42
+ return [...tree.walk()]
43
+ .map(({ segments, verb }) => name(segments, verb))
39
44
  .filter((named): named is string => named !== null)
40
45
  }
41
46
 
@@ -47,51 +52,76 @@ describe('walk', () => {
47
52
  })
48
53
 
49
54
  it('should name every method of every route', () => {
50
- const tree = new Tree(trunk([
51
- node('/pots', ['GET', 'POST'], [node('/:id', ['GET', 'DELETE'])])
52
- ]), endpoints, directives)
55
+ const tree = new Tree(
56
+ trunk([node('/pots', ['GET', 'POST'], [node('/:id', ['GET', 'DELETE'])])]),
57
+ endpoints,
58
+ directives
59
+ )
53
60
 
54
61
  assert.deepEqual(names(tree).sort(), [
55
- 'pots.GET', 'pots.POST', 'pots._id.DELETE', 'pots._id.GET'
62
+ 'pots.GET',
63
+ 'pots.POST',
64
+ 'pots._id.DELETE',
65
+ 'pots._id.GET'
56
66
  ])
57
67
  })
58
68
 
59
69
  it('should walk a branch that was merged', () => {
60
70
  const tree = new Tree(trunk([]), endpoints, directives)
61
71
 
62
- tree.merge(trunk([node('/pots', ['GET'])]), { namespace: 'default', component: 'pots' })
72
+ tree.merge(trunk([node('/pots', ['GET'])]), {
73
+ namespace: 'default',
74
+ component: 'pots'
75
+ })
63
76
 
64
77
  assert.deepEqual(names(tree), ['pots.GET'])
65
78
  })
66
79
 
67
80
  it('should name a tail', () => {
68
- const tree = new Tree(trunk([node('/files', [], [node('/**', ['GET'])])]),
69
- endpoints, directives)
81
+ const tree = new Tree(
82
+ trunk([node('/files', [], [node('/**', ['GET'])])]),
83
+ endpoints,
84
+ directives
85
+ )
70
86
 
71
87
  assert.deepEqual(names(tree), ['files.__.GET'])
72
88
  })
73
89
 
74
90
  it('should skip an intermediate node, whose route answers in its place', () => {
75
- const tree = new Tree(trunk([
76
- // `/posts` is intermediate: `/posts/` is answered by its `/` route, not by itself
77
- node('/posts', ['PATCH'], [node('/', ['PUT'])])
78
- ]), endpoints, directives)
91
+ const tree = new Tree(
92
+ trunk([
93
+ // `/posts` is intermediate: `/posts/` is answered by its `/` route, not by itself
94
+ node('/posts', ['PATCH'], [node('/', ['PUT'])])
95
+ ]),
96
+ endpoints,
97
+ directives
98
+ )
79
99
 
80
100
  assert.deepEqual(names(tree), ['posts.PUT'])
81
101
  })
82
102
 
83
103
  it('should name nothing where a segment cannot be spelled', () => {
84
- const tree = new Tree(trunk([node('/v1.0', ['GET']), node('/pots', ['GET'])]),
85
- endpoints, directives)
104
+ const tree = new Tree(
105
+ trunk([node('/v1.0', ['GET']), node('/pots', ['GET'])]),
106
+ endpoints,
107
+ directives
108
+ )
86
109
 
87
110
  assert.deepEqual(names(tree), ['pots.GET'])
88
111
  })
89
112
 
90
113
  it('should name what the tree then matches', () => {
91
- const tree = new Tree(trunk([
92
- node('/pots', ['GET'], [node('/:id', ['GET']), node('/hot', ['GET'])]),
93
- node('/files', [], [node('/**', ['GET'])])
94
- ], ['GET']), endpoints, directives)
114
+ const tree = new Tree(
115
+ trunk(
116
+ [
117
+ node('/pots', ['GET'], [node('/:id', ['GET']), node('/hot', ['GET'])]),
118
+ node('/files', [], [node('/**', ['GET'])])
119
+ ],
120
+ ['GET']
121
+ ),
122
+ endpoints,
123
+ directives
124
+ )
95
125
 
96
126
  const params = { id: 'a1b2', '**': 'a/b/c' }
97
127
 
@@ -103,8 +133,15 @@ describe('walk', () => {
103
133
  const { path } = address(named!, params)
104
134
  const match = tree.match(path)
105
135
 
106
- assert.notStrictEqual(match, null, `'${named!}' resolves to '${path}', which matches`)
107
- assert.ok(verb in match!.node.methods, `'${named!}' matches a node that answers ${verb}`)
136
+ assert.notStrictEqual(
137
+ match,
138
+ null,
139
+ `'${named!}' resolves to '${path}', which matches`
140
+ )
141
+ assert.ok(
142
+ verb in match!.node.methods,
143
+ `'${named!}' matches a node that answers ${verb}`
144
+ )
108
145
  }
109
146
  })
110
147
  })