@toa.io/extensions.exposition 1.0.0-alpha.292 → 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 (443) 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 +24 -13
  6. package/transpiled/Endpoint.js +3 -0
  7. package/transpiled/Endpoint.js.map +1 -1
  8. package/transpiled/Introspection.d.ts +6 -0
  9. package/transpiled/Introspection.js +1 -0
  10. package/transpiled/Introspection.js.map +1 -1
  11. package/transpiled/MCP/schema.js +2 -2
  12. package/transpiled/Query.d.ts +2 -12
  13. package/transpiled/Query.js +2 -12
  14. package/transpiled/Query.js.map +1 -1
  15. package/transpiled/RTD/Endpoint.d.ts +2 -3
  16. package/ui/dist/_app/immutable/assets/0.Cu0AnR_8.css +2 -0
  17. package/ui/dist/_app/immutable/assets/2.BghF56l_.css +1 -0
  18. package/ui/dist/_app/immutable/assets/ui.C8aD6zzF.css +1 -0
  19. package/ui/dist/_app/immutable/chunks/B8GvXrmq.js +1 -0
  20. package/ui/dist/_app/immutable/chunks/BVDJTrf4.js +3 -0
  21. package/ui/dist/_app/immutable/chunks/D6q28_Ok.js +86 -0
  22. package/ui/dist/_app/immutable/chunks/{aLpTDmOc.js → DVlaUfVU.js} +1 -1
  23. package/ui/dist/_app/immutable/chunks/DpB73ZB6.js +6 -0
  24. package/ui/dist/_app/immutable/entry/app.CTava8yn.js +2 -0
  25. package/ui/dist/_app/immutable/entry/start.yWN0gSLA.js +1 -0
  26. package/ui/dist/_app/immutable/nodes/0.HKRDBYrC.js +1 -0
  27. package/ui/dist/_app/immutable/nodes/1.CLa0ydOi.js +1 -0
  28. package/ui/dist/_app/immutable/nodes/2.C9Kaym8C.js +8 -0
  29. package/ui/dist/_app/immutable/nodes/3.C1X4_rXZ.js +1 -0
  30. package/ui/dist/_app/immutable/nodes/4.DdzDIi9E.js +1 -0
  31. package/ui/dist/_app/immutable/nodes/5.DpbmCMdw.js +1 -0
  32. package/ui/dist/_app/version.json +1 -1
  33. package/ui/dist/index.html +12 -12
  34. package/CHANGELOG.md +0 -42
  35. package/components/identity.bans/tsconfig.tsbuildinfo +0 -1
  36. package/components/identity.basic/source/lib/credentials.test.ts +0 -18
  37. package/components/identity.basic/tsconfig.tsbuildinfo +0 -1
  38. package/components/identity.clients/source/lib/canonical.test.ts +0 -43
  39. package/components/identity.clients/source/lib/cimd.test.ts +0 -122
  40. package/components/identity.clients/source/lib/redirect.test.ts +0 -47
  41. package/components/identity.clients/tsconfig.tsbuildinfo +0 -1
  42. package/components/identity.credentials/source/list.test.ts +0 -70
  43. package/components/identity.credentials/tsconfig.tsbuildinfo +0 -1
  44. package/components/identity.federation/source/lib/discovery.test.ts +0 -60
  45. package/components/identity.federation/source/list.test.ts +0 -41
  46. package/components/identity.federation/tsconfig.tsbuildinfo +0 -1
  47. package/components/identity.grants/tsconfig.tsbuildinfo +0 -1
  48. package/components/identity.keys/tsconfig.tsbuildinfo +0 -1
  49. package/components/identity.otp/tsconfig.tsbuildinfo +0 -1
  50. package/components/identity.passkeys/source/errors.test.ts +0 -34
  51. package/components/identity.passkeys/source/webauthn.test.ts +0 -26
  52. package/components/identity.passkeys/tsconfig.tsbuildinfo +0 -1
  53. package/components/identity.roles/tsconfig.tsbuildinfo +0 -1
  54. package/components/identity.tokens/source/authenticate.test.ts +0 -112
  55. package/components/identity.tokens/source/decrypt.test.ts +0 -216
  56. package/components/identity.tokens/source/encrypt.test.ts +0 -150
  57. package/components/identity.tokens/source/issue.test.ts +0 -73
  58. package/components/identity.tokens/source/lib/form.test.ts +0 -25
  59. package/components/identity.tokens/source/lib/paseto.test.ts +0 -62
  60. package/components/identity.tokens/tsconfig.tsbuildinfo +0 -1
  61. package/context.toa.yaml +0 -31
  62. package/cucumber.mjs +0 -7
  63. package/documentation/.assets/ia3-dark.jpg +0 -0
  64. package/documentation/.assets/ia3-light.jpg +0 -0
  65. package/documentation/.assets/overview-dark.jpg +0 -0
  66. package/documentation/.assets/overview-light.jpg +0 -0
  67. package/documentation/.assets/role-scopes-dark.jpg +0 -0
  68. package/documentation/.assets/role-scopes-light.jpg +0 -0
  69. package/documentation/.assets/rtd-dark.jpg +0 -0
  70. package/documentation/.assets/rtd-light.jpg +0 -0
  71. package/documentation/access.md +0 -350
  72. package/documentation/authorities.md +0 -51
  73. package/documentation/cache.md +0 -72
  74. package/documentation/components.md +0 -472
  75. package/documentation/consent.md +0 -101
  76. package/documentation/credentials.md +0 -88
  77. package/documentation/dev.md +0 -30
  78. package/documentation/discovery.md +0 -81
  79. package/documentation/flow.md +0 -44
  80. package/documentation/help.md +0 -122
  81. package/documentation/identity.md +0 -304
  82. package/documentation/introspection.md +0 -123
  83. package/documentation/io.md +0 -167
  84. package/documentation/ip.md +0 -24
  85. package/documentation/map.md +0 -123
  86. package/documentation/mcp.md +0 -183
  87. package/documentation/notes/desync.jpg +0 -0
  88. package/documentation/notes/peers.md +0 -59
  89. package/documentation/notes/sse.md +0 -71
  90. package/documentation/notes/throttling.md +0 -122
  91. package/documentation/oauth.md +0 -180
  92. package/documentation/octets.md +0 -334
  93. package/documentation/passkeys.md +0 -11
  94. package/documentation/protocol.md +0 -120
  95. package/documentation/query.md +0 -324
  96. package/documentation/require.md +0 -15
  97. package/documentation/rpc.md +0 -154
  98. package/documentation/tracing.md +0 -70
  99. package/documentation/tree.md +0 -199
  100. package/features/access.feature +0 -596
  101. package/features/annotation.feature +0 -32
  102. package/features/auth.assert.feature +0 -55
  103. package/features/auth.bearer.feature +0 -120
  104. package/features/auth.claims.feature +0 -171
  105. package/features/auth.incept.feature +0 -166
  106. package/features/auth.input.feature +0 -59
  107. package/features/authorities.basic.feature +0 -141
  108. package/features/authorities.feature +0 -71
  109. package/features/authorities.federation.feature +0 -100
  110. package/features/authorities.tokens.feature +0 -117
  111. package/features/body.feature +0 -76
  112. package/features/cache.feature +0 -368
  113. package/features/configuration.feature +0 -206
  114. package/features/cors.feature +0 -127
  115. package/features/credentials.feature +0 -106
  116. package/features/debug.feature +0 -34
  117. package/features/dev.feature +0 -90
  118. package/features/directives.feature +0 -61
  119. package/features/discovery.feature +0 -213
  120. package/features/discovery.ui.feature +0 -213
  121. package/features/dynamic.feature +0 -192
  122. package/features/errors.feature +0 -258
  123. package/features/etag.feature +0 -239
  124. package/features/flow.feature +0 -148
  125. package/features/help.feature +0 -512
  126. package/features/identity.bans.feature +0 -200
  127. package/features/identity.basic.feature +0 -666
  128. package/features/identity.feature +0 -240
  129. package/features/identity.federation.feature +0 -396
  130. package/features/identity.otp.feature +0 -142
  131. package/features/identity.roles.feature +0 -568
  132. package/features/identity.tokens.custom.feature +0 -430
  133. package/features/identity.tokens.feature +0 -131
  134. package/features/interruptions.feature +0 -20
  135. package/features/introspection.feature +0 -565
  136. package/features/introspection.map.feature +0 -108
  137. package/features/io.feature +0 -204
  138. package/features/io.throttle.feature +0 -166
  139. package/features/map.feature +0 -360
  140. package/features/mcp.feature +0 -753
  141. package/features/methods.feature +0 -48
  142. package/features/oauth.clients.feature +0 -195
  143. package/features/oauth.discovery.feature +0 -164
  144. package/features/oauth.grants.feature +0 -301
  145. package/features/octets.cloudinary.feature +0 -233
  146. package/features/octets.download.feature +0 -194
  147. package/features/octets.entries.feature +0 -83
  148. package/features/octets.feature +0 -306
  149. package/features/octets.head.feature +0 -40
  150. package/features/octets.location.feature +0 -83
  151. package/features/octets.meta.feature +0 -117
  152. package/features/octets.workflows.feature +0 -565
  153. package/features/passkeys.feature +0 -66
  154. package/features/probes.feature +0 -18
  155. package/features/query.feature +0 -389
  156. package/features/realtime.feature +0 -34
  157. package/features/require.feature +0 -66
  158. package/features/response.feature +0 -103
  159. package/features/routes.feature +0 -224
  160. package/features/rpc.feature +0 -429
  161. package/features/server.feature +0 -21
  162. package/features/site/_app/immutable/asset.js +0 -1
  163. package/features/site/favicon.ico +0 -0
  164. package/features/site/index.html +0 -10
  165. package/features/steps/.env.example +0 -5
  166. package/features/steps/Captures.ts +0 -20
  167. package/features/steps/Cloudinary.ts +0 -12
  168. package/features/steps/Common.ts +0 -38
  169. package/features/steps/Components.ts +0 -115
  170. package/features/steps/Database.ts +0 -106
  171. package/features/steps/Gateway.ts +0 -239
  172. package/features/steps/HTTP.ts +0 -96
  173. package/features/steps/IDP.ts +0 -361
  174. package/features/steps/Identity.ts +0 -54
  175. package/features/steps/OTP.ts +0 -42
  176. package/features/steps/Parameters.ts +0 -162
  177. package/features/steps/Probe.ts +0 -38
  178. package/features/steps/Realtime.ts +0 -175
  179. package/features/steps/Workspace.ts +0 -48
  180. package/features/steps/components/audit/manifest.toa.yaml +0 -20
  181. package/features/steps/components/audit/operations/record.js +0 -5
  182. package/features/steps/components/echo/manifest.toa.yaml +0 -59
  183. package/features/steps/components/echo/operations/affect.js +0 -3
  184. package/features/steps/components/echo/operations/compute.js +0 -3
  185. package/features/steps/components/echo/operations/echo.js +0 -3
  186. package/features/steps/components/echo/operations/error.js +0 -7
  187. package/features/steps/components/echo/operations/identity.js +0 -3
  188. package/features/steps/components/echo/operations/parameters.js +0 -3
  189. package/features/steps/components/echo/operations/ping.js +0 -3
  190. package/features/steps/components/echo/operations/unwrap.js +0 -3
  191. package/features/steps/components/echo.beacon/manifest.toa.yaml +0 -2
  192. package/features/steps/components/echo.beacon/operations/hello.js +0 -3
  193. package/features/steps/components/greeter/manifest.toa.yaml +0 -5
  194. package/features/steps/components/greeter/operations/greet.js +0 -3
  195. package/features/steps/components/notify/manifest.toa.yaml +0 -20
  196. package/features/steps/components/notify/operations/send.js +0 -5
  197. package/features/steps/components/octets.tester/manifest.toa.yaml +0 -73
  198. package/features/steps/components/octets.tester/operations/authority.js +0 -3
  199. package/features/steps/components/octets.tester/operations/bar.js +0 -9
  200. package/features/steps/components/octets.tester/operations/baz.js +0 -9
  201. package/features/steps/components/octets.tester/operations/concat.js +0 -5
  202. package/features/steps/components/octets.tester/operations/echo.js +0 -5
  203. package/features/steps/components/octets.tester/operations/err.js +0 -14
  204. package/features/steps/components/octets.tester/operations/foo.js +0 -5
  205. package/features/steps/components/octets.tester/operations/id.js +0 -5
  206. package/features/steps/components/octets.tester/operations/identity.js +0 -5
  207. package/features/steps/components/octets.tester/operations/lenna.png +0 -0
  208. package/features/steps/components/octets.tester/operations/redirect.js +0 -17
  209. package/features/steps/components/octets.tester/operations/yex.js +0 -14
  210. package/features/steps/components/octets.tester/operations/yield.js +0 -11
  211. package/features/steps/components/orders/manifest.toa.yaml +0 -30
  212. package/features/steps/components/orders/operations/create.js +0 -7
  213. package/features/steps/components/pots/manifest.toa.yaml +0 -91
  214. package/features/steps/components/pots/migrations/0002-indexes.yaml +0 -4
  215. package/features/steps/components/pricing/manifest.toa.yaml +0 -13
  216. package/features/steps/components/pricing/operations/quote.js +0 -3
  217. package/features/steps/components/sequences/manifest.toa.yaml +0 -11
  218. package/features/steps/components/sequences/operations/numbers.js +0 -5
  219. package/features/steps/components/sequences/operations/tokens.js +0 -14
  220. package/features/steps/components/users/manifest.toa.yaml +0 -30
  221. package/features/steps/components/users/operations/create.js +0 -11
  222. package/features/steps/components/users.properties/manifest.toa.yaml +0 -22
  223. package/features/steps/map.ts +0 -30
  224. package/features/steps/tsconfig.json +0 -9
  225. package/features/streams.feature +0 -35
  226. package/features/timestamps.feature +0 -41
  227. package/features/timing.feature +0 -49
  228. package/features/tracing.feature +0 -123
  229. package/source/Branch.test.ts +0 -40
  230. package/source/Branch.ts +0 -44
  231. package/source/Composition.ts +0 -51
  232. package/source/Context.ts +0 -11
  233. package/source/Directive.test.ts +0 -199
  234. package/source/Directive.ts +0 -248
  235. package/source/Discovery/Explorer.ts +0 -34
  236. package/source/Discovery/Site.test.ts +0 -147
  237. package/source/Discovery/Site.ts +0 -202
  238. package/source/Discovery/index.ts +0 -3
  239. package/source/Discovery/tree.test.ts +0 -175
  240. package/source/Discovery/tree.ts +0 -77
  241. package/source/Discovery/trunk.ts +0 -33
  242. package/source/Endpoint.test.ts +0 -67
  243. package/source/Endpoint.ts +0 -157
  244. package/source/Factory.ts +0 -42
  245. package/source/Gateway.ts +0 -390
  246. package/source/HTTP/Context.ts +0 -143
  247. package/source/HTTP/Probe.ts +0 -99
  248. package/source/HTTP/Server.ts +0 -435
  249. package/source/HTTP/Timing.ts +0 -14
  250. package/source/HTTP/address.test.ts +0 -28
  251. package/source/HTTP/address.ts +0 -16
  252. package/source/HTTP/exceptions.ts +0 -99
  253. package/source/HTTP/formats/form.ts +0 -21
  254. package/source/HTTP/formats/index.ts +0 -36
  255. package/source/HTTP/formats/json.ts +0 -14
  256. package/source/HTTP/formats/msgpack.ts +0 -14
  257. package/source/HTTP/formats/text.ts +0 -10
  258. package/source/HTTP/formats/yaml.test.ts +0 -22
  259. package/source/HTTP/formats/yaml.ts +0 -40
  260. package/source/HTTP/index.ts +0 -6
  261. package/source/HTTP/messages.test.ts +0 -196
  262. package/source/HTTP/messages.ts +0 -186
  263. package/source/HTTP/types.ts +0 -39
  264. package/source/Interception.ts +0 -37
  265. package/source/Introspection.ts +0 -179
  266. package/source/MCP/Server.ts +0 -335
  267. package/source/MCP/discover.ts +0 -51
  268. package/source/MCP/errors.ts +0 -80
  269. package/source/MCP/index.ts +0 -1
  270. package/source/MCP/schema.test.ts +0 -91
  271. package/source/MCP/schema.ts +0 -94
  272. package/source/MCP/tools.ts +0 -144
  273. package/source/MCP/types.ts +0 -84
  274. package/source/Mapping.ts +0 -101
  275. package/source/Query.test.ts +0 -54
  276. package/source/Query.ts +0 -277
  277. package/source/RPC/Context.ts +0 -75
  278. package/source/RPC/Dispatcher.ts +0 -150
  279. package/source/RPC/errors.test.ts +0 -77
  280. package/source/RPC/errors.ts +0 -82
  281. package/source/RPC/index.ts +0 -1
  282. package/source/RPC/names.test.ts +0 -141
  283. package/source/RPC/names.ts +0 -176
  284. package/source/RPC/types.ts +0 -34
  285. package/source/RTD/Context.ts +0 -16
  286. package/source/RTD/Directives.ts +0 -126
  287. package/source/RTD/Endpoint.ts +0 -27
  288. package/source/RTD/Match.ts +0 -11
  289. package/source/RTD/Method.ts +0 -39
  290. package/source/RTD/Node.ts +0 -169
  291. package/source/RTD/Route.ts +0 -93
  292. package/source/RTD/Tree.ts +0 -137
  293. package/source/RTD/expiration.test.ts +0 -81
  294. package/source/RTD/factory.ts +0 -105
  295. package/source/RTD/index.ts +0 -8
  296. package/source/RTD/segment.test.ts +0 -35
  297. package/source/RTD/segment.ts +0 -51
  298. package/source/RTD/syntax/index.ts +0 -1
  299. package/source/RTD/walk.test.ts +0 -147
  300. package/source/Remotes.test.ts +0 -79
  301. package/source/Remotes.ts +0 -39
  302. package/source/Tenant.ts +0 -73
  303. package/source/directives/auth/Anonymous.test.ts +0 -70
  304. package/source/directives/auth/Anonymous.ts +0 -36
  305. package/source/directives/auth/Anyone.ts +0 -23
  306. package/source/directives/auth/Assert.ts +0 -43
  307. package/source/directives/auth/Authorization.test.ts +0 -24
  308. package/source/directives/auth/Authorization.ts +0 -388
  309. package/source/directives/auth/Delegate.test.ts +0 -36
  310. package/source/directives/auth/Delegate.ts +0 -54
  311. package/source/directives/auth/Echo.ts +0 -24
  312. package/source/directives/auth/Federation.ts +0 -104
  313. package/source/directives/auth/Id.ts +0 -37
  314. package/source/directives/auth/Incept.ts +0 -117
  315. package/source/directives/auth/Input.ts +0 -92
  316. package/source/directives/auth/Role.test.ts +0 -147
  317. package/source/directives/auth/Role.ts +0 -99
  318. package/source/directives/auth/Rule.ts +0 -59
  319. package/source/directives/auth/Scheme.ts +0 -31
  320. package/source/directives/auth/create.ts +0 -11
  321. package/source/directives/auth/index.ts +0 -3
  322. package/source/directives/auth/schemes.test.ts +0 -18
  323. package/source/directives/auth/schemes.ts +0 -39
  324. package/source/directives/auth/split.ts +0 -14
  325. package/source/directives/auth/types.ts +0 -75
  326. package/source/directives/cache/Cache.ts +0 -92
  327. package/source/directives/cache/Control.ts +0 -81
  328. package/source/directives/cache/Exact.ts +0 -7
  329. package/source/directives/cache/etag.ts +0 -38
  330. package/source/directives/cache/index.ts +0 -3
  331. package/source/directives/cache/types.ts +0 -9
  332. package/source/directives/cors/CORS.test.ts +0 -75
  333. package/source/directives/cors/CORS.ts +0 -88
  334. package/source/directives/cors/index.ts +0 -3
  335. package/source/directives/dev/Development.ts +0 -41
  336. package/source/directives/dev/Faulty.ts +0 -31
  337. package/source/directives/dev/Sleep.ts +0 -53
  338. package/source/directives/dev/Stub.ts +0 -14
  339. package/source/directives/dev/Throw.ts +0 -14
  340. package/source/directives/dev/index.ts +0 -3
  341. package/source/directives/dev/types.ts +0 -5
  342. package/source/directives/flow/Compose.ts +0 -98
  343. package/source/directives/flow/Fetch.ts +0 -86
  344. package/source/directives/flow/Flow.ts +0 -43
  345. package/source/directives/flow/index.ts +0 -3
  346. package/source/directives/flow/types.ts +0 -7
  347. package/source/directives/help/Family.ts +0 -122
  348. package/source/directives/help/Help.test.ts +0 -227
  349. package/source/directives/help/Help.ts +0 -47
  350. package/source/directives/help/Parameters.ts +0 -47
  351. package/source/directives/help/described.ts +0 -57
  352. package/source/directives/help/index.ts +0 -45
  353. package/source/directives/index.ts +0 -33
  354. package/source/directives/io/Directive.ts +0 -17
  355. package/source/directives/io/IO.ts +0 -118
  356. package/source/directives/io/Input.ts +0 -55
  357. package/source/directives/io/Message.ts +0 -1
  358. package/source/directives/io/Output.ts +0 -81
  359. package/source/directives/io/Status.test.ts +0 -88
  360. package/source/directives/io/Status.ts +0 -47
  361. package/source/directives/io/Throttle.ts +0 -30
  362. package/source/directives/io/index.ts +0 -3
  363. package/source/directives/io/lib/throttle/Configuration.test.ts +0 -72
  364. package/source/directives/io/lib/throttle/Configuration.ts +0 -68
  365. package/source/directives/io/lib/throttle/Keys.ts +0 -53
  366. package/source/directives/io/lib/throttle/Quotas.test.ts +0 -411
  367. package/source/directives/io/lib/throttle/Quotas.ts +0 -190
  368. package/source/directives/io/lib/throttle/Sync.test.ts +0 -163
  369. package/source/directives/io/lib/throttle/Sync.ts +0 -93
  370. package/source/directives/io/lib/throttle/Warning.test.ts +0 -32
  371. package/source/directives/io/lib/throttle/Warning.ts +0 -29
  372. package/source/directives/io/lib/throttle/components/Component.ts +0 -7
  373. package/source/directives/io/lib/throttle/components/IP.ts +0 -30
  374. package/source/directives/io/lib/throttle/components/Identity.ts +0 -19
  375. package/source/directives/io/lib/throttle/components/Path.ts +0 -8
  376. package/source/directives/io/lib/throttle/components/Route.ts +0 -19
  377. package/source/directives/io/lib/throttle/components/Segment.ts +0 -19
  378. package/source/directives/io/lib/throttle/components/index.ts +0 -19
  379. package/source/directives/io/lib/throttle/conditions/Condition.ts +0 -5
  380. package/source/directives/io/lib/throttle/conditions/Status.ts +0 -17
  381. package/source/directives/io/lib/throttle/conditions/index.ts +0 -11
  382. package/source/directives/io/lib/throttle/index.ts +0 -4
  383. package/source/directives/io/schemas.test.ts +0 -40
  384. package/source/directives/io/schemas.ts +0 -16
  385. package/source/directives/map/Authority.ts +0 -15
  386. package/source/directives/map/Buffer.ts +0 -15
  387. package/source/directives/map/Claims.ts +0 -63
  388. package/source/directives/map/Directive.ts +0 -4
  389. package/source/directives/map/Headers.ts +0 -60
  390. package/source/directives/map/Language.ts +0 -45
  391. package/source/directives/map/Languages.ts +0 -17
  392. package/source/directives/map/Map.ts +0 -85
  393. package/source/directives/map/Mapping.ts +0 -45
  394. package/source/directives/map/Properties.ts +0 -15
  395. package/source/directives/map/Segments.ts +0 -52
  396. package/source/directives/map/index.ts +0 -3
  397. package/source/directives/mcp/MCP.ts +0 -33
  398. package/source/directives/mcp/Tool.test.ts +0 -56
  399. package/source/directives/mcp/Tool.ts +0 -32
  400. package/source/directives/mcp/index.ts +0 -6
  401. package/source/directives/oauth/Discovery.ts +0 -66
  402. package/source/directives/oauth/documents.ts +0 -110
  403. package/source/directives/oauth/index.ts +0 -3
  404. package/source/directives/octets/Context.ts +0 -23
  405. package/source/directives/octets/Delete.ts +0 -96
  406. package/source/directives/octets/Directive.ts +0 -21
  407. package/source/directives/octets/Get.ts +0 -88
  408. package/source/directives/octets/Octets.ts +0 -82
  409. package/source/directives/octets/Put.ts +0 -186
  410. package/source/directives/octets/Workflow.ts +0 -60
  411. package/source/directives/octets/bytes.test.ts +0 -33
  412. package/source/directives/octets/bytes.ts +0 -18
  413. package/source/directives/octets/index.ts +0 -3
  414. package/source/directives/octets/schemas.test.ts +0 -20
  415. package/source/directives/octets/schemas.ts +0 -15
  416. package/source/directives/octets/types.ts +0 -9
  417. package/source/directives/octets/workflows/Execution.ts +0 -130
  418. package/source/directives/octets/workflows/Workflow.ts +0 -51
  419. package/source/directives/octets/workflows/index.ts +0 -1
  420. package/source/directives/require/Directive.ts +0 -5
  421. package/source/directives/require/Headers.ts +0 -19
  422. package/source/directives/require/Require.ts +0 -27
  423. package/source/directives/require/index.ts +0 -3
  424. package/source/discovery.ts +0 -1
  425. package/source/exceptions.ts +0 -47
  426. package/source/index.ts +0 -10
  427. package/source/io.ts +0 -4
  428. package/source/octets.d.ts +0 -17
  429. package/source/root.ts +0 -59
  430. package/source/service.ts +0 -95
  431. package/source/userland.ts +0 -47
  432. package/tsconfig.json +0 -13
  433. package/tsconfig.tsbuildinfo +0 -1
  434. package/ui/dist/_app/immutable/assets/0.Bl7vLmIK.css +0 -2
  435. package/ui/dist/_app/immutable/assets/2.BC0-Jhqu.css +0 -1
  436. package/ui/dist/_app/immutable/chunks/BaWe3aOV.js +0 -1
  437. package/ui/dist/_app/immutable/chunks/DjIYL2zC.js +0 -3
  438. package/ui/dist/_app/immutable/chunks/GZTfV0ks.js +0 -6
  439. package/ui/dist/_app/immutable/entry/app.D5v4JoUx.js +0 -2
  440. package/ui/dist/_app/immutable/entry/start.CWxFoIyZ.js +0 -1
  441. package/ui/dist/_app/immutable/nodes/0.DIh5T_5-.js +0 -1
  442. package/ui/dist/_app/immutable/nodes/1.CY-bFzHC.js +0 -1
  443. package/ui/dist/_app/immutable/nodes/2.6Ubd1ItY.js +0 -14
@@ -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'
@@ -1,57 +0,0 @@
1
- import assert from 'node:assert'
2
-
3
- /** What a resource, a method or a parameter says of itself, in the order it is written. */
4
- export interface Described {
5
- title?: string
6
- description?: string
7
-
8
- /** what its methods are guarded by; see `guarded` */
9
- authenticated?: boolean
10
- private?: boolean
11
- protected?: boolean
12
- system?: boolean
13
- }
14
-
15
- /**
16
- * A bare value is the title: it is the short thing, and the one a client has somewhere to
17
- * put — a name is an address and reads as one. A sentence is written as a mapping, beside
18
- * the title it explains, and either may stand alone.
19
- */
20
- export function described(subject: string, value: unknown): Described {
21
- const stated = typeof value === 'string' ? { title: value } : value
22
-
23
- assert.ok(
24
- typeof stated === 'object' && stated !== null && !Array.isArray(stated),
25
- `Directive ${subject}: the value is a title, or a \`title\` and a \`description\``
26
- )
27
-
28
- const { title, description, ...rest } = stated as Record<string, unknown>
29
-
30
- assert.ok(
31
- Object.keys(rest).length === 0,
32
- `Directive ${subject}: unknown ${Object.keys(rest)
33
- .map((key) => `'${key}'`)
34
- .join(', ')}`
35
- )
36
-
37
- assert.ok(
38
- title === undefined || (typeof title === 'string' && title.trim().length > 0),
39
- `Directive ${subject}: a title cannot be empty`
40
- )
41
-
42
- assert.ok(
43
- description === undefined ||
44
- (typeof description === 'string' && description.trim().length > 0),
45
- `Directive ${subject}: a description cannot be empty`
46
- )
47
-
48
- assert.ok(
49
- title !== undefined || description !== undefined,
50
- `Directive ${subject}: says nothing`
51
- )
52
-
53
- return {
54
- ...(title === undefined ? {} : { title: title as string }),
55
- ...(description === undefined ? {} : { description: description as string })
56
- }
57
- }
@@ -1,45 +0,0 @@
1
- import { Family, FAMILY } from './Family.js'
2
- import type { Directive } from './Family.js'
3
- import type { Described } from './described.js'
4
- import type { Directives } from '../../RTD/index.js'
5
- import type { Introspection } from '../../Introspection.js'
6
-
7
- export const help = new Family()
8
-
9
- /**
10
- * What the resource a method is on says of itself, or nothing where it says nothing. Read
11
- * from the method because that is what carries a route's directives; every method of one
12
- * node carries the same declaration.
13
- */
14
- export function resource(directives: Directives): Described | null {
15
- const stated = Family.node(directives.declared<Directive>(FAMILY))
16
-
17
- if (stated === null) return null
18
-
19
- return {
20
- ...(stated.title === undefined ? {} : { title: stated.title }),
21
- ...(stated.description === undefined ? {} : { description: stated.description })
22
- }
23
- }
24
-
25
- /**
26
- * What a resource is, taken from what its methods are: the flags are a method's, and a
27
- * resource carries whichever of them any of its methods does — which is what a reader picks
28
- * one icon by.
29
- */
30
- export function guarded(methods: Record<string, Introspection>): Described {
31
- const described: Described = {}
32
-
33
- for (const introspection of Object.values(methods))
34
- for (const flag of FLAGS) if (introspection[flag] === true) described[flag] = true
35
-
36
- return described
37
- }
38
-
39
- const FLAGS = ['authenticated', 'private', 'protected', 'system'] as const
40
-
41
- export { FAMILY, Family } from './Family.js'
42
- export { Help } from './Help.js'
43
- export { Parameters } from './Parameters.js'
44
- export type { Directive } from './Family.js'
45
- export type { Described } from './described.js'
@@ -1,33 +0,0 @@
1
- import { authorization } from './auth/index.js'
2
- import { cache } from './cache/index.js'
3
- import { cors } from './cors/index.js'
4
- import { dev } from './dev/index.js'
5
- import { octets } from './octets/index.js'
6
- import { io } from './io/index.js'
7
- import { map } from './map/index.js'
8
- import { mcp } from './mcp/index.js'
9
- import { req } from './require/index.js'
10
- import { flow } from './flow/index.js'
11
- import { help } from './help/index.js'
12
- import { discovery } from './oauth/index.js'
13
- import { Site } from '../Discovery/index.js'
14
- import type { DirectiveFamily } from '../RTD/index.js'
15
- import type { Interceptor } from '../Interception.js'
16
-
17
- export const families: DirectiveFamily[] = [
18
- authorization,
19
- io,
20
- cache,
21
- map,
22
- mcp,
23
- help,
24
- req,
25
- flow,
26
- octets,
27
- dev
28
- ]
29
- /**
30
- * `cors` first, so a preflight is answered before anything reads the request; the page is
31
- * last, and claims its own prefix.
32
- */
33
- export const interceptors: Interceptor[] = [cors, discovery, new Site()]
@@ -1,17 +0,0 @@
1
- import type { Sync } from './lib/throttle/index.js'
2
- import type { Parameter } from '../../RTD/index.js'
3
- import type { Input as Context } from '../../io.js'
4
- import type * as http from '../../HTTP/index.js'
5
-
6
- export interface Directive {
7
- precall: (context: Context, parameters: Parameter[]) => void
8
-
9
- /** Synchronous by contract: settling holds the response, and none of it needs I/O. */
10
- settle?: (context: Context, response: http.OutgoingMessage) => void
11
- }
12
-
13
- export interface Constructor {
14
- validate: (value: unknown) => void
15
-
16
- new (value: any, sync: Sync, route: string): Directive
17
- }
@@ -1,118 +0,0 @@
1
- import { restrict } from '../../Introspection.js'
2
- import { Output } from './Output.js'
3
- import { Input } from './Input.js'
4
- import { Throttle } from './Throttle.js'
5
- import { Status } from './Status.js'
6
- import { Sync } from './lib/throttle/index.js'
7
- import type * as http from '../../HTTP/index.js'
8
- import type { Parameter, DirectiveFamily } from '../../RTD/index.js'
9
- import type { Remotes } from '../../Remotes.js'
10
- import type { Constructor, Directive } from './Directive.js'
11
- import type { Introspection } from '../../Introspection.js'
12
- import { ATOM_GROUP } from '@toa.io/definitions/extensions.exposition'
13
- import type { extensions } from '@toa.io/core/types'
14
-
15
- export class IO implements DirectiveFamily<Directive> {
16
- public readonly name = 'io'
17
- public readonly mandatory = true
18
-
19
- private host!: extensions.Host
20
-
21
- /** Throttling reconciles through the atom of the gateways, one for every directive. */
22
- private sync: Sync | null = null
23
-
24
- public mount(host: extensions.Host): void {
25
- this.host = host
26
- }
27
-
28
- // eslint-disable-next-line max-params
29
- public create(
30
- name: string,
31
- value: unknown,
32
- remotes: Remotes,
33
- route: string
34
- ): Directive {
35
- if (!(name in constructors))
36
- throw new Error(`Directive 'io:${name}' is not implemented`)
37
-
38
- const Directive = constructors[name]
39
-
40
- Directive.validate(value)
41
-
42
- if (name === 'throttle') this.sync ??= new Sync(this.host.atom(ATOM_GROUP))
43
-
44
- return new Directive(value, this.sync!, route)
45
- }
46
-
47
- public precall(
48
- directives: Directive[],
49
- context: http.Context,
50
- parameters: Parameter[]
51
- ): null {
52
- let restricted = false
53
-
54
- for (const directive of directives) {
55
- restricted ||= directive instanceof Output
56
-
57
- directive.precall(context, parameters)
58
- }
59
-
60
- if (!restricted) DENIAL.precall(context, parameters)
61
-
62
- return null
63
- }
64
-
65
- /**
66
- * What a whitelist admits is what the schema states. Without an `io:output` the reply is
67
- * dropped before it is sent, so there is no output to describe at all.
68
- */
69
- public explain(
70
- directives: Directive[],
71
- _: http.Context,
72
- introspection: Introspection
73
- ): Introspection {
74
- let restricted = false
75
-
76
- for (const directive of directives) {
77
- if (directive instanceof Input)
78
- introspection.input = restrict(introspection.input, directive.allowed)
79
-
80
- if (!(directive instanceof Output)) continue
81
-
82
- restricted = true
83
-
84
- if (!directive.disabled)
85
- introspection.output = restrict(introspection.output, directive.allowed)
86
- }
87
-
88
- if (!restricted) delete introspection.output
89
-
90
- return introspection
91
- }
92
-
93
- public settle(
94
- directives: Directive[],
95
- context: http.Context,
96
- output: http.OutgoingMessage
97
- ): void {
98
- for (const directive of directives) directive.settle?.(context, output)
99
- }
100
-
101
- /**
102
- * The ticker belongs to the family rather than to any route's directives, and the
103
- * factory disposes every route it made — so this runs once per route at shutdown,
104
- * and disposing an already stopped ticker is what makes that harmless.
105
- */
106
- public dispose(): void {
107
- this.sync?.dispose()
108
- }
109
- }
110
-
111
- const constructors: Record<string, Constructor> = {
112
- input: Input,
113
- output: Output,
114
- status: Status,
115
- throttle: Throttle
116
- }
117
-
118
- const DENIAL: Directive = new Output([])
@@ -1,55 +0,0 @@
1
- import { BadRequest } from '../../HTTP/index.js'
2
- import * as schemas from './schemas.js'
3
- import type { Message } from './Message.js'
4
- import type { Directive } from './Directive.js'
5
- import type { Input as Context } from '../../io.js'
6
-
7
- export class Input implements Directive {
8
- /** what a client may send, which is therefore what the input schema states */
9
- public readonly allowed: Set<string>
10
-
11
- public constructor(permissions: Permissions) {
12
- this.allowed = new Set(permissions)
13
- }
14
-
15
- public static validate(permissions: unknown): asserts permissions is Permissions {
16
- schemas.input.validate<Permissions>(permissions, "Incorrect 'io:input' format")
17
- }
18
-
19
- public precall(context: Context): void {
20
- // Restrictions are on what the client sent, so the check goes to the front of the
21
- // pipeline whatever order the families ran in: `auth:delegate` embeds the identity
22
- // and `map:*` assigns mapped properties, and those additions are the server's own,
23
- // not input to be restricted.
24
- context.pipelines.body.unshift((body) => this.check(body))
25
- }
26
-
27
- private check(body: unknown): Message | Message[] | undefined {
28
- if (body === undefined) return body
29
-
30
- try {
31
- schemas.message.validate<Message | Message[]>(body)
32
- } catch {
33
- throw new BadRequest('Invalid request body')
34
- }
35
-
36
- const property = this.violation(body)
37
-
38
- if (property !== undefined) throw new BadRequest(`Unexpected input: ${property}`)
39
-
40
- return body
41
- }
42
-
43
- private violation(value: Message | Message[]): string | undefined {
44
- if (!Array.isArray(value))
45
- return Object.keys(value).find((key) => !this.allowed.has(key))
46
-
47
- for (const item of value) {
48
- const property = this.violation(item)
49
-
50
- if (property !== undefined) return property
51
- }
52
- }
53
- }
54
-
55
- export type Permissions = string[]
@@ -1 +0,0 @@
1
- export type Message = Record<string, unknown>