@toa.io/extensions.exposition 0.24.0-alpha.2 → 0.24.0-alpha.21

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 (411) hide show
  1. package/components/context.toa.yaml +12 -0
  2. package/components/identity.bans/manifest.toa.yaml +1 -1
  3. package/components/identity.basic/manifest.toa.yaml +2 -2
  4. package/components/identity.basic/operations/authenticate.d.ts +9 -0
  5. package/components/identity.basic/operations/authenticate.js +24 -0
  6. package/components/identity.basic/operations/authenticate.js.map +1 -0
  7. package/components/identity.basic/operations/create.d.ts +10 -0
  8. package/components/identity.basic/operations/create.js +10 -0
  9. package/components/identity.basic/operations/create.js.map +1 -0
  10. package/components/identity.basic/operations/transit.d.ts +12 -0
  11. package/components/identity.basic/operations/transit.js +53 -0
  12. package/components/identity.basic/operations/transit.js.map +1 -0
  13. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -0
  14. package/components/identity.basic/operations/types.d.ts +38 -0
  15. package/components/identity.basic/operations/types.js +3 -0
  16. package/components/identity.basic/operations/types.js.map +1 -0
  17. package/components/identity.basic/source/authenticate.ts +0 -1
  18. package/components/identity.federation/events/principal.js +22 -0
  19. package/components/identity.federation/manifest.toa.yaml +88 -0
  20. package/components/identity.federation/operations/assertions-as-values.cjs +45 -0
  21. package/components/identity.federation/operations/assertions-as-values.cjs.map +1 -0
  22. package/components/identity.federation/operations/assertions-as-values.d.cts +4 -0
  23. package/components/identity.federation/operations/authenticate.d.ts +3 -0
  24. package/components/identity.federation/operations/authenticate.js +20 -0
  25. package/components/identity.federation/operations/authenticate.js.map +1 -0
  26. package/components/identity.federation/operations/create.d.ts +10 -0
  27. package/components/identity.federation/operations/create.js +15 -0
  28. package/components/identity.federation/operations/create.js.map +1 -0
  29. package/components/identity.federation/operations/jwt.cjs +112 -0
  30. package/components/identity.federation/operations/jwt.cjs.map +1 -0
  31. package/components/identity.federation/operations/jwt.d.cts +19 -0
  32. package/components/identity.federation/operations/schemas.d.ts +43 -0
  33. package/components/identity.federation/operations/schemas.js +9 -0
  34. package/components/identity.federation/operations/schemas.js.map +1 -0
  35. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
  36. package/components/identity.federation/operations/types.d.ts +51 -0
  37. package/components/identity.federation/operations/types.js +3 -0
  38. package/components/identity.federation/operations/types.js.map +1 -0
  39. package/components/identity.federation/source/assertions-as-values.cts +20 -0
  40. package/components/identity.federation/source/authenticate.ts +28 -0
  41. package/components/identity.federation/source/create.ts +26 -0
  42. package/components/identity.federation/source/jwt.cts +143 -0
  43. package/components/identity.federation/source/schemas.ts +45 -0
  44. package/components/identity.federation/source/types.ts +56 -0
  45. package/components/identity.federation/tsconfig.json +9 -0
  46. package/components/identity.roles/operations/list.d.ts +5 -0
  47. package/components/identity.roles/operations/list.js +8 -0
  48. package/components/identity.roles/operations/list.js.map +1 -0
  49. package/components/identity.roles/operations/principal.d.ts +15 -0
  50. package/components/identity.roles/operations/principal.js +8 -0
  51. package/components/identity.roles/operations/principal.js.map +1 -0
  52. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -0
  53. package/components/identity.tokens/manifest.toa.yaml +1 -1
  54. package/components/identity.tokens/operations/authenticate.d.ts +9 -0
  55. package/components/identity.tokens/operations/authenticate.js +32 -0
  56. package/components/identity.tokens/operations/authenticate.js.map +1 -0
  57. package/components/identity.tokens/operations/decrypt.d.ts +3 -0
  58. package/components/identity.tokens/operations/decrypt.js +32 -0
  59. package/components/identity.tokens/operations/decrypt.js.map +1 -0
  60. package/components/identity.tokens/operations/encrypt.d.ts +8 -0
  61. package/components/identity.tokens/operations/encrypt.js +22 -0
  62. package/components/identity.tokens/operations/encrypt.js.map +1 -0
  63. package/components/identity.tokens/operations/revoke.d.ts +2 -0
  64. package/components/identity.tokens/operations/revoke.js +8 -0
  65. package/components/identity.tokens/operations/revoke.js.map +1 -0
  66. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -0
  67. package/components/identity.tokens/operations/types.d.ts +40 -0
  68. package/components/identity.tokens/operations/types.js +3 -0
  69. package/components/identity.tokens/operations/types.js.map +1 -0
  70. package/cucumber.js +0 -1
  71. package/documentation/components.md +25 -2
  72. package/documentation/identity.md +7 -7
  73. package/documentation/protocol.md +21 -1
  74. package/documentation/query.md +1 -1
  75. package/documentation/vary.md +69 -0
  76. package/features/cors.feature +39 -0
  77. package/features/identity.feature +19 -3
  78. package/features/identity.federation.feature +125 -0
  79. package/features/octets.feature +1 -1
  80. package/features/response.feature +65 -0
  81. package/features/steps/Captures.ts +5 -0
  82. package/features/steps/Components.ts +5 -0
  83. package/features/steps/Gateway.ts +1 -2
  84. package/features/steps/HTTP.ts +39 -84
  85. package/features/steps/IdP.ts +120 -0
  86. package/features/steps/Parameters.ts +8 -2
  87. package/features/steps/Workspace.ts +5 -7
  88. package/features/steps/components/echo/operations/error.js +11 -0
  89. package/features/vary.feature +150 -0
  90. package/package.json +17 -18
  91. package/source/Directive.test.ts +8 -2
  92. package/source/Directive.ts +19 -16
  93. package/source/Factory.ts +8 -7
  94. package/source/Gateway.ts +22 -8
  95. package/source/HTTP/Server.fixtures.ts +0 -1
  96. package/source/HTTP/Server.test.ts +61 -134
  97. package/source/HTTP/Server.ts +45 -23
  98. package/source/HTTP/formats/msgpack.ts +9 -6
  99. package/source/HTTP/formats/text.ts +1 -1
  100. package/source/HTTP/formats/yaml.ts +1 -1
  101. package/source/HTTP/messages.ts +8 -2
  102. package/source/Interception.ts +24 -0
  103. package/source/RTD/Directives.ts +2 -2
  104. package/source/RTD/Tree.ts +3 -0
  105. package/source/RTD/syntax/parse.ts +6 -6
  106. package/source/RTD/syntax/types.ts +1 -1
  107. package/source/deployment.ts +1 -2
  108. package/source/directives/auth/{Family.ts → Authorization.ts} +29 -33
  109. package/source/directives/auth/Incept.ts +1 -1
  110. package/source/directives/auth/Rule.ts +2 -2
  111. package/source/directives/auth/index.ts +2 -2
  112. package/source/directives/auth/schemes.ts +2 -1
  113. package/source/directives/auth/types.ts +9 -6
  114. package/source/directives/cache/{Family.ts → Cache.ts} +4 -5
  115. package/source/directives/cache/index.ts +2 -2
  116. package/source/directives/cache/types.ts +1 -1
  117. package/source/directives/cors/CORS.ts +52 -0
  118. package/source/directives/cors/index.ts +3 -0
  119. package/source/directives/dev/{Family.ts → Development.ts} +3 -4
  120. package/source/directives/dev/Stub.ts +4 -4
  121. package/source/directives/dev/Throw.ts +4 -4
  122. package/source/directives/dev/index.ts +2 -2
  123. package/source/directives/dev/types.ts +1 -1
  124. package/source/directives/index.ts +10 -6
  125. package/source/directives/octets/Context.ts +1 -1
  126. package/source/directives/octets/Delete.ts +1 -2
  127. package/source/directives/octets/Fetch.ts +1 -1
  128. package/source/directives/octets/List.ts +1 -1
  129. package/source/directives/octets/{Family.ts → Octets.ts} +3 -4
  130. package/source/directives/octets/Permute.ts +1 -1
  131. package/source/directives/octets/Store.ts +3 -3
  132. package/source/directives/octets/index.ts +2 -2
  133. package/source/directives/octets/types.ts +3 -3
  134. package/source/directives/vary/Directive.ts +6 -0
  135. package/source/directives/vary/Embed.ts +62 -0
  136. package/source/directives/vary/Properties.ts +17 -0
  137. package/source/directives/vary/Vary.ts +48 -0
  138. package/source/directives/vary/embeddings/Embedding.ts +6 -0
  139. package/source/directives/vary/embeddings/Header.ts +30 -0
  140. package/source/directives/vary/embeddings/Language.ts +31 -0
  141. package/source/directives/vary/embeddings/index.ts +11 -0
  142. package/source/directives/vary/index.ts +3 -0
  143. package/source/io.ts +4 -0
  144. package/transpiled/Annotation.d.ts +7 -0
  145. package/transpiled/Annotation.js +3 -0
  146. package/transpiled/Annotation.js.map +1 -0
  147. package/transpiled/Branch.d.ts +7 -0
  148. package/transpiled/Branch.js +3 -0
  149. package/transpiled/Branch.js.map +1 -0
  150. package/transpiled/Composition.d.ts +14 -0
  151. package/transpiled/Composition.js +43 -0
  152. package/transpiled/Composition.js.map +1 -0
  153. package/transpiled/Context.d.ts +5 -0
  154. package/transpiled/Context.js +3 -0
  155. package/transpiled/Context.js.map +1 -0
  156. package/transpiled/Directive.d.ts +31 -0
  157. package/transpiled/Directive.js +78 -0
  158. package/transpiled/Directive.js.map +1 -0
  159. package/transpiled/Endpoint.d.ts +20 -0
  160. package/transpiled/Endpoint.js +45 -0
  161. package/transpiled/Endpoint.js.map +1 -0
  162. package/transpiled/Factory.d.ts +9 -0
  163. package/transpiled/Factory.js +67 -0
  164. package/transpiled/Factory.js.map +1 -0
  165. package/transpiled/Gateway.d.ts +22 -0
  166. package/transpiled/Gateway.js +102 -0
  167. package/transpiled/Gateway.js.map +1 -0
  168. package/transpiled/HTTP/Server.d.ts +24 -0
  169. package/transpiled/HTTP/Server.fixtures.d.ts +10 -0
  170. package/transpiled/HTTP/Server.fixtures.js +31 -0
  171. package/transpiled/HTTP/Server.fixtures.js.map +1 -0
  172. package/transpiled/HTTP/Server.js +148 -0
  173. package/transpiled/HTTP/Server.js.map +1 -0
  174. package/transpiled/HTTP/exceptions.d.ts +34 -0
  175. package/transpiled/HTTP/exceptions.js +71 -0
  176. package/transpiled/HTTP/exceptions.js.map +1 -0
  177. package/transpiled/HTTP/formats/index.d.ts +10 -0
  178. package/transpiled/HTTP/formats/index.js +38 -0
  179. package/transpiled/HTTP/formats/index.js.map +1 -0
  180. package/transpiled/HTTP/formats/json.d.ts +6 -0
  181. package/transpiled/HTTP/formats/json.js +17 -0
  182. package/transpiled/HTTP/formats/json.js.map +1 -0
  183. package/transpiled/HTTP/formats/msgpack.d.ts +6 -0
  184. package/transpiled/HTTP/formats/msgpack.js +17 -0
  185. package/transpiled/HTTP/formats/msgpack.js.map +1 -0
  186. package/transpiled/HTTP/formats/text.d.ts +8 -0
  187. package/transpiled/HTTP/formats/text.js +15 -0
  188. package/transpiled/HTTP/formats/text.js.map +1 -0
  189. package/transpiled/HTTP/formats/yaml.d.ts +6 -0
  190. package/transpiled/HTTP/formats/yaml.js +41 -0
  191. package/transpiled/HTTP/formats/yaml.js.map +1 -0
  192. package/transpiled/HTTP/index.d.ts +3 -0
  193. package/transpiled/HTTP/index.js +20 -0
  194. package/transpiled/HTTP/index.js.map +1 -0
  195. package/transpiled/HTTP/messages.d.ts +32 -0
  196. package/transpiled/HTTP/messages.js +72 -0
  197. package/transpiled/HTTP/messages.js.map +1 -0
  198. package/transpiled/Interception.d.ts +9 -0
  199. package/transpiled/Interception.js +19 -0
  200. package/transpiled/Interception.js.map +1 -0
  201. package/transpiled/Mapping.d.ts +8 -0
  202. package/transpiled/Mapping.js +38 -0
  203. package/transpiled/Mapping.js.map +1 -0
  204. package/transpiled/Query.d.ts +13 -0
  205. package/transpiled/Query.js +107 -0
  206. package/transpiled/Query.js.map +1 -0
  207. package/transpiled/RTD/Context.d.ts +11 -0
  208. package/transpiled/RTD/Context.js +3 -0
  209. package/transpiled/RTD/Context.js.map +1 -0
  210. package/transpiled/RTD/Directives.d.ts +7 -0
  211. package/transpiled/RTD/Directives.js +3 -0
  212. package/transpiled/RTD/Directives.js.map +1 -0
  213. package/transpiled/RTD/Endpoint.d.ts +9 -0
  214. package/transpiled/RTD/Endpoint.js +3 -0
  215. package/transpiled/RTD/Endpoint.js.map +1 -0
  216. package/transpiled/RTD/Match.d.ts +11 -0
  217. package/transpiled/RTD/Match.js +3 -0
  218. package/transpiled/RTD/Match.js.map +1 -0
  219. package/transpiled/RTD/Method.d.ts +9 -0
  220. package/transpiled/RTD/Method.js +16 -0
  221. package/transpiled/RTD/Method.js.map +1 -0
  222. package/transpiled/RTD/Node.d.ts +21 -0
  223. package/transpiled/RTD/Node.js +61 -0
  224. package/transpiled/RTD/Node.js.map +1 -0
  225. package/transpiled/RTD/Route.d.ts +14 -0
  226. package/transpiled/RTD/Route.js +49 -0
  227. package/transpiled/RTD/Route.js.map +1 -0
  228. package/transpiled/RTD/Tree.d.ts +14 -0
  229. package/transpiled/RTD/Tree.js +42 -0
  230. package/transpiled/RTD/Tree.js.map +1 -0
  231. package/transpiled/RTD/factory.d.ts +6 -0
  232. package/transpiled/RTD/factory.js +36 -0
  233. package/transpiled/RTD/factory.js.map +1 -0
  234. package/transpiled/RTD/index.d.ts +8 -0
  235. package/transpiled/RTD/index.js +38 -0
  236. package/transpiled/RTD/index.js.map +1 -0
  237. package/transpiled/RTD/segment.d.ts +8 -0
  238. package/transpiled/RTD/segment.js +25 -0
  239. package/transpiled/RTD/segment.js.map +1 -0
  240. package/transpiled/RTD/syntax/index.d.ts +2 -0
  241. package/transpiled/RTD/syntax/index.js +19 -0
  242. package/transpiled/RTD/syntax/index.js.map +1 -0
  243. package/transpiled/RTD/syntax/parse.d.ts +4 -0
  244. package/transpiled/RTD/syntax/parse.js +128 -0
  245. package/transpiled/RTD/syntax/parse.js.map +1 -0
  246. package/transpiled/RTD/syntax/types.d.ts +41 -0
  247. package/transpiled/RTD/syntax/types.js +5 -0
  248. package/transpiled/RTD/syntax/types.js.map +1 -0
  249. package/transpiled/Remotes.d.ts +9 -0
  250. package/transpiled/Remotes.js +25 -0
  251. package/transpiled/Remotes.js.map +1 -0
  252. package/transpiled/Tenant.d.ts +13 -0
  253. package/transpiled/Tenant.js +34 -0
  254. package/transpiled/Tenant.js.map +1 -0
  255. package/transpiled/deployment.d.ts +3 -0
  256. package/transpiled/deployment.js +66 -0
  257. package/transpiled/deployment.js.map +1 -0
  258. package/transpiled/directives/auth/Anonymous.d.ts +6 -0
  259. package/transpiled/directives/auth/Anonymous.js +17 -0
  260. package/transpiled/directives/auth/Anonymous.js.map +1 -0
  261. package/transpiled/directives/auth/Authorization.d.ts +20 -0
  262. package/transpiled/directives/auth/Authorization.js +125 -0
  263. package/transpiled/directives/auth/Authorization.js.map +1 -0
  264. package/transpiled/directives/auth/Echo.d.ts +6 -0
  265. package/transpiled/directives/auth/Echo.js +13 -0
  266. package/transpiled/directives/auth/Echo.js.map +1 -0
  267. package/transpiled/directives/auth/Id.d.ts +7 -0
  268. package/transpiled/directives/auth/Id.js +17 -0
  269. package/transpiled/directives/auth/Id.js.map +1 -0
  270. package/transpiled/directives/auth/Incept.d.ts +10 -0
  271. package/transpiled/directives/auth/Incept.js +58 -0
  272. package/transpiled/directives/auth/Incept.js.map +1 -0
  273. package/transpiled/directives/auth/Role.d.ts +11 -0
  274. package/transpiled/directives/auth/Role.js +44 -0
  275. package/transpiled/directives/auth/Role.js.map +1 -0
  276. package/transpiled/directives/auth/Rule.d.ts +9 -0
  277. package/transpiled/directives/auth/Rule.js +22 -0
  278. package/transpiled/directives/auth/Rule.js.map +1 -0
  279. package/transpiled/directives/auth/Scheme.d.ts +7 -0
  280. package/transpiled/directives/auth/Scheme.js +47 -0
  281. package/transpiled/directives/auth/Scheme.js.map +1 -0
  282. package/transpiled/directives/auth/index.d.ts +2 -0
  283. package/transpiled/directives/auth/index.js +6 -0
  284. package/transpiled/directives/auth/index.js.map +1 -0
  285. package/transpiled/directives/auth/schemes.d.ts +3 -0
  286. package/transpiled/directives/auth/schemes.js +10 -0
  287. package/transpiled/directives/auth/schemes.js.map +1 -0
  288. package/transpiled/directives/auth/split.d.ts +2 -0
  289. package/transpiled/directives/auth/split.js +38 -0
  290. package/transpiled/directives/auth/split.js.map +1 -0
  291. package/transpiled/directives/auth/types.d.ts +31 -0
  292. package/transpiled/directives/auth/types.js +3 -0
  293. package/transpiled/directives/auth/types.js.map +1 -0
  294. package/transpiled/directives/cache/Cache.d.ts +11 -0
  295. package/transpiled/directives/cache/Cache.js +28 -0
  296. package/transpiled/directives/cache/Cache.js.map +1 -0
  297. package/transpiled/directives/cache/Control.d.ts +9 -0
  298. package/transpiled/directives/cache/Control.js +42 -0
  299. package/transpiled/directives/cache/Control.js.map +1 -0
  300. package/transpiled/directives/cache/Exact.d.ts +4 -0
  301. package/transpiled/directives/cache/Exact.js +11 -0
  302. package/transpiled/directives/cache/Exact.js.map +1 -0
  303. package/transpiled/directives/cache/index.d.ts +2 -0
  304. package/transpiled/directives/cache/index.js +6 -0
  305. package/transpiled/directives/cache/index.js.map +1 -0
  306. package/transpiled/directives/cache/types.d.ts +7 -0
  307. package/transpiled/directives/cache/types.js +3 -0
  308. package/transpiled/directives/cache/types.js.map +1 -0
  309. package/transpiled/directives/cors/CORS.d.ts +14 -0
  310. package/transpiled/directives/cors/CORS.js +42 -0
  311. package/transpiled/directives/cors/CORS.js.map +1 -0
  312. package/transpiled/directives/cors/index.d.ts +2 -0
  313. package/transpiled/directives/cors/index.js +6 -0
  314. package/transpiled/directives/cors/index.js.map +1 -0
  315. package/transpiled/directives/dev/Development.d.ts +9 -0
  316. package/transpiled/directives/dev/Development.js +29 -0
  317. package/transpiled/directives/dev/Development.js.map +1 -0
  318. package/transpiled/directives/dev/Stub.d.ts +7 -0
  319. package/transpiled/directives/dev/Stub.js +14 -0
  320. package/transpiled/directives/dev/Stub.js.map +1 -0
  321. package/transpiled/directives/dev/Throw.d.ts +7 -0
  322. package/transpiled/directives/dev/Throw.js +14 -0
  323. package/transpiled/directives/dev/Throw.js.map +1 -0
  324. package/transpiled/directives/dev/index.d.ts +2 -0
  325. package/transpiled/directives/dev/index.js +6 -0
  326. package/transpiled/directives/dev/index.js.map +1 -0
  327. package/transpiled/directives/dev/types.d.ts +4 -0
  328. package/transpiled/directives/dev/types.js +3 -0
  329. package/transpiled/directives/dev/types.js.map +1 -0
  330. package/transpiled/directives/index.d.ts +4 -0
  331. package/transpiled/directives/index.js +12 -0
  332. package/transpiled/directives/index.js.map +1 -0
  333. package/transpiled/directives/octets/Context.d.ts +8 -0
  334. package/transpiled/directives/octets/Context.js +40 -0
  335. package/transpiled/directives/octets/Context.js.map +1 -0
  336. package/transpiled/directives/octets/Delete.d.ts +10 -0
  337. package/transpiled/directives/octets/Delete.js +47 -0
  338. package/transpiled/directives/octets/Delete.js.map +1 -0
  339. package/transpiled/directives/octets/Fetch.d.ts +18 -0
  340. package/transpiled/directives/octets/Fetch.js +77 -0
  341. package/transpiled/directives/octets/Fetch.js.map +1 -0
  342. package/transpiled/directives/octets/List.d.ts +10 -0
  343. package/transpiled/directives/octets/List.js +47 -0
  344. package/transpiled/directives/octets/List.js.map +1 -0
  345. package/transpiled/directives/octets/Octets.d.ts +11 -0
  346. package/transpiled/directives/octets/Octets.js +51 -0
  347. package/transpiled/directives/octets/Octets.js.map +1 -0
  348. package/transpiled/directives/octets/Permute.d.ts +10 -0
  349. package/transpiled/directives/octets/Permute.js +51 -0
  350. package/transpiled/directives/octets/Permute.js.map +1 -0
  351. package/transpiled/directives/octets/Store.d.ts +33 -0
  352. package/transpiled/directives/octets/Store.js +124 -0
  353. package/transpiled/directives/octets/Store.js.map +1 -0
  354. package/transpiled/directives/octets/index.d.ts +2 -0
  355. package/transpiled/directives/octets/index.js +6 -0
  356. package/transpiled/directives/octets/index.js.map +1 -0
  357. package/transpiled/directives/octets/schemas.d.ts +6 -0
  358. package/transpiled/directives/octets/schemas.js +17 -0
  359. package/transpiled/directives/octets/schemas.js.map +1 -0
  360. package/transpiled/directives/octets/types.d.ts +9 -0
  361. package/transpiled/directives/octets/types.js +3 -0
  362. package/transpiled/directives/octets/types.js.map +1 -0
  363. package/transpiled/directives/vary/Directive.d.ts +5 -0
  364. package/transpiled/directives/vary/Directive.js +3 -0
  365. package/transpiled/directives/vary/Directive.js.map +1 -0
  366. package/transpiled/directives/vary/Embed.d.ts +10 -0
  367. package/transpiled/directives/vary/Embed.js +49 -0
  368. package/transpiled/directives/vary/Embed.js.map +1 -0
  369. package/transpiled/directives/vary/Properties.d.ts +9 -0
  370. package/transpiled/directives/vary/Properties.js +16 -0
  371. package/transpiled/directives/vary/Properties.js.map +1 -0
  372. package/transpiled/directives/vary/Vary.d.ts +10 -0
  373. package/transpiled/directives/vary/Vary.js +36 -0
  374. package/transpiled/directives/vary/Vary.js.map +1 -0
  375. package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
  376. package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
  377. package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
  378. package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
  379. package/transpiled/directives/vary/embeddings/Header.js +26 -0
  380. package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
  381. package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
  382. package/transpiled/directives/vary/embeddings/Language.js +28 -0
  383. package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
  384. package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
  385. package/transpiled/directives/vary/embeddings/index.js +10 -0
  386. package/transpiled/directives/vary/embeddings/index.js.map +1 -0
  387. package/transpiled/directives/vary/index.d.ts +2 -0
  388. package/transpiled/directives/vary/index.js +6 -0
  389. package/transpiled/directives/vary/index.js.map +1 -0
  390. package/transpiled/discovery.d.ts +1 -0
  391. package/transpiled/discovery.js +3 -0
  392. package/transpiled/discovery.js.map +1 -0
  393. package/transpiled/exceptions.d.ts +2 -0
  394. package/transpiled/exceptions.js +39 -0
  395. package/transpiled/exceptions.js.map +1 -0
  396. package/transpiled/index.d.ts +5 -0
  397. package/transpiled/index.js +12 -0
  398. package/transpiled/index.js.map +1 -0
  399. package/transpiled/io.d.ts +3 -0
  400. package/transpiled/io.js +3 -0
  401. package/transpiled/io.js.map +1 -0
  402. package/transpiled/manifest.d.ts +3 -0
  403. package/transpiled/manifest.js +61 -0
  404. package/transpiled/manifest.js.map +1 -0
  405. package/transpiled/root.d.ts +2 -0
  406. package/transpiled/root.js +39 -0
  407. package/transpiled/root.js.map +1 -0
  408. package/transpiled/schemas.d.ts +3 -0
  409. package/transpiled/schemas.js +14 -0
  410. package/transpiled/schemas.js.map +1 -0
  411. package/transpiled/tsconfig.tsbuildinfo +1 -0
package/source/Factory.ts CHANGED
@@ -4,19 +4,18 @@ import { Remotes } from './Remotes'
4
4
  import { Tree, syntax } from './RTD'
5
5
  import { Server } from './HTTP'
6
6
  import { type Endpoint, EndpointsFactory } from './Endpoint'
7
- import * as directives from './directives'
8
- import { type Directives, DirectivesFactory, type Family } from './Directive'
7
+ import { families, interceptors } from './directives'
8
+ import { type Directives, DirectivesFactory } from './Directive'
9
9
  import { Composition } from './Composition'
10
10
  import * as root from './root'
11
+ import { Interception } from './Interception'
11
12
  import type { Connector, Locator, extensions } from '@toa.io/core'
12
13
 
13
14
  export class Factory implements extensions.Factory {
14
15
  private readonly boot: Bootloader
15
- private readonly families: Family[]
16
16
 
17
17
  public constructor (boot: Bootloader) {
18
18
  this.boot = boot
19
- this.families = directives.families
20
19
  }
21
20
 
22
21
  public tenant (locator: Locator, node: syntax.Node): Connector {
@@ -32,16 +31,18 @@ export class Factory implements extensions.Factory {
32
31
  const remotes = new Remotes(this.boot)
33
32
  const node = root.resolve()
34
33
  const methods = new EndpointsFactory(remotes)
35
- const directives = new DirectivesFactory(this.families, remotes)
34
+ const directives = new DirectivesFactory(families, remotes)
35
+ const interception = new Interception(interceptors)
36
36
  const tree = new Tree<Endpoint, Directives>(node, methods, directives)
37
37
 
38
38
  const composition = new Composition(this.boot)
39
- const gateway = new Gateway(broadcast, server, tree)
39
+ const gateway = new Gateway(broadcast, server, tree, interception)
40
40
 
41
41
  gateway.depends(remotes)
42
42
  gateway.depends(composition)
43
+ server.depends(gateway)
43
44
 
44
- return gateway
45
+ return server
45
46
  }
46
47
  }
47
48
 
package/source/Gateway.ts CHANGED
@@ -1,25 +1,31 @@
1
1
  import { type bindings, Connector } from '@toa.io/core'
2
- import { type Maybe } from '@toa.io/types'
3
2
  import * as http from './HTTP'
4
3
  import { rethrow } from './exceptions'
5
- import { type Method, type Parameter, type Tree } from './RTD'
6
- import { type Label } from './discovery'
7
- import { type Branch } from './Branch'
8
- import { type Endpoint } from './Endpoint'
9
- import { type Directives } from './Directive'
4
+ import type { Interceptor } from './Interception'
5
+ import type { Maybe } from '@toa.io/types'
6
+ import type { Method, Parameter, Tree } from './RTD'
7
+ import type { Label } from './discovery'
8
+ import type { Branch } from './Branch'
9
+ import type { Endpoint } from './Endpoint'
10
+ import type { Directives } from './Directive'
10
11
 
11
12
  export class Gateway extends Connector {
12
13
  private readonly broadcast: Broadcast
13
14
  private readonly tree: Tree<Endpoint, Directives>
15
+ private readonly interceptor: Interceptor
16
+ private readonly server: Connector
14
17
 
15
- public constructor (broadcast: Broadcast, server: http.Server, tree: Tree<Endpoint, Directives>) {
18
+ // eslint-disable-next-line max-params, max-len
19
+ public constructor (broadcast: Broadcast, server: http.Server, tree: Tree<Endpoint, Directives>, interception: Interceptor) {
16
20
  super()
17
21
 
18
22
  this.broadcast = broadcast
19
23
  this.tree = tree
24
+ this.interceptor = interception
25
+ this.server = server
20
26
 
21
27
  this.depends(broadcast)
22
- this.depends(server)
28
+ // this.depends(server)
23
29
 
24
30
  server.attach(this.process.bind(this))
25
31
  }
@@ -35,6 +41,11 @@ export class Gateway extends Connector {
35
41
  }
36
42
 
37
43
  private async process (request: http.IncomingMessage): Promise<http.OutgoingMessage> {
44
+ const interception = await this.interceptor.intercept(request)
45
+
46
+ if (interception !== null)
47
+ return interception
48
+
38
49
  const match = this.tree.match(request.path)
39
50
 
40
51
  if (match === null)
@@ -68,6 +79,9 @@ export class Gateway extends Connector {
68
79
 
69
80
  const body = await request.parse()
70
81
 
82
+ if ('embed' in request && typeof body === 'object' && body !== null)
83
+ Object.assign(body, request.embed)
84
+
71
85
  const reply = await method.endpoint
72
86
  .call(body, request.query, parameters)
73
87
  .catch(rethrow) as Maybe<unknown>
@@ -1,4 +1,3 @@
1
- import { Buffer } from 'buffer'
2
1
  import { Readable } from 'stream'
3
2
  import type { IncomingMessage } from './messages'
4
3
  import type * as http from 'node:http'
@@ -1,199 +1,126 @@
1
+ import { randomUUID } from 'node:crypto'
1
2
  import { Connector } from '@toa.io/core'
2
- import { immediate } from '@toa.io/generic'
3
- import { generate } from 'randomstring'
4
3
  import { type Processing, Server } from './Server'
5
4
  import { type OutgoingMessage } from './messages'
6
- import { express, cors, createRequest, res, next } from './Server.fixtures'
7
5
  import { BadRequest } from './exceptions'
8
- import type { Express, Request, RequestHandler } from 'express'
9
- import type { CorsOptions } from 'cors'
10
- import type http from 'node:http'
11
-
12
- jest.mock('express', () => () => express())
13
- jest.mock('cors', () => (options: CorsOptions) => cors(options))
14
6
 
15
7
  let server: Server
16
- let app: jest.MockedObject<Express>
17
-
18
- beforeEach(() => {
19
- jest.clearAllMocks()
20
8
 
21
- server = Server.create()
22
- app = express.mock.results[0]?.value
9
+ beforeAll(() => {
10
+ server = Server.create({ port: 0 })
23
11
  })
24
12
 
25
13
  it('should instance of connector', async () => {
26
14
  expect(server).toBeInstanceOf(Connector)
27
15
  })
28
16
 
29
- it('should create express app', async () => {
30
- expect(express).toHaveBeenCalled()
31
- expect(app.disable).toHaveBeenCalledWith('x-powered-by')
32
- })
33
-
34
- it('should support cors', async () => {
35
- expect(cors).toHaveBeenCalledWith({ allowedHeaders: ['content-type'] } satisfies CorsOptions)
36
-
37
- const middleware = cors.mock.results[0].value
38
-
39
- expect(app.use).toHaveBeenCalledWith(middleware)
40
- })
41
-
42
17
  it('should start HTTP server', async () => {
43
- const stared = server.connect()
44
-
45
- await immediate()
46
-
47
- expect(app.listen).toHaveBeenCalledWith(8000, expect.anything())
48
-
49
- const done = app.listen.mock.calls[0][1]
50
-
51
- if (done !== undefined) done()
18
+ await server.connect()
52
19
 
53
- await stared
54
- })
55
-
56
- it('should stop HTTP server', async () => {
57
- const started = server.connect()
58
-
59
- await immediate()
60
-
61
- app.listen.mock.calls[0][1]?.() // `listen` callback
62
-
63
- await started
64
-
65
- const stopped = server.disconnect()
66
- const httpServer: jest.MockedObject<http.Server> = app.listen.mock.results[0].value
67
-
68
- await immediate()
69
-
70
- expect(httpServer.close).toHaveBeenCalled()
71
-
72
- httpServer.close.mock.calls[0][0]?.() // `close` callback
73
-
74
- await stopped
20
+ expect(server.connected).toBeTruthy()
21
+ expect(server.port).toBeGreaterThan(0)
75
22
  })
76
23
 
77
24
  it('should register request handler', async () => {
78
- const process = jest.fn(async () => ({})) as unknown as Processing
79
- const req = createRequest()
25
+ const process: Processing = jest.fn().mockResolvedValue(undefined)
80
26
 
81
27
  server.attach(process)
82
28
 
83
- await use(req)
29
+ const res = await fetch(`http://localhost:${server.port}`)
30
+
31
+ await res.text()
84
32
 
85
- expect(process).toHaveBeenCalled()
33
+ expect(process).toHaveBeenCalledTimes(1)
86
34
  })
87
35
 
88
36
  it('should send 501 on unknown method', async () => {
89
- const req = createRequest({ method: generate() })
37
+ const head = await fetch(`http://localhost:${server.port}/`, { method: 'COPY' })
90
38
 
91
- await use(req)
39
+ await head.text()
40
+ expect(head.status).toBe(501)
41
+ })
92
42
 
93
- expect(res.sendStatus).toHaveBeenCalledWith(501)
43
+ it('should stop HTTP server', async () => {
44
+ await server.disconnect()
45
+ expect(server.port).toBe(0)
46
+ expect(server.connected).toBeFalsy()
94
47
  })
95
48
 
96
49
  describe('result', () => {
97
- it('should send status code 200 if the result has a value', async () => {
98
- const req = createRequest()
50
+ beforeEach(async () => {
51
+ server = Server.create({ port: 0 })
52
+ await server.connect()
53
+ })
54
+
55
+ afterEach(async () => {
56
+ await server.disconnect()
57
+ })
99
58
 
59
+ it('should send status code 200 if the result has a value', async () => {
100
60
  server.attach(async (): Promise<OutgoingMessage> => ({
101
- headers: new Headers(), body: generate()
61
+ headers: new Headers(), body: randomUUID()
102
62
  }))
103
- await use(req)
104
63
 
105
- expect(res.status).toHaveBeenCalledWith(200)
64
+ const res = await fetch(`http://localhost:${server.port}/`)
65
+
66
+ await res.text()
67
+ expect(res.status).toBe(200)
106
68
  })
107
69
 
108
70
  it('should send status code 204 if the result has no value', async () => {
109
- const req = createRequest()
110
-
111
71
  server.attach(async (): Promise<OutgoingMessage> => ({ headers: new Headers() }))
112
- await use(req)
113
72
 
114
- expect(res.status).toHaveBeenCalledWith(204)
73
+ const res = await fetch(`http://localhost:${server.port}/`)
74
+
75
+ await res.text()
76
+ expect(res.status).toBe(204)
115
77
  })
116
78
 
117
79
  it('should send result', async () => {
118
- const body = { [generate()]: generate() }
119
- const json = JSON.stringify(body)
120
- const buf = Buffer.from(json)
121
- const req = createRequest({ headers: { accept: 'application/json' } })
80
+ const body = { [randomUUID()]: randomUUID() }
122
81
 
123
- server.attach(async (): Promise<OutgoingMessage> => ({ headers: new Headers(), body }))
124
- await use(req)
82
+ server.attach(async (): Promise<OutgoingMessage> =>
83
+ ({ headers: new Headers(), body }))
125
84
 
126
- expect(res.end).toHaveBeenCalledWith(buf)
127
- })
85
+ const res = await fetch(`http://localhost:${server.port}/`,
86
+ { headers: { accept: 'application/json' } })
128
87
 
129
- it('should return 500 on exception', async () => {
130
- async function process (): Promise<OutgoingMessage> {
131
- throw new Error('Bad')
132
- }
88
+ const result = await res.json()
133
89
 
134
- const req = createRequest()
135
-
136
- server.attach(process)
137
- await use(req)
138
-
139
- expect(res.status).toHaveBeenCalledWith(500)
90
+ expect(result).toEqual(body)
140
91
  })
141
92
 
142
- it('should output exception message if debug is enabled', async () => {
143
- jest.clearAllMocks()
144
-
145
- server = Server.create({ debug: true })
146
- app = express.mock.results[0]?.value
147
-
148
- const message = generate()
149
- const req = createRequest()
150
-
151
- async function process (): Promise<OutgoingMessage> {
152
- throw new Error(message)
153
- }
93
+ it('should return 500 on exception', async () => {
94
+ server.attach(jest.fn().mockRejectedValue(new Error('Bad')))
154
95
 
155
- server.attach(process)
156
- await use(req)
96
+ const res = await fetch(`http://localhost:${server.port}/`)
157
97
 
158
- expect(res.status).toHaveBeenCalledWith(500)
98
+ await res.text()
99
+ expect(res.status).toBe(500)
159
100
  })
160
101
 
161
102
  it('should send client error', async () => {
162
- const req = createRequest()
163
- const message = generate()
103
+ const message = randomUUID()
164
104
 
165
- async function process (): Promise<OutgoingMessage> {
166
- throw new BadRequest(message)
167
- }
105
+ server.attach(jest.fn().mockRejectedValueOnce(new BadRequest(message)))
168
106
 
169
- server.attach(process)
170
- await use(req)
107
+ const res = await fetch(`http://localhost:${server.port}/`)
108
+ const text = await res.text()
171
109
 
172
- expect(res.status).toHaveBeenCalledWith(400)
110
+ expect(res.status).toBe(400)
111
+ expect(text).toContain(message)
173
112
  })
174
113
  })
175
114
 
176
115
  describe('options', () => {
177
116
  it('should send 501 on unspecified method', async () => {
178
- jest.clearAllMocks()
117
+ server = Server.create({ methods: new Set(['COPY']), port: 0 })
118
+ await server.connect()
179
119
 
180
- server = Server.create({ methods: new Set(['COPY']) })
181
- app = express.mock.results[0]?.value
120
+ const res = await fetch(`http://localhost:${server.port}/`)
182
121
 
183
- const req = createRequest({ method: 'GET' })
184
-
185
- await use(req)
186
-
187
- expect(res.sendStatus).toHaveBeenCalledWith(501)
122
+ await res.text()
123
+ await server.disconnect()
124
+ expect(res.status).toBe(501)
188
125
  })
189
126
  })
190
-
191
- async function use (req: Request): Promise<void> {
192
- for (const call of app.use.mock.calls) {
193
- const usage = call[0] as unknown as RequestHandler
194
-
195
- usage(req, res, next)
196
- }
197
-
198
- await immediate()
199
- }
@@ -1,7 +1,6 @@
1
1
  import fs from 'node:fs'
2
2
  import os from 'node:os'
3
3
  import express from 'express'
4
- import cors from 'cors'
5
4
  import { Connector } from '@toa.io/core'
6
5
  import { promex } from '@toa.io/generic'
7
6
  import Negotiator from 'negotiator'
@@ -13,44 +12,53 @@ import type * as http from 'node:http'
13
12
  import type { Express, Request, Response, NextFunction } from 'express'
14
13
 
15
14
  export class Server extends Connector {
16
- private readonly debug: boolean
17
- private readonly app: Express
18
15
  private server?: http.Server
19
16
 
20
- private constructor (app: Express, debug: boolean) {
17
+ private constructor (private readonly app: Express,
18
+ private readonly debug: boolean,
19
+ private readonly requestedPort: number) {
21
20
  super()
21
+ }
22
+
23
+ public get port (): number {
24
+ if (this.server === undefined) return this.requestedPort
25
+
26
+ const address = this.server.address()
22
27
 
23
- this.app = app
24
- this.debug = debug
28
+ if (address === null || typeof address === 'string')
29
+ throw new Error('Server is not listening on a port.')
30
+
31
+ return address.port
25
32
  }
26
33
 
27
34
  public static create (options?: Partial<Properties>): Server {
28
- const properties: Properties = options === undefined
35
+ const properties = options === undefined
29
36
  ? DEFAULTS
30
37
  : { ...DEFAULTS, ...options }
31
38
 
32
39
  const app = express()
33
40
 
34
41
  app.disable('x-powered-by')
35
- app.use(cors({ allowedHeaders: ['content-type'] }))
42
+ // app.use(cors(CORS))
36
43
  app.use(supportedMethods(properties.methods))
37
44
 
38
- return new Server(app, properties.debug)
45
+ return new Server(app, properties.debug, properties.port)
39
46
  }
40
47
 
41
48
  public attach (process: Processing): void {
42
- this.app.use((request: any, response: Response) => {
43
- this.extend(request)
44
- .then(process)
45
- .then(this.success(request, response))
46
- .catch(this.fail(request, response))
49
+ this.app.use((request: Request, response: Response) => {
50
+ const message = this.extend(request)
51
+
52
+ process(message)
53
+ .then(this.success(message, response))
54
+ .catch(this.fail(message, response))
47
55
  })
48
56
  }
49
57
 
50
58
  protected override async open (): Promise<void> {
51
59
  const listening = promex()
52
60
 
53
- this.server = this.app.listen(8000, listening.callback)
61
+ this.server = this.app.listen(this.requestedPort, listening.callback)
54
62
 
55
63
  await listening
56
64
 
@@ -63,23 +71,35 @@ export class Server extends Connector {
63
71
  this.server?.close(stopped.callback)
64
72
 
65
73
  await stopped
66
- }
67
74
 
68
- protected override dispose (): void {
75
+ this.server = undefined
76
+
69
77
  console.info('HTTP Server has been stopped.')
70
78
  }
71
79
 
72
- private async extend (request: IncomingMessage): Promise<IncomingMessage> {
73
- const message = request as unknown as IncomingMessage
80
+ private extend (request: Request): IncomingMessage {
81
+ const message = request as IncomingMessage
74
82
 
75
83
  message.encoder = negotiate(request)
76
- message.parse = async <T> (): Promise<T> => await read(request)
84
+ message.pipelines = { body: [], response: [] }
85
+
86
+ message.parse = async <T> (): Promise<T> => {
87
+ const value = await read(request)
88
+
89
+ if (message.pipelines.body.length === 0)
90
+ return value
91
+
92
+ return message.pipelines.body.reduce((value, transform) => transform(value), value)
93
+ }
77
94
 
78
95
  return message
79
96
  }
80
97
 
81
98
  private success (request: IncomingMessage, response: Response) {
82
99
  return (message: OutgoingMessage) => {
100
+ for (const transform of request.pipelines.response)
101
+ transform(message)
102
+
83
103
  let status = message.status
84
104
 
85
105
  if (status === undefined)
@@ -149,14 +169,16 @@ async function adam (request: Request): Promise<void> {
149
169
  return await completed
150
170
  }
151
171
 
152
- const DEFAULTS = {
153
- methods: new Set<string>(['GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE']),
154
- debug: false
172
+ const DEFAULTS: Properties = {
173
+ methods: new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']),
174
+ debug: false,
175
+ port: 8000
155
176
  }
156
177
 
157
178
  interface Properties {
158
179
  methods: Set<string>
159
180
  debug: boolean
181
+ port: number
160
182
  }
161
183
 
162
184
  export type Processing = (input: IncomingMessage) => Promise<OutgoingMessage>
@@ -1,13 +1,16 @@
1
1
  import { type Buffer } from 'node:buffer'
2
- import * as msgpack from 'msgpackr'
3
-
4
- export const type = 'application/msgpack'
5
- export const multipart = 'multipart/msgpack'
2
+ import { pack, unpack } from 'msgpackr'
6
3
 
7
4
  export function decode (buffer: Buffer): any {
8
- return msgpack.decode(buffer)
5
+ return unpack(buffer)
9
6
  }
10
7
 
11
8
  export function encode (value: any): Buffer {
12
- return msgpack.encode(value)
9
+ if (typeof value === 'object' && value !== null)
10
+ Object.setPrototypeOf(value, null)
11
+
12
+ return pack(value)
13
13
  }
14
+
15
+ export const type = 'application/msgpack'
16
+ export const multipart = 'multipart/msgpack'
@@ -7,6 +7,6 @@ export function decode (buffer: Buffer): any {
7
7
  return buffer.toString()
8
8
  }
9
9
 
10
- export function encode (value: any): Buffer {
10
+ export function encode (value: { toString: () => string }): Buffer {
11
11
  return Buffer.from(value.toString())
12
12
  }
@@ -11,7 +11,7 @@ export function decode (buffer: Buffer): any {
11
11
  }
12
12
 
13
13
  export function encode (value: any): Buffer {
14
- const text = yaml.dump(value)
14
+ const text = yaml.dump(value, { lineWidth: -1, noRefs: true })
15
15
 
16
16
  return Buffer.from(text)
17
17
  }
@@ -47,8 +47,10 @@ function send (message: OutgoingMessage, request: IncomingMessage, response: Res
47
47
 
48
48
  const buf = request.encoder.encode(message.body)
49
49
 
50
- response.set('content-type', request.encoder.type)
51
- response.end(buf)
50
+ response
51
+ .set('content-type', request.encoder.type)
52
+ .append('vary', 'accept')
53
+ .end(buf)
52
54
  }
53
55
 
54
56
  function stream
@@ -97,6 +99,10 @@ export interface IncomingMessage extends Request {
97
99
  query: Query
98
100
  parse: <T> () => Promise<T>
99
101
  encoder: Format | null
102
+ pipelines: {
103
+ body: Array<(input: unknown) => unknown>
104
+ response: Array<(output: OutgoingMessage) => void>
105
+ }
100
106
  }
101
107
 
102
108
  export interface OutgoingMessage {
@@ -0,0 +1,24 @@
1
+ import type { Input, Output } from './io'
2
+
3
+ export class Interception implements Interceptor {
4
+ private readonly interceptors: Interceptor[]
5
+
6
+ public constructor (interceptors: Interceptor[]) {
7
+ this.interceptors = interceptors
8
+ }
9
+
10
+ public async intercept (input: Input): Promise<Output> {
11
+ for (const interceptor of this.interceptors) {
12
+ const output = await interceptor.intercept(input)
13
+
14
+ if (output !== null)
15
+ return output
16
+ }
17
+
18
+ return null
19
+ }
20
+ }
21
+
22
+ export interface Interceptor {
23
+ intercept: (input: Input) => Output | Promise<Output>
24
+ }
@@ -1,7 +1,7 @@
1
1
  import type * as syntax from './syntax'
2
2
 
3
- export interface Directives<T = any> {
4
- merge: (directive: T) => void
3
+ export interface Directives<TDirective = any> {
4
+ merge: (directive: TDirective) => void
5
5
  }
6
6
 
7
7
  export interface DirectivesFactory<T = any> {
@@ -25,6 +25,9 @@ export class Tree<
25
25
  }
26
26
 
27
27
  public match (path: string): Match<TEndpoint, TDirectives> | null {
28
+ if (path === '/')
29
+ return { node: this.trunk, parameters: [] }
30
+
28
31
  const fragments = fragment(path)
29
32
 
30
33
  return this.trunk.match(fragments)
@@ -28,7 +28,7 @@ function parseNode (input: object, shortcuts?: Shortcuts): Node {
28
28
  }
29
29
 
30
30
  if (key[0] === '/') {
31
- const route = parseRoute(key, value, shortcuts)
31
+ const route = parseRoute(key, value as Node, shortcuts)
32
32
 
33
33
  node.routes.push(route)
34
34
 
@@ -36,7 +36,7 @@ function parseNode (input: object, shortcuts?: Shortcuts): Node {
36
36
  }
37
37
 
38
38
  if (verbs.has(key)) {
39
- const method = parseMethod(key, value, shortcuts)
39
+ const method = parseMethod(key, value as Mapping, shortcuts)
40
40
 
41
41
  node.methods.push(method)
42
42
 
@@ -65,7 +65,7 @@ export function createNode (): Node {
65
65
  }
66
66
  }
67
67
 
68
- function parseRoute (path: string, value: object, shortcuts?: Shortcuts): Route {
68
+ function parseRoute (path: string, value: Node, shortcuts?: Shortcuts): Route {
69
69
  const node = parse(value, shortcuts)
70
70
 
71
71
  return createRoute(path, node)
@@ -106,10 +106,10 @@ function parseQuery (mapping: any): void {
106
106
  return
107
107
 
108
108
  if (typeof query.limit === 'number')
109
- query.limit = expandRange(query.limit)
109
+ query.limit = expandRange(query.limit as number)
110
110
 
111
111
  if (typeof query.omit === 'number')
112
- query.omit = expandRange(query.omit)
112
+ query.omit = expandRange(query.omit as number)
113
113
  }
114
114
 
115
115
  function parseDirectives (mapping: Record<string, any>, shortcuts?: Shortcuts): Directive[] {
@@ -132,7 +132,7 @@ function parseDirectives (mapping: Record<string, any>, shortcuts?: Shortcuts):
132
132
 
133
133
  function parseDirective (key: string, value: any, shortcuts?: Shortcuts): Directive | null {
134
134
  if (shortcuts?.has(key) === true)
135
- key = shortcuts.get(key) as string
135
+ key = shortcuts.get(key)! // eslint-disable-line @typescript-eslint/no-non-null-assertion
136
136
 
137
137
  const match = key.match(DIRECTIVE_RX)
138
138
 
@@ -45,4 +45,4 @@ export interface Range {
45
45
  range: [number, number]
46
46
  }
47
47
 
48
- export const verbs = new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE'])
48
+ export const verbs = new Set<string>(['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'])