@toa.io/extensions.exposition 1.0.0-alpha.0 → 1.0.0-alpha.100

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 (700) hide show
  1. package/components/context.toa.yaml +12 -0
  2. package/components/identity.bans/manifest.toa.yaml +15 -6
  3. package/components/identity.bans/operations/transit.d.ts +14 -0
  4. package/components/identity.bans/operations/transit.js +11 -0
  5. package/components/identity.bans/operations/transit.js.map +1 -0
  6. package/components/identity.bans/operations/tsconfig.tsbuildinfo +1 -0
  7. package/components/identity.bans/source/transit.ts +21 -0
  8. package/components/identity.bans/tsconfig.json +9 -0
  9. package/components/identity.basic/manifest.toa.yaml +21 -8
  10. package/components/identity.basic/operations/authenticate.d.ts +13 -0
  11. package/components/identity.basic/operations/authenticate.js +27 -0
  12. package/components/identity.basic/operations/authenticate.js.map +1 -0
  13. package/components/identity.basic/operations/incept.d.ts +12 -0
  14. package/components/identity.basic/operations/incept.js +26 -0
  15. package/components/identity.basic/operations/incept.js.map +1 -0
  16. package/components/identity.basic/operations/transit.d.ts +12 -0
  17. package/components/identity.basic/operations/transit.js +55 -0
  18. package/components/identity.basic/operations/transit.js.map +1 -0
  19. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -0
  20. package/components/identity.basic/operations/types.d.ts +42 -0
  21. package/components/identity.basic/operations/types.js +3 -0
  22. package/components/identity.basic/operations/types.js.map +1 -0
  23. package/components/identity.basic/source/authenticate.ts +16 -6
  24. package/components/identity.basic/source/incept.ts +38 -0
  25. package/components/identity.basic/source/transit.ts +11 -9
  26. package/components/identity.basic/source/types.ts +8 -4
  27. package/components/identity.federation/events/principal.js +22 -0
  28. package/components/identity.federation/manifest.toa.yaml +119 -0
  29. package/components/identity.federation/operations/authenticate.d.ts +14 -0
  30. package/components/identity.federation/operations/authenticate.js +20 -0
  31. package/components/identity.federation/operations/authenticate.js.map +1 -0
  32. package/components/identity.federation/operations/incept.d.ts +11 -0
  33. package/components/identity.federation/operations/incept.js +14 -0
  34. package/components/identity.federation/operations/incept.js.map +1 -0
  35. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
  36. package/components/identity.federation/operations/lib/assertions-as-values.js +47 -0
  37. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
  38. package/components/identity.federation/operations/lib/get.d.ts +1 -0
  39. package/components/identity.federation/operations/lib/get.js +64 -0
  40. package/components/identity.federation/operations/lib/get.js.map +1 -0
  41. package/components/identity.federation/operations/lib/jwt.d.ts +19 -0
  42. package/components/identity.federation/operations/lib/jwt.js +140 -0
  43. package/components/identity.federation/operations/lib/jwt.js.map +1 -0
  44. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
  45. package/components/identity.federation/operations/types/configuration.d.ts +15 -0
  46. package/components/identity.federation/operations/types/configuration.js +3 -0
  47. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  48. package/components/identity.federation/operations/types/context.d.ts +49 -0
  49. package/components/identity.federation/operations/types/context.js +3 -0
  50. package/components/identity.federation/operations/types/context.js.map +1 -0
  51. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  52. package/components/identity.federation/operations/types/entity.js +3 -0
  53. package/components/identity.federation/operations/types/entity.js.map +1 -0
  54. package/components/identity.federation/operations/types/index.d.ts +3 -0
  55. package/components/identity.federation/operations/types/index.js +20 -0
  56. package/components/identity.federation/operations/types/index.js.map +1 -0
  57. package/components/identity.federation/source/authenticate.ts +36 -0
  58. package/components/identity.federation/source/incept.ts +26 -0
  59. package/components/identity.federation/source/lib/assertions-as-values.ts +22 -0
  60. package/components/identity.federation/source/lib/get.ts +82 -0
  61. package/components/identity.federation/source/lib/jwt.test.ts +179 -0
  62. package/components/identity.federation/source/lib/jwt.ts +178 -0
  63. package/components/identity.federation/source/types/configuration.ts +16 -0
  64. package/components/identity.federation/source/types/context.ts +55 -0
  65. package/components/identity.federation/source/types/entity.ts +6 -0
  66. package/components/identity.federation/source/types/index.ts +3 -0
  67. package/components/identity.federation/tsconfig.json +10 -0
  68. package/components/identity.roles/manifest.toa.yaml +18 -5
  69. package/components/identity.roles/operations/grant.d.ts +10 -0
  70. package/components/identity.roles/operations/grant.js +21 -0
  71. package/components/identity.roles/operations/grant.js.map +1 -0
  72. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  73. package/components/identity.roles/operations/lib/Entity.js +3 -0
  74. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  75. package/components/identity.roles/operations/list.d.ts +2 -0
  76. package/components/identity.roles/operations/list.js +8 -0
  77. package/components/identity.roles/operations/list.js.map +1 -0
  78. package/components/identity.roles/operations/principal.d.ts +13 -0
  79. package/components/identity.roles/operations/principal.js +13 -0
  80. package/components/identity.roles/operations/principal.js.map +1 -0
  81. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -0
  82. package/components/identity.roles/source/grant.ts +32 -0
  83. package/components/identity.roles/source/lib/Entity.ts +5 -0
  84. package/components/identity.roles/source/list.ts +2 -4
  85. package/components/identity.roles/source/principal.ts +10 -8
  86. package/components/identity.tokens/manifest.toa.yaml +18 -4
  87. package/components/identity.tokens/operations/authenticate.d.ts +9 -0
  88. package/components/identity.tokens/operations/authenticate.js +39 -0
  89. package/components/identity.tokens/operations/authenticate.js.map +1 -0
  90. package/components/identity.tokens/operations/decrypt.d.ts +3 -0
  91. package/components/identity.tokens/operations/decrypt.js +33 -0
  92. package/components/identity.tokens/operations/decrypt.js.map +1 -0
  93. package/components/identity.tokens/operations/encrypt.d.ts +8 -0
  94. package/components/identity.tokens/operations/encrypt.js +26 -0
  95. package/components/identity.tokens/operations/encrypt.js.map +1 -0
  96. package/components/identity.tokens/operations/revoke.d.ts +2 -0
  97. package/components/identity.tokens/operations/revoke.js +8 -0
  98. package/components/identity.tokens/operations/revoke.js.map +1 -0
  99. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -0
  100. package/components/identity.tokens/operations/types.d.ts +46 -0
  101. package/components/identity.tokens/operations/types.js +3 -0
  102. package/components/identity.tokens/operations/types.js.map +1 -0
  103. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  104. package/components/identity.tokens/source/authenticate.test.ts +11 -4
  105. package/components/identity.tokens/source/authenticate.ts +14 -6
  106. package/components/identity.tokens/source/decrypt.test.ts +5 -3
  107. package/components/identity.tokens/source/decrypt.ts +9 -8
  108. package/components/identity.tokens/source/encrypt.test.ts +26 -2
  109. package/components/identity.tokens/source/encrypt.ts +5 -1
  110. package/components/identity.tokens/source/types.ts +9 -2
  111. package/components/octets.storage/manifest.toa.yaml +10 -10
  112. package/components/octets.storage/operations/get.js +3 -3
  113. package/components/octets.storage/operations/head.js +7 -0
  114. package/components/octets.storage/operations/put.js +132 -0
  115. package/cucumber.js +0 -1
  116. package/documentation/access.md +80 -38
  117. package/documentation/authorities.md +48 -0
  118. package/documentation/cache.md +8 -1
  119. package/documentation/components.md +93 -24
  120. package/documentation/flow.md +44 -0
  121. package/documentation/identity.md +34 -23
  122. package/documentation/introspection.md +82 -0
  123. package/documentation/io.md +56 -0
  124. package/documentation/map.md +73 -0
  125. package/documentation/octets.md +162 -65
  126. package/documentation/protocol.md +34 -4
  127. package/documentation/query.md +79 -9
  128. package/documentation/require.md +15 -0
  129. package/documentation/tree.md +35 -4
  130. package/features/access.feature +141 -49
  131. package/features/annotation.feature +2 -0
  132. package/features/auth.claims.feature +170 -0
  133. package/features/authorities.basic.feature +141 -0
  134. package/features/authorities.feature +32 -0
  135. package/features/authorities.federation.feature +100 -0
  136. package/features/authorities.tokens.feature +117 -0
  137. package/features/body.feature +5 -1
  138. package/features/cache.feature +112 -5
  139. package/features/cors.feature +78 -0
  140. package/features/debug.feature +34 -0
  141. package/features/directives.feature +5 -0
  142. package/features/dynamic.feature +62 -7
  143. package/features/errors.feature +36 -10
  144. package/features/etag.feature +205 -0
  145. package/features/flow.feature +96 -0
  146. package/features/identity.bans.feature +137 -0
  147. package/features/identity.basic.feature +146 -21
  148. package/features/identity.feature +37 -9
  149. package/features/identity.federation.feature +268 -0
  150. package/features/identity.roles.feature +251 -7
  151. package/features/identity.tokens.feature +57 -4
  152. package/features/introspection.feature +153 -0
  153. package/features/io.feature +204 -0
  154. package/features/map.feature +241 -0
  155. package/features/methods.feature +47 -0
  156. package/features/octets.cloudinary.feature +68 -0
  157. package/features/octets.download.feature +189 -0
  158. package/features/octets.entries.feature +81 -0
  159. package/features/octets.feature +85 -133
  160. package/features/octets.head.feature +40 -0
  161. package/features/octets.meta.feature +116 -0
  162. package/features/octets.workflows.feature +391 -34
  163. package/features/probes.feature +14 -0
  164. package/features/{queries.feature → query.feature} +86 -3
  165. package/features/realtime.feature +34 -0
  166. package/features/require.feature +67 -0
  167. package/features/response.feature +103 -0
  168. package/features/routes.feature +145 -10
  169. package/features/server.feature +21 -0
  170. package/features/steps/.env.example +3 -0
  171. package/features/steps/Captures.ts +6 -0
  172. package/features/steps/Components.ts +18 -6
  173. package/features/steps/Database.ts +17 -10
  174. package/features/steps/Gateway.ts +25 -6
  175. package/features/steps/HTTP.ts +40 -87
  176. package/features/steps/IdP.ts +155 -0
  177. package/features/steps/Parameters.ts +51 -2
  178. package/features/steps/Realtime.ts +151 -0
  179. package/features/steps/Workspace.ts +5 -7
  180. package/features/steps/components/echo/manifest.toa.yaml +14 -0
  181. package/features/steps/components/echo/operations/error.js +11 -0
  182. package/features/steps/components/echo/operations/identity.js +7 -0
  183. package/features/steps/components/echo/operations/parameters.js +7 -0
  184. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  185. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  186. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  187. package/features/steps/components/octets.tester/manifest.toa.yaml +26 -2
  188. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  189. package/features/steps/components/octets.tester/operations/bar.js +0 -1
  190. package/features/steps/components/octets.tester/operations/baz.js +0 -2
  191. package/features/steps/components/octets.tester/operations/concat.js +7 -0
  192. package/features/steps/components/octets.tester/operations/echo.js +7 -0
  193. package/features/steps/components/octets.tester/operations/foo.js +1 -2
  194. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  195. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  196. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  197. package/features/steps/components/pots/manifest.toa.yaml +26 -6
  198. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  199. package/features/steps/components/users/manifest.toa.yaml +3 -0
  200. package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
  201. package/features/steps/tsconfig.json +1 -1
  202. package/features/streams.feature +5 -0
  203. package/features/timing.feature +69 -0
  204. package/package.json +25 -20
  205. package/readme.md +19 -13
  206. package/schemas/annotation.cos.yaml +2 -1
  207. package/schemas/io/input.cos.yaml +3 -0
  208. package/schemas/io/message.cos.yaml +5 -0
  209. package/schemas/io/output.cos.yaml +5 -0
  210. package/schemas/method.cos.yaml +1 -1
  211. package/schemas/node.cos.yaml +2 -0
  212. package/schemas/octets/delete.cos.yaml +2 -1
  213. package/schemas/octets/{fetch.cos.yaml → get.cos.yaml} +0 -1
  214. package/schemas/octets/put.cos.yaml +25 -0
  215. package/schemas/octets/workflow.cos.yaml +12 -0
  216. package/schemas/query.cos.yaml +4 -10
  217. package/schemas/querystring.cos.yaml +1 -0
  218. package/source/Annotation.ts +3 -2
  219. package/source/Branch.ts +1 -0
  220. package/source/Composition.ts +0 -6
  221. package/source/Context.ts +7 -4
  222. package/source/Directive.test.ts +14 -8
  223. package/source/Directive.ts +30 -52
  224. package/source/Endpoint.ts +105 -16
  225. package/source/Factory.ts +37 -17
  226. package/source/Gateway.ts +94 -42
  227. package/source/HTTP/Context.ts +90 -0
  228. package/source/HTTP/Server.ts +115 -92
  229. package/source/HTTP/Timing.ts +40 -0
  230. package/source/HTTP/exceptions.ts +13 -1
  231. package/source/HTTP/formats/index.ts +3 -3
  232. package/source/HTTP/formats/msgpack.ts +9 -6
  233. package/source/HTTP/formats/text.ts +1 -1
  234. package/source/HTTP/formats/yaml.ts +1 -1
  235. package/source/HTTP/index.ts +1 -0
  236. package/source/HTTP/messages.test.ts +71 -9
  237. package/source/HTTP/messages.ts +66 -46
  238. package/source/Interception.ts +24 -0
  239. package/source/Introspection.ts +11 -0
  240. package/source/Mapping.ts +69 -23
  241. package/source/Query.test.ts +3 -3
  242. package/source/Query.ts +123 -33
  243. package/source/RTD/Context.ts +8 -11
  244. package/source/RTD/Directives.ts +28 -4
  245. package/source/RTD/Endpoint.ts +9 -4
  246. package/source/RTD/Match.ts +2 -7
  247. package/source/RTD/Method.ts +23 -13
  248. package/source/RTD/Node.ts +37 -22
  249. package/source/RTD/Route.ts +5 -4
  250. package/source/RTD/Tree.ts +20 -16
  251. package/source/RTD/factory.ts +7 -7
  252. package/source/RTD/syntax/parse.test.ts +1 -1
  253. package/source/RTD/syntax/parse.ts +41 -28
  254. package/source/RTD/syntax/types.ts +6 -4
  255. package/source/Remotes.ts +7 -6
  256. package/source/Tenant.ts +6 -20
  257. package/source/deployment.ts +35 -20
  258. package/source/directives/auth/Anonymous.ts +3 -2
  259. package/source/directives/auth/Anyone.ts +13 -0
  260. package/source/directives/auth/Authorization.ts +170 -0
  261. package/source/directives/auth/Delegate.ts +42 -0
  262. package/source/directives/auth/Echo.ts +19 -5
  263. package/source/directives/auth/Federation.ts +84 -0
  264. package/source/directives/auth/Incept.ts +14 -8
  265. package/source/directives/auth/Role.test.ts +53 -6
  266. package/source/directives/auth/Role.ts +27 -17
  267. package/source/directives/auth/Rule.ts +2 -2
  268. package/source/directives/auth/Scheme.ts +3 -3
  269. package/source/directives/auth/index.ts +2 -2
  270. package/source/directives/auth/schemes.ts +2 -1
  271. package/source/directives/auth/split.ts +1 -1
  272. package/source/directives/auth/types.ts +10 -7
  273. package/source/directives/cache/Cache.ts +42 -0
  274. package/source/directives/cache/Control.ts +47 -21
  275. package/source/directives/cache/index.ts +2 -2
  276. package/source/directives/cache/types.ts +2 -2
  277. package/source/directives/cors/CORS.ts +63 -0
  278. package/source/directives/cors/index.ts +3 -0
  279. package/source/directives/dev/{Family.ts → Development.ts} +5 -6
  280. package/source/directives/dev/Stub.ts +4 -4
  281. package/source/directives/dev/Throw.ts +4 -4
  282. package/source/directives/dev/index.ts +2 -2
  283. package/source/directives/dev/types.ts +1 -1
  284. package/source/directives/flow/Compose.ts +68 -0
  285. package/source/directives/flow/Fetch.ts +86 -0
  286. package/source/directives/flow/Flow.ts +42 -0
  287. package/source/directives/flow/index.ts +3 -0
  288. package/source/directives/flow/types.ts +7 -0
  289. package/source/directives/index.ts +13 -6
  290. package/source/directives/io/Directive.ts +11 -0
  291. package/source/directives/io/IO.ts +43 -0
  292. package/source/directives/io/Input.ts +50 -0
  293. package/source/directives/io/Message.ts +1 -0
  294. package/source/directives/io/Output.ts +70 -0
  295. package/source/directives/io/index.ts +3 -0
  296. package/source/directives/io/schemas.ts +12 -0
  297. package/source/directives/map/Authority.ts +15 -0
  298. package/source/directives/map/Claims.ts +37 -0
  299. package/source/directives/map/Directive.ts +4 -0
  300. package/source/directives/map/Headers.ts +38 -0
  301. package/source/directives/map/Language.ts +42 -0
  302. package/source/directives/map/Languages.ts +11 -0
  303. package/source/directives/map/Map.ts +56 -0
  304. package/source/directives/map/Mapping.ts +13 -0
  305. package/source/directives/map/Properties.ts +15 -0
  306. package/source/directives/map/Segments.ts +26 -0
  307. package/source/directives/map/index.ts +3 -0
  308. package/source/directives/octets/Context.ts +9 -7
  309. package/source/directives/octets/Delete.ts +65 -12
  310. package/source/directives/octets/Directive.ts +10 -0
  311. package/source/directives/octets/Get.ts +86 -0
  312. package/source/directives/octets/{Family.ts → Octets.ts} +22 -20
  313. package/source/directives/octets/Put.ts +142 -0
  314. package/source/directives/octets/Workflow.ts +48 -0
  315. package/source/directives/octets/bytes.test.ts +30 -0
  316. package/source/directives/octets/bytes.ts +18 -0
  317. package/source/directives/octets/index.ts +2 -2
  318. package/source/directives/octets/schemas.test.ts +21 -0
  319. package/source/directives/octets/schemas.ts +9 -6
  320. package/source/directives/octets/types.ts +2 -8
  321. package/source/directives/octets/workflows/Execution.ts +128 -0
  322. package/source/directives/octets/workflows/Workflow.ts +37 -0
  323. package/source/directives/octets/workflows/index.ts +1 -0
  324. package/source/directives/require/Directive.ts +5 -0
  325. package/source/directives/require/Headers.ts +20 -0
  326. package/source/directives/require/Require.ts +28 -0
  327. package/source/directives/require/index.ts +3 -0
  328. package/source/exceptions.ts +23 -11
  329. package/source/io.ts +4 -0
  330. package/source/manifest.test.ts +6 -14
  331. package/source/manifest.ts +18 -16
  332. package/source/root.ts +5 -0
  333. package/source/schemas.ts +7 -3
  334. package/transpiled/Annotation.d.ts +8 -0
  335. package/transpiled/Annotation.js +3 -0
  336. package/transpiled/Annotation.js.map +1 -0
  337. package/transpiled/Branch.d.ts +8 -0
  338. package/transpiled/Branch.js +3 -0
  339. package/transpiled/Branch.js.map +1 -0
  340. package/transpiled/Composition.d.ts +13 -0
  341. package/transpiled/Composition.js +39 -0
  342. package/transpiled/Composition.js.map +1 -0
  343. package/transpiled/Context.d.ts +8 -0
  344. package/transpiled/Context.js +3 -0
  345. package/transpiled/Context.js.map +1 -0
  346. package/transpiled/Directive.d.ts +18 -0
  347. package/transpiled/Directive.js +77 -0
  348. package/transpiled/Directive.js.map +1 -0
  349. package/transpiled/Endpoint.d.ts +24 -0
  350. package/transpiled/Endpoint.js +131 -0
  351. package/transpiled/Endpoint.js.map +1 -0
  352. package/transpiled/Factory.d.ts +10 -0
  353. package/transpiled/Factory.js +81 -0
  354. package/transpiled/Factory.js.map +1 -0
  355. package/transpiled/Gateway.d.ts +21 -0
  356. package/transpiled/Gateway.js +132 -0
  357. package/transpiled/Gateway.js.map +1 -0
  358. package/transpiled/HTTP/Context.d.ts +31 -0
  359. package/transpiled/HTTP/Context.js +61 -0
  360. package/transpiled/HTTP/Context.js.map +1 -0
  361. package/transpiled/HTTP/Server.d.ts +36 -0
  362. package/transpiled/HTTP/Server.js +148 -0
  363. package/transpiled/HTTP/Server.js.map +1 -0
  364. package/transpiled/HTTP/Timing.d.ts +10 -0
  365. package/transpiled/HTTP/Timing.js +29 -0
  366. package/transpiled/HTTP/Timing.js.map +1 -0
  367. package/transpiled/HTTP/exceptions.d.ts +40 -0
  368. package/transpiled/HTTP/exceptions.js +83 -0
  369. package/transpiled/HTTP/exceptions.js.map +1 -0
  370. package/transpiled/HTTP/formats/index.d.ts +10 -0
  371. package/transpiled/HTTP/formats/index.js +38 -0
  372. package/transpiled/HTTP/formats/index.js.map +1 -0
  373. package/transpiled/HTTP/formats/json.d.ts +6 -0
  374. package/transpiled/HTTP/formats/json.js +17 -0
  375. package/transpiled/HTTP/formats/json.js.map +1 -0
  376. package/transpiled/HTTP/formats/msgpack.d.ts +6 -0
  377. package/transpiled/HTTP/formats/msgpack.js +17 -0
  378. package/transpiled/HTTP/formats/msgpack.js.map +1 -0
  379. package/transpiled/HTTP/formats/text.d.ts +8 -0
  380. package/transpiled/HTTP/formats/text.js +15 -0
  381. package/transpiled/HTTP/formats/text.js.map +1 -0
  382. package/transpiled/HTTP/formats/yaml.d.ts +6 -0
  383. package/transpiled/HTTP/formats/yaml.js +41 -0
  384. package/transpiled/HTTP/formats/yaml.js.map +1 -0
  385. package/transpiled/HTTP/index.d.ts +4 -0
  386. package/transpiled/HTTP/index.js +21 -0
  387. package/transpiled/HTTP/index.js.map +1 -0
  388. package/transpiled/HTTP/messages.d.ts +20 -0
  389. package/transpiled/HTTP/messages.js +96 -0
  390. package/transpiled/HTTP/messages.js.map +1 -0
  391. package/transpiled/Interception.d.ts +9 -0
  392. package/transpiled/Interception.js +19 -0
  393. package/transpiled/Interception.js.map +1 -0
  394. package/transpiled/Introspection.d.ts +9 -0
  395. package/transpiled/Introspection.js +3 -0
  396. package/transpiled/Introspection.js.map +1 -0
  397. package/transpiled/Mapping.d.ts +17 -0
  398. package/transpiled/Mapping.js +69 -0
  399. package/transpiled/Mapping.js.map +1 -0
  400. package/transpiled/Query.d.ts +22 -0
  401. package/transpiled/Query.js +164 -0
  402. package/transpiled/Query.js.map +1 -0
  403. package/transpiled/RTD/Context.d.ts +12 -0
  404. package/transpiled/RTD/Context.js +3 -0
  405. package/transpiled/RTD/Context.js.map +1 -0
  406. package/transpiled/RTD/Directives.d.ts +22 -0
  407. package/transpiled/RTD/Directives.js +3 -0
  408. package/transpiled/RTD/Directives.js.map +1 -0
  409. package/transpiled/RTD/Endpoint.d.ts +12 -0
  410. package/transpiled/RTD/Endpoint.js +3 -0
  411. package/transpiled/RTD/Endpoint.js.map +1 -0
  412. package/transpiled/RTD/Match.d.ts +9 -0
  413. package/transpiled/RTD/Match.js +3 -0
  414. package/transpiled/RTD/Match.js.map +1 -0
  415. package/transpiled/RTD/Method.d.ts +13 -0
  416. package/transpiled/RTD/Method.js +27 -0
  417. package/transpiled/RTD/Method.js.map +1 -0
  418. package/transpiled/RTD/Node.d.ts +22 -0
  419. package/transpiled/RTD/Node.js +73 -0
  420. package/transpiled/RTD/Node.js.map +1 -0
  421. package/transpiled/RTD/Route.d.ts +14 -0
  422. package/transpiled/RTD/Route.js +48 -0
  423. package/transpiled/RTD/Route.js.map +1 -0
  424. package/transpiled/RTD/Tree.d.ts +14 -0
  425. package/transpiled/RTD/Tree.js +45 -0
  426. package/transpiled/RTD/Tree.js.map +1 -0
  427. package/transpiled/RTD/factory.d.ts +4 -0
  428. package/transpiled/RTD/factory.js +39 -0
  429. package/transpiled/RTD/factory.js.map +1 -0
  430. package/transpiled/RTD/index.d.ts +8 -0
  431. package/transpiled/RTD/index.js +38 -0
  432. package/transpiled/RTD/index.js.map +1 -0
  433. package/transpiled/RTD/segment.d.ts +8 -0
  434. package/transpiled/RTD/segment.js +25 -0
  435. package/transpiled/RTD/segment.js.map +1 -0
  436. package/transpiled/RTD/syntax/index.d.ts +2 -0
  437. package/transpiled/RTD/syntax/index.js +19 -0
  438. package/transpiled/RTD/syntax/index.js.map +1 -0
  439. package/transpiled/RTD/syntax/parse.d.ts +4 -0
  440. package/transpiled/RTD/syntax/parse.js +140 -0
  441. package/transpiled/RTD/syntax/parse.js.map +1 -0
  442. package/transpiled/RTD/syntax/types.d.ts +43 -0
  443. package/transpiled/RTD/syntax/types.js +5 -0
  444. package/transpiled/RTD/syntax/types.js.map +1 -0
  445. package/transpiled/Remotes.d.ts +9 -0
  446. package/transpiled/Remotes.js +26 -0
  447. package/transpiled/Remotes.js.map +1 -0
  448. package/transpiled/Tenant.d.ts +13 -0
  449. package/transpiled/Tenant.js +23 -0
  450. package/transpiled/Tenant.js.map +1 -0
  451. package/transpiled/deployment.d.ts +3 -0
  452. package/transpiled/deployment.js +79 -0
  453. package/transpiled/deployment.js.map +1 -0
  454. package/transpiled/directives/auth/Anonymous.d.ts +6 -0
  455. package/transpiled/directives/auth/Anonymous.js +16 -0
  456. package/transpiled/directives/auth/Anonymous.js.map +1 -0
  457. package/transpiled/directives/auth/Anyone.d.ts +6 -0
  458. package/transpiled/directives/auth/Anyone.js +14 -0
  459. package/transpiled/directives/auth/Anyone.js.map +1 -0
  460. package/transpiled/directives/auth/Authorization.d.ts +19 -0
  461. package/transpiled/directives/auth/Authorization.js +141 -0
  462. package/transpiled/directives/auth/Authorization.js.map +1 -0
  463. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  464. package/transpiled/directives/auth/Delegate.js +34 -0
  465. package/transpiled/directives/auth/Delegate.js.map +1 -0
  466. package/transpiled/directives/auth/Echo.d.ts +7 -0
  467. package/transpiled/directives/auth/Echo.js +23 -0
  468. package/transpiled/directives/auth/Echo.js.map +1 -0
  469. package/transpiled/directives/auth/Federation.d.ts +16 -0
  470. package/transpiled/directives/auth/Federation.js +57 -0
  471. package/transpiled/directives/auth/Federation.js.map +1 -0
  472. package/transpiled/directives/auth/Id.d.ts +7 -0
  473. package/transpiled/directives/auth/Id.js +17 -0
  474. package/transpiled/directives/auth/Id.js.map +1 -0
  475. package/transpiled/directives/auth/Incept.d.ts +10 -0
  476. package/transpiled/directives/auth/Incept.js +64 -0
  477. package/transpiled/directives/auth/Incept.js.map +1 -0
  478. package/transpiled/directives/auth/Role.d.ts +14 -0
  479. package/transpiled/directives/auth/Role.js +52 -0
  480. package/transpiled/directives/auth/Role.js.map +1 -0
  481. package/transpiled/directives/auth/Rule.d.ts +9 -0
  482. package/transpiled/directives/auth/Rule.js +22 -0
  483. package/transpiled/directives/auth/Rule.js.map +1 -0
  484. package/transpiled/directives/auth/Scheme.d.ts +7 -0
  485. package/transpiled/directives/auth/Scheme.js +47 -0
  486. package/transpiled/directives/auth/Scheme.js.map +1 -0
  487. package/transpiled/directives/auth/index.d.ts +2 -0
  488. package/transpiled/directives/auth/index.js +6 -0
  489. package/transpiled/directives/auth/index.js.map +1 -0
  490. package/transpiled/directives/auth/schemes.d.ts +3 -0
  491. package/transpiled/directives/auth/schemes.js +10 -0
  492. package/transpiled/directives/auth/schemes.js.map +1 -0
  493. package/transpiled/directives/auth/split.d.ts +2 -0
  494. package/transpiled/directives/auth/split.js +38 -0
  495. package/transpiled/directives/auth/split.js.map +1 -0
  496. package/transpiled/directives/auth/types.d.ts +31 -0
  497. package/transpiled/directives/auth/types.js +3 -0
  498. package/transpiled/directives/auth/types.js.map +1 -0
  499. package/transpiled/directives/cache/Cache.d.ts +11 -0
  500. package/transpiled/directives/cache/Cache.js +34 -0
  501. package/transpiled/directives/cache/Cache.js.map +1 -0
  502. package/transpiled/directives/cache/Control.d.ts +10 -0
  503. package/transpiled/directives/cache/Control.js +59 -0
  504. package/transpiled/directives/cache/Control.js.map +1 -0
  505. package/transpiled/directives/cache/Exact.d.ts +4 -0
  506. package/transpiled/directives/cache/Exact.js +11 -0
  507. package/transpiled/directives/cache/Exact.js.map +1 -0
  508. package/transpiled/directives/cache/index.d.ts +2 -0
  509. package/transpiled/directives/cache/index.js +6 -0
  510. package/transpiled/directives/cache/index.js.map +1 -0
  511. package/transpiled/directives/cache/types.d.ts +7 -0
  512. package/transpiled/directives/cache/types.js +3 -0
  513. package/transpiled/directives/cache/types.js.map +1 -0
  514. package/transpiled/directives/cors/CORS.d.ts +10 -0
  515. package/transpiled/directives/cors/CORS.js +52 -0
  516. package/transpiled/directives/cors/CORS.js.map +1 -0
  517. package/transpiled/directives/cors/index.d.ts +2 -0
  518. package/transpiled/directives/cors/index.js +6 -0
  519. package/transpiled/directives/cors/index.js.map +1 -0
  520. package/transpiled/directives/dev/Development.d.ts +9 -0
  521. package/transpiled/directives/dev/Development.js +29 -0
  522. package/transpiled/directives/dev/Development.js.map +1 -0
  523. package/transpiled/directives/dev/Stub.d.ts +7 -0
  524. package/transpiled/directives/dev/Stub.js +14 -0
  525. package/transpiled/directives/dev/Stub.js.map +1 -0
  526. package/transpiled/directives/dev/Throw.d.ts +7 -0
  527. package/transpiled/directives/dev/Throw.js +14 -0
  528. package/transpiled/directives/dev/Throw.js.map +1 -0
  529. package/transpiled/directives/dev/index.d.ts +2 -0
  530. package/transpiled/directives/dev/index.js +6 -0
  531. package/transpiled/directives/dev/index.js.map +1 -0
  532. package/transpiled/directives/dev/types.d.ts +4 -0
  533. package/transpiled/directives/dev/types.js +3 -0
  534. package/transpiled/directives/dev/types.js.map +1 -0
  535. package/transpiled/directives/flow/Compose.d.ts +8 -0
  536. package/transpiled/directives/flow/Compose.js +74 -0
  537. package/transpiled/directives/flow/Compose.js.map +1 -0
  538. package/transpiled/directives/flow/Fetch.d.ts +12 -0
  539. package/transpiled/directives/flow/Fetch.js +58 -0
  540. package/transpiled/directives/flow/Fetch.js.map +1 -0
  541. package/transpiled/directives/flow/Flow.d.ts +10 -0
  542. package/transpiled/directives/flow/Flow.js +33 -0
  543. package/transpiled/directives/flow/Flow.js.map +1 -0
  544. package/transpiled/directives/flow/index.d.ts +2 -0
  545. package/transpiled/directives/flow/index.js +6 -0
  546. package/transpiled/directives/flow/index.js.map +1 -0
  547. package/transpiled/directives/flow/types.d.ts +6 -0
  548. package/transpiled/directives/flow/types.js +3 -0
  549. package/transpiled/directives/flow/types.js.map +1 -0
  550. package/transpiled/directives/index.d.ts +4 -0
  551. package/transpiled/directives/index.js +15 -0
  552. package/transpiled/directives/index.js.map +1 -0
  553. package/transpiled/directives/io/Directive.d.ts +8 -0
  554. package/transpiled/directives/io/Directive.js +3 -0
  555. package/transpiled/directives/io/Directive.js.map +1 -0
  556. package/transpiled/directives/io/IO.d.ts +9 -0
  557. package/transpiled/directives/io/IO.js +33 -0
  558. package/transpiled/directives/io/IO.js.map +1 -0
  559. package/transpiled/directives/io/Input.d.ts +11 -0
  560. package/transpiled/directives/io/Input.js +63 -0
  561. package/transpiled/directives/io/Input.js.map +1 -0
  562. package/transpiled/directives/io/Message.d.ts +1 -0
  563. package/transpiled/directives/io/Message.js +3 -0
  564. package/transpiled/directives/io/Message.js.map +1 -0
  565. package/transpiled/directives/io/Output.d.ts +13 -0
  566. package/transpiled/directives/io/Output.js +76 -0
  567. package/transpiled/directives/io/Output.js.map +1 -0
  568. package/transpiled/directives/io/index.d.ts +2 -0
  569. package/transpiled/directives/io/index.js +6 -0
  570. package/transpiled/directives/io/index.js.map +1 -0
  571. package/transpiled/directives/io/schemas.d.ts +7 -0
  572. package/transpiled/directives/io/schemas.js +14 -0
  573. package/transpiled/directives/io/schemas.js.map +1 -0
  574. package/transpiled/directives/map/Authority.d.ts +6 -0
  575. package/transpiled/directives/map/Authority.js +19 -0
  576. package/transpiled/directives/map/Authority.js.map +1 -0
  577. package/transpiled/directives/map/Claims.d.ts +6 -0
  578. package/transpiled/directives/map/Claims.js +29 -0
  579. package/transpiled/directives/map/Claims.js.map +1 -0
  580. package/transpiled/directives/map/Directive.d.ts +3 -0
  581. package/transpiled/directives/map/Directive.js +3 -0
  582. package/transpiled/directives/map/Directive.js.map +1 -0
  583. package/transpiled/directives/map/Headers.d.ts +7 -0
  584. package/transpiled/directives/map/Headers.js +34 -0
  585. package/transpiled/directives/map/Headers.js.map +1 -0
  586. package/transpiled/directives/map/Language.d.ts +10 -0
  587. package/transpiled/directives/map/Language.js +38 -0
  588. package/transpiled/directives/map/Language.js.map +1 -0
  589. package/transpiled/directives/map/Languages.d.ts +4 -0
  590. package/transpiled/directives/map/Languages.js +17 -0
  591. package/transpiled/directives/map/Languages.js.map +1 -0
  592. package/transpiled/directives/map/Map.d.ts +11 -0
  593. package/transpiled/directives/map/Map.js +44 -0
  594. package/transpiled/directives/map/Map.js.map +1 -0
  595. package/transpiled/directives/map/Mapping.d.ts +8 -0
  596. package/transpiled/directives/map/Mapping.js +11 -0
  597. package/transpiled/directives/map/Mapping.js.map +1 -0
  598. package/transpiled/directives/map/Properties.d.ts +9 -0
  599. package/transpiled/directives/map/Properties.js +14 -0
  600. package/transpiled/directives/map/Properties.js.map +1 -0
  601. package/transpiled/directives/map/Segments.d.ts +6 -0
  602. package/transpiled/directives/map/Segments.js +25 -0
  603. package/transpiled/directives/map/Segments.js.map +1 -0
  604. package/transpiled/directives/map/index.d.ts +2 -0
  605. package/transpiled/directives/map/index.js +6 -0
  606. package/transpiled/directives/map/index.js.map +1 -0
  607. package/transpiled/directives/octets/Context.d.ts +8 -0
  608. package/transpiled/directives/octets/Context.js +22 -0
  609. package/transpiled/directives/octets/Context.js.map +1 -0
  610. package/transpiled/directives/octets/Delete.d.ts +20 -0
  611. package/transpiled/directives/octets/Delete.js +84 -0
  612. package/transpiled/directives/octets/Delete.js.map +1 -0
  613. package/transpiled/directives/octets/Directive.d.ts +8 -0
  614. package/transpiled/directives/octets/Directive.js +8 -0
  615. package/transpiled/directives/octets/Directive.js.map +1 -0
  616. package/transpiled/directives/octets/Get.d.ts +17 -0
  617. package/transpiled/directives/octets/Get.js +88 -0
  618. package/transpiled/directives/octets/Get.js.map +1 -0
  619. package/transpiled/directives/octets/Octets.d.ts +12 -0
  620. package/transpiled/directives/octets/Octets.js +52 -0
  621. package/transpiled/directives/octets/Octets.js.map +1 -0
  622. package/transpiled/directives/octets/Put.d.ts +29 -0
  623. package/transpiled/directives/octets/Put.js +102 -0
  624. package/transpiled/directives/octets/Put.js.map +1 -0
  625. package/transpiled/directives/octets/Workflow.d.ts +15 -0
  626. package/transpiled/directives/octets/Workflow.js +59 -0
  627. package/transpiled/directives/octets/Workflow.js.map +1 -0
  628. package/transpiled/directives/octets/bytes.d.ts +1 -0
  629. package/transpiled/directives/octets/bytes.js +21 -0
  630. package/transpiled/directives/octets/bytes.js.map +1 -0
  631. package/transpiled/directives/octets/index.d.ts +2 -0
  632. package/transpiled/directives/octets/index.js +6 -0
  633. package/transpiled/directives/octets/index.js.map +1 -0
  634. package/transpiled/directives/octets/schemas.d.ts +9 -0
  635. package/transpiled/directives/octets/schemas.js +15 -0
  636. package/transpiled/directives/octets/schemas.js.map +1 -0
  637. package/transpiled/directives/octets/types.d.ts +5 -0
  638. package/transpiled/directives/octets/types.js +3 -0
  639. package/transpiled/directives/octets/types.js.map +1 -0
  640. package/transpiled/directives/octets/workflows/Execution.d.ts +29 -0
  641. package/transpiled/directives/octets/workflows/Execution.js +89 -0
  642. package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
  643. package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
  644. package/transpiled/directives/octets/workflows/Workflow.js +26 -0
  645. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
  646. package/transpiled/directives/octets/workflows/index.d.ts +1 -0
  647. package/transpiled/directives/octets/workflows/index.js +6 -0
  648. package/transpiled/directives/octets/workflows/index.js.map +1 -0
  649. package/transpiled/directives/require/Directive.d.ts +4 -0
  650. package/transpiled/directives/require/Directive.js +3 -0
  651. package/transpiled/directives/require/Directive.js.map +1 -0
  652. package/transpiled/directives/require/Headers.d.ts +7 -0
  653. package/transpiled/directives/require/Headers.js +19 -0
  654. package/transpiled/directives/require/Headers.js.map +1 -0
  655. package/transpiled/directives/require/Require.d.ts +9 -0
  656. package/transpiled/directives/require/Require.js +27 -0
  657. package/transpiled/directives/require/Require.js.map +1 -0
  658. package/transpiled/directives/require/index.d.ts +2 -0
  659. package/transpiled/directives/require/index.js +6 -0
  660. package/transpiled/directives/require/index.js.map +1 -0
  661. package/transpiled/discovery.d.ts +1 -0
  662. package/transpiled/discovery.js +3 -0
  663. package/transpiled/discovery.js.map +1 -0
  664. package/transpiled/exceptions.d.ts +3 -0
  665. package/transpiled/exceptions.js +46 -0
  666. package/transpiled/exceptions.js.map +1 -0
  667. package/transpiled/index.d.ts +5 -0
  668. package/transpiled/index.js +12 -0
  669. package/transpiled/index.js.map +1 -0
  670. package/transpiled/io.d.ts +3 -0
  671. package/transpiled/io.js +3 -0
  672. package/transpiled/io.js.map +1 -0
  673. package/transpiled/manifest.d.ts +3 -0
  674. package/transpiled/manifest.js +65 -0
  675. package/transpiled/manifest.js.map +1 -0
  676. package/transpiled/root.d.ts +2 -0
  677. package/transpiled/root.js +44 -0
  678. package/transpiled/root.js.map +1 -0
  679. package/transpiled/schemas.d.ts +7 -0
  680. package/transpiled/schemas.js +14 -0
  681. package/transpiled/schemas.js.map +1 -0
  682. package/transpiled/tsconfig.tsbuildinfo +1 -0
  683. package/components/identity.basic/source/create.ts +0 -18
  684. package/components/octets.storage/operations/fetch.js +0 -46
  685. package/components/octets.storage/operations/list.js +0 -7
  686. package/components/octets.storage/operations/permute.js +0 -7
  687. package/components/octets.storage/operations/store.js +0 -11
  688. package/features/steps/components/octets.tester/operations/diversify.js +0 -14
  689. package/schemas/octets/context.cos.yaml +0 -1
  690. package/schemas/octets/list.cos.yaml +0 -1
  691. package/schemas/octets/permute.cos.yaml +0 -1
  692. package/schemas/octets/store.cos.yaml +0 -3
  693. package/source/HTTP/Server.fixtures.ts +0 -41
  694. package/source/HTTP/Server.test.ts +0 -199
  695. package/source/directives/auth/Family.ts +0 -148
  696. package/source/directives/cache/Family.ts +0 -36
  697. package/source/directives/octets/Fetch.ts +0 -85
  698. package/source/directives/octets/List.ts +0 -32
  699. package/source/directives/octets/Permute.ts +0 -37
  700. package/source/directives/octets/Store.ts +0 -158
package/source/Query.ts CHANGED
@@ -1,43 +1,117 @@
1
+ import assert from 'node:assert'
1
2
  import * as http from './HTTP'
2
3
  import { type Parameter } from './RTD'
3
4
  import * as schemas from './schemas'
5
+ import { queryable } from './Mapping'
6
+ import type { Introspection, Schema } from './Introspection'
4
7
  import type * as syntax from './RTD/syntax'
5
8
  import type * as core from '@toa.io/core'
6
9
 
7
10
  export class Query {
8
11
  private readonly query: syntax.Query
9
12
  private readonly closed: boolean = false
13
+ private readonly prepend: ',' | ';' = ';'
14
+ private readonly queryable: boolean
10
15
 
11
16
  public constructor (query: syntax.Query) {
12
- if (query.criteria !== undefined) {
13
- const open = query.criteria[query.criteria.length - 1] === ';'
14
-
15
- if (open) query.criteria = query.criteria.slice(0, -1)
16
- else this.closed = true
17
+ this.queryable = queryable(query)
18
+
19
+ if (this.queryable) {
20
+ query.omit ??= { value: 0, range: [0, 1000] }
21
+ query.limit ??= { value: 10, range: [1, 100] }
22
+
23
+ if (query.criteria !== undefined) {
24
+ // eslint-disable-next-line max-depth
25
+ if (query.criteria.endsWith(';'))
26
+ query.criteria = query.criteria.slice(0, -1)
27
+ else
28
+ this.closed = true
29
+
30
+ // eslint-disable-next-line max-depth
31
+ if (query.criteria.startsWith(',') || query.criteria.startsWith(';')) {
32
+ this.prepend = query.criteria[0] as ',' | ';'
33
+
34
+ query.criteria = query.criteria.slice(1)
35
+ }
36
+ }
17
37
  }
18
38
 
19
39
  this.query = query
20
40
  }
21
41
 
22
- public fit (query: http.Query, parameters: Parameter[]): core.Query {
23
- const error = schemas.querystring.fit(query)
42
+ public fit (query: http.Query, parameters: Parameter[]): QueryString {
43
+ const qs = this.split(query)
44
+
45
+ if (qs.query !== null) {
46
+ const error = schemas.querystring.fit(qs.query)
24
47
 
25
- if (error !== null)
26
- throw new http.BadRequest('Query ' + error.message)
48
+ if (error !== null)
49
+ throw new http.BadRequest('Query ' + error.message)
27
50
 
28
- this.fitCriteria(query, parameters)
29
- this.fitRanges(query)
30
- this.fitSort(query)
51
+ this.fitCriteria(qs.query, parameters)
52
+ this.fitRanges(qs.query)
53
+ this.fitSort(qs.query)
54
+ }
31
55
 
32
- return query as core.Query
56
+ return {
57
+ query: qs.query as core.Query,
58
+ parameters: qs.parameters
59
+ }
33
60
  }
34
61
 
35
- private fitCriteria (query: http.Query, parameters: Parameter[]): void {
36
- const criteria: string[] = []
62
+ public explain (introspection: Introspection): Record<string, Schema> | null {
63
+ if (this.query?.parameters === undefined || introspection.input?.type !== 'object')
64
+ return null
37
65
 
38
- if (this.query.criteria !== undefined)
39
- criteria.push(this.query.criteria)
66
+ let query: Record<string, Schema> | null = null
67
+
68
+ for (const parameter of this.query.parameters) {
69
+ const schema = introspection.input.properties[parameter]
70
+
71
+ if (schema !== undefined) {
72
+ query ??= {}
73
+ query[parameter] = schema
74
+ }
75
+
76
+ delete introspection.input.properties[parameter]
77
+ }
78
+
79
+ return query
80
+ }
81
+
82
+ private split (query: http.Query): {
83
+ query: http.Query | null
84
+ parameters: Record<string, string> | null
85
+ } {
86
+ let parameters: Record<string, string> | null = null
87
+
88
+ if (this.query?.parameters !== undefined)
89
+ for (const key in query)
90
+ // eslint-disable-next-line max-depth
91
+ if (this.query.parameters.includes(key)) {
92
+ parameters ??= {}
93
+ parameters[key] = query[key] as string
94
+
95
+ delete query[key]
96
+ }
97
+
98
+ if (!this.queryable) {
99
+ const keys = Object.keys(query)
40
100
 
101
+ if (keys.length > 0)
102
+ throw new http.BadRequest(`Query parameter '${keys[0]}' is not allowed`)
103
+
104
+ query = null!
105
+ }
106
+
107
+ return {
108
+ query,
109
+ parameters
110
+ }
111
+ }
112
+
113
+ private fitCriteria (query: http.Query, parameters: Parameter[]): void {
114
+ const groups: CriteriaGroup[] = []
41
115
  const idx = parameters.findIndex((parameter) => parameter.name === 'id')
42
116
 
43
117
  if (idx !== -1) {
@@ -47,32 +121,36 @@ export class Query {
47
121
  }
48
122
 
49
123
  if (parameters.length > 0) {
50
- const chunks = parameters
124
+ const criteria = parameters
51
125
  .map(({ name, value }) => `${name}==${value}`)
52
126
  .join(';')
53
127
 
54
- criteria.push(chunks)
128
+ groups.push({ criteria, operator: this.prepend })
55
129
  }
56
130
 
131
+ if (this.query.criteria !== undefined)
132
+ groups.push({ criteria: this.query.criteria, operator: ';' })
133
+
57
134
  if (query.criteria !== undefined)
58
- if (this.closed) throw new http.BadRequest('Query criteria is closed.')
59
- else criteria.push(query.criteria)
60
-
61
- switch (criteria.length) {
62
- case 0:
63
- break
64
- case 1:
65
- query.criteria = criteria[0]
66
- break
67
- default:
68
- query.criteria = '(' + criteria.join(');(') + ')'
69
- break
70
- }
135
+ if (this.closed)
136
+ throw new http.BadRequest('Query criteria is closed')
137
+ else
138
+ groups.push({ criteria: query.criteria, operator: WHATEVER })
139
+
140
+ if (groups.length > 0)
141
+ query.criteria = groups.reduce((acc, { criteria, operator }, i) => {
142
+ return i === groups.length - 1
143
+ ? `${acc}(${criteria})`
144
+ : `${acc}(${criteria})${operator}`
145
+ }, '')
71
146
  }
72
147
 
73
148
  private fitRanges (qs: http.Query): void {
74
149
  const query = qs as core.Query
75
150
 
151
+ assert.ok(this.query.limit !== undefined, 'Query limit must be defined')
152
+ assert.ok(this.query.omit !== undefined, 'Query limit range must be defined')
153
+
76
154
  if (qs.limit !== undefined)
77
155
  query.limit = fit(qs.limit, this.query.limit.range, 'limit')
78
156
  else
@@ -99,7 +177,19 @@ function fit (string: string, range: [number, number], name: string): number {
99
177
 
100
178
  if (number < range[0] || number > range[1])
101
179
  throw new http.BadRequest(`Query ${name} must be between ` +
102
- `${range[0]} and ${range[1]} inclusive.`)
180
+ `${range[0]} and ${range[1]} inclusive`)
103
181
 
104
182
  return number
105
183
  }
184
+
185
+ const WHATEVER = ';'
186
+
187
+ interface CriteriaGroup {
188
+ criteria: string
189
+ operator: ',' | ';'
190
+ }
191
+
192
+ export interface QueryString {
193
+ query: core.Query | null
194
+ parameters: Record<string, string> | null
195
+ }
@@ -1,16 +1,13 @@
1
- import { type Directives, type DirectivesFactory } from './Directives'
2
- import { type Endpoint, type EndpointsFactory } from './Endpoint'
1
+ import { type DirectiveFactory } from './Directives'
2
+ import { type EndpointsFactory } from './Endpoint'
3
+ import type { Directive } from './syntax'
3
4
 
4
- export interface Context<
5
- TEndpoint extends Endpoint = any,
6
- TDirectives extends Directives<TDirectives> = any,
7
- TExtension = any
8
- > {
5
+ export interface Context<TExtension = any> {
9
6
  readonly protected: boolean
10
- readonly endpoints: EndpointsFactory<TEndpoint>
7
+ readonly endpoints: EndpointsFactory
11
8
  readonly directives: {
12
- readonly factory: DirectivesFactory
13
- stack: TDirectives[]
9
+ readonly factory: DirectiveFactory
10
+ stack: Directive[]
14
11
  }
15
- readonly extension?: TExtension
12
+ readonly extension: TExtension
16
13
  }
@@ -1,9 +1,33 @@
1
+ import type { Parameter } from './Match'
1
2
  import type * as syntax from './syntax'
3
+ import type { Context, OutgoingMessage } from '../HTTP'
4
+ import type { Output } from '../io'
2
5
 
3
- export interface Directives<T = any> {
4
- merge: (directive: T) => void
6
+ export interface Directives {
7
+ preflight: (context: Context, parameters: Parameter[]) => Promise<Output>
8
+ settle: (context: Context, response: OutgoingMessage) => Promise<void>
5
9
  }
6
10
 
7
- export interface DirectivesFactory<T = any> {
8
- create: (directives: syntax.Directive[]) => T
11
+ export interface DirectiveFactory {
12
+ create: (directives: syntax.Directive[]) => Directives
13
+ }
14
+
15
+ export interface DirectiveSet {
16
+ family: DirectiveFamily
17
+ directives: any[]
18
+ }
19
+
20
+ export interface DirectiveFamily<TDirective = any, TExtension = any> {
21
+ readonly name: string
22
+ readonly mandatory: boolean
23
+
24
+ create: (name: string, ...rest: any[]) => TDirective
25
+
26
+ preflight?: (directives: TDirective[],
27
+ request: Context & TExtension,
28
+ parameters: Parameter[]) => Output | Promise<Output>
29
+
30
+ settle?: (directives: TDirective[],
31
+ request: Context & TExtension,
32
+ response: OutgoingMessage) => void | Promise<void>
9
33
  }
@@ -1,11 +1,16 @@
1
1
  import { type Context } from './Context'
2
+ import type * as http from '../HTTP'
2
3
  import type * as syntax from './syntax'
4
+ import type * as RTD from './index'
5
+
6
+ export interface Endpoint {
7
+ call: (context: http.Context, parameters: RTD.Parameter[]) => Promise<http.OutgoingMessage>
8
+
9
+ explain: (parameters: RTD.Parameter[]) => Promise<unknown>
3
10
 
4
- export interface Endpoint<T extends Endpoint = any> {
5
- call: T['call']
6
11
  close: () => Promise<void>
7
12
  }
8
13
 
9
- export interface EndpointsFactory<T extends Endpoint<T> = any> {
10
- create: (method: syntax.Method, context: Context) => T
14
+ export interface EndpointsFactory {
15
+ create: (method: syntax.Method, context: Context) => Endpoint
11
16
  }
@@ -1,12 +1,7 @@
1
1
  import { type Node } from './Node'
2
- import { type Directives } from './Directives'
3
- import { type Endpoint } from './Endpoint'
4
2
 
5
- export interface Match<
6
- TEndpoint extends Endpoint<TEndpoint> = any,
7
- TDirectives extends Directives<TDirectives> = any
8
- > {
9
- node: Node<TEndpoint, TDirectives>
3
+ export interface Match {
4
+ node: Node
10
5
  parameters: Parameter[]
11
6
  }
12
7
 
@@ -1,24 +1,34 @@
1
- import { type Directives } from './Directives'
2
- import { type Endpoint } from './Endpoint'
1
+ import type { Parameter } from './Match'
2
+ import type { Endpoint } from './Endpoint'
3
+ import type { Directives } from './Directives'
3
4
 
4
- export class Method<
5
- TEndpoint extends Endpoint<TEndpoint> = any,
6
- TDirectives extends Directives<TDirectives> = any
7
- > {
8
- public readonly endpoint: TEndpoint | null
9
- public readonly directives: TDirectives
5
+ export class Method {
6
+ public readonly endpoint: Endpoint | null
7
+ public readonly directives: Directives
8
+ private introspection: unknown | null = null
9
+ private introspecting: Promise<unknown> | null = null
10
10
 
11
- public constructor (endpoint: TEndpoint | null, directives: TDirectives) {
11
+ public constructor (endpoint: Endpoint | null, directives: Directives) {
12
12
  this.endpoint = endpoint
13
13
  this.directives = directives
14
14
  }
15
15
 
16
+ public async explain (parameters: Parameter[]): Promise<unknown> {
17
+ if (this.introspection !== null)
18
+ return this.introspection
19
+
20
+ if (this.introspecting === null)
21
+ // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
22
+ this.introspecting = this.endpoint?.explain(parameters)!
23
+
24
+ this.introspection = await this.introspecting
25
+
26
+ return this.introspection
27
+ }
28
+
16
29
  public async close (): Promise<void> {
17
30
  await this.endpoint?.close()
18
31
  }
19
32
  }
20
33
 
21
- export type Methods<
22
- TEndpoint extends Endpoint<TEndpoint> = any,
23
- TDirectives extends Directives<TDirectives> = any
24
- > = Record<string, Method<TEndpoint, TDirectives>>
34
+ export type Methods = Record<string, Method>
@@ -1,23 +1,20 @@
1
1
  import { type Route } from './Route'
2
2
  import { type Methods } from './Method'
3
3
  import { type Match, type Parameter } from './Match'
4
- import { type Directives } from './Directives'
5
- import { type Endpoint } from './Endpoint'
6
4
 
7
- export class Node<
8
- TEndpoint extends Endpoint<TEndpoint> = any,
9
- TDirectives extends Directives<TDirectives> = any
10
- > {
5
+ export class Node {
11
6
  public intermediate: boolean
12
- public methods: Methods<TEndpoint, TDirectives>
7
+ public forward: string | null
8
+ public methods: Methods
13
9
  private readonly protected: boolean
14
10
  private routes: Route[]
15
11
 
16
12
  public constructor
17
- (routes: Route[], methods: Methods<TEndpoint, TDirectives>, properties: Properties) {
13
+ (routes: Route[], methods: Methods, properties: Properties) {
18
14
  this.routes = routes
19
15
  this.methods = methods
20
16
  this.protected = properties.protected
17
+ this.forward = properties.forward ?? null
21
18
  this.intermediate = this.routes.findIndex((route) => route.root) !== -1
22
19
 
23
20
  this.sort()
@@ -25,7 +22,8 @@ export class Node<
25
22
 
26
23
  public match (fragments: string[], parameters: Parameter[] = []): Match | null {
27
24
  for (const route of this.routes) {
28
- const match = route.match(fragments, parameters)
25
+ const params = parameters.slice()
26
+ const match = route.match(fragments, params)
29
27
 
30
28
  if (match !== null)
31
29
  return match
@@ -34,37 +32,49 @@ export class Node<
34
32
  return null
35
33
  }
36
34
 
37
- public merge (node: Node<TEndpoint, TDirectives>): void {
35
+ public merge (node: Node): void {
38
36
  this.intermediate = node.intermediate
39
37
 
40
- if (!this.protected) this.replace(node)
41
- else this.append(node)
38
+ if (this.protected)
39
+ this.append(node)
40
+ else
41
+ this.replace(node)
42
42
 
43
43
  this.sort()
44
44
  }
45
45
 
46
- private replace (node: Node<TEndpoint, TDirectives>): void {
46
+ public async explain (parameters: Parameter[]): Promise<Record<string, unknown>> {
47
+ const methods: Record<string, unknown> = {}
48
+
49
+ const explained = Object.entries(this.methods)
50
+ .map(async ([verb, method]) =>
51
+ (methods[verb] = await method.explain(parameters)))
52
+
53
+ await Promise.all(explained)
54
+
55
+ return methods
56
+ }
57
+
58
+ private replace (node: Node): void {
47
59
  const methods = Object.values(this.methods)
48
60
 
49
61
  this.routes = node.routes
50
62
  this.methods = node.methods
51
63
 
64
+ // race condition is really unlikely
52
65
  for (const method of methods)
53
- void method.close() // race condition is really unlikely
66
+ void method.close()
54
67
  }
55
68
 
56
- private append (node: Node<TEndpoint, TDirectives>): void {
69
+ private append (node: Node): void {
57
70
  for (const route of node.routes)
58
- this.mergeRoute(route)
71
+ this.route(route)
59
72
 
60
73
  for (const [verb, method] of Object.entries(node.methods))
61
- if (verb in this.methods)
62
- console.warn(`Overriding of the protected method ${verb} is not permitted.`)
63
- else
64
- this.methods[verb] = method
74
+ this.methods[verb] = method
65
75
  }
66
76
 
67
- private mergeRoute (candidate: Route): void {
77
+ private route (candidate: Route): void {
68
78
  for (const route of this.routes)
69
79
  if (candidate.equals(route)) {
70
80
  route.merge(candidate)
@@ -76,10 +86,15 @@ export class Node<
76
86
  }
77
87
 
78
88
  private sort (): void {
79
- this.routes.sort((a, b) => a.variables - b.variables)
89
+ this.routes.sort((a, b) => {
90
+ return a.variables === b.variables
91
+ ? b.segments.length - a.segments.length // routes with more segments should be matched first
92
+ : a.variables - b.variables // routes with more variables should be matched last
93
+ })
80
94
  }
81
95
  }
82
96
 
83
97
  export interface Properties {
84
98
  protected: boolean
99
+ forward?: string
85
100
  }
@@ -5,7 +5,7 @@ import { type Match, type Parameter } from './Match'
5
5
  export class Route {
6
6
  public readonly root: boolean
7
7
  public readonly variables: number = 0
8
- private readonly segments: Segment[]
8
+ public readonly segments: Segment[]
9
9
  private readonly node: Node
10
10
 
11
11
  public constructor (segments: Segment[], node: Node) {
@@ -31,8 +31,10 @@ export class Route {
31
31
 
32
32
  const exact = this.segments.length === fragments.length
33
33
 
34
- if (exact && !this.node.intermediate) return { node: this.node, parameters }
35
- else return this.matchNested(fragments, parameters)
34
+ if (exact && !this.node.intermediate)
35
+ return { node: this.node, parameters }
36
+ else
37
+ return this.matchNested(fragments, parameters)
36
38
  }
37
39
 
38
40
  public equals (route: Route): boolean {
@@ -52,7 +54,6 @@ export class Route {
52
54
 
53
55
  private matchNested (fragments: string[], parameters: Parameter[]): Match | null {
54
56
  fragments = fragments.slice(this.segments.length)
55
- parameters = parameters.slice()
56
57
 
57
58
  return this.node.match(fragments, parameters)
58
59
  }
@@ -1,42 +1,46 @@
1
- import { type Node } from './Node'
2
1
  import { createNode } from './factory'
3
2
  import { fragment } from './segment'
4
- import { type Match } from './Match'
5
- import { type Context } from './Context'
6
- import { type Directives, type DirectivesFactory } from './Directives'
7
- import { type Endpoint, type EndpointsFactory } from './Endpoint'
3
+ import type { Node } from './Node'
4
+ import type { Match } from './Match'
5
+ import type { Context } from './Context'
6
+ import type { DirectiveFactory } from './Directives'
7
+ import type { EndpointsFactory } from './Endpoint'
8
8
  import type * as syntax from './syntax'
9
9
 
10
- export class Tree<
11
- TEndpoint extends Endpoint<TEndpoint> = any,
12
- TDirectives extends Directives<TDirectives> = any
13
- > {
10
+ export class Tree {
14
11
  private readonly root: syntax.Node
15
- private readonly trunk: Node<TEndpoint, TDirectives>
16
- private readonly endpoints: EndpointsFactory<TEndpoint>
17
- private readonly directives: DirectivesFactory
12
+ private readonly trunk: Node
13
+ private readonly endpoints: EndpointsFactory
14
+ private readonly directives: DirectiveFactory
18
15
 
19
16
  public constructor
20
- (node: syntax.Node, endpoints: EndpointsFactory, directives: DirectivesFactory) {
17
+ (node: syntax.Node, endpoints: EndpointsFactory, directives: DirectiveFactory) {
21
18
  this.endpoints = endpoints
22
19
  this.directives = directives
23
20
  this.trunk = this.createNode(node, PROTECTED)
24
21
  this.root = node
25
22
  }
26
23
 
27
- public match (path: string): Match<TEndpoint, TDirectives> | null {
24
+ public match (path: string): Match | null {
25
+ if (path === '/')
26
+ return {
27
+ node: this.trunk,
28
+ parameters: []
29
+ }
30
+
28
31
  const fragments = fragment(path)
29
32
 
30
33
  return this.trunk.match(fragments)
31
34
  }
32
35
 
33
- public merge (node: syntax.Node, extension: any): void {
36
+ public merge (node: syntax.Node, extension: unknown): void {
34
37
  const branch = this.createNode(node, !PROTECTED, extension)
35
38
 
36
39
  this.trunk.merge(branch)
37
40
  }
38
41
 
39
- private createNode (node: syntax.Node, protect: boolean, extension?: any): Node {
42
+ private createNode
43
+ (node: syntax.Node, protect: boolean, extension?: unknown): Node {
40
44
  const context: Context = {
41
45
  protected: protect,
42
46
  endpoints: this.endpoints,
@@ -1,14 +1,11 @@
1
1
  import { Node, type Properties } from './Node'
2
2
  import { Route } from './Route'
3
- import { type Context } from './Context'
4
3
  import { segment } from './segment'
5
4
  import { Method, type Methods } from './Method'
6
- import { type Endpoint } from './Endpoint'
7
- import { type Directives } from './Directives'
5
+ import type { Context } from './Context'
8
6
  import type * as syntax from './syntax'
9
7
 
10
- export function createNode<TEndpoint extends Endpoint, TDirectives extends Directives>
11
- (node: syntax.Node, context: Context): Node<TEndpoint, TDirectives> {
8
+ export function createNode (node: syntax.Node, context: Context): Node {
12
9
  if (node.isolated === true)
13
10
  context.directives.stack = node.directives
14
11
  else
@@ -20,7 +17,10 @@ export function createNode<TEndpoint extends Endpoint, TDirectives extends Direc
20
17
  for (const method of node.methods)
21
18
  methods[method.verb] = createMethod(method, context)
22
19
 
23
- const properties: Properties = { protected: node.protected ?? context.protected }
20
+ const properties: Properties = {
21
+ protected: node.protected ?? context.protected,
22
+ forward: node.forward
23
+ }
24
24
 
25
25
  return new Node(routes, methods, properties)
26
26
  }
@@ -36,7 +36,7 @@ function createRoute (route: syntax.Route, context: Context): Route {
36
36
  }
37
37
 
38
38
  function createMethod (method: syntax.Method, context: Context): Method {
39
- const stack = context.directives.stack.concat(method.directives.reverse())
39
+ const stack = method.directives.concat(context.directives.stack)
40
40
  const directives = context.directives.factory.create(stack)
41
41
 
42
42
  const endpoint = method.mapping?.endpoint === undefined
@@ -148,7 +148,7 @@ describe('validation', () => {
148
148
  it('should throw on unknown key', async () => {
149
149
  const declaration = { hello: 'world' }
150
150
 
151
- expect(() => parse(declaration)).toThrow('RTD parse error: unknown key \'hello\'.')
151
+ expect(() => parse(declaration)).toThrow('RTD parse error: unknown key \'hello\'')
152
152
  })
153
153
 
154
154
  it('should throw on invalid mapping', async () => {