@toa.io/extensions.exposition 1.0.0-alpha.291 → 1.0.0-alpha.293

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 (526) hide show
  1. package/components/identity.basic/package.json +8 -0
  2. package/components/identity.federation/package.json +8 -0
  3. package/components/identity.passkeys/package.json +8 -0
  4. package/components/identity.tokens/package.json +10 -0
  5. package/package.json +25 -13
  6. package/transpiled/Discovery/Explorer.js +1 -1
  7. package/transpiled/Discovery/Explorer.js.map +1 -1
  8. package/transpiled/Discovery/Site.js +1 -1
  9. package/transpiled/Discovery/Site.js.map +1 -1
  10. package/transpiled/Discovery/trunk.js +1 -1
  11. package/transpiled/Discovery/trunk.js.map +1 -1
  12. package/transpiled/Endpoint.js +3 -0
  13. package/transpiled/Endpoint.js.map +1 -1
  14. package/transpiled/Factory.js +1 -1
  15. package/transpiled/Factory.js.map +1 -1
  16. package/transpiled/Gateway.js +1 -1
  17. package/transpiled/Gateway.js.map +1 -1
  18. package/transpiled/HTTP/Server.d.ts +1 -1
  19. package/transpiled/HTTP/Server.js +1 -1
  20. package/transpiled/HTTP/Server.js.map +1 -1
  21. package/transpiled/Introspection.d.ts +6 -0
  22. package/transpiled/Introspection.js +1 -0
  23. package/transpiled/Introspection.js.map +1 -1
  24. package/transpiled/MCP/Server.d.ts +1 -1
  25. package/transpiled/MCP/Server.js +1 -1
  26. package/transpiled/MCP/Server.js.map +1 -1
  27. package/transpiled/MCP/discover.d.ts +1 -1
  28. package/transpiled/MCP/schema.js +2 -2
  29. package/transpiled/Query.d.ts +2 -12
  30. package/transpiled/Query.js +3 -13
  31. package/transpiled/Query.js.map +1 -1
  32. package/transpiled/RPC/Dispatcher.d.ts +1 -1
  33. package/transpiled/RPC/Dispatcher.js +2 -2
  34. package/transpiled/RPC/Dispatcher.js.map +1 -1
  35. package/transpiled/RTD/Endpoint.d.ts +2 -3
  36. package/transpiled/RTD/Tree.js +1 -1
  37. package/transpiled/RTD/Tree.js.map +1 -1
  38. package/transpiled/RTD/factory.js +1 -1
  39. package/transpiled/RTD/factory.js.map +1 -1
  40. package/transpiled/RTD/syntax/index.d.ts +1 -2
  41. package/transpiled/RTD/syntax/index.js +1 -2
  42. package/transpiled/RTD/syntax/index.js.map +1 -1
  43. package/transpiled/Tenant.js +1 -1
  44. package/transpiled/Tenant.js.map +1 -1
  45. package/transpiled/directives/auth/Authorization.js +1 -1
  46. package/transpiled/directives/auth/Authorization.js.map +1 -1
  47. package/transpiled/directives/io/IO.js +1 -1
  48. package/transpiled/directives/io/IO.js.map +1 -1
  49. package/transpiled/directives/oauth/documents.d.ts +1 -1
  50. package/transpiled/index.d.ts +0 -2
  51. package/transpiled/index.js +0 -2
  52. package/transpiled/index.js.map +1 -1
  53. package/transpiled/service.js +1 -1
  54. package/transpiled/service.js.map +1 -1
  55. package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
  56. package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
  57. package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
  58. package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
  59. package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
  60. package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
  61. package/ui/dist/_app/immutable/chunks/{D9tE1yyO.js → DVlaUfVU.js} +1 -1
  62. package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
  63. package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
  64. package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
  65. package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
  66. package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
  67. package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
  68. package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
  69. package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
  70. package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
  71. package/ui/dist/_app/version.json +1 -1
  72. package/ui/dist/index.html +12 -12
  73. package/CHANGELOG.md +0 -35
  74. package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
  75. package/components/identity.basic/source/lib/credentials.test.ts +0 -18
  76. package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
  77. package/components/identity.clients/source/lib/canonical.test.ts +0 -43
  78. package/components/identity.clients/source/lib/cimd.test.ts +0 -122
  79. package/components/identity.clients/source/lib/redirect.test.ts +0 -47
  80. package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
  81. package/components/identity.credentials/source/list.test.ts +0 -70
  82. package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
  83. package/components/identity.federation/source/lib/discovery.test.ts +0 -60
  84. package/components/identity.federation/source/list.test.ts +0 -41
  85. package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
  86. package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
  87. package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
  88. package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
  89. package/components/identity.passkeys/source/errors.test.ts +0 -34
  90. package/components/identity.passkeys/source/webauthn.test.ts +0 -26
  91. package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
  92. package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
  93. package/components/identity.tokens/source/authenticate.test.ts +0 -112
  94. package/components/identity.tokens/source/decrypt.test.ts +0 -216
  95. package/components/identity.tokens/source/encrypt.test.ts +0 -150
  96. package/components/identity.tokens/source/issue.test.ts +0 -73
  97. package/components/identity.tokens/source/lib/form.test.ts +0 -25
  98. package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
  99. package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
  100. package/context.toa.yaml +0 -31
  101. package/cucumber.mjs +0 -7
  102. package/documentation/.assets/ia3-dark.jpg +0 -0
  103. package/documentation/.assets/ia3-light.jpg +0 -0
  104. package/documentation/.assets/overview-dark.jpg +0 -0
  105. package/documentation/.assets/overview-light.jpg +0 -0
  106. package/documentation/.assets/role-scopes-dark.jpg +0 -0
  107. package/documentation/.assets/role-scopes-light.jpg +0 -0
  108. package/documentation/.assets/rtd-dark.jpg +0 -0
  109. package/documentation/.assets/rtd-light.jpg +0 -0
  110. package/documentation/access.md +0 -350
  111. package/documentation/authorities.md +0 -51
  112. package/documentation/cache.md +0 -72
  113. package/documentation/components.md +0 -472
  114. package/documentation/consent.md +0 -101
  115. package/documentation/credentials.md +0 -88
  116. package/documentation/dev.md +0 -30
  117. package/documentation/discovery.md +0 -81
  118. package/documentation/flow.md +0 -44
  119. package/documentation/help.md +0 -122
  120. package/documentation/identity.md +0 -304
  121. package/documentation/introspection.md +0 -123
  122. package/documentation/io.md +0 -167
  123. package/documentation/ip.md +0 -24
  124. package/documentation/map.md +0 -123
  125. package/documentation/mcp.md +0 -183
  126. package/documentation/notes/desync.jpg +0 -0
  127. package/documentation/notes/peers.md +0 -59
  128. package/documentation/notes/sse.md +0 -71
  129. package/documentation/notes/throttling.md +0 -122
  130. package/documentation/oauth.md +0 -180
  131. package/documentation/octets.md +0 -334
  132. package/documentation/passkeys.md +0 -11
  133. package/documentation/protocol.md +0 -120
  134. package/documentation/query.md +0 -324
  135. package/documentation/require.md +0 -15
  136. package/documentation/rpc.md +0 -154
  137. package/documentation/tracing.md +0 -70
  138. package/documentation/tree.md +0 -199
  139. package/features/access.feature +0 -596
  140. package/features/annotation.feature +0 -32
  141. package/features/auth.assert.feature +0 -55
  142. package/features/auth.bearer.feature +0 -120
  143. package/features/auth.claims.feature +0 -171
  144. package/features/auth.incept.feature +0 -166
  145. package/features/auth.input.feature +0 -59
  146. package/features/authorities.basic.feature +0 -141
  147. package/features/authorities.feature +0 -71
  148. package/features/authorities.federation.feature +0 -100
  149. package/features/authorities.tokens.feature +0 -117
  150. package/features/body.feature +0 -76
  151. package/features/cache.feature +0 -368
  152. package/features/configuration.feature +0 -206
  153. package/features/cors.feature +0 -127
  154. package/features/credentials.feature +0 -106
  155. package/features/debug.feature +0 -34
  156. package/features/dev.feature +0 -90
  157. package/features/directives.feature +0 -61
  158. package/features/discovery.feature +0 -213
  159. package/features/discovery.ui.feature +0 -213
  160. package/features/dynamic.feature +0 -192
  161. package/features/errors.feature +0 -258
  162. package/features/etag.feature +0 -239
  163. package/features/flow.feature +0 -148
  164. package/features/help.feature +0 -512
  165. package/features/identity.bans.feature +0 -200
  166. package/features/identity.basic.feature +0 -666
  167. package/features/identity.feature +0 -240
  168. package/features/identity.federation.feature +0 -396
  169. package/features/identity.otp.feature +0 -142
  170. package/features/identity.roles.feature +0 -568
  171. package/features/identity.tokens.custom.feature +0 -430
  172. package/features/identity.tokens.feature +0 -131
  173. package/features/interruptions.feature +0 -20
  174. package/features/introspection.feature +0 -565
  175. package/features/introspection.map.feature +0 -108
  176. package/features/io.feature +0 -204
  177. package/features/io.throttle.feature +0 -166
  178. package/features/map.feature +0 -360
  179. package/features/mcp.feature +0 -753
  180. package/features/methods.feature +0 -48
  181. package/features/oauth.clients.feature +0 -195
  182. package/features/oauth.discovery.feature +0 -164
  183. package/features/oauth.grants.feature +0 -301
  184. package/features/octets.cloudinary.feature +0 -233
  185. package/features/octets.download.feature +0 -194
  186. package/features/octets.entries.feature +0 -83
  187. package/features/octets.feature +0 -306
  188. package/features/octets.head.feature +0 -40
  189. package/features/octets.location.feature +0 -83
  190. package/features/octets.meta.feature +0 -117
  191. package/features/octets.workflows.feature +0 -565
  192. package/features/passkeys.feature +0 -66
  193. package/features/probes.feature +0 -18
  194. package/features/query.feature +0 -389
  195. package/features/realtime.feature +0 -34
  196. package/features/require.feature +0 -66
  197. package/features/response.feature +0 -103
  198. package/features/routes.feature +0 -224
  199. package/features/rpc.feature +0 -429
  200. package/features/server.feature +0 -21
  201. package/features/site/_app/immutable/asset.js +0 -1
  202. package/features/site/favicon.ico +0 -0
  203. package/features/site/index.html +0 -10
  204. package/features/steps/.env.example +0 -5
  205. package/features/steps/Captures.ts +0 -20
  206. package/features/steps/Cloudinary.ts +0 -12
  207. package/features/steps/Common.ts +0 -38
  208. package/features/steps/Components.ts +0 -115
  209. package/features/steps/Database.ts +0 -106
  210. package/features/steps/Gateway.ts +0 -240
  211. package/features/steps/HTTP.ts +0 -96
  212. package/features/steps/IDP.ts +0 -361
  213. package/features/steps/Identity.ts +0 -54
  214. package/features/steps/OTP.ts +0 -42
  215. package/features/steps/Parameters.ts +0 -162
  216. package/features/steps/Probe.ts +0 -38
  217. package/features/steps/Realtime.ts +0 -175
  218. package/features/steps/Workspace.ts +0 -48
  219. package/features/steps/components/audit/manifest.toa.yaml +0 -20
  220. package/features/steps/components/audit/operations/record.js +0 -5
  221. package/features/steps/components/echo/manifest.toa.yaml +0 -59
  222. package/features/steps/components/echo/operations/affect.js +0 -3
  223. package/features/steps/components/echo/operations/compute.js +0 -3
  224. package/features/steps/components/echo/operations/echo.js +0 -3
  225. package/features/steps/components/echo/operations/error.js +0 -7
  226. package/features/steps/components/echo/operations/identity.js +0 -3
  227. package/features/steps/components/echo/operations/parameters.js +0 -3
  228. package/features/steps/components/echo/operations/ping.js +0 -3
  229. package/features/steps/components/echo/operations/unwrap.js +0 -3
  230. package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
  231. package/features/steps/components/echo.beacon/operations/hello.js +0 -3
  232. package/features/steps/components/greeter/manifest.toa.yaml +0 -5
  233. package/features/steps/components/greeter/operations/greet.js +0 -3
  234. package/features/steps/components/notify/manifest.toa.yaml +0 -20
  235. package/features/steps/components/notify/operations/send.js +0 -5
  236. package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
  237. package/features/steps/components/octets.tester/operations/authority.js +0 -3
  238. package/features/steps/components/octets.tester/operations/bar.js +0 -9
  239. package/features/steps/components/octets.tester/operations/baz.js +0 -9
  240. package/features/steps/components/octets.tester/operations/concat.js +0 -5
  241. package/features/steps/components/octets.tester/operations/echo.js +0 -5
  242. package/features/steps/components/octets.tester/operations/err.js +0 -14
  243. package/features/steps/components/octets.tester/operations/foo.js +0 -5
  244. package/features/steps/components/octets.tester/operations/id.js +0 -5
  245. package/features/steps/components/octets.tester/operations/identity.js +0 -5
  246. package/features/steps/components/octets.tester/operations/lenna.png +0 -0
  247. package/features/steps/components/octets.tester/operations/redirect.js +0 -17
  248. package/features/steps/components/octets.tester/operations/yex.js +0 -14
  249. package/features/steps/components/octets.tester/operations/yield.js +0 -11
  250. package/features/steps/components/orders/manifest.toa.yaml +0 -30
  251. package/features/steps/components/orders/operations/create.js +0 -7
  252. package/features/steps/components/pots/manifest.toa.yaml +0 -91
  253. package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
  254. package/features/steps/components/pricing/manifest.toa.yaml +0 -13
  255. package/features/steps/components/pricing/operations/quote.js +0 -3
  256. package/features/steps/components/sequences/manifest.toa.yaml +0 -11
  257. package/features/steps/components/sequences/operations/numbers.js +0 -5
  258. package/features/steps/components/sequences/operations/tokens.js +0 -14
  259. package/features/steps/components/users/manifest.toa.yaml +0 -30
  260. package/features/steps/components/users/operations/create.js +0 -11
  261. package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
  262. package/features/steps/map.ts +0 -30
  263. package/features/steps/tsconfig.json +0 -9
  264. package/features/streams.feature +0 -35
  265. package/features/timestamps.feature +0 -41
  266. package/features/timing.feature +0 -49
  267. package/features/tracing.feature +0 -123
  268. package/schemas/annotation.cos.yaml +0 -125
  269. package/schemas/call.cos.yaml +0 -18
  270. package/schemas/directive.cos.yaml +0 -7
  271. package/schemas/method.cos.yaml +0 -23
  272. package/schemas/node.cos.yaml +0 -22
  273. package/schemas/query.cos.yaml +0 -31
  274. package/schemas/querystring.cos.yaml +0 -19
  275. package/schemas/range.cos.yaml +0 -10
  276. package/schemas/route.cos.yaml +0 -6
  277. package/source/Annotation.ts +0 -89
  278. package/source/Branch.test.ts +0 -40
  279. package/source/Branch.ts +0 -44
  280. package/source/Composition.ts +0 -51
  281. package/source/Context.ts +0 -11
  282. package/source/Directive.test.ts +0 -199
  283. package/source/Directive.ts +0 -248
  284. package/source/Discovery/Explorer.ts +0 -34
  285. package/source/Discovery/Site.test.ts +0 -147
  286. package/source/Discovery/Site.ts +0 -202
  287. package/source/Discovery/index.ts +0 -3
  288. package/source/Discovery/tree.test.ts +0 -175
  289. package/source/Discovery/tree.ts +0 -77
  290. package/source/Discovery/trunk.ts +0 -33
  291. package/source/Endpoint.test.ts +0 -67
  292. package/source/Endpoint.ts +0 -157
  293. package/source/Factory.ts +0 -42
  294. package/source/Gateway.ts +0 -390
  295. package/source/HTTP/Context.ts +0 -143
  296. package/source/HTTP/Probe.ts +0 -99
  297. package/source/HTTP/Server.ts +0 -430
  298. package/source/HTTP/Timing.ts +0 -14
  299. package/source/HTTP/address.test.ts +0 -28
  300. package/source/HTTP/address.ts +0 -16
  301. package/source/HTTP/exceptions.ts +0 -99
  302. package/source/HTTP/formats/form.ts +0 -21
  303. package/source/HTTP/formats/index.ts +0 -36
  304. package/source/HTTP/formats/json.ts +0 -14
  305. package/source/HTTP/formats/msgpack.ts +0 -14
  306. package/source/HTTP/formats/text.ts +0 -10
  307. package/source/HTTP/formats/yaml.test.ts +0 -22
  308. package/source/HTTP/formats/yaml.ts +0 -40
  309. package/source/HTTP/index.ts +0 -6
  310. package/source/HTTP/messages.test.ts +0 -196
  311. package/source/HTTP/messages.ts +0 -186
  312. package/source/HTTP/types.ts +0 -39
  313. package/source/Interception.ts +0 -37
  314. package/source/Introspection.ts +0 -179
  315. package/source/MCP/Server.ts +0 -335
  316. package/source/MCP/discover.ts +0 -51
  317. package/source/MCP/errors.ts +0 -80
  318. package/source/MCP/index.ts +0 -1
  319. package/source/MCP/schema.test.ts +0 -91
  320. package/source/MCP/schema.ts +0 -94
  321. package/source/MCP/tools.ts +0 -144
  322. package/source/MCP/types.ts +0 -84
  323. package/source/Mapping.ts +0 -101
  324. package/source/Query.test.ts +0 -54
  325. package/source/Query.ts +0 -277
  326. package/source/RPC/Context.ts +0 -75
  327. package/source/RPC/Dispatcher.ts +0 -150
  328. package/source/RPC/errors.test.ts +0 -77
  329. package/source/RPC/errors.ts +0 -82
  330. package/source/RPC/index.ts +0 -1
  331. package/source/RPC/names.test.ts +0 -141
  332. package/source/RPC/names.ts +0 -176
  333. package/source/RPC/types.ts +0 -34
  334. package/source/RTD/Context.ts +0 -16
  335. package/source/RTD/Directives.ts +0 -126
  336. package/source/RTD/Endpoint.ts +0 -27
  337. package/source/RTD/Match.ts +0 -11
  338. package/source/RTD/Method.ts +0 -39
  339. package/source/RTD/Node.ts +0 -169
  340. package/source/RTD/Route.ts +0 -93
  341. package/source/RTD/Tree.ts +0 -137
  342. package/source/RTD/expiration.test.ts +0 -81
  343. package/source/RTD/factory.ts +0 -105
  344. package/source/RTD/index.ts +0 -8
  345. package/source/RTD/segment.test.ts +0 -35
  346. package/source/RTD/segment.ts +0 -51
  347. package/source/RTD/syntax/index.ts +0 -2
  348. package/source/RTD/syntax/parse.test.ts +0 -196
  349. package/source/RTD/syntax/parse.ts +0 -171
  350. package/source/RTD/syntax/types.ts +0 -69
  351. package/source/RTD/walk.test.ts +0 -147
  352. package/source/Remotes.test.ts +0 -79
  353. package/source/Remotes.ts +0 -39
  354. package/source/Tenant.ts +0 -73
  355. package/source/const.ts +0 -45
  356. package/source/deployment.ts +0 -96
  357. package/source/directives/auth/Anonymous.test.ts +0 -70
  358. package/source/directives/auth/Anonymous.ts +0 -36
  359. package/source/directives/auth/Anyone.ts +0 -23
  360. package/source/directives/auth/Assert.ts +0 -43
  361. package/source/directives/auth/Authorization.test.ts +0 -24
  362. package/source/directives/auth/Authorization.ts +0 -388
  363. package/source/directives/auth/Delegate.test.ts +0 -36
  364. package/source/directives/auth/Delegate.ts +0 -54
  365. package/source/directives/auth/Echo.ts +0 -24
  366. package/source/directives/auth/Federation.ts +0 -104
  367. package/source/directives/auth/Id.ts +0 -37
  368. package/source/directives/auth/Incept.ts +0 -117
  369. package/source/directives/auth/Input.ts +0 -92
  370. package/source/directives/auth/Role.test.ts +0 -147
  371. package/source/directives/auth/Role.ts +0 -99
  372. package/source/directives/auth/Rule.ts +0 -59
  373. package/source/directives/auth/Scheme.ts +0 -31
  374. package/source/directives/auth/create.ts +0 -11
  375. package/source/directives/auth/index.ts +0 -3
  376. package/source/directives/auth/schemes.test.ts +0 -18
  377. package/source/directives/auth/schemes.ts +0 -39
  378. package/source/directives/auth/split.ts +0 -14
  379. package/source/directives/auth/types.ts +0 -75
  380. package/source/directives/cache/Cache.ts +0 -92
  381. package/source/directives/cache/Control.ts +0 -81
  382. package/source/directives/cache/Exact.ts +0 -7
  383. package/source/directives/cache/etag.ts +0 -38
  384. package/source/directives/cache/index.ts +0 -3
  385. package/source/directives/cache/types.ts +0 -9
  386. package/source/directives/cors/CORS.test.ts +0 -75
  387. package/source/directives/cors/CORS.ts +0 -88
  388. package/source/directives/cors/index.ts +0 -3
  389. package/source/directives/dev/Development.ts +0 -41
  390. package/source/directives/dev/Faulty.ts +0 -31
  391. package/source/directives/dev/Sleep.ts +0 -53
  392. package/source/directives/dev/Stub.ts +0 -14
  393. package/source/directives/dev/Throw.ts +0 -14
  394. package/source/directives/dev/index.ts +0 -3
  395. package/source/directives/dev/types.ts +0 -5
  396. package/source/directives/flow/Compose.ts +0 -98
  397. package/source/directives/flow/Fetch.ts +0 -86
  398. package/source/directives/flow/Flow.ts +0 -43
  399. package/source/directives/flow/index.ts +0 -3
  400. package/source/directives/flow/types.ts +0 -7
  401. package/source/directives/help/Family.ts +0 -122
  402. package/source/directives/help/Help.test.ts +0 -227
  403. package/source/directives/help/Help.ts +0 -47
  404. package/source/directives/help/Parameters.ts +0 -47
  405. package/source/directives/help/described.ts +0 -57
  406. package/source/directives/help/index.ts +0 -45
  407. package/source/directives/index.ts +0 -33
  408. package/source/directives/io/Directive.ts +0 -17
  409. package/source/directives/io/IO.ts +0 -118
  410. package/source/directives/io/Input.ts +0 -55
  411. package/source/directives/io/Message.ts +0 -1
  412. package/source/directives/io/Output.ts +0 -81
  413. package/source/directives/io/Status.test.ts +0 -88
  414. package/source/directives/io/Status.ts +0 -47
  415. package/source/directives/io/Throttle.ts +0 -30
  416. package/source/directives/io/index.ts +0 -3
  417. package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
  418. package/source/directives/io/lib/throttle/Configuration.ts +0 -68
  419. package/source/directives/io/lib/throttle/Keys.ts +0 -53
  420. package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
  421. package/source/directives/io/lib/throttle/Quotas.ts +0 -190
  422. package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
  423. package/source/directives/io/lib/throttle/Sync.ts +0 -93
  424. package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
  425. package/source/directives/io/lib/throttle/Warning.ts +0 -29
  426. package/source/directives/io/lib/throttle/components/Component.ts +0 -7
  427. package/source/directives/io/lib/throttle/components/IP.ts +0 -30
  428. package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
  429. package/source/directives/io/lib/throttle/components/Path.ts +0 -8
  430. package/source/directives/io/lib/throttle/components/Route.ts +0 -19
  431. package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
  432. package/source/directives/io/lib/throttle/components/index.ts +0 -19
  433. package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
  434. package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
  435. package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
  436. package/source/directives/io/lib/throttle/index.ts +0 -4
  437. package/source/directives/io/schemas.test.ts +0 -40
  438. package/source/directives/io/schemas.ts +0 -16
  439. package/source/directives/map/Authority.ts +0 -15
  440. package/source/directives/map/Buffer.ts +0 -15
  441. package/source/directives/map/Claims.ts +0 -63
  442. package/source/directives/map/Directive.ts +0 -4
  443. package/source/directives/map/Headers.ts +0 -60
  444. package/source/directives/map/Language.ts +0 -45
  445. package/source/directives/map/Languages.ts +0 -17
  446. package/source/directives/map/Map.ts +0 -85
  447. package/source/directives/map/Mapping.ts +0 -45
  448. package/source/directives/map/Properties.ts +0 -15
  449. package/source/directives/map/Segments.ts +0 -52
  450. package/source/directives/map/index.ts +0 -3
  451. package/source/directives/mcp/MCP.ts +0 -33
  452. package/source/directives/mcp/Tool.test.ts +0 -56
  453. package/source/directives/mcp/Tool.ts +0 -32
  454. package/source/directives/mcp/index.ts +0 -6
  455. package/source/directives/oauth/Discovery.ts +0 -66
  456. package/source/directives/oauth/documents.ts +0 -110
  457. package/source/directives/oauth/index.ts +0 -3
  458. package/source/directives/octets/Context.ts +0 -23
  459. package/source/directives/octets/Delete.ts +0 -96
  460. package/source/directives/octets/Directive.ts +0 -21
  461. package/source/directives/octets/Get.ts +0 -88
  462. package/source/directives/octets/Octets.ts +0 -82
  463. package/source/directives/octets/Put.ts +0 -186
  464. package/source/directives/octets/Workflow.ts +0 -60
  465. package/source/directives/octets/bytes.test.ts +0 -33
  466. package/source/directives/octets/bytes.ts +0 -18
  467. package/source/directives/octets/index.ts +0 -3
  468. package/source/directives/octets/schemas.test.ts +0 -20
  469. package/source/directives/octets/schemas.ts +0 -15
  470. package/source/directives/octets/types.ts +0 -9
  471. package/source/directives/octets/workflows/Execution.ts +0 -130
  472. package/source/directives/octets/workflows/Workflow.ts +0 -51
  473. package/source/directives/octets/workflows/index.ts +0 -1
  474. package/source/directives/require/Directive.ts +0 -5
  475. package/source/directives/require/Headers.ts +0 -19
  476. package/source/directives/require/Require.ts +0 -27
  477. package/source/directives/require/index.ts +0 -3
  478. package/source/discovery.ts +0 -1
  479. package/source/exceptions.ts +0 -47
  480. package/source/index.ts +0 -12
  481. package/source/io.ts +0 -4
  482. package/source/manifest.test.ts +0 -56
  483. package/source/manifest.ts +0 -56
  484. package/source/octets.d.ts +0 -17
  485. package/source/root.ts +0 -59
  486. package/source/schemas.test.ts +0 -31
  487. package/source/schemas.ts +0 -15
  488. package/source/service.ts +0 -94
  489. package/source/shortcuts.ts +0 -14
  490. package/source/userland.ts +0 -47
  491. package/transpiled/Annotation.d.ts +0 -70
  492. package/transpiled/Annotation.js +0 -2
  493. package/transpiled/Annotation.js.map +0 -1
  494. package/transpiled/RTD/syntax/parse.d.ts +0 -4
  495. package/transpiled/RTD/syntax/parse.js +0 -112
  496. package/transpiled/RTD/syntax/parse.js.map +0 -1
  497. package/transpiled/RTD/syntax/types.d.ts +0 -52
  498. package/transpiled/RTD/syntax/types.js +0 -11
  499. package/transpiled/RTD/syntax/types.js.map +0 -1
  500. package/transpiled/const.d.ts +0 -36
  501. package/transpiled/const.js +0 -37
  502. package/transpiled/const.js.map +0 -1
  503. package/transpiled/deployment.d.ts +0 -6
  504. package/transpiled/deployment.js +0 -76
  505. package/transpiled/deployment.js.map +0 -1
  506. package/transpiled/manifest.d.ts +0 -3
  507. package/transpiled/manifest.js +0 -39
  508. package/transpiled/manifest.js.map +0 -1
  509. package/transpiled/schemas.d.ts +0 -9
  510. package/transpiled/schemas.js +0 -9
  511. package/transpiled/schemas.js.map +0 -1
  512. package/transpiled/shortcuts.d.ts +0 -3
  513. package/transpiled/shortcuts.js +0 -13
  514. package/transpiled/shortcuts.js.map +0 -1
  515. package/tsconfig.json +0 -13
  516. package/tsconfig.tsbuildinfo +0 -1
  517. package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
  518. package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
  519. package/ui/dist/_app/immutable/chunks/B_pK3U1C.js +0 -6
  520. package/ui/dist/_app/immutable/chunks/CiKbPLyY.js +0 -1
  521. package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
  522. package/ui/dist/_app/immutable/entry/app.DMqmL4NY.js +0 -2
  523. package/ui/dist/_app/immutable/entry/start.CRe7HWBI.js +0 -1
  524. package/ui/dist/_app/immutable/nodes/0.D9m-6cbM.js +0 -1
  525. package/ui/dist/_app/immutable/nodes/1.Cgi_RcSO.js +0 -1
  526. package/ui/dist/_app/immutable/nodes/2.D_Cbxgz4.js +0 -14
@@ -1,98 +0,0 @@
1
- import { once } from 'node:events'
2
- import * as assert from 'node:assert'
3
- import { Readable } from 'node:stream'
4
- import { console } from 'openspan'
5
- import type { Directive } from './types.js'
6
- import type { Input as Context } from '../../io.js'
7
- import type { OutgoingMessage } from '../../HTTP/index.js'
8
-
9
- export class Compose implements Directive {
10
- private readonly expressions: Expression[]
11
-
12
- public constructor(composition: any) {
13
- this.expressions = build(composition)
14
- }
15
-
16
- public attach(context: Context): void {
17
- context.pipelines.response.push(async (message: OutgoingMessage) => {
18
- if (!(message.body instanceof Readable)) {
19
- console.warn('Response body is not a stream, skipping composition')
20
-
21
- return
22
- }
23
-
24
- assert.ok(message.body instanceof Readable, 'Response body is not a stream')
25
-
26
- assert.ok(
27
- // @ts-expect-error -- objectMode is not defined in the type definition
28
- message.body._readableState.objectMode,
29
- 'Response stream is not in object mode'
30
- )
31
-
32
- const $ = await this.compose(message.body)
33
-
34
- message.body = this.execute($)
35
- })
36
- }
37
-
38
- private async compose(stream: Readable): Promise<unknown[]> {
39
- const $: unknown[] = []
40
-
41
- stream.on('data', (data) => $.push(data))
42
-
43
- await once(stream, 'end')
44
-
45
- return $
46
- }
47
-
48
- private execute($: unknown[]): unknown {
49
- let exception: Error | undefined
50
-
51
- for (const expression of this.expressions)
52
- try {
53
- return expression($)
54
- } catch (e: unknown) {
55
- exception = e as Error
56
- console.debug('Chunks composition failed', { cause: exception.message })
57
- }
58
-
59
- throw exception!
60
- }
61
- }
62
-
63
- function build(composition: any): Expression[] {
64
- return Array.isArray(composition)
65
- ? composition.map((variant) => compile(variant as object | string))
66
- : [compile(composition as object | string)]
67
- }
68
-
69
- function compile(composition: object | string): Expression {
70
- const text =
71
- typeof composition === 'string'
72
- ? `return ${composition}`
73
- : `return ${json(composition)}`
74
-
75
- // eslint-disable-next-line @typescript-eslint/no-implied-eval,no-new-func
76
- return new Function('$', text) as Expression
77
- }
78
-
79
- function json(node: object | string): string {
80
- if (typeof node === 'string')
81
- if (node.startsWith('\\')) return `"${node}"`
82
- else return node
83
-
84
- if (Array.isArray(node))
85
- return `[${node.map((v) => json(v as object | string)).join(',')}]`
86
-
87
- if (node.constructor !== Object) return JSON.stringify(node)
88
-
89
- return (
90
- '{' +
91
- Object.entries(node)
92
- .map(([key, value]) => `"${key}": ${json(value as object | string)}`)
93
- .join(',') +
94
- '}'
95
- )
96
- }
97
-
98
- type Expression = ($: unknown[]) => unknown
@@ -1,86 +0,0 @@
1
- import { Readable } from 'node:stream'
2
- import assert from 'node:assert'
3
- import { match } from 'matchacho'
4
- import { NotFound } from '../../HTTP/index.js'
5
- import type { Directive } from './types.js'
6
- import type { ReadableStream } from 'node:stream/web'
7
- import type { Remotes } from '../../Remotes.js'
8
- import type { Maybe } from '@toa.io/core/types'
9
- import type { Component } from '@toa.io/core'
10
- import type { Output } from '../../io.js'
11
- import type { Input } from '../octets/types.js'
12
- import type { Parameter } from '../../RTD/index.js'
13
-
14
- export class Fetch implements Directive {
15
- private readonly connecting: Promise<Component>
16
- private remote: Component | null = null
17
- private readonly operation: string
18
-
19
- public constructor(endpoint: string, discovery: Remotes) {
20
- assert.equal(typeof endpoint, 'string', '`flow:fetch` must be a string')
21
-
22
- const [operation, name, namespace = 'default'] = endpoint.split('.').reverse()
23
-
24
- this.operation = operation
25
- this.connecting = discovery.discover(namespace, name)
26
- }
27
-
28
- public async apply(input: Input, parameters: Parameter[]): Promise<Output> {
29
- if ('if-none-match' in input.request.headers) return { status: 304 }
30
-
31
- this.remote ??= await this.connecting
32
-
33
- const request = await this.remote.invoke<Maybe<Request | string>>(this.operation, {
34
- input: {
35
- authority: input.authority,
36
- path: input.request.url,
37
- parameters: Object.fromEntries(parameters.map(({ name, value }) => [name, value]))
38
- }
39
- })
40
-
41
- if (request instanceof Error) throw new NotFound(request)
42
-
43
- const { url, options } = match<Request>(
44
- request,
45
- String,
46
- { url: request },
47
- (request: Request): Request => ({
48
- url: request.url,
49
- options: {
50
- method: request.options?.method ?? 'GET',
51
- body: request.options?.body,
52
- headers: request.options?.headers
53
- }
54
- })
55
- )
56
-
57
- const response = await fetch(url, options)
58
-
59
- if (!response.ok) throw new NotFound()
60
-
61
- const headers = new Headers()
62
-
63
- for (const header of ['content-type', 'content-length', 'etag']) {
64
- const value = response.headers.get(header)
65
-
66
- if (value !== null) headers.set(header, value)
67
- }
68
-
69
- return {
70
- headers,
71
- body:
72
- response.body === null ? null : Readable.fromWeb(response.body as ReadableStream)
73
- }
74
- }
75
- }
76
-
77
- interface Request {
78
- url: string
79
- options?: RequestOptions
80
- }
81
-
82
- interface RequestOptions {
83
- method?: string
84
- body?: string
85
- headers?: Record<string, string>
86
- }
@@ -1,43 +0,0 @@
1
- import { Fetch } from './Fetch.js'
2
- import { Compose } from './Compose.js'
3
- import type { Directive } from './types.js'
4
- import type { Input, Output } from '../../io.js'
5
- import type { DirectiveFamily, Parameter } from '../../RTD/index.js'
6
- import type { Remotes } from '../../Remotes.js'
7
-
8
- export class Flow implements DirectiveFamily<Directive> {
9
- public readonly name: string = 'flow'
10
- public readonly mandatory: boolean = false
11
-
12
- public create(name: string, value: unknown, remotes: Remotes): Directive {
13
- const Class = constructors[name]
14
-
15
- if (Class === undefined)
16
- throw new Error(`Directive '${this.name}:${name}' is not implemented`)
17
-
18
- return new Class(value, remotes)
19
- }
20
-
21
- public async precall(
22
- directives: Directive[],
23
- input: Input,
24
- parameters: Parameter[]
25
- ): Promise<Output> {
26
- for (const directive of directives) {
27
- if (directive.attach !== undefined) directive.attach(input)
28
-
29
- if (directive.apply === undefined) continue
30
-
31
- const output = await directive.apply(input, parameters)
32
-
33
- if (output !== null) return output
34
- }
35
-
36
- return null
37
- }
38
- }
39
-
40
- const constructors: Record<string, new (value: any, discovery: Remotes) => Directive> = {
41
- fetch: Fetch,
42
- compose: Compose
43
- }
@@ -1,3 +0,0 @@
1
- import { Flow } from './Flow.js'
2
-
3
- export const flow = new Flow()
@@ -1,7 +0,0 @@
1
- import type { Input as Context, Input, Output } from '../../io.js'
2
- import type { Parameter } from '../../RTD/index.js'
3
-
4
- export interface Directive {
5
- apply?: (input: Input, parameters: Parameter[]) => Promise<Output>
6
- attach?: (context: Context) => void
7
- }
@@ -1,122 +0,0 @@
1
- import assert from 'node:assert'
2
- import { Help } from './Help.js'
3
- import { Parameters } from './Parameters.js'
4
- import type { Introspection, Schema } from '../../Introspection.js'
5
- import type { Described } from './described.js'
6
- import type { Context } from '../../HTTP/index.js'
7
- import type { DirectiveFamily } from '../../RTD/index.js'
8
-
9
- /** The name the family is declared under, and what a consumer of one asks a method for. */
10
- export const FAMILY = 'help'
11
-
12
- export type Directive = Help | Parameters
13
-
14
- export class Family implements DirectiveFamily<Directive> {
15
- public readonly name = FAMILY
16
- public readonly mandatory = false
17
-
18
- /**
19
- * What a node says of itself is not said of what is under it: inherited, `help:node`
20
- * would describe every resource below as the one it was written for. The rest go with
21
- * it — a sentence about one method is not true of the next, and a route variable a
22
- * template does not have is not one at all.
23
- */
24
- public readonly inherited = false
25
-
26
- /** What the nearest declaration says of the method, or nothing where none does. */
27
- public static method(directives: Directive[] | undefined): Help | null {
28
- return stated(directives, 'method')
29
- }
30
-
31
- /** And the same of the resource the method is on. */
32
- public static node(directives: Directive[] | undefined): Help | null {
33
- return stated(directives, 'node')
34
- }
35
-
36
- // eslint-disable-next-line max-params
37
- public create(name: string, value: unknown, _: unknown, route: string): Directive {
38
- if (name === 'node' || name === 'method') return new Help(name, value)
39
-
40
- assert.ok(name === 'route' || name === 'query', `Unknown directive: help:${name}`)
41
-
42
- return new Parameters(name, value, route)
43
- }
44
-
45
- /** What the route states this method and its parameters are. */
46
- public explain(
47
- directives: Directive[],
48
- _: Context,
49
- introspection: Introspection
50
- ): Introspection | null {
51
- const help = Family.method(directives)
52
-
53
- // what is hidden is hidden from every answer at once, this being the one place they
54
- // all read; the method itself is reached as it always was
55
- if (help?.hidden === true) return null
56
-
57
- const described: Introspection = {
58
- ...introspection,
59
- ...(help?.title === undefined ? {} : { title: help.title }),
60
- ...(help?.description === undefined ? {} : { description: help.description })
61
- }
62
-
63
- // a schema says `title` and `description` of what it describes, which is where these go
64
- for (const subject of PARAMETERS) {
65
- const declaration = declared(directives, subject)
66
-
67
- if (declaration === null) continue
68
-
69
- const parameters = declaration.parameters
70
-
71
- for (const [name, stated] of Object.entries(parameters)) {
72
- const schema = described[subject]?.[name]
73
-
74
- /*
75
- * A route variable is one because the template names it, whether or not the
76
- * operation declares it as input — and only then is it answered. `:id` on an
77
- * observation is the ordinary case: it is taken by the query, so nothing describes
78
- * it and the caller is not told it is a path parameter at all.
79
- *
80
- * Anything else is described only where it is already answered: a querystring
81
- * parameter is one only where the mapping takes it, and a segment `map:segments`
82
- * renames is answered under the property it fills.
83
- */
84
- if (schema === undefined && !declaration.variables.includes(name)) continue
85
-
86
- // written where the shape states it, whatever the schema already said
87
- const merged = { ...schema } as Record<string, unknown>
88
-
89
- delete merged.title
90
- delete merged.description
91
-
92
- described[subject] ??= {}
93
- described[subject]![name] = Object.assign(merged, stated) as unknown as Schema
94
- }
95
- }
96
-
97
- return described
98
- }
99
- }
100
-
101
- const PARAMETERS = ['route', 'query'] as const
102
-
103
- function stated(directives: Directive[] | undefined, subject: string): Help | null {
104
- const help = directives?.find(
105
- (directive) => directive instanceof Help && directive.subject === subject
106
- )
107
-
108
- return (help as Help | undefined) ?? null
109
- }
110
-
111
- function declared(
112
- directives: Directive[] | undefined,
113
- subject: string
114
- ): Parameters | null {
115
- const found = directives?.find(
116
- (directive) => directive instanceof Parameters && directive.subject === subject
117
- )
118
-
119
- return (found as Parameters | undefined) ?? null
120
- }
121
-
122
- export type { Described }
@@ -1,227 +0,0 @@
1
- import assert from 'node:assert'
2
- import { describe, it } from 'node:test'
3
- import { Help } from './Help.js'
4
- import { Family } from './Family.js'
5
- import { Parameters } from './Parameters.js'
6
-
7
- describe('help:method', () => {
8
- it('should read a bare value as the title, which is the short thing', () => {
9
- const help = new Help('method', 'Hot pots')
10
-
11
- assert.strictEqual(help.title, 'Hot pots')
12
- assert.strictEqual(help.description, undefined)
13
- })
14
-
15
- it('should take a description beside it', () => {
16
- const help = new Help('method', {
17
- title: 'Hot pots',
18
- description: 'The pots that are too hot to pour.'
19
- })
20
-
21
- assert.strictEqual(help.title, 'Hot pots')
22
- assert.strictEqual(help.description, 'The pots that are too hot to pour.')
23
- })
24
-
25
- it('should take a description alone', () => {
26
- const help = new Help('method', { description: 'Every pot there is.' })
27
-
28
- assert.strictEqual(help.title, undefined)
29
- assert.strictEqual(help.description, 'Every pot there is.')
30
- })
31
-
32
- it('should not accept one that says nothing', () => {
33
- assert.throws(() => new Help('method', {}), /says nothing/)
34
- })
35
-
36
- it('should not accept what it does not know', () => {
37
- assert.throws(() => new Help('method', { summary: 'A pot.' }), /'summary'/)
38
- })
39
-
40
- it('should not accept an empty value', () => {
41
- assert.throws(() => new Help('method', { title: ' ' }), /title cannot be empty/)
42
- assert.throws(
43
- () => new Help('method', { description: ' ' }),
44
- /description cannot be empty/
45
- )
46
- })
47
-
48
- it('should not accept a value that is not one', () => {
49
- assert.throws(() => new Help('method', ['a']), /the value is a title/)
50
- })
51
- })
52
-
53
- describe('help:node', () => {
54
- it('should read the value as the title', () => {
55
- const help = new Help('node', 'Pots')
56
-
57
- assert.strictEqual(help.title, 'Pots')
58
- assert.strictEqual(help.description, undefined)
59
- })
60
-
61
- it('should take a description beside it, as a method does', () => {
62
- const help = new Help('node', { title: 'Pots', description: 'What is brewing.' })
63
-
64
- assert.strictEqual(help.title, 'Pots')
65
- assert.strictEqual(help.description, 'What is brewing.')
66
- })
67
- })
68
-
69
- describe('help', () => {
70
- const help = new Family()
71
-
72
- it('should not be inherited: a node describes itself, not what is under it', () => {
73
- assert.strictEqual(help.inherited, false)
74
- })
75
-
76
- it('should take the nearest declaration of each subject', () => {
77
- const directives = [
78
- new Help('method', 'Nearest'),
79
- new Help('node', 'Resource'),
80
- new Help('method', 'Further')
81
- ]
82
-
83
- assert.strictEqual(Family.method(directives)?.title, 'Nearest')
84
- assert.strictEqual(Family.node(directives)?.title, 'Resource')
85
- })
86
-
87
- it('should say nothing where nothing is declared', () => {
88
- assert.strictEqual(Family.method(undefined), null)
89
- assert.strictEqual(Family.node([]), null)
90
- })
91
-
92
- it('should describe a method with what the route states', () => {
93
- const directives = [new Help('method', { title: 'Hot', description: 'Too hot.' })]
94
-
95
- assert.deepStrictEqual(help.explain(directives, null as never, { errors: ['NO'] }), {
96
- errors: ['NO'],
97
- title: 'Hot',
98
- description: 'Too hot.'
99
- })
100
- })
101
-
102
- it('should leave a method the node describes alone', () => {
103
- // what the resource is, is not what one of its methods is
104
- const directives = [new Help('node', 'Pots')]
105
-
106
- assert.deepStrictEqual(help.explain(directives, null as never, {}), {})
107
- })
108
-
109
- it('should refuse a directive it does not know', () => {
110
- assert.throws(() => help.create('resource', 'Pots'), /Unknown directive/)
111
- })
112
- })
113
-
114
- describe('help:route', () => {
115
- it('should describe a variable the template names', () => {
116
- const stated = new Parameters('route', { id: 'The pot' }, '/pots/:id')
117
-
118
- assert.deepStrictEqual(stated.parameters, { id: { title: 'The pot' } })
119
- })
120
-
121
- it('should take a description beside it', () => {
122
- const stated = new Parameters(
123
- 'route',
124
- { id: { title: 'The pot', description: 'Which pot to pour.' } },
125
- '/pots/:id'
126
- )
127
-
128
- assert.deepStrictEqual(stated.parameters.id, {
129
- title: 'The pot',
130
- description: 'Which pot to pour.'
131
- })
132
- })
133
-
134
- it('should keep what the template names, which is what may be answered anew', () => {
135
- const stated = new Parameters('route', { id: 'The pot' }, '/pots/:id')
136
-
137
- assert.deepStrictEqual(stated.variables, ['id'])
138
- })
139
-
140
- it('should not check a name, because the template is not what says them all', () => {
141
- // `map:segments` answers a variable under the property it fills, and that name is
142
- // nowhere in the template
143
- const stated = new Parameters('route', { pot: 'The pot' }, '/pots/:id')
144
-
145
- assert.deepStrictEqual(stated.parameters, { pot: { title: 'The pot' } })
146
- })
147
-
148
- it('should name the rest of a path as the template writes it', () => {
149
- const stated = new Parameters('route', { '**': 'What is left' }, '/files/**')
150
-
151
- assert.deepStrictEqual(stated.parameters, { '**': { title: 'What is left' } })
152
- })
153
- })
154
-
155
- describe('help:query', () => {
156
- it('should describe a parameter, which no template names', () => {
157
- const stated = new Parameters('query', { since: 'From when' }, '/pots')
158
-
159
- assert.deepStrictEqual(stated.parameters, { since: { title: 'From when' } })
160
- })
161
-
162
- it('should refuse a value that names nothing', () => {
163
- assert.throws(() => new Parameters('query', 'since', '/pots'), /names each parameter/)
164
- })
165
-
166
- it('should refuse one that says nothing', () => {
167
- assert.throws(
168
- () => new Parameters('query', { since: {} }, '/pots'),
169
- /help:query\.since: says nothing/
170
- )
171
- })
172
- })
173
-
174
- describe('help parameters', () => {
175
- const help = new Family()
176
-
177
- it('should say what a parameter is, where its schema is', () => {
178
- const directives = [
179
- new Parameters('route', { id: 'The pot' }, '/pots/:id'),
180
- new Parameters('query', { limit: { description: 'How many.' } }, '/pots/:id')
181
- ]
182
-
183
- const explained = help.explain(directives, null as never, {
184
- route: { id: { type: 'string' } as never },
185
- query: { limit: { type: 'integer' } as never }
186
- })
187
-
188
- assert.deepStrictEqual(explained.route, { id: { type: 'string', title: 'The pot' } })
189
- assert.deepStrictEqual(explained.query, {
190
- limit: { type: 'integer', description: 'How many.' }
191
- })
192
- })
193
-
194
- it('should leave a parameter the method does not take alone', () => {
195
- const directives = [new Parameters('query', { since: 'From when' }, '/pots')]
196
-
197
- assert.deepStrictEqual(help.explain(directives, null as never, {}), {})
198
- })
199
-
200
- it('should answer a route variable an operation does not declare', () => {
201
- // `:id` on an observation is taken by the query, so nothing else describes it
202
- const directives = [new Parameters('route', { id: 'The pot' }, '/pots/:id')]
203
-
204
- assert.deepStrictEqual(help.explain(directives, null as never, {}), {
205
- route: { id: { title: 'The pot' } }
206
- })
207
- })
208
-
209
- it('should describe a segment a mapping renamed, under the name it answers by', () => {
210
- const directives = [new Parameters('route', { a: 'Which one' }, '/echo/:first')]
211
-
212
- const explained = help.explain(directives, null as never, {
213
- route: { a: { type: 'string' } as never }
214
- })
215
-
216
- assert.deepStrictEqual(explained.route, { a: { type: 'string', title: 'Which one' } })
217
- })
218
-
219
- it('should not invent a parameter nothing answers', () => {
220
- const directives = [new Parameters('route', { typo: 'Nobody' }, '/echo/:first')]
221
-
222
- assert.deepStrictEqual(
223
- help.explain(directives, null as never, { route: { a: { type: 'string' } as never } }),
224
- { route: { a: { type: 'string' } } }
225
- )
226
- })
227
- })
@@ -1,47 +0,0 @@
1
- import assert from 'node:assert'
2
- import { described, type Described } from './described.js'
3
-
4
- /**
5
- * What a resource or a method is, in the words an application chooses for it — read by
6
- * everything that describes one: `OPTIONS`, discovery, and the tools MCP publishes.
7
- *
8
- * The operation states what it is too, and that is not this. An operation is written
9
- * without knowledge of any route, and a method is an operation and a route together — the
10
- * same operation mounted twice is two methods, and one sentence is not true of both.
11
- */
12
- export class Help {
13
- /** `node` says what the resource is; `method` what one of its methods is. */
14
- public readonly subject: Subject
15
- public readonly title: string | undefined
16
- public readonly description: string | undefined
17
-
18
- /**
19
- * Whether the method is described at all. `help:method: null` takes it out of every
20
- * answer — `OPTIONS`, discovery and the tools MCP publishes — and leaves it as callable
21
- * as it was: a route something else reaches for, and nobody is meant to go looking for.
22
- */
23
- public readonly hidden: boolean
24
-
25
- public constructor(subject: Subject, value: unknown) {
26
- assert.ok(
27
- value !== null || subject === 'method',
28
- `Directive help:${subject}: only a method is hidden`
29
- )
30
-
31
- if (value === null) {
32
- this.subject = subject
33
- this.hidden = true
34
-
35
- return
36
- }
37
-
38
- const stated: Described = described(`help:${subject}`, value)
39
-
40
- this.subject = subject
41
- this.hidden = false
42
- this.title = stated.title
43
- this.description = stated.description
44
- }
45
- }
46
-
47
- export type Subject = 'node' | 'method'
@@ -1,47 +0,0 @@
1
- import assert from 'node:assert'
2
- import { segment } from '../../RTD/segment.js'
3
- import { described, type Described } from './described.js'
4
-
5
- /**
6
- * What the parameters of a method are, by name: a route variable, or one of the
7
- * querystring. Written where the method is, because what a variable means is what the
8
- * route it is in makes of it.
9
- *
10
- * A name is not checked against the template, because the template is not what says them
11
- * all: `map:segments` answers a variable under the property it fills instead, and that
12
- * name is nowhere here. What matches nothing is not answered.
13
- */
14
- export class Parameters {
15
- public readonly subject: Subject
16
- public readonly parameters: Record<string, Described>
17
-
18
- /** What the route template names, which is a parameter whether an operation takes it or not. */
19
- public readonly variables: string[]
20
-
21
- public constructor(subject: Subject, value: unknown, route: string) {
22
- assert.ok(
23
- typeof value === 'object' && value !== null && !Array.isArray(value),
24
- `Directive help:${subject}: the value names each parameter it describes`
25
- )
26
-
27
- const parameters: Record<string, Described> = {}
28
-
29
- for (const [name, stated] of Object.entries(value))
30
- parameters[name] = described(`help:${subject}.${name}`, stated)
31
-
32
- this.subject = subject
33
- this.parameters = parameters
34
- this.variables = subject === 'route' ? names(route) : []
35
- }
36
- }
37
-
38
- /** The variables the template names, which are what a route parameter may be called. */
39
- function names(route: string): string[] {
40
- return segment(route)
41
- .map((part) =>
42
- part.fragment !== null ? null : part.wildcard === true ? '**' : part.placeholder
43
- )
44
- .filter((name): name is string => name !== null)
45
- }
46
-
47
- export type Subject = 'route' | 'query'