@toa.io/extensions.exposition 0.24.0-alpha.9 → 1.0.0-alpha.10

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 (444) hide show
  1. package/components/context.toa.yaml +12 -0
  2. package/components/identity.bans/manifest.toa.yaml +2 -1
  3. package/components/identity.basic/manifest.toa.yaml +5 -1
  4. package/components/identity.basic/operations/authenticate.js +1 -2
  5. package/components/identity.basic/operations/authenticate.js.map +1 -1
  6. package/components/identity.basic/operations/transit.js.map +1 -1
  7. package/components/identity.basic/operations/tsconfig.tsbuildinfo +1 -1
  8. package/components/identity.basic/source/authenticate.ts +0 -1
  9. package/components/identity.federation/events/principal.js +22 -0
  10. package/components/identity.federation/manifest.toa.yaml +94 -0
  11. package/components/identity.federation/operations/authenticate.d.ts +3 -0
  12. package/components/identity.federation/operations/authenticate.js +20 -0
  13. package/components/identity.federation/operations/authenticate.js.map +1 -0
  14. package/components/identity.federation/operations/create.d.ts +10 -0
  15. package/components/identity.federation/operations/create.js +15 -0
  16. package/components/identity.federation/operations/create.js.map +1 -0
  17. package/components/identity.federation/operations/lib/assertions-as-values.d.ts +4 -0
  18. package/components/identity.federation/operations/lib/assertions-as-values.js +45 -0
  19. package/components/identity.federation/operations/lib/assertions-as-values.js.map +1 -0
  20. package/components/identity.federation/operations/lib/jwt.d.ts +20 -0
  21. package/components/identity.federation/operations/lib/jwt.js +136 -0
  22. package/components/identity.federation/operations/lib/jwt.js.map +1 -0
  23. package/components/identity.federation/operations/schemas.d.ts +59 -0
  24. package/components/identity.federation/operations/schemas.js +9 -0
  25. package/components/identity.federation/operations/schemas.js.map +1 -0
  26. package/components/identity.federation/operations/tsconfig.tsbuildinfo +1 -0
  27. package/components/identity.federation/operations/types.d.ts +51 -0
  28. package/components/identity.federation/operations/types.js +3 -0
  29. package/components/identity.federation/operations/types.js.map +1 -0
  30. package/components/identity.federation/source/authenticate.ts +28 -0
  31. package/components/identity.federation/source/create.ts +26 -0
  32. package/components/identity.federation/source/lib/assertions-as-values.ts +19 -0
  33. package/components/identity.federation/source/lib/jwt.test.ts +56 -0
  34. package/components/identity.federation/source/lib/jwt.ts +171 -0
  35. package/components/identity.federation/source/schemas.ts +61 -0
  36. package/components/identity.federation/source/types.ts +56 -0
  37. package/components/identity.federation/tsconfig.json +9 -0
  38. package/components/identity.roles/manifest.toa.yaml +17 -5
  39. package/components/identity.roles/operations/grant.d.ts +10 -0
  40. package/components/identity.roles/operations/grant.js +20 -0
  41. package/components/identity.roles/operations/grant.js.map +1 -0
  42. package/components/identity.roles/operations/lib/Entity.d.ts +5 -0
  43. package/components/identity.roles/operations/lib/Entity.js +3 -0
  44. package/components/identity.roles/operations/lib/Entity.js.map +1 -0
  45. package/components/identity.roles/operations/list.d.ts +1 -4
  46. package/components/identity.roles/operations/list.js.map +1 -1
  47. package/components/identity.roles/operations/principal.d.ts +4 -6
  48. package/components/identity.roles/operations/principal.js +6 -1
  49. package/components/identity.roles/operations/principal.js.map +1 -1
  50. package/components/identity.roles/operations/tsconfig.tsbuildinfo +1 -1
  51. package/components/identity.roles/source/grant.ts +31 -0
  52. package/components/identity.roles/source/lib/Entity.ts +5 -0
  53. package/components/identity.roles/source/list.ts +2 -4
  54. package/components/identity.roles/source/principal.ts +10 -8
  55. package/components/identity.tokens/manifest.toa.yaml +1 -1
  56. package/components/identity.tokens/operations/authenticate.js.map +1 -1
  57. package/components/identity.tokens/operations/decrypt.js.map +1 -1
  58. package/components/identity.tokens/operations/tsconfig.tsbuildinfo +1 -1
  59. package/components/octets.storage/manifest.toa.yaml +1 -0
  60. package/components/octets.storage/operations/store.js +3 -3
  61. package/cucumber.js +0 -1
  62. package/documentation/access.md +11 -11
  63. package/documentation/components.md +48 -12
  64. package/documentation/identity.md +14 -7
  65. package/documentation/io.md +56 -0
  66. package/documentation/octets.md +102 -37
  67. package/documentation/protocol.md +21 -1
  68. package/documentation/query.md +51 -6
  69. package/documentation/tree.md +22 -4
  70. package/documentation/vary.md +69 -0
  71. package/features/access.feature +13 -2
  72. package/features/annotation.feature +1 -0
  73. package/features/body.feature +3 -1
  74. package/features/cache.feature +3 -0
  75. package/features/cors.feature +72 -0
  76. package/features/directives.feature +2 -0
  77. package/features/dynamic.feature +14 -7
  78. package/features/errors.feature +4 -3
  79. package/features/etag.feature +97 -0
  80. package/features/identity.basic.feature +68 -0
  81. package/features/identity.feature +19 -3
  82. package/features/identity.federation.feature +153 -0
  83. package/features/identity.roles.feature +151 -0
  84. package/features/identity.tokens.feature +3 -0
  85. package/features/io.feature +167 -0
  86. package/features/octets.entries.feature +123 -0
  87. package/features/octets.feature +4 -28
  88. package/features/octets.meta.feature +66 -0
  89. package/features/octets.workflows.feature +177 -4
  90. package/features/queries.feature +9 -1
  91. package/features/response.feature +68 -0
  92. package/features/routes.feature +54 -10
  93. package/features/steps/Captures.ts +6 -0
  94. package/features/steps/Components.ts +18 -6
  95. package/features/steps/Database.ts +1 -1
  96. package/features/steps/Gateway.ts +4 -2
  97. package/features/steps/HTTP.ts +34 -6
  98. package/features/steps/IdP.ts +149 -0
  99. package/features/steps/Parameters.ts +8 -2
  100. package/features/steps/Workspace.ts +5 -7
  101. package/features/steps/components/echo/manifest.toa.yaml +1 -0
  102. package/features/steps/components/echo/operations/error.js +11 -0
  103. package/features/steps/components/greeter/manifest.toa.yaml +1 -0
  104. package/features/steps/components/octets.tester/manifest.toa.yaml +4 -0
  105. package/features/steps/components/octets.tester/operations/concat.js +7 -0
  106. package/features/steps/components/octets.tester/operations/echo.js +7 -0
  107. package/features/steps/components/pots/manifest.toa.yaml +12 -3
  108. package/features/steps/components/sequences/manifest.toa.yaml +1 -0
  109. package/features/steps/components/users/manifest.toa.yaml +4 -0
  110. package/features/steps/components/users.properties/manifest.toa.yaml +14 -0
  111. package/features/steps/tsconfig.json +1 -1
  112. package/features/timing.feature +66 -0
  113. package/features/vary.feature +180 -0
  114. package/package.json +16 -20
  115. package/readme.md +7 -6
  116. package/schemas/annotation.cos.yaml +1 -0
  117. package/schemas/io/input.cos.yaml +3 -0
  118. package/schemas/io/message.cos.yaml +5 -0
  119. package/schemas/io/output.cos.yaml +5 -0
  120. package/schemas/octets/delete.cos.yaml +2 -1
  121. package/schemas/octets/list.cos.yaml +2 -1
  122. package/schemas/octets/workflow.cos.yaml +12 -0
  123. package/schemas/querystring.cos.yaml +1 -0
  124. package/source/Annotation.ts +1 -0
  125. package/source/Context.ts +6 -4
  126. package/source/Directive.test.ts +14 -8
  127. package/source/Directive.ts +26 -49
  128. package/source/Endpoint.ts +53 -6
  129. package/source/Factory.ts +23 -12
  130. package/source/Gateway.ts +45 -42
  131. package/source/HTTP/Context.ts +67 -0
  132. package/source/HTTP/Server.test.ts +61 -134
  133. package/source/HTTP/Server.ts +83 -87
  134. package/source/HTTP/Timing.ts +40 -0
  135. package/source/HTTP/formats/msgpack.ts +9 -6
  136. package/source/HTTP/formats/text.ts +1 -1
  137. package/source/HTTP/formats/yaml.ts +1 -1
  138. package/source/HTTP/index.ts +1 -0
  139. package/source/HTTP/messages.test.ts +27 -8
  140. package/source/HTTP/messages.ts +38 -42
  141. package/source/Interception.ts +24 -0
  142. package/source/Mapping.ts +7 -8
  143. package/source/RTD/Context.ts +7 -10
  144. package/source/RTD/Directives.ts +28 -4
  145. package/source/RTD/Endpoint.ts +6 -4
  146. package/source/RTD/Match.ts +2 -7
  147. package/source/RTD/Method.ts +7 -13
  148. package/source/RTD/Node.ts +13 -14
  149. package/source/RTD/Tree.ts +19 -15
  150. package/source/RTD/factory.ts +2 -5
  151. package/source/RTD/syntax/parse.ts +6 -6
  152. package/source/RTD/syntax/types.ts +1 -1
  153. package/source/deployment.ts +7 -2
  154. package/source/directives/auth/Anonymous.ts +3 -2
  155. package/source/directives/auth/{Family.ts → Authorization.ts} +39 -40
  156. package/source/directives/auth/Delegate.ts +32 -0
  157. package/source/directives/auth/Incept.ts +11 -6
  158. package/source/directives/auth/Role.ts +5 -3
  159. package/source/directives/auth/Rule.ts +2 -2
  160. package/source/directives/auth/Scheme.ts +2 -2
  161. package/source/directives/auth/index.ts +2 -2
  162. package/source/directives/auth/schemes.ts +2 -1
  163. package/source/directives/auth/types.ts +9 -6
  164. package/source/directives/cache/{Family.ts → Cache.ts} +6 -7
  165. package/source/directives/cache/Control.ts +5 -5
  166. package/source/directives/cache/index.ts +2 -2
  167. package/source/directives/cache/types.ts +2 -2
  168. package/source/directives/cors/CORS.ts +62 -0
  169. package/source/directives/cors/index.ts +3 -0
  170. package/source/directives/dev/{Family.ts → Development.ts} +4 -5
  171. package/source/directives/dev/Stub.ts +4 -4
  172. package/source/directives/dev/Throw.ts +4 -4
  173. package/source/directives/dev/index.ts +2 -2
  174. package/source/directives/dev/types.ts +1 -1
  175. package/source/directives/index.ts +11 -6
  176. package/source/directives/io/Directive.ts +11 -0
  177. package/source/directives/io/IO.ts +43 -0
  178. package/source/directives/io/Input.ts +50 -0
  179. package/source/directives/io/Message.ts +1 -0
  180. package/source/directives/io/Output.ts +69 -0
  181. package/source/directives/io/index.ts +3 -0
  182. package/source/directives/io/schemas.ts +12 -0
  183. package/source/directives/octets/Context.ts +6 -5
  184. package/source/directives/octets/Delete.ts +64 -11
  185. package/source/directives/octets/Directive.ts +10 -0
  186. package/source/directives/octets/Fetch.ts +44 -29
  187. package/source/directives/octets/List.ts +50 -10
  188. package/source/directives/octets/{Family.ts → Octets.ts} +14 -9
  189. package/source/directives/octets/Permute.ts +18 -11
  190. package/source/directives/octets/Store.ts +70 -102
  191. package/source/directives/octets/Workflow.ts +48 -0
  192. package/source/directives/octets/index.ts +2 -2
  193. package/source/directives/octets/schemas.test.ts +21 -0
  194. package/source/directives/octets/schemas.ts +13 -6
  195. package/source/directives/octets/types.ts +2 -8
  196. package/source/directives/octets/workflows/Execution.ts +76 -0
  197. package/source/directives/octets/workflows/Workflow.ts +37 -0
  198. package/source/directives/octets/workflows/index.ts +1 -0
  199. package/source/directives/vary/Directive.ts +6 -0
  200. package/source/directives/vary/Embed.ts +62 -0
  201. package/source/directives/vary/Properties.ts +17 -0
  202. package/source/directives/vary/Vary.ts +48 -0
  203. package/source/directives/vary/embeddings/Embedding.ts +6 -0
  204. package/source/directives/vary/embeddings/Header.ts +32 -0
  205. package/source/directives/vary/embeddings/Language.ts +31 -0
  206. package/source/directives/vary/embeddings/index.ts +11 -0
  207. package/source/directives/vary/index.ts +3 -0
  208. package/source/exceptions.ts +13 -9
  209. package/source/io.ts +4 -0
  210. package/source/manifest.test.ts +6 -14
  211. package/source/manifest.ts +9 -6
  212. package/source/root.ts +5 -0
  213. package/source/schemas.ts +7 -3
  214. package/transpiled/Annotation.d.ts +1 -0
  215. package/transpiled/Composition.js.map +1 -1
  216. package/transpiled/Context.d.ts +6 -4
  217. package/transpiled/Directive.d.ts +11 -25
  218. package/transpiled/Directive.js +17 -18
  219. package/transpiled/Directive.js.map +1 -1
  220. package/transpiled/Endpoint.d.ts +7 -5
  221. package/transpiled/Endpoint.js +58 -2
  222. package/transpiled/Endpoint.js.map +1 -1
  223. package/transpiled/Factory.d.ts +0 -1
  224. package/transpiled/Factory.js +14 -7
  225. package/transpiled/Factory.js.map +1 -1
  226. package/transpiled/Gateway.d.ts +7 -8
  227. package/transpiled/Gateway.js +25 -25
  228. package/transpiled/Gateway.js.map +1 -1
  229. package/transpiled/HTTP/Context.d.ts +24 -0
  230. package/transpiled/HTTP/Context.js +47 -0
  231. package/transpiled/HTTP/Context.js.map +1 -0
  232. package/transpiled/HTTP/Server.d.ts +10 -7
  233. package/transpiled/HTTP/Server.js +80 -70
  234. package/transpiled/HTTP/Server.js.map +1 -1
  235. package/transpiled/HTTP/Timing.d.ts +10 -0
  236. package/transpiled/HTTP/Timing.js +29 -0
  237. package/transpiled/HTTP/Timing.js.map +1 -0
  238. package/transpiled/HTTP/formats/msgpack.d.ts +2 -2
  239. package/transpiled/HTTP/formats/msgpack.js +8 -29
  240. package/transpiled/HTTP/formats/msgpack.js.map +1 -1
  241. package/transpiled/HTTP/formats/text.d.ts +3 -1
  242. package/transpiled/HTTP/formats/text.js.map +1 -1
  243. package/transpiled/HTTP/formats/yaml.js +1 -1
  244. package/transpiled/HTTP/formats/yaml.js.map +1 -1
  245. package/transpiled/HTTP/index.d.ts +1 -0
  246. package/transpiled/HTTP/index.js +1 -0
  247. package/transpiled/HTTP/index.js.map +1 -1
  248. package/transpiled/HTTP/messages.d.ts +7 -16
  249. package/transpiled/HTTP/messages.js +28 -25
  250. package/transpiled/HTTP/messages.js.map +1 -1
  251. package/transpiled/Interception.d.ts +9 -0
  252. package/transpiled/Interception.js +19 -0
  253. package/transpiled/Interception.js.map +1 -0
  254. package/transpiled/Mapping.js +7 -7
  255. package/transpiled/Mapping.js.map +1 -1
  256. package/transpiled/Query.js.map +1 -1
  257. package/transpiled/RTD/Context.d.ts +7 -6
  258. package/transpiled/RTD/Directives.d.ts +19 -4
  259. package/transpiled/RTD/Endpoint.d.ts +6 -4
  260. package/transpiled/RTD/Match.d.ts +2 -4
  261. package/transpiled/RTD/Method.d.ts +7 -7
  262. package/transpiled/RTD/Method.js.map +1 -1
  263. package/transpiled/RTD/Node.d.ts +4 -6
  264. package/transpiled/RTD/Node.js +2 -1
  265. package/transpiled/RTD/Node.js.map +1 -1
  266. package/transpiled/RTD/Route.js.map +1 -1
  267. package/transpiled/RTD/Tree.d.ts +6 -6
  268. package/transpiled/RTD/Tree.js +5 -0
  269. package/transpiled/RTD/Tree.js.map +1 -1
  270. package/transpiled/RTD/factory.d.ts +2 -4
  271. package/transpiled/RTD/factory.js.map +1 -1
  272. package/transpiled/RTD/syntax/parse.js +1 -1
  273. package/transpiled/RTD/syntax/parse.js.map +1 -1
  274. package/transpiled/RTD/syntax/types.js +1 -1
  275. package/transpiled/RTD/syntax/types.js.map +1 -1
  276. package/transpiled/deployment.js +6 -2
  277. package/transpiled/deployment.js.map +1 -1
  278. package/transpiled/directives/auth/Anonymous.js +3 -4
  279. package/transpiled/directives/auth/Anonymous.js.map +1 -1
  280. package/transpiled/directives/auth/{Family.d.ts → Authorization.d.ts} +4 -5
  281. package/transpiled/directives/auth/{Family.js → Authorization.js} +22 -13
  282. package/transpiled/directives/auth/Authorization.js.map +1 -0
  283. package/transpiled/directives/auth/Delegate.d.ts +8 -0
  284. package/transpiled/directives/auth/Delegate.js +27 -0
  285. package/transpiled/directives/auth/Delegate.js.map +1 -0
  286. package/transpiled/directives/auth/Incept.d.ts +1 -1
  287. package/transpiled/directives/auth/Incept.js +11 -6
  288. package/transpiled/directives/auth/Incept.js.map +1 -1
  289. package/transpiled/directives/auth/Role.js +5 -3
  290. package/transpiled/directives/auth/Role.js.map +1 -1
  291. package/transpiled/directives/auth/Rule.d.ts +2 -2
  292. package/transpiled/directives/auth/Rule.js.map +1 -1
  293. package/transpiled/directives/auth/Scheme.js +2 -2
  294. package/transpiled/directives/auth/Scheme.js.map +1 -1
  295. package/transpiled/directives/auth/index.d.ts +2 -2
  296. package/transpiled/directives/auth/index.js +4 -5
  297. package/transpiled/directives/auth/index.js.map +1 -1
  298. package/transpiled/directives/auth/schemes.js +2 -1
  299. package/transpiled/directives/auth/schemes.js.map +1 -1
  300. package/transpiled/directives/auth/types.d.ts +4 -4
  301. package/transpiled/directives/cache/Cache.d.ts +11 -0
  302. package/transpiled/directives/cache/{Family.js → Cache.js} +6 -4
  303. package/transpiled/directives/cache/Cache.js.map +1 -0
  304. package/transpiled/directives/cache/Control.d.ts +3 -3
  305. package/transpiled/directives/cache/Control.js +3 -3
  306. package/transpiled/directives/cache/Control.js.map +1 -1
  307. package/transpiled/directives/cache/index.d.ts +2 -2
  308. package/transpiled/directives/cache/index.js +4 -5
  309. package/transpiled/directives/cache/index.js.map +1 -1
  310. package/transpiled/directives/cache/types.d.ts +2 -2
  311. package/transpiled/directives/cors/CORS.d.ts +10 -0
  312. package/transpiled/directives/cors/CORS.js +51 -0
  313. package/transpiled/directives/cors/CORS.js.map +1 -0
  314. package/transpiled/directives/cors/index.d.ts +2 -0
  315. package/transpiled/directives/cors/index.js +6 -0
  316. package/transpiled/directives/cors/index.js.map +1 -0
  317. package/transpiled/directives/dev/Development.d.ts +9 -0
  318. package/transpiled/directives/dev/{Family.js → Development.js} +4 -2
  319. package/transpiled/directives/dev/Development.js.map +1 -0
  320. package/transpiled/directives/dev/Stub.d.ts +3 -3
  321. package/transpiled/directives/dev/Stub.js.map +1 -1
  322. package/transpiled/directives/dev/Throw.d.ts +3 -3
  323. package/transpiled/directives/dev/Throw.js.map +1 -1
  324. package/transpiled/directives/dev/index.d.ts +2 -2
  325. package/transpiled/directives/dev/index.js +4 -5
  326. package/transpiled/directives/dev/index.js.map +1 -1
  327. package/transpiled/directives/dev/types.d.ts +1 -1
  328. package/transpiled/directives/index.d.ts +4 -2
  329. package/transpiled/directives/index.js +10 -9
  330. package/transpiled/directives/index.js.map +1 -1
  331. package/transpiled/directives/io/Directive.d.ts +8 -0
  332. package/transpiled/directives/io/Directive.js +3 -0
  333. package/transpiled/directives/io/Directive.js.map +1 -0
  334. package/transpiled/directives/io/IO.d.ts +9 -0
  335. package/transpiled/directives/io/IO.js +33 -0
  336. package/transpiled/directives/io/IO.js.map +1 -0
  337. package/transpiled/directives/io/Input.d.ts +11 -0
  338. package/transpiled/directives/io/Input.js +63 -0
  339. package/transpiled/directives/io/Input.js.map +1 -0
  340. package/transpiled/directives/io/Message.d.ts +1 -0
  341. package/transpiled/directives/io/Message.js +3 -0
  342. package/transpiled/directives/io/Message.js.map +1 -0
  343. package/transpiled/directives/io/Output.d.ts +13 -0
  344. package/transpiled/directives/io/Output.js +76 -0
  345. package/transpiled/directives/io/Output.js.map +1 -0
  346. package/transpiled/directives/io/index.d.ts +2 -0
  347. package/transpiled/directives/io/index.js +6 -0
  348. package/transpiled/directives/io/index.js.map +1 -0
  349. package/transpiled/directives/io/schemas.d.ts +7 -0
  350. package/transpiled/directives/io/schemas.js +14 -0
  351. package/transpiled/directives/io/schemas.js.map +1 -0
  352. package/transpiled/directives/octets/Context.d.ts +5 -5
  353. package/transpiled/directives/octets/Context.js +4 -2
  354. package/transpiled/directives/octets/Context.js.map +1 -1
  355. package/transpiled/directives/octets/Delete.d.ts +15 -5
  356. package/transpiled/directives/octets/Delete.js +45 -8
  357. package/transpiled/directives/octets/Delete.js.map +1 -1
  358. package/transpiled/directives/octets/Directive.d.ts +8 -0
  359. package/transpiled/directives/octets/Directive.js +8 -0
  360. package/transpiled/directives/octets/Directive.js.map +1 -0
  361. package/transpiled/directives/octets/Fetch.d.ts +9 -9
  362. package/transpiled/directives/octets/Fetch.js +36 -21
  363. package/transpiled/directives/octets/Fetch.js.map +1 -1
  364. package/transpiled/directives/octets/List.d.ts +11 -5
  365. package/transpiled/directives/octets/List.js +34 -7
  366. package/transpiled/directives/octets/List.js.map +1 -1
  367. package/transpiled/directives/octets/Octets.d.ts +12 -0
  368. package/transpiled/directives/octets/{Family.js → Octets.js} +12 -6
  369. package/transpiled/directives/octets/Octets.js.map +1 -0
  370. package/transpiled/directives/octets/Permute.d.ts +5 -4
  371. package/transpiled/directives/octets/Permute.js +15 -8
  372. package/transpiled/directives/octets/Permute.js.map +1 -1
  373. package/transpiled/directives/octets/Store.d.ts +14 -23
  374. package/transpiled/directives/octets/Store.js +41 -70
  375. package/transpiled/directives/octets/Store.js.map +1 -1
  376. package/transpiled/directives/octets/Workflow.d.ts +15 -0
  377. package/transpiled/directives/octets/Workflow.js +59 -0
  378. package/transpiled/directives/octets/Workflow.js.map +1 -0
  379. package/transpiled/directives/octets/index.d.ts +2 -2
  380. package/transpiled/directives/octets/index.js +4 -5
  381. package/transpiled/directives/octets/index.js.map +1 -1
  382. package/transpiled/directives/octets/schemas.d.ts +13 -6
  383. package/transpiled/directives/octets/schemas.js +2 -1
  384. package/transpiled/directives/octets/schemas.js.map +1 -1
  385. package/transpiled/directives/octets/types.d.ts +2 -6
  386. package/transpiled/directives/octets/workflows/Execution.d.ts +25 -0
  387. package/transpiled/directives/octets/workflows/Execution.js +54 -0
  388. package/transpiled/directives/octets/workflows/Execution.js.map +1 -0
  389. package/transpiled/directives/octets/workflows/Workflow.d.ts +12 -0
  390. package/transpiled/directives/octets/workflows/Workflow.js +25 -0
  391. package/transpiled/directives/octets/workflows/Workflow.js.map +1 -0
  392. package/transpiled/directives/octets/workflows/index.d.ts +1 -0
  393. package/transpiled/directives/octets/workflows/index.js +6 -0
  394. package/transpiled/directives/octets/workflows/index.js.map +1 -0
  395. package/transpiled/directives/vary/Directive.d.ts +5 -0
  396. package/transpiled/directives/vary/Directive.js +3 -0
  397. package/transpiled/directives/vary/Directive.js.map +1 -0
  398. package/transpiled/directives/vary/Embed.d.ts +10 -0
  399. package/transpiled/directives/vary/Embed.js +49 -0
  400. package/transpiled/directives/vary/Embed.js.map +1 -0
  401. package/transpiled/directives/vary/Properties.d.ts +9 -0
  402. package/transpiled/directives/vary/Properties.js +16 -0
  403. package/transpiled/directives/vary/Properties.js.map +1 -0
  404. package/transpiled/directives/vary/Vary.d.ts +10 -0
  405. package/transpiled/directives/vary/Vary.js +36 -0
  406. package/transpiled/directives/vary/Vary.js.map +1 -0
  407. package/transpiled/directives/vary/embeddings/Embedding.d.ts +5 -0
  408. package/transpiled/directives/vary/embeddings/Embedding.js +3 -0
  409. package/transpiled/directives/vary/embeddings/Embedding.js.map +1 -0
  410. package/transpiled/directives/vary/embeddings/Header.d.ts +7 -0
  411. package/transpiled/directives/vary/embeddings/Header.js +28 -0
  412. package/transpiled/directives/vary/embeddings/Header.js.map +1 -0
  413. package/transpiled/directives/vary/embeddings/Language.d.ts +7 -0
  414. package/transpiled/directives/vary/embeddings/Language.js +28 -0
  415. package/transpiled/directives/vary/embeddings/Language.js.map +1 -0
  416. package/transpiled/directives/vary/embeddings/index.d.ts +5 -0
  417. package/transpiled/directives/vary/embeddings/index.js +10 -0
  418. package/transpiled/directives/vary/embeddings/index.js.map +1 -0
  419. package/transpiled/directives/vary/index.d.ts +2 -0
  420. package/transpiled/directives/vary/index.js +6 -0
  421. package/transpiled/directives/vary/index.js.map +1 -0
  422. package/transpiled/exceptions.js +7 -7
  423. package/transpiled/exceptions.js.map +1 -1
  424. package/transpiled/io.d.ts +3 -0
  425. package/transpiled/io.js +3 -0
  426. package/transpiled/io.js.map +1 -0
  427. package/transpiled/manifest.js +10 -5
  428. package/transpiled/manifest.js.map +1 -1
  429. package/transpiled/root.js +5 -0
  430. package/transpiled/root.js.map +1 -1
  431. package/transpiled/schemas.d.ts +7 -3
  432. package/transpiled/schemas.js.map +1 -1
  433. package/transpiled/tsconfig.tsbuildinfo +1 -1
  434. package/source/HTTP/Server.fixtures.ts +0 -41
  435. package/transpiled/HTTP/Server.fixtures.d.ts +0 -11
  436. package/transpiled/HTTP/Server.fixtures.js +0 -32
  437. package/transpiled/HTTP/Server.fixtures.js.map +0 -1
  438. package/transpiled/directives/auth/Family.js.map +0 -1
  439. package/transpiled/directives/cache/Family.d.ts +0 -12
  440. package/transpiled/directives/cache/Family.js.map +0 -1
  441. package/transpiled/directives/dev/Family.d.ts +0 -10
  442. package/transpiled/directives/dev/Family.js.map +0 -1
  443. package/transpiled/directives/octets/Family.d.ts +0 -12
  444. package/transpiled/directives/octets/Family.js.map +0 -1
@@ -23,7 +23,7 @@ If request's `content-type` is not acceptable, or if the request body does not p
23
23
  the [validation](/extensions/storages/readme.md#async-putpath-string-stream-readable-type-typecontrol-maybeentry),
24
24
  the request is rejected with a `415 Unsupported Media Type` response.
25
25
 
26
- The value of the directive is an object with the following properties:
26
+ The value of the directive is `null` or an object with the following properties:
27
27
 
28
28
  - `accept`: a media type or an array of media types that are acceptable.
29
29
  If the `accept` property is not specified, any media type is acceptable (which is the default).
@@ -43,43 +43,27 @@ The value of the directive is an object with the following properties:
43
43
  analyze: images.analyze
44
44
  ```
45
45
 
46
- ### Workflows
47
-
48
- A workflow is a list of endpoints to be called.
49
- The following input will be passed to each endpoint:
50
-
51
- ```yaml
52
- storage: string
53
- path: string
54
- entry: Entry
55
- ```
56
-
57
- See [Entry](/extensions/storages/readme.md#entry) and an
58
- example [workflow step processor](../features/steps/components/octets.tester).
46
+ Non-standard `content-meta` header can be used
47
+ to set initial [metadata](/extensions/storages/readme.md#entry) value for the Entry.
59
48
 
60
- A _workflow unit_ is an object with keys referencing the workflow step identifier, and an endpoint
61
- as value.
62
- Steps within a workflow unit are executed in parallel.
49
+ The value of the `content-meta` header is a comma-separated list of key-value string pairs.
50
+ If no value is provided for a key, the string `true` is used.
63
51
 
64
- ```yaml
65
- octets:store:
66
- workflow:
67
- resize: images.resize
68
- analyze: images.analyze
52
+ ```http
53
+ POST /images/ HTTP/1.1
54
+ content-type: image/jpeg
55
+ content-meta: foo, bar=baz
56
+ content-meta: baz=1
69
57
  ```
70
58
 
71
- A workflow can be a single unit, or an array of units.
72
- If it's an array, the workflow units are executed in sequence.
73
-
74
59
  ```yaml
75
- octets:store:
76
- workflow:
77
- - optimize: images.optimize # executed first
78
- - resize: images.resize # executed second
79
- analyze: images.analyze # executed in parallel with `resize`
60
+ meta:
61
+ foo: 'true'
62
+ bar: 'baz'
63
+ baz: '1'
80
64
  ```
81
65
 
82
- If one of the workflow units returns an error, the execution of the workflow is interrupted.
66
+ If the Entry already exists, the `content-meta` header is ignored.
83
67
 
84
68
  ### Response
85
69
 
@@ -147,26 +131,42 @@ The value of the directive is an object with the following properties:
147
131
  meta: true # allow access to an Entry
148
132
  ```
149
133
 
150
- To access an Entry, the request path must be suffixed with `:meta`:
134
+ The `octets:fetch: ~` declaration is equivalent to defaults.
135
+
136
+ To access an Entry, the `accept` request header must contain the `octets.entry` subtype
137
+ in
138
+ the `toa` [vendor tree](https://datatracker.ietf.org/doc/html/rfc6838#section-3.2):
151
139
 
152
140
  ```http
153
- GET /images/eecd837c:meta HTTP/1.1
141
+ GET /images/eecd837c HTTP/1.1
142
+ accept: application/vnd.toa.octets.entry+yaml
154
143
  ```
155
144
 
156
- The `octets:fetch: ~` declaration is equivalent to defaults.
157
-
158
145
  ## `octets:list`
159
146
 
160
147
  Lists the entries stored under the request path.
161
148
 
149
+ The value of the directive is an object with the following properties:
150
+
151
+ - `meta`: `boolean` indicating whether the list of Entries is accessible.
152
+ Defaults to `false`, which means that only entry identifiers are returned.
153
+
162
154
  ```yaml
163
155
  /images:
164
156
  octets:context: images
165
157
  GET:
166
- octets:list: ~
158
+ octets:list:
159
+ meta: true
167
160
  ```
168
161
 
169
- Responds with a list of entry identifiers.
162
+ The `octets:list: ~` declaration is equivalent to defaults.
163
+
164
+ To access a list of Entries, the `accept` request header must contain the `octets.entries` subtype:
165
+
166
+ ```http
167
+ GET /images/ HTTP/1.1
168
+ accept: application/vnd.toa.octets.entries+yaml
169
+ ```
170
170
 
171
171
  ## `octets:delete`
172
172
 
@@ -179,6 +179,20 @@ Delete the entry corresponding to the request path.
179
179
  octets:delete: ~
180
180
  ```
181
181
 
182
+ The value of the directive may contain a [workflow](#workflows) declaration, to be executed before
183
+ the entry is deleted.
184
+
185
+ ```yaml
186
+ /images:
187
+ octets:context: images
188
+ DELETE:
189
+ octets:delete:
190
+ workflow:
191
+ cleanup: images.cleanup
192
+ ```
193
+
194
+ The error returned by the workflow prevents the deletion of the entry.
195
+
182
196
  ## `octets:permute`
183
197
 
184
198
  Performs
@@ -194,3 +208,54 @@ under the request path.
194
208
  ```
195
209
 
196
210
  The request body must be a list of entry identifiers.
211
+
212
+ ## `octets:workflow`
213
+
214
+ Execute a [workflow](#workflows) on the entry under the request path.
215
+
216
+ ```yaml
217
+ /images:
218
+ /*:
219
+ DELETE:
220
+ octets:workflow:
221
+ archive: images.archive
222
+ ```
223
+
224
+ ## Workflows
225
+
226
+ A workflow is a list of endpoints to be called.
227
+ The following input will be passed to each endpoint:
228
+
229
+ ```yaml
230
+ storage: string
231
+ path: string
232
+ entry: Entry
233
+ parameters: Record<string, string> # route parameters
234
+ ```
235
+
236
+ See [Entry](/extensions/storages/readme.md#entry) and an
237
+ example [workflow step processor](../features/steps/components/octets.tester).
238
+
239
+ A _workflow unit_ is an object with keys referencing the workflow step identifier, and an endpoint
240
+ as value.
241
+ Steps within a workflow unit are executed in parallel.
242
+
243
+ ```yaml
244
+ octets:store:
245
+ workflow:
246
+ resize: images.resize
247
+ analyze: images.analyze
248
+ ```
249
+
250
+ A workflow can be a single unit, or an array of units.
251
+ If it's an array, the workflow units are executed in sequence.
252
+
253
+ ```yaml
254
+ octets:store:
255
+ workflow:
256
+ - optimize: images.optimize # executed first
257
+ - resize: images.resize # executed second
258
+ analyze: images.analyze # executed in parallel with `resize`
259
+ ```
260
+
261
+ If one of the workflow units returns an error, the execution of the workflow is interrupted.
@@ -27,7 +27,8 @@ foo: bar
27
27
  ### Multipart types
28
28
 
29
29
  Multipart responses are endoded using content negotiation,
30
- and the `content-type` of the response is set to one of the custom `multipart/` subtypes, corresponding to the type of
30
+ and the `content-type` of the response is set to one of the custom `multipart/` subtypes,
31
+ corresponding to the type of
31
32
  the parts:
32
33
 
33
34
  | Response type | Part type |
@@ -60,3 +61,22 @@ See also:
60
61
  - [Multipart Content-Type](https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html) at W3C
61
62
  - [Content-Type: multipart](https://learn.microsoft.com/en-us/previous-versions/office/developer/exchange-server-2010/aa493937(v=exchg.140))
62
63
  at Microsoft
64
+
65
+ ## CORS
66
+
67
+ [CORS](https://www.w3.org/TR/2020/SPSD-cors-20200602/) is supported,
68
+ credentials, any `origin`, and any request header fields are allowed.
69
+
70
+ The following request headers are allowed:
71
+
72
+ - `accept`
73
+ - `authorization`
74
+ - `content-type`
75
+ - headers used by the [`vary:embed` directive](vary.md#embeddings)
76
+
77
+ The following response headers are exposed:
78
+
79
+ - `authorization`
80
+ - `content-type`
81
+ - `content-length`
82
+ - `etag`
@@ -6,10 +6,10 @@
6
6
  id?: string
7
7
  criteria?: string
8
8
  sort?: string
9
- omit?: [integer]
10
- limit?: [integer]
9
+ omit?: integer
10
+ limit?: integer
11
11
  selectors?: string[]
12
- projection?: [string]
12
+ projection?: string[]
13
13
  ```
14
14
 
15
15
  ```yaml
@@ -45,7 +45,7 @@ Undefined `query` denies any query arguments in requests.
45
45
 
46
46
  ## Criteria
47
47
 
48
- Search critaria in [RSQL](https://github.com/jirutka/rsql-parser) format.
48
+ Search criteria in [RSQL](https://github.com/jirutka/rsql-parser) format.
49
49
 
50
50
  The `criteria` property is considered as *open* when it ends with a `;`, allowing the combination of
51
51
  request query criteria using `and` logic.
@@ -77,7 +77,7 @@ query:
77
77
 
78
78
  ### Path variables
79
79
 
80
- Path variables are prepended to the `criteria` request query parameter using logial AND,
80
+ Path variables are prepended to the `criteria` request query parameter using logical AND,
81
81
  except for the [`POST` method](#post-method).
82
82
 
83
83
  Given the following declaration:
@@ -107,7 +107,7 @@ Operation call will have the following query criteria:
107
107
  criteria: state==hot;type==cool;rank=5
108
108
  ```
109
109
 
110
- ### POST method
110
+ #### POST method
111
111
 
112
112
  `POST` method semantically used to create a new entity instance, that is, calling a Transition
113
113
  without Query.
@@ -224,3 +224,48 @@ A list of Entity properties to be included in the Observation result.
224
224
  ```yaml
225
225
  projection: [id, title, timestamp]
226
226
  ```
227
+
228
+ ## Optimistic concurrency control
229
+
230
+ If an operation returns an object with `_version` property,
231
+ then its value is passed as the value of
232
+ the [`etag` header](https://datatracker.ietf.org/doc/html/rfc7232#section-2.3) in the response
233
+ (and removed from the object).
234
+
235
+ Client can use the `if-match` request header to perform an operation only if the corresponding
236
+ object has not been modified since the last retrieval.
237
+
238
+ ```http
239
+ GET /dummies/5e82ed5e/ HTTP/1.1
240
+
241
+ ---
242
+
243
+ HTTP/1.1 200 OK
244
+ etag: "1"
245
+
246
+ foo: bar
247
+ ```
248
+
249
+ ```http request
250
+ PUT /dummies/5e82ed5e/ HTTP/1.1
251
+ if-match: "1"
252
+
253
+ foo: baz
254
+ ```
255
+
256
+ ```http
257
+ 200 OK
258
+ ```
259
+
260
+ ```http request
261
+ PUT /dummies/5e82ed5e/ HTTP/1.1
262
+ if-match: "never"
263
+
264
+ foo: baz
265
+ ```
266
+
267
+ ```http
268
+ 412 Precondition Failed
269
+ ```
270
+
271
+ The value within the quotes is mapped to the `version` property of operation call query.
@@ -102,7 +102,7 @@ HTTP methods can only be mapped to operations of the corresponding types.
102
102
  | `GET` | **Observation**<br/>**Computation** |
103
103
  | `PATCH` | **Assignment**<br/>**Effect** |
104
104
 
105
- As method mapping is unambiguous for Observation, Assignent, and Computation, a consice syntax is
105
+ As method mapping is unambiguous for Observation, Assignment, and Computation, a concise syntax is
106
106
  available:
107
107
 
108
108
  ```yaml
@@ -110,7 +110,23 @@ available:
110
110
  /items/:id: [observe, assign]
111
111
  ```
112
112
 
113
- ### Intermediate Nodes
113
+ ### Projections
114
+
115
+ A Method can have a `projection` key that specifies the fields of the operation result to be
116
+ included in the response.
117
+
118
+ ```yaml
119
+ /teapots:
120
+ GET:
121
+ endpoint: select
122
+ projection:
123
+ - name
124
+ - state
125
+ ```
126
+
127
+ > `id` is always included in the projection.
128
+
129
+ ## Intermediate Nodes
114
130
 
115
131
  An RTD Node that has a Route with a key `/` is an _intermediate_ Node.
116
132
  Intermediate Nodes must not have Methods as they are unreachable.
@@ -124,8 +140,10 @@ Intermediate Nodes must not have Methods as they are unreachable.
124
140
 
125
141
  ## Directives
126
142
 
127
- RTD Directives are declared using RTD node or Method keys following the `{family}:{directive}` pattern and can be used
128
- to add or modify the behavior of request processing. Directive declarations are applied to the RTD node where they are
143
+ RTD Directives are declared using RTD node or Method keys following the `{family}:{directive}`
144
+ pattern and can be used
145
+ to add or modify the behavior of request processing. Directive declarations are applied to the RTD
146
+ node where they are
129
147
  declared and to all nested nodes.
130
148
 
131
149
  ```yaml
@@ -0,0 +1,69 @@
1
+ # HTTP request details
2
+
3
+ The `vary` directives family provides the capability to include HTTP request details as input for an
4
+ operation call.
5
+
6
+ ## TL;DR
7
+
8
+ ```yaml
9
+ exposition:
10
+ realms:
11
+ toa: the.toa.io
12
+ /:
13
+ vary:languages: [en, fr]
14
+ GET:
15
+ vary:embed:
16
+ lang: language # predefined embeddings
17
+ realm: realm
18
+ token: :x-access-token # raw header value
19
+ endpoint: dummies.get
20
+ ```
21
+
22
+ ## Embeddings
23
+
24
+ Request parts are embedded into the operation call according to the mapping
25
+ defined by the `vary:embed` directive.
26
+ The keys in the embedding map are the names of the input properties details to be embedded to,
27
+ and the values are the names of the embedding functions.
28
+ If the value is an array, the first non-empty embedding function's result is used.
29
+
30
+ > If a property is already present in the input, the embedded value will overwrite its current
31
+ > value.
32
+
33
+ ### Realm
34
+
35
+ Realm is an identifier of a domain used to access the Exposition.
36
+ The list of domains is defined by the `vary:realms` directive,
37
+ which is a map of realm names to their domain names.
38
+
39
+ The `realm` embedding substitutes the realm identified based on the `host` request header.
40
+
41
+ ### Language
42
+
43
+ The `language` embedding substitutes the most matching language code based on the `accept-language`
44
+ request header and a list of supported languages defined by the `vary:languages` directive, and also
45
+ adds `accept-language` to the `vary` HTTP response header value.
46
+ If neither of the supported languages matches, the first supported language is used.
47
+
48
+ ### Raw header values
49
+
50
+ Keys in the embedding map starting with a semicolon (:) are the names of HTTP request headers whose
51
+ values to be embedded into an operation call.
52
+ The names of these headers are then included in the `vary` HTTP response header
53
+ and [Access-Control-Allow-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)
54
+ of the [CORS](protocol.md#cors).
55
+
56
+ [Multiple header fields](https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2) are embedded
57
+ as a comma-separated list.
58
+
59
+ ### Fallbacks
60
+
61
+ If the embedding function is an array, the first non-empty resolved value is used.
62
+
63
+ ```yaml
64
+ vary:embed:
65
+ ip: # fallbacks
66
+ - :CloudFront-Viewer-Address
67
+ - :CF-Connecting-IP
68
+ - :X-Appengine-User-IP
69
+ ```
@@ -30,6 +30,7 @@ Feature: Access authorization
30
30
  Given the annotation:
31
31
  """yaml
32
32
  /:
33
+ io:output: true
33
34
  auth:anonymous: true
34
35
  GET:
35
36
  dev:stub:
@@ -71,6 +72,7 @@ Feature: Access authorization
71
72
  Given the annotation:
72
73
  """yaml
73
74
  /:
75
+ io:output: true
74
76
  /:id:
75
77
  auth:id: id
76
78
  GET:
@@ -109,6 +111,7 @@ Feature: Access authorization
109
111
  And the annotation:
110
112
  """yaml
111
113
  /:
114
+ io:output: true
112
115
  auth:role: developer
113
116
  GET:
114
117
  dev:stub:
@@ -146,6 +149,7 @@ Feature: Access authorization
146
149
  And the annotation:
147
150
  """yaml
148
151
  /:
152
+ io:output: true
149
153
  /:
150
154
  auth:role: developer:rust:junior # role scope matches
151
155
  /nested:
@@ -190,6 +194,7 @@ Feature: Access authorization
190
194
  - developer
191
195
  - admin
192
196
  GET:
197
+ io:output: true
193
198
  dev:stub:
194
199
  access: granted!
195
200
  """
@@ -215,6 +220,7 @@ Feature: Access authorization
215
220
  And the annotation:
216
221
  """yaml
217
222
  /:
223
+ io:output: true
218
224
  /rust/:id:
219
225
  auth:rule:
220
226
  id: id
@@ -257,6 +263,7 @@ Feature: Access authorization
257
263
  Given the annotation:
258
264
  """yaml
259
265
  /:
266
+ io:output: true
260
267
  /:id:
261
268
  auth:id: id
262
269
  GET:
@@ -295,6 +302,7 @@ Feature: Access authorization
295
302
  Given the annotation:
296
303
  """yaml
297
304
  /:
305
+ io:output: true
298
306
  auth:role: developer
299
307
  GET:
300
308
  dev:stub:
@@ -335,6 +343,7 @@ Feature: Access authorization
335
343
  Given the annotation:
336
344
  """yaml
337
345
  /:
346
+ io:output: true
338
347
  /:id:
339
348
  auth:scheme: basic
340
349
  auth:id: id
@@ -374,7 +383,8 @@ Feature: Access authorization
374
383
 
375
384
  Given the annotation:
376
385
  """yaml
377
- anonymous: true
386
+ /:
387
+ anonymous: true
378
388
  """
379
389
  When the following request is received:
380
390
  """
@@ -396,6 +406,7 @@ Feature: Access authorization
396
406
  """yaml
397
407
  /:
398
408
  /:id:
409
+ io:output: true
399
410
  auth:id: id
400
411
  GET:
401
412
  dev:stub:
@@ -425,7 +436,7 @@ Feature: Access authorization
425
436
  """
426
437
  Then the following reply is sent:
427
438
  """
428
- 204 No Content
439
+ 200 OK
429
440
  """
430
441
  # accessing a resource with a banned Identity
431
442
  When the following request is received:
@@ -4,6 +4,7 @@ Feature: Annotation
4
4
  Given the annotation:
5
5
  """yaml
6
6
  /:
7
+ io:output: true
7
8
  anonymous: true
8
9
  /foo:
9
10
  GET:
@@ -5,7 +5,8 @@ Feature: Request body
5
5
  """yaml
6
6
  exposition:
7
7
  /:
8
- POST: transit
8
+ io:output: true
9
+ POST: create
9
10
  """
10
11
  When the following request is received:
11
12
  """
@@ -25,6 +26,7 @@ Feature: Request body
25
26
  """yaml
26
27
  exposition:
27
28
  /:name:
29
+ io:output: true
28
30
  GET: <operation>
29
31
  """
30
32
  When the following request is received:
@@ -14,6 +14,7 @@ Feature: Caching
14
14
  Given the annotation:
15
15
  """yaml
16
16
  /:
17
+ io:output: true
17
18
  anonymous: true
18
19
  GET:
19
20
  cache:control: max-age=60000
@@ -37,6 +38,7 @@ Feature: Caching
37
38
  Given the annotation:
38
39
  """yaml
39
40
  /:
41
+ io:output: true
40
42
  cache:control: max-age=30000
41
43
  GET:
42
44
  anonymous: true
@@ -120,6 +122,7 @@ Feature: Caching
120
122
  Given the annotation:
121
123
  """yaml
122
124
  /:
125
+ io:output: true
123
126
  auth:role: developer
124
127
  cache:exact: max-age=60000, public
125
128
  GET:
@@ -0,0 +1,72 @@
1
+ Feature: CORS Support
2
+
3
+ Scenario: Using CORS
4
+ Given the annotation:
5
+ """yaml
6
+ /:
7
+ anonymous: true
8
+ /foo:
9
+ GET:
10
+ dev:stub: Hello
11
+ """
12
+ When the following request is received:
13
+ """
14
+ OPTIONS / HTTP/1.1
15
+ origin: https://hello.world
16
+ """
17
+ Then the following reply is sent:
18
+ """
19
+ 204 No Content
20
+ access-control-allow-origin: https://hello.world
21
+ access-control-allow-methods: GET, POST, PUT, PATCH, DELETE
22
+ access-control-allow-headers: accept, authorization, content-type, etag, if-match, if-none-match
23
+ access-control-allow-credentials: true
24
+ access-control-max-age: 3600
25
+ cache-control: max-age=3600
26
+ vary: origin
27
+ """
28
+ When the following request is received:
29
+ """
30
+ GET /foo/ HTTP/1.1
31
+ origin: https://hello.world
32
+ """
33
+ Then the following reply is sent:
34
+ """
35
+ 200 OK
36
+ access-control-allow-origin: https://hello.world
37
+ access-control-expose-headers: authorization, content-type, content-length, etag
38
+ vary: origin
39
+ """
40
+
41
+ Scenario: Errors contain CORS headers
42
+ Given the annotation:
43
+ """yaml
44
+ /:
45
+ /foo:
46
+ GET:
47
+ dev:stub: Hello
48
+ """
49
+ When the following request is received:
50
+ """
51
+ GET /bar/ HTTP/1.1
52
+ origin: https://hello.world
53
+ """
54
+ Then the following reply is sent:
55
+ """
56
+ 404 Not Found
57
+ access-control-allow-origin: https://hello.world
58
+ access-control-expose-headers: authorization, content-type, content-length, etag
59
+ vary: origin
60
+ """
61
+ When the following request is received:
62
+ """
63
+ GET /foo/ HTTP/1.1
64
+ origin: https://hello.world
65
+ """
66
+ Then the following reply is sent:
67
+ """
68
+ 401 Unauthorized
69
+ access-control-allow-origin: https://hello.world
70
+ access-control-expose-headers: authorization, content-type, content-length, etag
71
+ vary: origin
72
+ """
@@ -4,6 +4,7 @@ Feature: Directives
4
4
  Given the annotation:
5
5
  """yaml
6
6
  /:
7
+ io:output: true
7
8
  anonymous: true
8
9
  GET:
9
10
  dev:stub:
@@ -26,6 +27,7 @@ Feature: Directives
26
27
  Given the annotation:
27
28
  """yaml
28
29
  /:
30
+ io:output: true
29
31
  anonymous: true
30
32
  dev:stub:
31
33
  hello: again