reqon-dsl 0.2.0

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 (388) hide show
  1. package/.claude/settings.local.json +31 -0
  2. package/.claude/skills/api-integration.md +125 -0
  3. package/.claude/skills/database-schema.md +51 -0
  4. package/.claude/skills/dsl-design.md +80 -0
  5. package/.claude/skills/property-testing.md +143 -0
  6. package/.claude/skills/reqon/SKILL.md +44 -0
  7. package/.claude/skills/reqon/references/examples.md +206 -0
  8. package/.claude/skills/reqon/references/syntax.md +263 -0
  9. package/.claude/skills/vscode-extension.md +113 -0
  10. package/.github/dependabot.yml +32 -0
  11. package/.github/pull_request_template.md +21 -0
  12. package/.github/workflows/ci.yml +174 -0
  13. package/.github/workflows/release.yml +73 -0
  14. package/CLAUDE.md +72 -0
  15. package/CONTRIBUTING.md +161 -0
  16. package/README.md +235 -0
  17. package/TODO.md +51 -0
  18. package/dist/ast/index.d.ts +1 -0
  19. package/dist/ast/index.js +1 -0
  20. package/dist/ast/nodes.d.ts +237 -0
  21. package/dist/ast/nodes.js +12 -0
  22. package/dist/auth/auth.test.d.ts +1 -0
  23. package/dist/auth/auth.test.js +255 -0
  24. package/dist/auth/circuit-breaker.d.ts +115 -0
  25. package/dist/auth/circuit-breaker.js +267 -0
  26. package/dist/auth/credentials.d.ts +91 -0
  27. package/dist/auth/credentials.js +169 -0
  28. package/dist/auth/index.d.ts +5 -0
  29. package/dist/auth/index.js +8 -0
  30. package/dist/auth/oauth2-provider.d.ts +41 -0
  31. package/dist/auth/oauth2-provider.js +131 -0
  32. package/dist/auth/rate-limiter.d.ts +61 -0
  33. package/dist/auth/rate-limiter.js +380 -0
  34. package/dist/auth/token-store.d.ts +30 -0
  35. package/dist/auth/token-store.js +148 -0
  36. package/dist/auth/types.d.ts +142 -0
  37. package/dist/auth/types.js +1 -0
  38. package/dist/cli.d.ts +2 -0
  39. package/dist/cli.js +270 -0
  40. package/dist/errors/errors.test.d.ts +1 -0
  41. package/dist/errors/errors.test.js +165 -0
  42. package/dist/errors/index.d.ts +83 -0
  43. package/dist/errors/index.js +159 -0
  44. package/dist/execution/execution.test.d.ts +1 -0
  45. package/dist/execution/execution.test.js +246 -0
  46. package/dist/execution/index.d.ts +4 -0
  47. package/dist/execution/index.js +2 -0
  48. package/dist/execution/state.d.ts +136 -0
  49. package/dist/execution/state.js +82 -0
  50. package/dist/execution/store.d.ts +52 -0
  51. package/dist/execution/store.js +120 -0
  52. package/dist/index.d.ts +27 -0
  53. package/dist/index.js +57 -0
  54. package/dist/integration.test.d.ts +1 -0
  55. package/dist/integration.test.js +168 -0
  56. package/dist/interpreter/context.d.ts +15 -0
  57. package/dist/interpreter/context.js +29 -0
  58. package/dist/interpreter/evaluator.d.ts +5 -0
  59. package/dist/interpreter/evaluator.js +223 -0
  60. package/dist/interpreter/evaluator.test.d.ts +1 -0
  61. package/dist/interpreter/evaluator.test.js +512 -0
  62. package/dist/interpreter/executor.d.ts +131 -0
  63. package/dist/interpreter/executor.js +663 -0
  64. package/dist/interpreter/fetch-handler.d.ts +43 -0
  65. package/dist/interpreter/fetch-handler.js +203 -0
  66. package/dist/interpreter/http.d.ts +57 -0
  67. package/dist/interpreter/http.js +210 -0
  68. package/dist/interpreter/http.test.d.ts +1 -0
  69. package/dist/interpreter/http.test.js +299 -0
  70. package/dist/interpreter/index.d.ts +7 -0
  71. package/dist/interpreter/index.js +7 -0
  72. package/dist/interpreter/pagination.d.ts +63 -0
  73. package/dist/interpreter/pagination.js +155 -0
  74. package/dist/interpreter/progress.test.d.ts +1 -0
  75. package/dist/interpreter/progress.test.js +216 -0
  76. package/dist/interpreter/schema-matcher.d.ts +16 -0
  77. package/dist/interpreter/schema-matcher.js +136 -0
  78. package/dist/interpreter/schema-matcher.test.d.ts +1 -0
  79. package/dist/interpreter/schema-matcher.test.js +122 -0
  80. package/dist/interpreter/signals.d.ts +57 -0
  81. package/dist/interpreter/signals.js +73 -0
  82. package/dist/interpreter/step-handlers/for-handler.d.ts +17 -0
  83. package/dist/interpreter/step-handlers/for-handler.js +51 -0
  84. package/dist/interpreter/step-handlers/index.d.ts +8 -0
  85. package/dist/interpreter/step-handlers/index.js +8 -0
  86. package/dist/interpreter/step-handlers/map-handler.d.ts +10 -0
  87. package/dist/interpreter/step-handlers/map-handler.js +20 -0
  88. package/dist/interpreter/step-handlers/match-handler.d.ts +27 -0
  89. package/dist/interpreter/step-handlers/match-handler.js +61 -0
  90. package/dist/interpreter/step-handlers/store-handler.d.ts +13 -0
  91. package/dist/interpreter/step-handlers/store-handler.js +66 -0
  92. package/dist/interpreter/step-handlers/types.d.ts +15 -0
  93. package/dist/interpreter/step-handlers/types.js +1 -0
  94. package/dist/interpreter/step-handlers/validate-handler.d.ts +10 -0
  95. package/dist/interpreter/step-handlers/validate-handler.js +26 -0
  96. package/dist/interpreter/step-handlers/webhook-handler.d.ts +36 -0
  97. package/dist/interpreter/step-handlers/webhook-handler.js +104 -0
  98. package/dist/lexer/index.d.ts +10 -0
  99. package/dist/lexer/index.js +12 -0
  100. package/dist/lexer/lexer.d.ts +24 -0
  101. package/dist/lexer/lexer.js +264 -0
  102. package/dist/lexer/lexer.test.d.ts +1 -0
  103. package/dist/lexer/lexer.test.js +259 -0
  104. package/dist/lexer/tokens.d.ts +69 -0
  105. package/dist/lexer/tokens.js +146 -0
  106. package/dist/loader/index.d.ts +36 -0
  107. package/dist/loader/index.js +220 -0
  108. package/dist/loader/loader.test.d.ts +1 -0
  109. package/dist/loader/loader.test.js +287 -0
  110. package/dist/oas/index.d.ts +4 -0
  111. package/dist/oas/index.js +2 -0
  112. package/dist/oas/loader.d.ts +21 -0
  113. package/dist/oas/loader.js +82 -0
  114. package/dist/oas/oas.test.d.ts +1 -0
  115. package/dist/oas/oas.test.js +218 -0
  116. package/dist/oas/validator.d.ts +12 -0
  117. package/dist/oas/validator.js +227 -0
  118. package/dist/parser/base.d.ts +33 -0
  119. package/dist/parser/base.js +97 -0
  120. package/dist/parser/expressions.d.ts +27 -0
  121. package/dist/parser/expressions.js +248 -0
  122. package/dist/parser/expressions.test.d.ts +1 -0
  123. package/dist/parser/expressions.test.js +378 -0
  124. package/dist/parser/index.d.ts +3 -0
  125. package/dist/parser/index.js +3 -0
  126. package/dist/parser/match.test.d.ts +1 -0
  127. package/dist/parser/match.test.js +254 -0
  128. package/dist/parser/parser.d.ts +68 -0
  129. package/dist/parser/parser.js +1229 -0
  130. package/dist/parser/parser.test.d.ts +1 -0
  131. package/dist/parser/parser.test.js +333 -0
  132. package/dist/parser/schedule.test.d.ts +1 -0
  133. package/dist/parser/schedule.test.js +241 -0
  134. package/dist/plugin.d.ts +35 -0
  135. package/dist/plugin.js +68 -0
  136. package/dist/scheduler/cron-parser.d.ts +32 -0
  137. package/dist/scheduler/cron-parser.js +198 -0
  138. package/dist/scheduler/cron-parser.test.d.ts +1 -0
  139. package/dist/scheduler/cron-parser.test.js +188 -0
  140. package/dist/scheduler/index.d.ts +3 -0
  141. package/dist/scheduler/index.js +2 -0
  142. package/dist/scheduler/scheduler.d.ts +81 -0
  143. package/dist/scheduler/scheduler.js +376 -0
  144. package/dist/scheduler/types.d.ts +65 -0
  145. package/dist/scheduler/types.js +1 -0
  146. package/dist/stores/factory.d.ts +36 -0
  147. package/dist/stores/factory.js +73 -0
  148. package/dist/stores/file.d.ts +60 -0
  149. package/dist/stores/file.js +173 -0
  150. package/dist/stores/file.test.d.ts +1 -0
  151. package/dist/stores/file.test.js +165 -0
  152. package/dist/stores/index.d.ts +6 -0
  153. package/dist/stores/index.js +5 -0
  154. package/dist/stores/memory.d.ts +19 -0
  155. package/dist/stores/memory.js +51 -0
  156. package/dist/stores/memory.test.d.ts +1 -0
  157. package/dist/stores/memory.test.js +157 -0
  158. package/dist/stores/postgrest.d.ts +55 -0
  159. package/dist/stores/postgrest.js +217 -0
  160. package/dist/stores/stores.test.d.ts +1 -0
  161. package/dist/stores/stores.test.js +158 -0
  162. package/dist/stores/types.d.ts +31 -0
  163. package/dist/stores/types.js +26 -0
  164. package/dist/sync/index.d.ts +4 -0
  165. package/dist/sync/index.js +2 -0
  166. package/dist/sync/state.d.ts +69 -0
  167. package/dist/sync/state.js +66 -0
  168. package/dist/sync/store.d.ts +49 -0
  169. package/dist/sync/store.js +93 -0
  170. package/dist/sync/sync.test.d.ts +1 -0
  171. package/dist/sync/sync.test.js +221 -0
  172. package/dist/utils/async.d.ts +7 -0
  173. package/dist/utils/async.js +9 -0
  174. package/dist/utils/file.d.ts +38 -0
  175. package/dist/utils/file.js +92 -0
  176. package/dist/utils/index.d.ts +4 -0
  177. package/dist/utils/index.js +4 -0
  178. package/dist/utils/logger.d.ts +34 -0
  179. package/dist/utils/logger.js +39 -0
  180. package/dist/utils/path.d.ts +12 -0
  181. package/dist/utils/path.js +41 -0
  182. package/dist/webhook/index.d.ts +8 -0
  183. package/dist/webhook/index.js +7 -0
  184. package/dist/webhook/server.d.ts +84 -0
  185. package/dist/webhook/server.js +319 -0
  186. package/dist/webhook/store.d.ts +67 -0
  187. package/dist/webhook/store.js +193 -0
  188. package/dist/webhook/types.d.ts +88 -0
  189. package/dist/webhook/types.js +6 -0
  190. package/docusaurus/README.md +41 -0
  191. package/docusaurus/docs/advanced/execution-state.md +283 -0
  192. package/docusaurus/docs/advanced/extending-reqon.md +388 -0
  193. package/docusaurus/docs/advanced/multi-file-missions.md +250 -0
  194. package/docusaurus/docs/advanced/parallel-execution.md +353 -0
  195. package/docusaurus/docs/api-reference.md +443 -0
  196. package/docusaurus/docs/authentication/api-key.md +339 -0
  197. package/docusaurus/docs/authentication/basic.md +276 -0
  198. package/docusaurus/docs/authentication/bearer.md +282 -0
  199. package/docusaurus/docs/authentication/oauth2.md +317 -0
  200. package/docusaurus/docs/authentication/overview.md +251 -0
  201. package/docusaurus/docs/cli.md +229 -0
  202. package/docusaurus/docs/core-concepts/actions.md +286 -0
  203. package/docusaurus/docs/core-concepts/missions.md +264 -0
  204. package/docusaurus/docs/core-concepts/schemas.md +353 -0
  205. package/docusaurus/docs/core-concepts/sources.md +339 -0
  206. package/docusaurus/docs/core-concepts/stores.md +332 -0
  207. package/docusaurus/docs/dsl-syntax/expressions.md +361 -0
  208. package/docusaurus/docs/dsl-syntax/fetch.md +293 -0
  209. package/docusaurus/docs/dsl-syntax/for-loops.md +324 -0
  210. package/docusaurus/docs/dsl-syntax/map.md +345 -0
  211. package/docusaurus/docs/dsl-syntax/match.md +387 -0
  212. package/docusaurus/docs/dsl-syntax/pipelines.md +397 -0
  213. package/docusaurus/docs/dsl-syntax/validate.md +401 -0
  214. package/docusaurus/docs/error-handling/dead-letter-queues.md +399 -0
  215. package/docusaurus/docs/error-handling/flow-control.md +337 -0
  216. package/docusaurus/docs/error-handling/retry-strategies.md +368 -0
  217. package/docusaurus/docs/examples.md +488 -0
  218. package/docusaurus/docs/getting-started.md +256 -0
  219. package/docusaurus/docs/http/circuit-breaker.md +401 -0
  220. package/docusaurus/docs/http/incremental-sync.md +394 -0
  221. package/docusaurus/docs/http/pagination.md +361 -0
  222. package/docusaurus/docs/http/rate-limiting.md +383 -0
  223. package/docusaurus/docs/http/requests.md +328 -0
  224. package/docusaurus/docs/http/retry.md +402 -0
  225. package/docusaurus/docs/intro.md +90 -0
  226. package/docusaurus/docs/openapi/loading-specs.md +305 -0
  227. package/docusaurus/docs/openapi/operation-calls.md +314 -0
  228. package/docusaurus/docs/openapi/overview.md +212 -0
  229. package/docusaurus/docs/openapi/response-validation.md +344 -0
  230. package/docusaurus/docs/scheduling/cron.md +305 -0
  231. package/docusaurus/docs/scheduling/daemon-mode.md +317 -0
  232. package/docusaurus/docs/scheduling/intervals.md +289 -0
  233. package/docusaurus/docs/scheduling/overview.md +231 -0
  234. package/docusaurus/docs/stores/custom-adapters.md +376 -0
  235. package/docusaurus/docs/stores/file.md +236 -0
  236. package/docusaurus/docs/stores/memory.md +193 -0
  237. package/docusaurus/docs/stores/overview.md +274 -0
  238. package/docusaurus/docs/stores/postgrest.md +316 -0
  239. package/docusaurus/docusaurus.config.ts +148 -0
  240. package/docusaurus/package-lock.json +18029 -0
  241. package/docusaurus/package.json +47 -0
  242. package/docusaurus/sidebars.ts +155 -0
  243. package/docusaurus/src/components/HomepageFeatures/index.tsx +105 -0
  244. package/docusaurus/src/components/HomepageFeatures/styles.module.css +12 -0
  245. package/docusaurus/src/css/custom.css +169 -0
  246. package/docusaurus/src/pages/index.module.css +48 -0
  247. package/docusaurus/src/pages/index.tsx +110 -0
  248. package/docusaurus/src/pages/markdown-page.md +7 -0
  249. package/docusaurus/static/.nojekyll +0 -0
  250. package/docusaurus/static/img/docusaurus-social-card.jpg +0 -0
  251. package/docusaurus/static/img/docusaurus.png +0 -0
  252. package/docusaurus/static/img/favicon.ico +0 -0
  253. package/docusaurus/static/img/logo.svg +10 -0
  254. package/docusaurus/static/img/undraw_docusaurus_mountain.svg +171 -0
  255. package/docusaurus/static/img/undraw_docusaurus_react.svg +170 -0
  256. package/docusaurus/static/img/undraw_docusaurus_tree.svg +40 -0
  257. package/docusaurus/tsconfig.json +8 -0
  258. package/examples/README.md +112 -0
  259. package/examples/error-handling/README.md +150 -0
  260. package/examples/error-handling/payment-processor.vague +287 -0
  261. package/examples/github-sync/README.md +74 -0
  262. package/examples/github-sync/fetch-issues.vague +47 -0
  263. package/examples/github-sync/fetch-prs.vague +40 -0
  264. package/examples/github-sync/mission.vague +101 -0
  265. package/examples/github-sync/normalize.vague +70 -0
  266. package/examples/jsonplaceholder/README.md +28 -0
  267. package/examples/jsonplaceholder/posts.vague +48 -0
  268. package/examples/petstore/README.md +35 -0
  269. package/examples/petstore/openapi.yaml +97 -0
  270. package/examples/petstore/sync.vague +52 -0
  271. package/examples/temporal-comparison/README.md +297 -0
  272. package/examples/temporal-comparison/reconciliation.vague +355 -0
  273. package/examples/temporal-comparison/temporal/activities/index.ts +8 -0
  274. package/examples/temporal-comparison/temporal/activities/shipstation.ts +225 -0
  275. package/examples/temporal-comparison/temporal/activities/shopify.ts +257 -0
  276. package/examples/temporal-comparison/temporal/activities/storage.ts +198 -0
  277. package/examples/temporal-comparison/temporal/activities/stripe.ts +169 -0
  278. package/examples/temporal-comparison/temporal/activities/validation.ts +205 -0
  279. package/examples/temporal-comparison/temporal/client/schedule.ts +218 -0
  280. package/examples/temporal-comparison/temporal/config/retry.ts +63 -0
  281. package/examples/temporal-comparison/temporal/types/index.ts +129 -0
  282. package/examples/temporal-comparison/temporal/workers/main.ts +130 -0
  283. package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +262 -0
  284. package/examples/xero/README.md +88 -0
  285. package/examples/xero/invoices.vague +189 -0
  286. package/package.json +40 -0
  287. package/src/api-integration.test.ts +954 -0
  288. package/src/ast/index.ts +1 -0
  289. package/src/ast/nodes.ts +310 -0
  290. package/src/auth/auth.test.ts +326 -0
  291. package/src/auth/circuit-breaker.test.ts +390 -0
  292. package/src/auth/circuit-breaker.ts +379 -0
  293. package/src/auth/credentials.test.ts +273 -0
  294. package/src/auth/credentials.ts +246 -0
  295. package/src/auth/index.ts +40 -0
  296. package/src/auth/oauth2-provider.ts +177 -0
  297. package/src/auth/rate-limiter.ts +459 -0
  298. package/src/auth/token-store.ts +177 -0
  299. package/src/auth/types.ts +159 -0
  300. package/src/benchmark/e2e.bench.ts +288 -0
  301. package/src/benchmark/evaluator.bench.ts +331 -0
  302. package/src/benchmark/fixtures.ts +295 -0
  303. package/src/benchmark/index.ts +108 -0
  304. package/src/benchmark/lexer.bench.ts +69 -0
  305. package/src/benchmark/parser.bench.ts +103 -0
  306. package/src/benchmark/resilience.bench.ts +193 -0
  307. package/src/benchmark/store.bench.ts +147 -0
  308. package/src/benchmark/utils.ts +230 -0
  309. package/src/cli.ts +313 -0
  310. package/src/errors/errors.test.ts +234 -0
  311. package/src/errors/index.ts +223 -0
  312. package/src/execution/execution.test.ts +307 -0
  313. package/src/execution/index.ts +21 -0
  314. package/src/execution/state.ts +207 -0
  315. package/src/execution/store.ts +188 -0
  316. package/src/index.ts +169 -0
  317. package/src/integration.test.ts +192 -0
  318. package/src/interpreter/context.ts +57 -0
  319. package/src/interpreter/evaluator.test.ts +796 -0
  320. package/src/interpreter/evaluator.ts +245 -0
  321. package/src/interpreter/executor.ts +946 -0
  322. package/src/interpreter/fetch-handler.ts +302 -0
  323. package/src/interpreter/http.test.ts +423 -0
  324. package/src/interpreter/http.ts +308 -0
  325. package/src/interpreter/index.ts +32 -0
  326. package/src/interpreter/pagination.ts +207 -0
  327. package/src/interpreter/progress.test.ts +276 -0
  328. package/src/interpreter/schema-matcher.test.ts +160 -0
  329. package/src/interpreter/schema-matcher.ts +168 -0
  330. package/src/interpreter/signals.ts +73 -0
  331. package/src/interpreter/step-handlers/for-handler.ts +65 -0
  332. package/src/interpreter/step-handlers/index.ts +17 -0
  333. package/src/interpreter/step-handlers/map-handler.ts +24 -0
  334. package/src/interpreter/step-handlers/match-handler.ts +101 -0
  335. package/src/interpreter/step-handlers/store-handler.ts +78 -0
  336. package/src/interpreter/step-handlers/types.ts +17 -0
  337. package/src/interpreter/step-handlers/validate-handler.ts +30 -0
  338. package/src/interpreter/step-handlers/webhook-handler.ts +142 -0
  339. package/src/lexer/index.ts +18 -0
  340. package/src/lexer/lexer.test.ts +316 -0
  341. package/src/lexer/tokens.ts +179 -0
  342. package/src/loader/index.ts +288 -0
  343. package/src/loader/loader.test.ts +360 -0
  344. package/src/oas/index.ts +4 -0
  345. package/src/oas/loader.ts +126 -0
  346. package/src/oas/oas.test.ts +254 -0
  347. package/src/oas/validator.ts +299 -0
  348. package/src/parser/base.ts +124 -0
  349. package/src/parser/expressions.test.ts +525 -0
  350. package/src/parser/expressions.ts +314 -0
  351. package/src/parser/index.ts +3 -0
  352. package/src/parser/match.test.ts +296 -0
  353. package/src/parser/parser.test.ts +739 -0
  354. package/src/parser/parser.ts +1469 -0
  355. package/src/parser/schedule.test.ts +287 -0
  356. package/src/parser/webhook.test.ts +248 -0
  357. package/src/plugin.ts +83 -0
  358. package/src/scheduler/cron-parser.test.ts +236 -0
  359. package/src/scheduler/cron-parser.ts +236 -0
  360. package/src/scheduler/index.ts +10 -0
  361. package/src/scheduler/scheduler.ts +443 -0
  362. package/src/scheduler/types.ts +71 -0
  363. package/src/stores/factory.ts +104 -0
  364. package/src/stores/file.test.ts +276 -0
  365. package/src/stores/file.ts +211 -0
  366. package/src/stores/index.ts +6 -0
  367. package/src/stores/memory.test.ts +238 -0
  368. package/src/stores/memory.ts +63 -0
  369. package/src/stores/postgrest.test.ts +488 -0
  370. package/src/stores/postgrest.ts +263 -0
  371. package/src/stores/stores.test.ts +197 -0
  372. package/src/stores/types.ts +58 -0
  373. package/src/sync/index.ts +16 -0
  374. package/src/sync/state.ts +126 -0
  375. package/src/sync/store.ts +139 -0
  376. package/src/sync/sync.test.ts +271 -0
  377. package/src/utils/async.ts +10 -0
  378. package/src/utils/file.ts +106 -0
  379. package/src/utils/index.ts +14 -0
  380. package/src/utils/logger.ts +53 -0
  381. package/src/utils/path.ts +47 -0
  382. package/src/webhook/index.ts +15 -0
  383. package/src/webhook/server.test.ts +253 -0
  384. package/src/webhook/server.ts +389 -0
  385. package/src/webhook/store.ts +239 -0
  386. package/src/webhook/types.ts +93 -0
  387. package/tsconfig.json +17 -0
  388. package/vitest.config.ts +39 -0
@@ -0,0 +1,212 @@
1
+ ---
2
+ sidebar_position: 1
3
+ ---
4
+
5
+ # OpenAPI Integration Overview
6
+
7
+ Reqon integrates with OpenAPI (Swagger) specifications for type-safe API calls and response validation.
8
+
9
+ ## Benefits
10
+
11
+ - **Type-safe operations**: Call APIs by operation ID
12
+ - **Auto-discovery**: Base URL and endpoints from spec
13
+ - **Response validation**: Validate against schema definitions
14
+ - **Documentation sync**: API changes reflected automatically
15
+
16
+ ## Quick Start
17
+
18
+ ### 1. Define Source from Spec
19
+
20
+ ```vague
21
+ source Petstore from "./petstore.yaml" {
22
+ auth: bearer,
23
+ validateResponses: true
24
+ }
25
+ ```
26
+
27
+ ### 2. Call Operations
28
+
29
+ ```vague
30
+ action FetchPets {
31
+ call Petstore.listPets { params: { limit: 100 } }
32
+ store response -> pets { key: .id }
33
+
34
+ call Petstore.getPetById { params: { petId: "123" } }
35
+ store response -> petDetails { key: .id }
36
+ }
37
+ ```
38
+
39
+ ## How It Works
40
+
41
+ ### Loading Specs
42
+
43
+ Reqon loads and parses OpenAPI specs:
44
+
45
+ ```vague
46
+ // Local file
47
+ source API from "./api.yaml" { auth: bearer }
48
+
49
+ // URL
50
+ source API from "https://api.example.com/openapi.json" { auth: bearer }
51
+ ```
52
+
53
+ ### Operation Resolution
54
+
55
+ Reqon maps `call Source.operationId` to:
56
+
57
+ ```yaml
58
+ # OpenAPI spec
59
+ paths:
60
+ /pets:
61
+ get:
62
+ operationId: listPets
63
+ # Reqon uses: GET /pets
64
+ ```
65
+
66
+ ### Base URL Extraction
67
+
68
+ Base URL from spec's `servers`:
69
+
70
+ ```yaml
71
+ servers:
72
+ - url: https://api.example.com/v1
73
+ ```
74
+
75
+ ## Configuration Options
76
+
77
+ ```vague
78
+ source API from "./spec.yaml" {
79
+ auth: bearer,
80
+ validateResponses: true, # Validate responses against schema
81
+ headers: { # Additional headers
82
+ "X-Custom": "value"
83
+ }
84
+ }
85
+ ```
86
+
87
+ ## Example Workflow
88
+
89
+ ```vague
90
+ mission PetstoreSync {
91
+ source Petstore from "./petstore.yaml" {
92
+ auth: api_key,
93
+ validateResponses: true
94
+ }
95
+
96
+ store pets: file("pets")
97
+
98
+ action SyncPets {
99
+ // List all pets
100
+ call Petstore.listPets {
101
+ params: { limit: 100 }
102
+ }
103
+
104
+ for pet in response {
105
+ // Get full details
106
+ call Petstore.getPetById {
107
+ params: { petId: pet.id }
108
+ }
109
+
110
+ store response -> pets { key: .id }
111
+ }
112
+ }
113
+
114
+ action CreatePet {
115
+ call Petstore.addPet {
116
+ body: {
117
+ name: "Fluffy",
118
+ tag: "cat"
119
+ }
120
+ }
121
+ }
122
+
123
+ run SyncPets
124
+ }
125
+ ```
126
+
127
+ ## Comparison: Traditional vs OAS
128
+
129
+ ### Traditional Approach
130
+
131
+ ```vague
132
+ source API { auth: bearer, base: "https://api.example.com" }
133
+
134
+ action Fetch {
135
+ get "/pets"
136
+ get concat("/pets/", id)
137
+ }
138
+ ```
139
+
140
+ ### OAS Approach
141
+
142
+ ```vague
143
+ source API from "./spec.yaml" { auth: bearer }
144
+
145
+ action Fetch {
146
+ call API.listPets
147
+ call API.getPetById { params: { petId: id } }
148
+ }
149
+ ```
150
+
151
+ ### Benefits of OAS
152
+
153
+ | Aspect | Traditional | OAS |
154
+ |--------|-------------|-----|
155
+ | Type safety | None | Schema validation |
156
+ | Endpoint updates | Manual | Automatic |
157
+ | Documentation | Separate | Integrated |
158
+ | IDE support | Limited | Full autocomplete |
159
+
160
+ ## Supported Spec Formats
161
+
162
+ - OpenAPI 3.0.x (recommended)
163
+ - OpenAPI 3.1.x
164
+ - Swagger 2.0 (converted internally)
165
+
166
+ ### Format Detection
167
+
168
+ ```vague
169
+ // YAML
170
+ source API from "./spec.yaml"
171
+
172
+ // JSON
173
+ source API from "./spec.json"
174
+
175
+ // Remote
176
+ source API from "https://api.example.com/openapi.json"
177
+ ```
178
+
179
+ ## Common Patterns
180
+
181
+ ### Fetch with Pagination
182
+
183
+ ```vague
184
+ call API.listItems {
185
+ params: { limit: 100 },
186
+ paginate: cursor(cursor, 100, "nextCursor"),
187
+ until: response.nextCursor == null
188
+ }
189
+ ```
190
+
191
+ ### Conditional Operations
192
+
193
+ ```vague
194
+ action SyncItem {
195
+ call API.getItem { params: { id: itemId } }
196
+
197
+ match response {
198
+ { exists: false } -> {
199
+ call API.createItem { body: itemData }
200
+ },
201
+ _ -> {
202
+ call API.updateItem { params: { id: itemId }, body: itemData }
203
+ }
204
+ }
205
+ }
206
+ ```
207
+
208
+ ## Next Steps
209
+
210
+ - [Loading Specs](./loading-specs) - Loading and caching specs
211
+ - [Operation Calls](./operation-calls) - Calling operations
212
+ - [Response Validation](./response-validation) - Validating responses
@@ -0,0 +1,344 @@
1
+ ---
2
+ sidebar_position: 4
3
+ ---
4
+
5
+ # Response Validation
6
+
7
+ Reqon can validate API responses against OpenAPI schema definitions.
8
+
9
+ ## Enabling Validation
10
+
11
+ ```vague
12
+ source API from "./spec.yaml" {
13
+ auth: bearer,
14
+ validateResponses: true
15
+ }
16
+ ```
17
+
18
+ ## How It Works
19
+
20
+ ### Schema Matching
21
+
22
+ OpenAPI spec:
23
+ ```yaml
24
+ paths:
25
+ /pets/{petId}:
26
+ get:
27
+ operationId: getPetById
28
+ responses:
29
+ '200':
30
+ content:
31
+ application/json:
32
+ schema:
33
+ $ref: '#/components/schemas/Pet'
34
+
35
+ components:
36
+ schemas:
37
+ Pet:
38
+ type: object
39
+ required:
40
+ - id
41
+ - name
42
+ properties:
43
+ id:
44
+ type: string
45
+ name:
46
+ type: string
47
+ tag:
48
+ type: string
49
+ ```
50
+
51
+ Reqon validates:
52
+ ```vague
53
+ call API.getPetById { params: { petId: "123" } }
54
+ // Validates response against Pet schema
55
+ ```
56
+
57
+ ## Validation Modes
58
+
59
+ ### Strict Mode
60
+
61
+ Fails on schema mismatch:
62
+
63
+ ```vague
64
+ source API from "./spec.yaml" {
65
+ validateResponses: true,
66
+ validationMode: "strict"
67
+ }
68
+ ```
69
+
70
+ ### Warning Mode
71
+
72
+ Logs warning but continues:
73
+
74
+ ```vague
75
+ source API from "./spec.yaml" {
76
+ validateResponses: true,
77
+ validationMode: "warn"
78
+ }
79
+ ```
80
+
81
+ ### Off
82
+
83
+ No validation (default):
84
+
85
+ ```vague
86
+ source API from "./spec.yaml" {
87
+ validateResponses: false
88
+ }
89
+ ```
90
+
91
+ ## Validation Rules
92
+
93
+ ### Required Fields
94
+
95
+ ```yaml
96
+ Pet:
97
+ required:
98
+ - id
99
+ - name
100
+ ```
101
+
102
+ Response missing `name` triggers error:
103
+ ```json
104
+ { "id": "123" } // Error: missing required field 'name'
105
+ ```
106
+
107
+ ### Type Checking
108
+
109
+ ```yaml
110
+ Pet:
111
+ properties:
112
+ id:
113
+ type: string
114
+ age:
115
+ type: integer
116
+ ```
117
+
118
+ ```json
119
+ { "id": 123, "age": "five" }
120
+ // Errors: id should be string, age should be integer
121
+ ```
122
+
123
+ ### Enum Validation
124
+
125
+ ```yaml
126
+ Pet:
127
+ properties:
128
+ status:
129
+ type: string
130
+ enum: [available, pending, sold]
131
+ ```
132
+
133
+ ```json
134
+ { "status": "active" } // Error: status not in enum
135
+ ```
136
+
137
+ ### Array Validation
138
+
139
+ ```yaml
140
+ Pets:
141
+ type: array
142
+ items:
143
+ $ref: '#/components/schemas/Pet'
144
+ ```
145
+
146
+ Each item in array is validated.
147
+
148
+ ## Error Handling
149
+
150
+ ### With Validation Errors
151
+
152
+ ```vague
153
+ call API.getPet { params: { id: "123" } }
154
+
155
+ match response {
156
+ { validationErrors: errors } -> {
157
+ store {
158
+ operation: "getPet",
159
+ errors: errors
160
+ } -> validationFailures
161
+ skip
162
+ },
163
+ _ -> store response -> pets { key: .id }
164
+ }
165
+ ```
166
+
167
+ ### Catching Specific Errors
168
+
169
+ ```vague
170
+ match response {
171
+ { validationErrors: e } where includes(e, "missing required") -> {
172
+ // Handle missing fields
173
+ abort "Incomplete data from API"
174
+ },
175
+ { validationErrors: e } where includes(e, "type mismatch") -> {
176
+ // Handle type issues
177
+ store response -> typeIssues { key: response.id }
178
+ skip
179
+ },
180
+ _ -> continue
181
+ }
182
+ ```
183
+
184
+ ## Custom Validation
185
+
186
+ ### Additional Constraints
187
+
188
+ Beyond schema validation:
189
+
190
+ ```vague
191
+ call API.getOrder { params: { id: orderId } }
192
+
193
+ // Schema validation happens automatically
194
+
195
+ // Additional business validation
196
+ validate response {
197
+ assume .total >= 0,
198
+ assume .items is array,
199
+ assume length(.items) > 0,
200
+ assume .status != "invalid"
201
+ }
202
+
203
+ store response -> orders { key: .id }
204
+ ```
205
+
206
+ ### Combining Validations
207
+
208
+ ```vague
209
+ action ValidatedFetch {
210
+ call API.listItems
211
+
212
+ for item in response.items {
213
+ // Schema already validated by OAS
214
+
215
+ // Additional validation
216
+ validate item {
217
+ assume .price > 0,
218
+ assume .quantity >= 0
219
+ }
220
+
221
+ match item {
222
+ _ where .validationErrors != null -> {
223
+ queue invalid { item: item }
224
+ skip
225
+ },
226
+ _ -> store item -> items { key: .id }
227
+ }
228
+ }
229
+ }
230
+ ```
231
+
232
+ ## Schema References
233
+
234
+ ### Component Schemas
235
+
236
+ ```yaml
237
+ components:
238
+ schemas:
239
+ Pet:
240
+ type: object
241
+ properties:
242
+ id: { type: string }
243
+ owner:
244
+ $ref: '#/components/schemas/Owner'
245
+ Owner:
246
+ type: object
247
+ properties:
248
+ name: { type: string }
249
+ ```
250
+
251
+ Nested schemas are validated:
252
+
253
+ ```json
254
+ {
255
+ "id": "123",
256
+ "owner": {
257
+ "name": 123 // Error: name should be string
258
+ }
259
+ }
260
+ ```
261
+
262
+ ### OneOf/AnyOf
263
+
264
+ ```yaml
265
+ Response:
266
+ oneOf:
267
+ - $ref: '#/components/schemas/Success'
268
+ - $ref: '#/components/schemas/Error'
269
+ ```
270
+
271
+ Validates against matching schema.
272
+
273
+ ## Best Practices
274
+
275
+ ### Use Validation in Development
276
+
277
+ ```vague
278
+ source API from "./spec.yaml" {
279
+ validateResponses: env("NODE_ENV") != "production"
280
+ }
281
+ ```
282
+
283
+ ### Log Validation Failures
284
+
285
+ ```vague
286
+ match response {
287
+ { validationErrors: e } -> {
288
+ store {
289
+ timestamp: now(),
290
+ operation: currentOperation,
291
+ errors: e,
292
+ response: response
293
+ } -> validationLog
294
+ },
295
+ _ -> continue
296
+ }
297
+ ```
298
+
299
+ ### Keep Specs Updated
300
+
301
+ Ensure spec matches actual API:
302
+ - Run validation in CI/CD
303
+ - Update spec when API changes
304
+ - Use spec versioning
305
+
306
+ ### Handle Gracefully
307
+
308
+ ```vague
309
+ // Don't fail hard on validation
310
+ source API from "./spec.yaml" {
311
+ validateResponses: true,
312
+ validationMode: "warn"
313
+ }
314
+
315
+ // Handle in code
316
+ match response {
317
+ { validationErrors: _ } -> {
318
+ // Log and continue with caution
319
+ },
320
+ _ -> continue
321
+ }
322
+ ```
323
+
324
+ ## Troubleshooting
325
+
326
+ ### "Schema not found"
327
+
328
+ Check component name matches:
329
+
330
+ ```yaml
331
+ $ref: '#/components/schemas/Pet' # Case sensitive
332
+ ```
333
+
334
+ ### False Positives
335
+
336
+ Schema may be outdated:
337
+ - Update spec from API provider
338
+ - Check for API version changes
339
+
340
+ ### Performance
341
+
342
+ Validation adds overhead:
343
+ - Disable in production if not needed
344
+ - Use sampling for high-volume APIs