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,286 @@
1
+ ---
2
+ sidebar_position: 2
3
+ ---
4
+
5
+ # Actions
6
+
7
+ An **Action** is a named sequence of steps that process data. Actions are the building blocks of your pipeline logic.
8
+
9
+ ## Basic Structure
10
+
11
+ ```vague
12
+ action ActionName {
13
+ // Step 1
14
+ get "/endpoint"
15
+
16
+ // Step 2
17
+ for item in response {
18
+ // Nested steps
19
+ }
20
+
21
+ // Step 3
22
+ store response -> storeName { key: .id }
23
+ }
24
+ ```
25
+
26
+ ## Step Types
27
+
28
+ Actions can contain the following step types:
29
+
30
+ | Step | Description |
31
+ |------|-------------|
32
+ | `get`, `post`, `put`, `patch`, `delete` | HTTP requests |
33
+ | `call` | OAS operation call |
34
+ | `for...in...where` | Iteration with optional filtering |
35
+ | `map...->` | Data transformation |
36
+ | `validate` | Constraint checking |
37
+ | `store...->` | Data persistence |
38
+ | `match` | Pattern matching with flow control |
39
+
40
+ ## HTTP Request Steps
41
+
42
+ Fetch data from APIs:
43
+
44
+ ```vague
45
+ action FetchData {
46
+ // Simple GET
47
+ get "/users"
48
+
49
+ // With query parameters
50
+ get "/users" { params: { limit: 100, offset: 0 } }
51
+
52
+ // With pagination
53
+ get "/users" {
54
+ paginate: offset(page, 100),
55
+ until: length(response.users) == 0
56
+ }
57
+
58
+ // POST with body
59
+ post "/users" {
60
+ body: {
61
+ name: "John",
62
+ email: "john@example.com"
63
+ }
64
+ }
65
+ }
66
+ ```
67
+
68
+ ## Iteration Steps
69
+
70
+ Process collections:
71
+
72
+ ```vague
73
+ action ProcessUsers {
74
+ get "/users"
75
+
76
+ // Iterate all items
77
+ for user in response.users {
78
+ // Process each user
79
+ }
80
+
81
+ // With filtering
82
+ for user in response.users where .status == "active" {
83
+ // Process only active users
84
+ }
85
+ }
86
+ ```
87
+
88
+ ## Transformation Steps
89
+
90
+ Transform data shapes:
91
+
92
+ ```vague
93
+ action TransformData {
94
+ get "/users"
95
+
96
+ for user in response.users {
97
+ map user -> StandardUser {
98
+ id: .id,
99
+ fullName: concat(.firstName, " ", .lastName),
100
+ email: lowercase(.email),
101
+ createdAt: parseDate(.created_at)
102
+ }
103
+
104
+ store user -> users { key: .id }
105
+ }
106
+ }
107
+ ```
108
+
109
+ See the [Vague documentation](https://github.com/mcclowes/vague) for expression syntax.
110
+
111
+ ## Validation Steps
112
+
113
+ Check data constraints:
114
+
115
+ ```vague
116
+ action ValidateData {
117
+ get "/users"
118
+
119
+ for user in response.users {
120
+ validate user {
121
+ assume .id is string,
122
+ assume length(.name) > 0,
123
+ assume .email contains "@",
124
+ assume .age >= 18
125
+ }
126
+
127
+ store user -> users { key: .id }
128
+ }
129
+ }
130
+ ```
131
+
132
+ ## Store Steps
133
+
134
+ Persist data:
135
+
136
+ ```vague
137
+ action SaveData {
138
+ get "/users"
139
+
140
+ // Store entire response
141
+ store response -> allData
142
+
143
+ // Store with key
144
+ store response.users -> users { key: .id }
145
+
146
+ // Upsert mode
147
+ store response.users -> users { key: .id, upsert: true }
148
+
149
+ // Partial update
150
+ store response.users -> users { key: .id, partial: true }
151
+ }
152
+ ```
153
+
154
+ ## Pattern Matching Steps
155
+
156
+ Route data based on shape:
157
+
158
+ ```vague
159
+ action HandleResponse {
160
+ get "/users"
161
+
162
+ match response {
163
+ { error: e, code: 401 } -> jump RefreshToken then retry,
164
+ { error: e, code: 429 } -> retry { maxAttempts: 5 },
165
+ { error: e } -> abort "API error",
166
+ { users: _ } -> continue,
167
+ _ -> abort "Unexpected response"
168
+ }
169
+ }
170
+ ```
171
+
172
+ ## Nested Actions
173
+
174
+ Actions can reference other actions via `jump`:
175
+
176
+ ```vague
177
+ action Main {
178
+ get "/data"
179
+
180
+ match response {
181
+ AuthError -> jump RefreshAuth then retry,
182
+ _ -> continue
183
+ }
184
+ }
185
+
186
+ action RefreshAuth {
187
+ post "/auth/refresh" { body: { token: env("REFRESH_TOKEN") } }
188
+ // Token is automatically used for subsequent requests
189
+ }
190
+ ```
191
+
192
+ ## Action Composition in Pipelines
193
+
194
+ Actions are composed in the `run` statement:
195
+
196
+ ```vague
197
+ mission DataPipeline {
198
+ action Fetch { /* ... */ }
199
+ action Transform { /* ... */ }
200
+ action Export { /* ... */ }
201
+
202
+ // Sequential
203
+ run Fetch then Transform then Export
204
+
205
+ // Parallel groups
206
+ run [FetchA, FetchB] then Merge then Export
207
+ }
208
+ ```
209
+
210
+ ## Variable Scope
211
+
212
+ Variables are scoped to their action and nested contexts:
213
+
214
+ ```vague
215
+ action ProcessData {
216
+ get "/users" // response is set
217
+
218
+ for user in response.users {
219
+ // user is available here
220
+ // response is still available
221
+
222
+ map user -> processed {
223
+ // user and response available
224
+ }
225
+ // processed is available
226
+ }
227
+
228
+ // user is no longer available here
229
+ // response is still available
230
+ }
231
+ ```
232
+
233
+ ## Best Practices
234
+
235
+ ### Single Responsibility
236
+
237
+ Each action should do one thing well:
238
+
239
+ ```vague
240
+ // Good: focused actions
241
+ action FetchUsers {
242
+ get "/users"
243
+ store response -> rawUsers
244
+ }
245
+
246
+ action TransformUsers {
247
+ for user in rawUsers {
248
+ map user -> StandardUser { /* ... */ }
249
+ store user -> users { key: .id }
250
+ }
251
+ }
252
+
253
+ // Avoid: doing too much
254
+ action DoEverything {
255
+ get "/users"
256
+ get "/orders"
257
+ // transform both
258
+ // export to multiple places
259
+ }
260
+ ```
261
+
262
+ ### Handle Errors at Action Boundaries
263
+
264
+ ```vague
265
+ action FetchWithErrorHandling {
266
+ get "/users"
267
+
268
+ match response {
269
+ ErrorResponse -> queue failures { item: response },
270
+ _ -> store response -> users { key: .id }
271
+ }
272
+ }
273
+ ```
274
+
275
+ ### Use Descriptive Names
276
+
277
+ ```vague
278
+ // Good
279
+ action FetchActiveCustomersWithOrders { }
280
+ action TransformToQuickBooksFormat { }
281
+ action ExportToDataWarehouse { }
282
+
283
+ // Avoid
284
+ action Step1 { }
285
+ action Process { }
286
+ ```
@@ -0,0 +1,264 @@
1
+ ---
2
+ sidebar_position: 1
3
+ ---
4
+
5
+ # Missions
6
+
7
+ A **Mission** is the top-level container in Reqon. It defines a complete data pipeline, including all the sources, stores, schemas, actions, and the execution flow.
8
+
9
+ ## Basic Structure
10
+
11
+ ```vague
12
+ mission MissionName {
13
+ // Source definitions (APIs)
14
+ source SourceName { auth: type, base: "url" }
15
+
16
+ // Store definitions (data persistence)
17
+ store storeName: adapter("identifier")
18
+
19
+ // Schema definitions (for validation and matching)
20
+ schema SchemaName { field: type }
21
+
22
+ // Action definitions (processing logic)
23
+ action ActionName {
24
+ // steps...
25
+ }
26
+
27
+ // Pipeline definition (execution order)
28
+ run ActionName then AnotherAction
29
+ }
30
+ ```
31
+
32
+ ## Mission Components
33
+
34
+ ### Sources
35
+
36
+ Define the APIs your mission connects to:
37
+
38
+ ```vague
39
+ mission DataSync {
40
+ source MainAPI {
41
+ auth: bearer,
42
+ base: "https://api.example.com/v1"
43
+ }
44
+
45
+ source BackupAPI {
46
+ auth: api_key,
47
+ base: "https://backup.example.com"
48
+ }
49
+ }
50
+ ```
51
+
52
+ ### Stores
53
+
54
+ Define where data is persisted:
55
+
56
+ ```vague
57
+ mission DataSync {
58
+ store customers: file("customers")
59
+ store orders: memory("orders")
60
+ store products: sql("products_table")
61
+ }
62
+ ```
63
+
64
+ ### Schemas
65
+
66
+ Define data shapes for validation and pattern matching:
67
+
68
+ ```vague
69
+ mission DataSync {
70
+ schema Customer {
71
+ id: string,
72
+ name: string,
73
+ email: string,
74
+ createdAt: date?
75
+ }
76
+
77
+ schema ErrorResponse {
78
+ error: string,
79
+ code: number
80
+ }
81
+ }
82
+ ```
83
+
84
+ For schema syntax details, see the [Vague documentation](https://github.com/mcclowes/vague).
85
+
86
+ ### Actions
87
+
88
+ Define the processing logic:
89
+
90
+ ```vague
91
+ mission DataSync {
92
+ action FetchCustomers {
93
+ get "/customers"
94
+ store response -> customers { key: .id }
95
+ }
96
+
97
+ action ProcessOrders {
98
+ for customer in customers {
99
+ get "/orders" { params: { customerId: customer.id } }
100
+ store response -> orders { key: .id }
101
+ }
102
+ }
103
+ }
104
+ ```
105
+
106
+ ### Pipeline
107
+
108
+ Define execution order:
109
+
110
+ ```vague
111
+ mission DataSync {
112
+ // Sequential execution
113
+ run FetchCustomers then ProcessOrders
114
+
115
+ // Or parallel execution
116
+ run [FetchProducts, FetchCategories] then MergeData
117
+ }
118
+ ```
119
+
120
+ ## Multiple Missions
121
+
122
+ A Reqon file can contain multiple missions:
123
+
124
+ ```vague
125
+ mission SyncCustomers {
126
+ source API { auth: bearer, base: "https://api.example.com" }
127
+ store customers: file("customers")
128
+
129
+ action Fetch {
130
+ get "/customers"
131
+ store response -> customers { key: .id }
132
+ }
133
+
134
+ run Fetch
135
+ }
136
+
137
+ mission SyncOrders {
138
+ source API { auth: bearer, base: "https://api.example.com" }
139
+ store orders: file("orders")
140
+
141
+ action Fetch {
142
+ get "/orders"
143
+ store response -> orders { key: .id }
144
+ }
145
+
146
+ run Fetch
147
+ }
148
+ ```
149
+
150
+ ## Scheduled Missions
151
+
152
+ Add a schedule to run missions automatically:
153
+
154
+ ```vague
155
+ mission DailySync {
156
+ schedule: every 6 hours
157
+
158
+ source API { auth: bearer, base: "https://api.example.com" }
159
+ store data: file("data")
160
+
161
+ action Sync {
162
+ get "/data" { since: lastSync }
163
+ store response -> data { key: .id }
164
+ }
165
+
166
+ run Sync
167
+ }
168
+ ```
169
+
170
+ See [Scheduling](../category/scheduling) for more details.
171
+
172
+ ## Mission Options
173
+
174
+ Missions can include additional options:
175
+
176
+ ```vague
177
+ mission RobustSync {
178
+ // Scheduling
179
+ schedule: cron "0 */6 * * *"
180
+
181
+ // Concurrency control
182
+ maxConcurrency: 5
183
+
184
+ // Skip if already running
185
+ skipIfRunning: true
186
+
187
+ // Retry on failure
188
+ retryOnFailure: {
189
+ maxAttempts: 3,
190
+ backoff: exponential
191
+ }
192
+
193
+ // ... sources, stores, actions ...
194
+ }
195
+ ```
196
+
197
+ ## Best Practices
198
+
199
+ ### Keep Missions Focused
200
+
201
+ Each mission should have a single responsibility:
202
+
203
+ ```vague
204
+ // Good: focused mission
205
+ mission SyncInvoices {
206
+ // Only deals with invoices
207
+ }
208
+
209
+ mission SyncPayments {
210
+ // Only deals with payments
211
+ }
212
+ ```
213
+
214
+ ### Use Descriptive Names
215
+
216
+ ```vague
217
+ // Good
218
+ mission SyncXeroInvoicesToQuickBooks { }
219
+
220
+ // Avoid
221
+ mission Sync1 { }
222
+ ```
223
+
224
+ ### Organize Complex Missions
225
+
226
+ For complex pipelines, use [multi-file missions](../advanced/multi-file-missions):
227
+
228
+ ```
229
+ missions/
230
+ └── invoice-sync/
231
+ ├── mission.vague # Main definition
232
+ ├── fetch.vague # Fetch actions
233
+ ├── transform.vague # Transform actions
234
+ └── export.vague # Export actions
235
+ ```
236
+
237
+ ### Handle Errors Gracefully
238
+
239
+ Always include error handling:
240
+
241
+ ```vague
242
+ mission RobustSync {
243
+ action FetchData {
244
+ get "/data"
245
+
246
+ match response {
247
+ ErrorResponse -> queue dlq,
248
+ _ -> store response -> data { key: .id }
249
+ }
250
+ }
251
+ }
252
+ ```
253
+
254
+ ## Execution Context
255
+
256
+ When a mission runs, Reqon creates an execution context that includes:
257
+
258
+ - **stores**: Map of named store adapters
259
+ - **sources**: Map of named HTTP clients
260
+ - **schemas**: Map of named schema definitions
261
+ - **variables**: Runtime variables (loop variables, etc.)
262
+ - **response**: Last HTTP response
263
+
264
+ This context is passed through the entire pipeline, allowing actions to share data.