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,101 @@
1
+ // GitHub Issues & PRs Sync Mission
2
+ // Demonstrates multi-file missions, parallel execution, and error handling
3
+ //
4
+ // This mission is organized as a folder:
5
+ // github-sync/
6
+ // ├── mission.reqon # This file: sources, stores, schemas, pipeline
7
+ // ├── fetch-issues.reqon # Fetches issues with pagination
8
+ // ├── fetch-prs.reqon # Fetches pull requests
9
+ // └── normalize.reqon # Normalizes to unified schema
10
+
11
+ mission SyncGitHub {
12
+
13
+ // ============================================================
14
+ // SOURCE
15
+ // ============================================================
16
+
17
+ source GitHub {
18
+ auth: bearer,
19
+ base: "https://api.github.com",
20
+ headers: {
21
+ "Accept": "application/vnd.github.v3+json",
22
+ "User-Agent": "reqon-sync"
23
+ },
24
+ rateLimit: {
25
+ strategy: "pause",
26
+ maxWait: 60,
27
+ fallbackRpm: 60
28
+ }
29
+ }
30
+
31
+ // ============================================================
32
+ // STORES
33
+ // ============================================================
34
+
35
+ store issues_raw: memory("issues_raw")
36
+ store prs_raw: memory("prs_raw")
37
+ store work_items: sql("work_items")
38
+ store errors: memory("sync_errors")
39
+
40
+ // ============================================================
41
+ // SCHEMAS - For response type matching
42
+ // ============================================================
43
+
44
+ schema GitHubIssue {
45
+ id: int,
46
+ number: int,
47
+ title: string,
48
+ body: string?,
49
+ state: string,
50
+ user: object,
51
+ labels: array,
52
+ created_at: date,
53
+ updated_at: date
54
+ }
55
+
56
+ schema GitHubPR {
57
+ id: int,
58
+ number: int,
59
+ title: string,
60
+ body: string?,
61
+ state: string,
62
+ user: object,
63
+ head: object,
64
+ base: object,
65
+ merged: boolean?,
66
+ created_at: date,
67
+ updated_at: date
68
+ }
69
+
70
+ schema RateLimitError {
71
+ message: string,
72
+ documentation_url: string
73
+ }
74
+
75
+ schema NotFoundError {
76
+ message: string,
77
+ documentation_url: string
78
+ }
79
+
80
+ schema UnifiedWorkItem {
81
+ id: string,
82
+ source: string,
83
+ type: string,
84
+ number: int,
85
+ title: string,
86
+ description: string?,
87
+ status: string,
88
+ author: string,
89
+ labels: array,
90
+ created_at: date,
91
+ updated_at: date,
92
+ synced_at: date
93
+ }
94
+
95
+ // ============================================================
96
+ // PIPELINE - Parallel fetch, then normalize
97
+ // ============================================================
98
+
99
+ // FetchIssues and FetchPRs run in parallel, then Normalize runs after both complete
100
+ run [FetchIssues, FetchPRs] then Normalize
101
+ }
@@ -0,0 +1,70 @@
1
+ // Normalize issues and PRs to unified work items
2
+ // External action file - automatically merged into mission
3
+
4
+ action Normalize {
5
+ // Normalize issues
6
+ for issue in issues_raw {
7
+ map issue -> UnifiedWorkItem {
8
+ id: "issue_" + .id,
9
+ source: "github",
10
+ type: "issue",
11
+ number: .number,
12
+ title: .title,
13
+ description: .body,
14
+ status: match .state {
15
+ "open" => "open",
16
+ "closed" => "closed",
17
+ _ => "unknown"
18
+ },
19
+ author: .user.login,
20
+ labels: .labels,
21
+ created_at: .created_at,
22
+ updated_at: .updated_at,
23
+ synced_at: now()
24
+ }
25
+
26
+ validate response {
27
+ assume length(.title) > 0
28
+ assume .number > 0
29
+ }
30
+
31
+ store response -> work_items {
32
+ key: .id,
33
+ upsert: true
34
+ }
35
+ }
36
+
37
+ // Normalize PRs
38
+ for pr in prs_raw {
39
+ map pr -> UnifiedWorkItem {
40
+ id: "pr_" + .id,
41
+ source: "github",
42
+ type: "pull_request",
43
+ number: .number,
44
+ title: .title,
45
+ description: .body,
46
+ status: match .state {
47
+ "open" => "open",
48
+ "closed" => match .merged {
49
+ true => "merged",
50
+ _ => "closed"
51
+ },
52
+ _ => "unknown"
53
+ },
54
+ author: .user.login,
55
+ labels: [],
56
+ created_at: .created_at,
57
+ updated_at: .updated_at,
58
+ synced_at: now()
59
+ }
60
+
61
+ validate response {
62
+ assume length(.title) > 0
63
+ }
64
+
65
+ store response -> work_items {
66
+ key: .id,
67
+ upsert: true
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,28 @@
1
+ # JSONPlaceholder Example
2
+
3
+ Demonstrates basic Reqon usage with a public API (no authentication).
4
+
5
+ ## What it does
6
+
7
+ 1. Fetches 100 posts from JSONPlaceholder API
8
+ 2. Maps each post to a normalized `StandardPost` schema
9
+ 3. Stores results in memory
10
+
11
+ ## Run
12
+
13
+ ```bash
14
+ node dist/cli.js examples/jsonplaceholder/posts.vague --verbose
15
+ ```
16
+
17
+ Export to JSON:
18
+ ```bash
19
+ node dist/cli.js examples/jsonplaceholder/posts.vague --output output.json
20
+ ```
21
+
22
+ ## Features demonstrated
23
+
24
+ - `auth: none` for public APIs
25
+ - `get` for simple requests
26
+ - `map` for schema transformation
27
+ - `for...in` iteration over stored items
28
+ - `run...then` for action sequencing
@@ -0,0 +1,48 @@
1
+ // JSONPlaceholder Posts Sync - Demo with public API
2
+ // Fetches posts and their comments, normalizes to a standard schema
3
+
4
+ mission SyncPosts {
5
+ source JSONPlaceholder {
6
+ auth: none,
7
+ base: "https://jsonplaceholder.typicode.com"
8
+ }
9
+
10
+ store posts_raw: sql("posts_raw")
11
+ store posts_normalized: sql("posts_normalized")
12
+
13
+ action FetchPosts {
14
+ get "/posts"
15
+
16
+ validate response {
17
+ assume length(response) > 0
18
+ }
19
+
20
+ store response -> posts_raw {
21
+ key: .id
22
+ }
23
+ }
24
+
25
+ action NormalizePosts {
26
+ for post in posts_raw {
27
+ map post -> StandardPost {
28
+ id: .id,
29
+ title: .title,
30
+ body: .body,
31
+ author_id: .userId,
32
+ origin: "jsonplaceholder"
33
+ }
34
+
35
+ validate response {
36
+ assume length(.title) > 0
37
+ assume .author_id > 0
38
+ }
39
+
40
+ store response -> posts_normalized {
41
+ key: .id
42
+ }
43
+ }
44
+ }
45
+
46
+ run FetchPosts
47
+ then NormalizePosts
48
+ }
@@ -0,0 +1,35 @@
1
+ # Petstore Example
2
+
3
+ Demonstrates OpenAPI spec integration with Reqon.
4
+
5
+ ## What it does
6
+
7
+ 1. Loads API definition from `openapi.yaml`
8
+ 2. Fetches pets using `operationId` references
9
+ 3. Normalizes pet data with pattern matching
10
+ 4. Validates output schema
11
+
12
+ ## Run
13
+
14
+ ```bash
15
+ node dist/cli.js examples/petstore/sync.vague --auth credentials.json --verbose
16
+ ```
17
+
18
+ Requires a `credentials.json`:
19
+ ```json
20
+ {
21
+ "Petstore": {
22
+ "type": "bearer",
23
+ "token": "your-api-token"
24
+ }
25
+ }
26
+ ```
27
+
28
+ ## Features demonstrated
29
+
30
+ - `source ... from "spec.yaml"` for OAS integration
31
+ - `validateResponses: true` for response validation against spec
32
+ - `call Source.operationId` syntax
33
+ - Cursor-based pagination
34
+ - `match` expressions for value mapping
35
+ - `validate` with `assume` constraints
@@ -0,0 +1,97 @@
1
+ openapi: 3.0.3
2
+ info:
3
+ title: Petstore API
4
+ version: 1.0.0
5
+ servers:
6
+ - url: https://api.petstore.example.com/v1
7
+ paths:
8
+ /pets:
9
+ get:
10
+ operationId: listPets
11
+ summary: List all pets
12
+ parameters:
13
+ - name: limit
14
+ in: query
15
+ schema:
16
+ type: integer
17
+ default: 20
18
+ responses:
19
+ '200':
20
+ description: A list of pets
21
+ content:
22
+ application/json:
23
+ schema:
24
+ type: object
25
+ properties:
26
+ pets:
27
+ type: array
28
+ items:
29
+ $ref: '#/components/schemas/Pet'
30
+ nextCursor:
31
+ type: string
32
+ post:
33
+ operationId: createPet
34
+ summary: Create a pet
35
+ requestBody:
36
+ required: true
37
+ content:
38
+ application/json:
39
+ schema:
40
+ $ref: '#/components/schemas/NewPet'
41
+ responses:
42
+ '201':
43
+ description: Pet created
44
+ content:
45
+ application/json:
46
+ schema:
47
+ $ref: '#/components/schemas/Pet'
48
+ /pets/{petId}:
49
+ get:
50
+ operationId: getPet
51
+ summary: Get a pet by ID
52
+ parameters:
53
+ - name: petId
54
+ in: path
55
+ required: true
56
+ schema:
57
+ type: string
58
+ responses:
59
+ '200':
60
+ description: A pet
61
+ content:
62
+ application/json:
63
+ schema:
64
+ $ref: '#/components/schemas/Pet'
65
+ components:
66
+ schemas:
67
+ Pet:
68
+ type: object
69
+ required:
70
+ - id
71
+ - name
72
+ properties:
73
+ id:
74
+ type: string
75
+ name:
76
+ type: string
77
+ species:
78
+ type: string
79
+ enum: [dog, cat, bird, fish]
80
+ age:
81
+ type: integer
82
+ minimum: 0
83
+ NewPet:
84
+ type: object
85
+ required:
86
+ - name
87
+ properties:
88
+ name:
89
+ type: string
90
+ species:
91
+ type: string
92
+ age:
93
+ type: integer
94
+ securitySchemes:
95
+ bearerAuth:
96
+ type: http
97
+ scheme: bearer
@@ -0,0 +1,52 @@
1
+ // Petstore Sync Mission - demonstrating OAS integration
2
+ // The API spec is loaded from petstore.yaml, so we don't need to specify paths or methods
3
+
4
+ mission SyncPets {
5
+ // Load source from OpenAPI spec - base URL comes from spec's servers field
6
+ source Petstore from "./examples/petstore.yaml" {
7
+ auth: bearer,
8
+ validateResponses: true
9
+ }
10
+
11
+ store pets_raw: sql("pets_raw")
12
+ store pets_normalized: sql("pets_normalized")
13
+
14
+ // Fetch all pets using operationId from OAS
15
+ action FetchPets {
16
+ call Petstore.listPets {
17
+ paginate: cursor(cursor, 20, "nextCursor"),
18
+ until: response.pets.length == 0
19
+ }
20
+
21
+ store response.pets -> pets_raw {
22
+ key: .id
23
+ }
24
+ }
25
+
26
+ // Normalize to our internal schema
27
+ action NormalizePets {
28
+ for pet in pets_raw {
29
+ map pet -> InternalPet {
30
+ id: .id,
31
+ display_name: .name,
32
+ animal_type: match .species {
33
+ "dog" => "canine",
34
+ "cat" => "feline",
35
+ "bird" => "avian",
36
+ _ => "other"
37
+ },
38
+ age_years: .age
39
+ }
40
+
41
+ validate response {
42
+ assume .display_name != ""
43
+ }
44
+
45
+ store response -> pets_normalized {
46
+ key: .id
47
+ }
48
+ }
49
+ }
50
+
51
+ run FetchPets then NormalizePets
52
+ }