@toa.io/extensions.exposition 1.0.0-alpha.6 → 1.0.0-alpha.61

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/context.toa.yaml +2 -2
  2. package/components/identity.bans/manifest.toa.yaml +15 -7
  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 -10
  10. package/components/identity.basic/operations/authenticate.d.ts +5 -1
  11. package/components/identity.basic/operations/authenticate.js +5 -2
  12. package/components/identity.basic/operations/authenticate.js.map +1 -1
  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 +4 -4
  17. package/components/identity.basic/operations/transit.js +5 -3
  18. package/components/identity.basic/operations/transit.js.map +1 -1
  19. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  20. package/components/identity.basic/operations/types.d.ts +8 -4
  21. package/components/identity.basic/source/authenticate.ts +16 -5
  22. package/components/identity.basic/source/incept.ts +38 -0
  23. package/components/identity.basic/source/transit.ts +8 -6
  24. package/components/identity.basic/source/types.ts +8 -4
  25. package/components/identity.federation/manifest.toa.yaml +32 -16
  26. package/components/identity.federation/operations/authenticate.d.ts +2 -2
  27. package/components/identity.federation/operations/authenticate.js +4 -11
  28. package/components/identity.federation/operations/authenticate.js.map +1 -1
  29. package/components/identity.federation/operations/incept.d.ts +11 -0
  30. package/components/identity.federation/operations/{create.js → incept.js} +6 -7
  31. package/components/identity.federation/operations/incept.js.map +1 -0
  32. package/components/identity.federation/operations/lib/jwt.d.ts +5 -5
  33. package/components/identity.federation/operations/lib/jwt.js +25 -12
  34. package/components/identity.federation/operations/lib/jwt.js.map +1 -1
  35. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -1
  36. package/components/identity.federation/operations/types/configuration.d.ts +14 -0
  37. package/components/identity.federation/operations/types/configuration.js +3 -0
  38. package/components/identity.federation/operations/types/configuration.js.map +1 -0
  39. package/components/identity.federation/operations/{types.d.ts → types/context.d.ts} +15 -7
  40. package/components/identity.federation/operations/types/context.js +3 -0
  41. package/components/identity.federation/operations/types/context.js.map +1 -0
  42. package/components/identity.federation/operations/types/entity.d.ts +6 -0
  43. package/components/identity.federation/operations/types/entity.js +3 -0
  44. package/components/identity.federation/operations/types/entity.js.map +1 -0
  45. package/components/identity.federation/operations/types/index.d.ts +3 -0
  46. package/components/identity.federation/operations/types/index.js +20 -0
  47. package/components/identity.federation/operations/types/index.js.map +1 -0
  48. package/components/identity.federation/source/authenticate.ts +6 -19
  49. package/components/identity.federation/source/{create.ts → incept.ts} +10 -9
  50. package/components/identity.federation/source/lib/jwt.test.ts +123 -4
  51. package/components/identity.federation/source/lib/jwt.ts +36 -16
  52. package/components/identity.federation/source/types/configuration.ts +15 -0
  53. package/components/identity.federation/source/{types.ts → types/context.ts} +17 -6
  54. package/components/identity.federation/source/types/entity.ts +6 -0
  55. package/components/identity.federation/source/types/index.ts +3 -0
  56. package/components/identity.federation/tsconfig.json +5 -4
  57. package/components/identity.roles/manifest.toa.yaml +18 -7
  58. package/components/identity.roles/operations/grant.d.ts +10 -0
  59. package/components/identity.roles/operations/grant.js +21 -0
  60. package/components/identity.roles/operations/grant.js.map +1 -0
  61. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  62. package/components/identity.roles/operations/lib/Entity.js +3 -0
  63. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  64. package/components/identity.roles/operations/list.d.ts +1 -4
  65. package/components/identity.roles/operations/list.js.map +1 -1
  66. package/components/identity.roles/operations/principal.d.ts +4 -6
  67. package/components/identity.roles/operations/principal.js +6 -1
  68. package/components/identity.roles/operations/principal.js.map +1 -1
  69. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  70. package/components/identity.roles/source/grant.ts +32 -0
  71. package/components/identity.roles/source/lib/Entity.ts +5 -0
  72. package/components/identity.roles/source/list.ts +2 -4
  73. package/components/identity.roles/source/principal.ts +10 -8
  74. package/components/identity.tokens/manifest.toa.yaml +19 -5
  75. package/components/identity.tokens/operations/authenticate.d.ts +2 -2
  76. package/components/identity.tokens/operations/authenticate.js +12 -5
  77. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  78. package/components/identity.tokens/operations/decrypt.js +1 -0
  79. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  80. package/components/identity.tokens/operations/encrypt.js +5 -1
  81. package/components/identity.tokens/operations/encrypt.js.map +1 -1
  82. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  83. package/components/identity.tokens/operations/types.d.ts +8 -2
  84. package/components/identity.tokens/receivers/identity.bans.created.js +3 -0
  85. package/components/identity.tokens/source/authenticate.test.ts +11 -4
  86. package/components/identity.tokens/source/authenticate.ts +14 -6
  87. package/components/identity.tokens/source/decrypt.test.ts +5 -3
  88. package/components/identity.tokens/source/decrypt.ts +9 -8
  89. package/components/identity.tokens/source/encrypt.test.ts +26 -2
  90. package/components/identity.tokens/source/encrypt.ts +5 -1
  91. package/components/identity.tokens/source/types.ts +9 -2
  92. package/components/octets.storage/manifest.toa.yaml +6 -7
  93. package/components/octets.storage/operations/get.js +2 -2
  94. package/components/octets.storage/operations/store.js +113 -3
  95. package/documentation/access.md +75 -38
  96. package/documentation/authorities.md +49 -0
  97. package/documentation/cache.md +8 -1
  98. package/documentation/components.md +47 -22
  99. package/documentation/flow.md +31 -0
  100. package/documentation/identity.md +17 -22
  101. package/documentation/introspection.md +82 -0
  102. package/documentation/octets.md +81 -23
  103. package/documentation/protocol.md +3 -0
  104. package/documentation/query.md +29 -4
  105. package/documentation/require.md +15 -0
  106. package/documentation/tree.md +13 -0
  107. package/documentation/vary.md +14 -14
  108. package/features/access.feature +78 -46
  109. package/features/annotation.feature +1 -0
  110. package/features/auth.claim.feature +170 -0
  111. package/features/authorities.basic.feature +141 -0
  112. package/features/authorities.feature +32 -0
  113. package/features/authorities.federation.feature +100 -0
  114. package/features/authorities.tokens.feature +117 -0
  115. package/features/body.feature +3 -0
  116. package/features/cache.feature +109 -5
  117. package/features/cors.feature +6 -1
  118. package/features/debug.feature +34 -0
  119. package/features/directives.feature +3 -0
  120. package/features/dynamic.feature +4 -0
  121. package/features/errors.feature +20 -7
  122. package/features/etag.feature +31 -0
  123. package/features/flow.feature +45 -0
  124. package/features/identity.bans.feature +137 -0
  125. package/features/identity.basic.feature +125 -23
  126. package/features/identity.feature +7 -2
  127. package/features/identity.federation.feature +66 -11
  128. package/features/identity.roles.feature +250 -7
  129. package/features/identity.tokens.feature +54 -4
  130. package/features/introspection.feature +153 -0
  131. package/features/io.feature +38 -1
  132. package/features/methods.feature +47 -0
  133. package/features/octets.download.feature +189 -0
  134. package/features/octets.entries.feature +8 -1
  135. package/features/octets.feature +82 -54
  136. package/features/octets.meta.feature +3 -0
  137. package/features/octets.workflows.feature +239 -19
  138. package/features/probes.feature +14 -0
  139. package/features/{queries.feature → query.feature} +65 -2
  140. package/features/require.feature +67 -0
  141. package/features/response.feature +38 -3
  142. package/features/routes.feature +93 -2
  143. package/features/steps/Database.ts +17 -10
  144. package/features/steps/Gateway.ts +23 -6
  145. package/features/steps/IdP.ts +30 -25
  146. package/features/steps/Parameters.ts +1 -1
  147. package/features/steps/components/echo/manifest.toa.yaml +14 -1
  148. package/features/steps/components/echo/operations/identity.js +7 -0
  149. package/features/steps/components/echo/operations/parameters.js +7 -0
  150. package/features/steps/components/echo.beacon/manifest.toa.yaml +2 -0
  151. package/features/steps/components/echo.beacon/operations/hello.js +5 -0
  152. package/features/steps/components/octets.tester/manifest.toa.yaml +22 -1
  153. package/features/steps/components/octets.tester/operations/authority.js +7 -0
  154. package/features/steps/components/octets.tester/operations/baz.js +1 -2
  155. package/features/steps/components/octets.tester/operations/diversify.js +3 -1
  156. package/features/steps/components/octets.tester/operations/foo.js +2 -2
  157. package/features/steps/components/octets.tester/operations/redirect.js +12 -0
  158. package/features/steps/components/octets.tester/operations/yex.js +16 -0
  159. package/features/steps/components/octets.tester/operations/yield.js +13 -0
  160. package/features/steps/components/pots/manifest.toa.yaml +14 -3
  161. package/features/steps/components/users/manifest.toa.yaml +0 -1
  162. package/features/steps/components/users.properties/manifest.toa.yaml +1 -1
  163. package/features/streams.feature +1 -0
  164. package/features/timing.feature +27 -1
  165. package/features/vary.feature +71 -0
  166. package/package.json +22 -14
  167. package/readme.md +19 -14
  168. package/schemas/annotation.cos.yaml +1 -1
  169. package/schemas/method.cos.yaml +1 -1
  170. package/schemas/node.cos.yaml +1 -0
  171. package/schemas/octets/store.cos.yaml +25 -3
  172. package/schemas/query.cos.yaml +4 -10
  173. package/source/Annotation.ts +3 -3
  174. package/source/Composition.ts +2 -2
  175. package/source/Directive.ts +4 -5
  176. package/source/Endpoint.ts +48 -12
  177. package/source/Factory.ts +10 -11
  178. package/source/Gateway.ts +49 -20
  179. package/source/HTTP/Context.ts +24 -2
  180. package/source/HTTP/Server.ts +51 -44
  181. package/source/HTTP/exceptions.ts +13 -1
  182. package/source/HTTP/formats/index.ts +3 -3
  183. package/source/HTTP/messages.test.ts +39 -2
  184. package/source/HTTP/messages.ts +7 -3
  185. package/source/Introspection.ts +11 -0
  186. package/source/Mapping.ts +63 -21
  187. package/source/Query.test.ts +3 -3
  188. package/source/Query.ts +117 -33
  189. package/source/RTD/Endpoint.ts +3 -0
  190. package/source/RTD/Method.ts +16 -0
  191. package/source/RTD/Node.ts +29 -13
  192. package/source/RTD/Route.ts +5 -4
  193. package/source/RTD/factory.ts +5 -2
  194. package/source/RTD/syntax/parse.ts +37 -24
  195. package/source/RTD/syntax/types.ts +6 -4
  196. package/source/Remotes.ts +2 -9
  197. package/source/Tenant.ts +0 -8
  198. package/source/deployment.ts +32 -22
  199. package/source/directives/auth/Authorization.ts +37 -14
  200. package/source/directives/auth/Delegate.ts +42 -0
  201. package/source/directives/auth/Federation.ts +84 -0
  202. package/source/directives/auth/Incept.ts +4 -3
  203. package/source/directives/auth/Role.test.ts +53 -6
  204. package/source/directives/auth/Role.ts +22 -14
  205. package/source/directives/auth/split.ts +1 -1
  206. package/source/directives/auth/types.ts +1 -1
  207. package/source/directives/cache/Cache.ts +13 -6
  208. package/source/directives/cache/Control.ts +42 -16
  209. package/source/directives/cors/CORS.ts +1 -1
  210. package/source/directives/dev/Development.ts +1 -1
  211. package/source/directives/flow/Fetch.ts +88 -0
  212. package/source/directives/flow/Flow.ts +34 -0
  213. package/source/directives/flow/index.ts +3 -0
  214. package/source/directives/flow/types.ts +6 -0
  215. package/source/directives/index.ts +3 -1
  216. package/source/directives/io/Input.ts +4 -4
  217. package/source/directives/io/Output.ts +1 -1
  218. package/source/directives/octets/Context.ts +7 -5
  219. package/source/directives/octets/Delete.ts +4 -2
  220. package/source/directives/octets/Directive.ts +10 -0
  221. package/source/directives/octets/Fetch.ts +15 -13
  222. package/source/directives/octets/List.ts +9 -7
  223. package/source/directives/octets/Octets.ts +4 -5
  224. package/source/directives/octets/Store.ts +34 -12
  225. package/source/directives/octets/Workflow.ts +10 -3
  226. package/source/directives/octets/bytes.test.ts +30 -0
  227. package/source/directives/octets/bytes.ts +18 -0
  228. package/source/directives/octets/schemas.ts +4 -6
  229. package/source/directives/octets/types.ts +0 -7
  230. package/source/directives/octets/workflows/Execution.ts +59 -8
  231. package/source/directives/octets/workflows/Workflow.ts +2 -1
  232. package/source/directives/require/Directive.ts +5 -0
  233. package/source/directives/require/Headers.ts +20 -0
  234. package/source/directives/require/Require.ts +28 -0
  235. package/source/directives/require/index.ts +3 -0
  236. package/source/directives/vary/Directive.ts +2 -1
  237. package/source/directives/vary/Embed.ts +14 -8
  238. package/source/directives/vary/Vary.ts +6 -4
  239. package/source/directives/vary/embeddings/Authority.ts +8 -0
  240. package/source/directives/vary/embeddings/Embedding.ts +2 -1
  241. package/source/directives/vary/embeddings/Parameter.ts +14 -0
  242. package/source/directives/vary/embeddings/index.ts +6 -4
  243. package/source/exceptions.ts +22 -11
  244. package/source/manifest.ts +10 -11
  245. package/source/schemas.ts +1 -1
  246. package/transpiled/Annotation.d.ts +3 -3
  247. package/transpiled/Composition.js +2 -2
  248. package/transpiled/Composition.js.map +1 -1
  249. package/transpiled/Directive.js +4 -4
  250. package/transpiled/Directive.js.map +1 -1
  251. package/transpiled/Endpoint.d.ts +6 -4
  252. package/transpiled/Endpoint.js +28 -4
  253. package/transpiled/Endpoint.js.map +1 -1
  254. package/transpiled/Factory.d.ts +1 -1
  255. package/transpiled/Factory.js +9 -8
  256. package/transpiled/Factory.js.map +1 -1
  257. package/transpiled/Gateway.d.ts +2 -0
  258. package/transpiled/Gateway.js +36 -12
  259. package/transpiled/Gateway.js.map +1 -1
  260. package/transpiled/HTTP/Context.d.ts +8 -1
  261. package/transpiled/HTTP/Context.js +15 -2
  262. package/transpiled/HTTP/Context.js.map +1 -1
  263. package/transpiled/HTTP/Server.d.ts +13 -2
  264. package/transpiled/HTTP/Server.js +38 -36
  265. package/transpiled/HTTP/Server.js.map +1 -1
  266. package/transpiled/HTTP/exceptions.d.ts +7 -1
  267. package/transpiled/HTTP/exceptions.js +13 -1
  268. package/transpiled/HTTP/exceptions.js.map +1 -1
  269. package/transpiled/HTTP/formats/index.js +3 -3
  270. package/transpiled/HTTP/formats/index.js.map +1 -1
  271. package/transpiled/HTTP/messages.d.ts +1 -0
  272. package/transpiled/HTTP/messages.js +9 -3
  273. package/transpiled/HTTP/messages.js.map +1 -1
  274. package/transpiled/Introspection.d.ts +9 -0
  275. package/transpiled/Introspection.js +3 -0
  276. package/transpiled/Introspection.js.map +1 -0
  277. package/transpiled/Mapping.d.ts +10 -2
  278. package/transpiled/Mapping.js +48 -19
  279. package/transpiled/Mapping.js.map +1 -1
  280. package/transpiled/Query.d.ts +10 -1
  281. package/transpiled/Query.js +83 -30
  282. package/transpiled/Query.js.map +1 -1
  283. package/transpiled/RTD/Endpoint.d.ts +1 -0
  284. package/transpiled/RTD/Method.d.ts +4 -0
  285. package/transpiled/RTD/Method.js +11 -0
  286. package/transpiled/RTD/Method.js.map +1 -1
  287. package/transpiled/RTD/Node.d.ts +4 -1
  288. package/transpiled/RTD/Node.js +23 -12
  289. package/transpiled/RTD/Node.js.map +1 -1
  290. package/transpiled/RTD/Route.d.ts +1 -1
  291. package/transpiled/RTD/Route.js +0 -1
  292. package/transpiled/RTD/Route.js.map +1 -1
  293. package/transpiled/RTD/factory.js +5 -2
  294. package/transpiled/RTD/factory.js.map +1 -1
  295. package/transpiled/RTD/syntax/parse.js +34 -22
  296. package/transpiled/RTD/syntax/parse.js.map +1 -1
  297. package/transpiled/RTD/syntax/types.d.ts +5 -3
  298. package/transpiled/RTD/syntax/types.js +1 -1
  299. package/transpiled/RTD/syntax/types.js.map +1 -1
  300. package/transpiled/Remotes.d.ts +2 -4
  301. package/transpiled/Remotes.js +0 -5
  302. package/transpiled/Remotes.js.map +1 -1
  303. package/transpiled/Tenant.d.ts +0 -1
  304. package/transpiled/Tenant.js +0 -6
  305. package/transpiled/Tenant.js.map +1 -1
  306. package/transpiled/deployment.d.ts +1 -1
  307. package/transpiled/deployment.js +28 -20
  308. package/transpiled/deployment.js.map +1 -1
  309. package/transpiled/directives/auth/Authorization.js +26 -10
  310. package/transpiled/directives/auth/Authorization.js.map +1 -1
  311. package/transpiled/directives/auth/Delegate.d.ts +10 -0
  312. package/transpiled/directives/auth/Delegate.js +34 -0
  313. package/transpiled/directives/auth/Delegate.js.map +1 -0
  314. package/transpiled/directives/auth/Federation.d.ts +16 -0
  315. package/transpiled/directives/auth/Federation.js +57 -0
  316. package/transpiled/directives/auth/Federation.js.map +1 -0
  317. package/transpiled/directives/auth/Incept.js +4 -3
  318. package/transpiled/directives/auth/Incept.js.map +1 -1
  319. package/transpiled/directives/auth/Role.d.ts +4 -1
  320. package/transpiled/directives/auth/Role.js +20 -14
  321. package/transpiled/directives/auth/Role.js.map +1 -1
  322. package/transpiled/directives/auth/split.js +1 -1
  323. package/transpiled/directives/auth/split.js.map +1 -1
  324. package/transpiled/directives/cache/Cache.d.ts +3 -3
  325. package/transpiled/directives/cache/Cache.js +10 -4
  326. package/transpiled/directives/cache/Cache.js.map +1 -1
  327. package/transpiled/directives/cache/Control.d.ts +2 -1
  328. package/transpiled/directives/cache/Control.js +29 -12
  329. package/transpiled/directives/cache/Control.js.map +1 -1
  330. package/transpiled/directives/cors/CORS.js +1 -1
  331. package/transpiled/directives/cors/CORS.js.map +1 -1
  332. package/transpiled/directives/dev/Development.js +1 -1
  333. package/transpiled/directives/dev/Development.js.map +1 -1
  334. package/transpiled/directives/flow/Fetch.d.ts +13 -0
  335. package/transpiled/directives/flow/Fetch.js +59 -0
  336. package/transpiled/directives/flow/Fetch.js.map +1 -0
  337. package/transpiled/directives/flow/Flow.d.ts +10 -0
  338. package/transpiled/directives/flow/Flow.js +27 -0
  339. package/transpiled/directives/flow/Flow.js.map +1 -0
  340. package/transpiled/directives/flow/index.d.ts +2 -0
  341. package/transpiled/directives/flow/index.js +6 -0
  342. package/transpiled/directives/flow/index.js.map +1 -0
  343. package/transpiled/directives/flow/types.d.ts +5 -0
  344. package/transpiled/directives/flow/types.js.map +1 -0
  345. package/transpiled/directives/index.js +3 -1
  346. package/transpiled/directives/index.js.map +1 -1
  347. package/transpiled/directives/io/Input.js +2 -2
  348. package/transpiled/directives/io/Input.js.map +1 -1
  349. package/transpiled/directives/io/Output.js.map +1 -1
  350. package/transpiled/directives/octets/Context.d.ts +3 -3
  351. package/transpiled/directives/octets/Context.js +8 -26
  352. package/transpiled/directives/octets/Context.js.map +1 -1
  353. package/transpiled/directives/octets/Delete.d.ts +3 -2
  354. package/transpiled/directives/octets/Delete.js +3 -1
  355. package/transpiled/directives/octets/Delete.js.map +1 -1
  356. package/transpiled/directives/octets/Directive.d.ts +8 -0
  357. package/transpiled/directives/octets/Directive.js +8 -0
  358. package/transpiled/directives/octets/Directive.js.map +1 -0
  359. package/transpiled/directives/octets/Fetch.d.ts +6 -5
  360. package/transpiled/directives/octets/Fetch.js +11 -9
  361. package/transpiled/directives/octets/Fetch.js.map +1 -1
  362. package/transpiled/directives/octets/List.d.ts +6 -5
  363. package/transpiled/directives/octets/List.js +6 -4
  364. package/transpiled/directives/octets/List.js.map +1 -1
  365. package/transpiled/directives/octets/Octets.d.ts +2 -1
  366. package/transpiled/directives/octets/Octets.js +2 -4
  367. package/transpiled/directives/octets/Octets.js.map +1 -1
  368. package/transpiled/directives/octets/Store.d.ts +9 -3
  369. package/transpiled/directives/octets/Store.js +20 -8
  370. package/transpiled/directives/octets/Store.js.map +1 -1
  371. package/transpiled/directives/octets/Workflow.d.ts +3 -2
  372. package/transpiled/directives/octets/Workflow.js +9 -2
  373. package/transpiled/directives/octets/Workflow.js.map +1 -1
  374. package/transpiled/directives/octets/bytes.d.ts +1 -0
  375. package/transpiled/directives/octets/bytes.js +21 -0
  376. package/transpiled/directives/octets/bytes.js.map +1 -0
  377. package/transpiled/directives/octets/schemas.d.ts +4 -6
  378. package/transpiled/directives/octets/schemas.js +1 -3
  379. package/transpiled/directives/octets/schemas.js.map +1 -1
  380. package/transpiled/directives/octets/types.d.ts +0 -5
  381. package/transpiled/directives/octets/workflows/Execution.d.ts +5 -1
  382. package/transpiled/directives/octets/workflows/Execution.js +43 -9
  383. package/transpiled/directives/octets/workflows/Execution.js.map +1 -1
  384. package/transpiled/directives/octets/workflows/Workflow.js +2 -1
  385. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -1
  386. package/transpiled/directives/require/Directive.d.ts +4 -0
  387. package/transpiled/directives/require/Directive.js +3 -0
  388. package/transpiled/directives/require/Directive.js.map +1 -0
  389. package/transpiled/directives/require/Headers.d.ts +7 -0
  390. package/transpiled/directives/require/Headers.js +19 -0
  391. package/transpiled/directives/require/Headers.js.map +1 -0
  392. package/transpiled/directives/require/Require.d.ts +9 -0
  393. package/transpiled/directives/require/Require.js +27 -0
  394. package/transpiled/directives/require/Require.js.map +1 -0
  395. package/transpiled/directives/require/index.d.ts +2 -0
  396. package/transpiled/directives/require/index.js +6 -0
  397. package/transpiled/directives/require/index.js.map +1 -0
  398. package/transpiled/directives/vary/Directive.d.ts +2 -1
  399. package/transpiled/directives/vary/Embed.d.ts +2 -1
  400. package/transpiled/directives/vary/Embed.js +8 -6
  401. package/transpiled/directives/vary/Embed.js.map +1 -1
  402. package/transpiled/directives/vary/Vary.d.ts +2 -2
  403. package/transpiled/directives/vary/Vary.js +3 -3
  404. package/transpiled/directives/vary/Vary.js.map +1 -1
  405. package/transpiled/directives/vary/embeddings/Authority.d.ts +5 -0
  406. package/transpiled/directives/vary/embeddings/Authority.js +10 -0
  407. package/transpiled/directives/vary/embeddings/Authority.js.map +1 -0
  408. package/transpiled/directives/vary/embeddings/Embedding.d.ts +2 -1
  409. package/transpiled/directives/vary/embeddings/Parameter.d.ts +7 -0
  410. package/transpiled/directives/vary/embeddings/Parameter.js +14 -0
  411. package/transpiled/directives/vary/embeddings/Parameter.js.map +1 -0
  412. package/transpiled/directives/vary/embeddings/index.d.ts +2 -2
  413. package/transpiled/directives/vary/embeddings/index.js +8 -4
  414. package/transpiled/directives/vary/embeddings/index.js.map +1 -1
  415. package/transpiled/exceptions.d.ts +3 -2
  416. package/transpiled/exceptions.js +13 -7
  417. package/transpiled/exceptions.js.map +1 -1
  418. package/transpiled/manifest.js +10 -11
  419. package/transpiled/manifest.js.map +1 -1
  420. package/transpiled/schemas.d.ts +1 -1
  421. package/transpiled/schemas.js +2 -2
  422. package/transpiled/schemas.js.map +1 -1
  423. package/transpiled/tsconfig.tsbuildinfo +1 -1
  424. package/tsconfig.json +9 -7
  425. package/components/identity.basic/operations/create.d.ts +0 -10
  426. package/components/identity.basic/operations/create.js +0 -10
  427. package/components/identity.basic/operations/create.js.map +0 -1
  428. package/components/identity.basic/source/create.ts +0 -18
  429. package/components/identity.federation/operations/create.d.ts +0 -10
  430. package/components/identity.federation/operations/create.js.map +0 -1
  431. package/components/identity.federation/operations/schemas.d.ts +0 -59
  432. package/components/identity.federation/operations/schemas.js +0 -9
  433. package/components/identity.federation/operations/schemas.js.map +0 -1
  434. package/components/identity.federation/operations/types.js.map +0 -1
  435. package/components/identity.federation/source/schemas.ts +0 -61
  436. package/components/octets.storage/operations/permute.js +0 -7
  437. package/schemas/octets/context.cos.yaml +0 -1
  438. package/source/HTTP/Server.test.ts +0 -126
  439. package/source/directives/octets/Permute.ts +0 -43
  440. package/transpiled/directives/octets/Permute.d.ts +0 -10
  441. package/transpiled/directives/octets/Permute.js +0 -56
  442. package/transpiled/directives/octets/Permute.js.map +0 -1
  443. /package/{components/identity.federation/operations → transpiled/directives/flow}/types.js +0 -0
package/source/Mapping.ts CHANGED
@@ -1,50 +1,92 @@
1
1
  import { type Parameter } from './RTD'
2
2
  import { Query } from './Query'
3
+ import type { Introspection, Schema } from './Introspection'
4
+ import type { QueryString } from './Query'
3
5
  import type * as http from './HTTP'
4
6
  import type * as syntax from './RTD/syntax'
5
7
  import type * as core from '@toa.io/core'
6
8
 
7
9
  export abstract class Mapping {
8
- public static create (query?: syntax.Query): Mapping {
9
- if (query === undefined || query === null)
10
- return new InputMapping()
10
+ protected readonly query: Query
11
11
 
12
- const q = new Query(query)
12
+ public constructor (query: Query) {
13
+ this.query = query
14
+ }
15
+
16
+ public static create (query?: syntax.Query | null): Mapping {
17
+ const q = new Query(query!)
13
18
 
14
- return new QueryableMapping(q)
19
+ return queryable(query)
20
+ ? new QueryableMapping(q)
21
+ : new InputMapping(q)
15
22
  }
16
23
 
17
- public abstract fit (input: any, qs: http.Query, parameters: Parameter[]): core.Request
24
+ public explain (introspection: Introspection): Record<string, Schema> | null {
25
+ return this.query.explain(introspection)
26
+ }
27
+
28
+ protected assign (input: any, qs: QueryString): void {
29
+ if (qs.parameters !== null) {
30
+ if (typeof input !== 'object' || input === null)
31
+ throw new Error('Input must be an object to embed query parameters')
32
+
33
+ Object.assign(input, qs.parameters)
34
+ }
35
+ }
36
+
37
+ public abstract fit (input: any, query: http.Query, parameters: Parameter[]): core.Request
18
38
  }
19
39
 
20
40
  class QueryableMapping extends Mapping {
21
- private readonly query: Query
41
+ public fit (input: any, query: http.Query, parameters: Parameter[]): core.Request {
42
+ const request: core.Request = {}
43
+ const qs = this.query.fit(query, parameters)
22
44
 
23
- public constructor (query: Query) {
24
- super()
45
+ if (input === undefined && qs.parameters !== null)
46
+ input = {}
25
47
 
26
- this.query = query
27
- }
48
+ this.assign(input, qs)
28
49
 
29
- public fit (input: any, qs: http.Query, parameters: Parameter[]): core.Request {
30
- const query = this.query.fit(qs, parameters)
50
+ if (input !== undefined)
51
+ request.input = input
31
52
 
32
- return {
33
- input,
34
- query
35
- }
53
+ if (qs.query !== null)
54
+ request.query = qs.query
55
+
56
+ return request
36
57
  }
37
58
  }
38
59
 
39
60
  class InputMapping extends Mapping {
40
- public fit (input: any, _: unknown, parameters: Parameter[]): core.Request {
41
- if (input === undefined && parameters.length > 0)
61
+ public fit (input: any, query: http.Query, parameters: Parameter[]): core.Request {
62
+ const request: core.Request = {}
63
+ const qs = this.query.fit(query, parameters)
64
+
65
+ if (input === undefined && (parameters.length > 0 || qs.parameters !== null))
42
66
  input = {}
43
67
 
44
- if (typeof input === 'object' && input !== null)
68
+ if (parameters.length > 0) {
69
+ if (typeof input !== 'object' || input === null)
70
+ throw new Error('Input must be an object to embed route parameters')
71
+
45
72
  for (const parameter of parameters)
46
73
  input[parameter.name] = parameter.value
74
+ }
47
75
 
48
- return { input }
76
+ this.assign(input, qs)
77
+
78
+ if (input !== undefined)
79
+ request.input = input
80
+
81
+ return request
49
82
  }
50
83
  }
84
+
85
+ export function queryable (query?: syntax.Query | null): boolean {
86
+ if (query === undefined || query === null)
87
+ return false
88
+
89
+ const keys = Object.keys(query)
90
+
91
+ return !(keys.length === 1 && keys[0] === 'parameters')
92
+ }
@@ -16,7 +16,7 @@ it('should combine request criteria', async () => {
16
16
  const instance = new Query(query)
17
17
  const result = instance.fit({ criteria: 'qux==4' }, parameters)
18
18
 
19
- expect(result.criteria).toStrictEqual('(foo==1);(bar==2;baz==3);(qux==4)')
19
+ expect(result.query!.criteria).toStrictEqual('(bar==2;baz==3);(foo==1);(qux==4)')
20
20
  })
21
21
 
22
22
  it('should set id parameter as query.id', async () => {
@@ -32,6 +32,6 @@ it('should set id parameter as query.id', async () => {
32
32
  const instance = new Query(query)
33
33
  const result = instance.fit({}, parameters)
34
34
 
35
- expect(result.criteria).toBeUndefined()
36
- expect(result.id).toStrictEqual(id)
35
+ expect(result.query!.criteria).toBeUndefined()
36
+ expect(result.query!.id).toStrictEqual(id)
37
37
  })
package/source/Query.ts CHANGED
@@ -1,43 +1,111 @@
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
+ }
40
97
 
98
+ if (!this.queryable)
99
+ query = null!
100
+
101
+ return {
102
+ query,
103
+ parameters
104
+ }
105
+ }
106
+
107
+ private fitCriteria (query: http.Query, parameters: Parameter[]): void {
108
+ const groups: CriteriaGroup[] = []
41
109
  const idx = parameters.findIndex((parameter) => parameter.name === 'id')
42
110
 
43
111
  if (idx !== -1) {
@@ -47,32 +115,36 @@ export class Query {
47
115
  }
48
116
 
49
117
  if (parameters.length > 0) {
50
- const chunks = parameters
118
+ const criteria = parameters
51
119
  .map(({ name, value }) => `${name}==${value}`)
52
120
  .join(';')
53
121
 
54
- criteria.push(chunks)
122
+ groups.push({ criteria, operator: this.prepend })
55
123
  }
56
124
 
125
+ if (this.query.criteria !== undefined)
126
+ groups.push({ criteria: this.query.criteria, operator: ';' })
127
+
57
128
  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
- }
129
+ if (this.closed)
130
+ throw new http.BadRequest('Query criteria is closed')
131
+ else
132
+ groups.push({ criteria: query.criteria, operator: WHATEVER })
133
+
134
+ if (groups.length > 0)
135
+ query.criteria = groups.reduce((acc, { criteria, operator }, i) => {
136
+ return i === groups.length - 1
137
+ ? `${acc}(${criteria})`
138
+ : `${acc}(${criteria})${operator}`
139
+ }, '')
71
140
  }
72
141
 
73
142
  private fitRanges (qs: http.Query): void {
74
143
  const query = qs as core.Query
75
144
 
145
+ assert.ok(this.query.limit !== undefined, 'Query limit must be defined')
146
+ assert.ok(this.query.omit !== undefined, 'Query limit range must be defined')
147
+
76
148
  if (qs.limit !== undefined)
77
149
  query.limit = fit(qs.limit, this.query.limit.range, 'limit')
78
150
  else
@@ -99,7 +171,19 @@ function fit (string: string, range: [number, number], name: string): number {
99
171
 
100
172
  if (number < range[0] || number > range[1])
101
173
  throw new http.BadRequest(`Query ${name} must be between ` +
102
- `${range[0]} and ${range[1]} inclusive.`)
174
+ `${range[0]} and ${range[1]} inclusive`)
103
175
 
104
176
  return number
105
177
  }
178
+
179
+ const WHATEVER = ';'
180
+
181
+ interface CriteriaGroup {
182
+ criteria: string
183
+ operator: ',' | ';'
184
+ }
185
+
186
+ export interface QueryString {
187
+ query: core.Query | null
188
+ parameters: Record<string, string> | null
189
+ }
@@ -5,6 +5,9 @@ import type * as RTD from './index'
5
5
 
6
6
  export interface Endpoint {
7
7
  call: (context: http.Context, parameters: RTD.Parameter[]) => Promise<http.OutgoingMessage>
8
+
9
+ explain: (parameters: RTD.Parameter[]) => Promise<unknown>
10
+
8
11
  close: () => Promise<void>
9
12
  }
10
13
 
@@ -1,15 +1,31 @@
1
+ import type { Parameter } from './Match'
1
2
  import type { Endpoint } from './Endpoint'
2
3
  import type { Directives } from './Directives'
3
4
 
4
5
  export class Method {
5
6
  public readonly endpoint: Endpoint | null
6
7
  public readonly directives: Directives
8
+ private introspection: unknown | null = null
9
+ private introspecting: Promise<unknown> | null = null
7
10
 
8
11
  public constructor (endpoint: Endpoint | null, directives: Directives) {
9
12
  this.endpoint = endpoint
10
13
  this.directives = directives
11
14
  }
12
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
+
13
29
  public async close (): Promise<void> {
14
30
  await this.endpoint?.close()
15
31
  }
@@ -4,6 +4,7 @@ import { type Match, type Parameter } from './Match'
4
4
 
5
5
  export class Node {
6
6
  public intermediate: boolean
7
+ public forward: string | null
7
8
  public methods: Methods
8
9
  private readonly protected: boolean
9
10
  private routes: Route[]
@@ -13,6 +14,7 @@ export class Node {
13
14
  this.routes = routes
14
15
  this.methods = methods
15
16
  this.protected = properties.protected
17
+ this.forward = properties.forward ?? null
16
18
  this.intermediate = this.routes.findIndex((route) => route.root) !== -1
17
19
 
18
20
  this.sort()
@@ -20,7 +22,8 @@ export class Node {
20
22
 
21
23
  public match (fragments: string[], parameters: Parameter[] = []): Match | null {
22
24
  for (const route of this.routes) {
23
- const match = route.match(fragments, parameters)
25
+ const params = parameters.slice()
26
+ const match = route.match(fragments, params)
24
27
 
25
28
  if (match !== null)
26
29
  return match
@@ -32,38 +35,46 @@ export class Node {
32
35
  public merge (node: Node): void {
33
36
  this.intermediate = node.intermediate
34
37
 
35
- if (!this.protected)
36
- this.replace(node)
37
- else
38
+ if (this.protected)
38
39
  this.append(node)
40
+ else
41
+ this.replace(node)
39
42
 
40
43
  this.sort()
41
44
  }
42
45
 
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
+
43
58
  private replace (node: Node): void {
44
59
  const methods = Object.values(this.methods)
45
60
 
46
61
  this.routes = node.routes
47
62
  this.methods = node.methods
48
63
 
64
+ // race condition is really unlikely
49
65
  for (const method of methods)
50
66
  void method.close()
51
-
52
- // race condition is really unlikely
53
67
  }
54
68
 
55
69
  private append (node: Node): void {
56
70
  for (const route of node.routes)
57
- this.mergeRoute(route)
71
+ this.route(route)
58
72
 
59
73
  for (const [verb, method] of Object.entries(node.methods))
60
- if (verb in this.methods)
61
- console.warn(`Overriding of the protected method ${verb} is not permitted.`)
62
- else
63
- this.methods[verb] = method
74
+ this.methods[verb] = method
64
75
  }
65
76
 
66
- private mergeRoute (candidate: Route): void {
77
+ private route (candidate: Route): void {
67
78
  for (const route of this.routes)
68
79
  if (candidate.equals(route)) {
69
80
  route.merge(candidate)
@@ -75,10 +86,15 @@ export class Node {
75
86
  }
76
87
 
77
88
  private sort (): void {
78
- 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
+ })
79
94
  }
80
95
  }
81
96
 
82
97
  export interface Properties {
83
98
  protected: boolean
99
+ forward?: string
84
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
  }
@@ -17,7 +17,10 @@ export function createNode (node: syntax.Node, context: Context): Node {
17
17
  for (const method of node.methods)
18
18
  methods[method.verb] = createMethod(method, context)
19
19
 
20
- const properties: Properties = { protected: node.protected ?? context.protected }
20
+ const properties: Properties = {
21
+ protected: node.protected ?? context.protected,
22
+ forward: node.forward
23
+ }
21
24
 
22
25
  return new Node(routes, methods, properties)
23
26
  }
@@ -33,7 +36,7 @@ function createRoute (route: syntax.Route, context: Context): Route {
33
36
  }
34
37
 
35
38
  function createMethod (method: syntax.Method, context: Context): Method {
36
- const stack = context.directives.stack.concat(method.directives.reverse())
39
+ const stack = method.directives.concat(context.directives.stack)
37
40
  const directives = context.directives.factory.create(stack)
38
41
 
39
42
  const endpoint = method.mapping?.endpoint === undefined
@@ -17,42 +17,56 @@ export function parse (input: object, shortcuts?: Shortcuts): Node {
17
17
  return node
18
18
  }
19
19
 
20
- function parseNode (input: object, shortcuts?: Shortcuts): Node {
20
+ function parseNode (input: object | string, shortcuts?: Shortcuts): Node {
21
21
  const node = createNode()
22
22
 
23
- for (const [key, value] of Object.entries(input)) {
24
- if (PROPERTIES.includes(key as keyof Node)) {
25
- node[key as keyof Node] = value
23
+ if (typeof input === 'string') {
24
+ node.forward = input
26
25
 
27
- continue
28
- }
26
+ return node
27
+ }
29
28
 
30
- if (key[0] === '/') {
31
- const route = parseRoute(key, value as Node, shortcuts)
29
+ for (const [key, value] of Object.entries(input) as Array<[keyof Node, unknown]>)
30
+ switch (key) {
31
+ case 'protected':
32
+ case 'isolated':
33
+ node[key] = value as boolean
34
+ break
35
+ case 'forward':
36
+ node[key] = value as string
37
+ break
32
38
 
33
- node.routes.push(route)
39
+ default:
40
+ // eslint-disable-next-line max-depth
41
+ if (key[0] === '/') {
42
+ const route = parseRoute(key, value as Node, shortcuts)
34
43
 
35
- continue
36
- }
44
+ node.routes.push(route)
37
45
 
38
- if (verbs.has(key)) {
39
- const method = parseMethod(key, value as Mapping, shortcuts)
46
+ continue
47
+ }
40
48
 
41
- node.methods.push(method)
49
+ // eslint-disable-next-line max-depth
50
+ if (verbs.has(key)) {
51
+ const method = parseMethod(key, value as Mapping, shortcuts)
42
52
 
43
- continue
44
- }
53
+ node.methods.push(method)
45
54
 
46
- const directive = parseDirective(key, value, shortcuts)
55
+ continue
56
+ }
47
57
 
48
- if (directive !== null) {
49
- node.directives.push(directive)
58
+ // eslint-disable-next-line no-case-declarations
59
+ const directive = parseDirective(key, value, shortcuts)
50
60
 
51
- continue
52
- }
61
+ // eslint-disable-next-line max-depth
62
+ if (directive !== null) {
63
+ node.directives.push(directive)
53
64
 
54
- throw new Error(`RTD parse error: unknown key '${key}'.`)
55
- }
65
+ continue
66
+ }
67
+
68
+ throw new Error(`RTD parse error: unknown key '${key}'.`)
69
+ }
56
70
 
57
71
  return node
58
72
  }
@@ -149,6 +163,5 @@ function expandRange (range: number): Range {
149
163
  }
150
164
 
151
165
  const DIRECTIVE_RX = /^(?<family>\w{1,32}):(?<name>\w{1,32})$/
152
- const PROPERTIES: Array<keyof Node> = ['protected', 'isolated']
153
166
 
154
167
  export type Shortcuts = Map<string, string>
@@ -1,6 +1,7 @@
1
1
  export interface Node {
2
2
  protected?: boolean
3
3
  isolated?: boolean
4
+ forward?: string
4
5
  routes: Route[]
5
6
  methods: Method[]
6
7
  directives: Directive[]
@@ -27,17 +28,18 @@ export interface Mapping {
27
28
  namespace?: string
28
29
  component?: string
29
30
  endpoint: string
30
- query?: Query
31
+ query?: Query | null
31
32
  }
32
33
 
33
34
  export interface Query {
34
35
  id?: string
35
36
  criteria?: string
36
37
  sort?: string
37
- omit: Range
38
- limit: Range
38
+ omit?: Range
39
+ limit?: Range
39
40
  selectors?: string[]
40
41
  projection?: string[]
42
+ parameters?: string[]
41
43
  }
42
44
 
43
45
  export interface Range {
@@ -45,4 +47,4 @@ export interface Range {
45
47
  range: [number, number]
46
48
  }
47
49
 
48
- export const verbs = new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'])
50
+ export const verbs = new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'LOCK', 'UNLOCK'])
package/source/Remotes.ts CHANGED
@@ -1,24 +1,17 @@
1
- import { Locator, Connector, type Component } from '@toa.io/core'
1
+ import { Locator, Connector, type Remote } from '@toa.io/core'
2
2
  import { type Bootloader } from './Factory'
3
3
 
4
4
  export class Remotes extends Connector {
5
5
  private readonly boot: Bootloader
6
- private readonly remotes: Record<string, Promise<Component>> = {}
7
6
 
8
7
  public constructor (boot: Bootloader) {
9
8
  super()
10
9
  this.boot = boot
11
10
  }
12
11
 
13
- public async discover (namespace: string, name: string): Promise<Component> {
12
+ public async discover (namespace: string, name: string): Promise<Remote> {
14
13
  const locator = new Locator(name, namespace)
15
14
 
16
- this.remotes[locator.id] ??= this.create(locator)
17
-
18
- return await this.remotes[locator.id]
19
- }
20
-
21
- private async create (locator: Locator): Promise<Component> {
22
15
  const remote = await this.boot.remote(locator)
23
16
 
24
17
  this.depends(remote)