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,112 @@
1
+ # Reqon Examples
2
+
3
+ This directory contains examples demonstrating Reqon's features for declarative data pipelines.
4
+
5
+ ## Examples Overview
6
+
7
+ | Example | Description | Key Features |
8
+ |---------|-------------|--------------|
9
+ | [jsonplaceholder](./jsonplaceholder/) | Basic public API sync | `auth: none`, fetch, map, for loops |
10
+ | [petstore](./petstore/) | OpenAPI spec integration | OAS operationId, cursor pagination |
11
+ | [xero](./xero/) | OAuth2 invoice sync | OAuth2, hydration, **match steps**, **flow control** |
12
+ | [github-sync](./github-sync/) | Multi-file mission | **Folder structure**, **parallel execution**, schema matching |
13
+ | [error-handling](./error-handling/) | Comprehensive error handling | **All flow control directives**, dead letter queues |
14
+ | [temporal-comparison](./temporal-comparison/) | E-commerce reconciliation | Multi-source, **parallel execution**, rate limiting |
15
+
16
+ ## Feature Index
17
+
18
+ ### Multi-File Missions
19
+ Organize large missions into folders with separate action files:
20
+ ```
21
+ github-sync/
22
+ ├── mission.vague # Sources, stores, schemas, pipeline
23
+ ├── fetch-issues.vague # Action file
24
+ ├── fetch-prs.vague # Action file
25
+ └── normalize.vague # Action file
26
+ ```
27
+ See: [github-sync](./github-sync/)
28
+
29
+ ### Parallel Execution
30
+ Run multiple actions concurrently:
31
+ ```vague
32
+ run [FetchOrders, FetchPayments, FetchShipments] then Reconcile
33
+ ```
34
+ See: [github-sync](./github-sync/), [temporal-comparison](./temporal-comparison/)
35
+
36
+ ### Schema Overloading with Match Steps
37
+ Handle different API response types declaratively:
38
+ ```vague
39
+ match response {
40
+ SuccessSchema -> { store response -> cache },
41
+ RateLimitError -> retry { maxAttempts: 5 },
42
+ AuthError -> jump RefreshToken then retry,
43
+ _ -> abort "Unexpected response"
44
+ }
45
+ ```
46
+ See: [xero](./xero/), [error-handling](./error-handling/)
47
+
48
+ ### Flow Control Directives
49
+ Six directives for controlling execution flow:
50
+
51
+ | Directive | Description | Example |
52
+ |-----------|-------------|---------|
53
+ | `continue` | Proceed to next step | `Schema -> continue` |
54
+ | `skip` | Skip remaining steps | `Schema -> skip` |
55
+ | `abort` | Halt mission | `Schema -> abort "Error"` |
56
+ | `retry` | Retry with backoff | `Schema -> retry { maxAttempts: 5 }` |
57
+ | `queue` | Send to dead letter queue | `Schema -> queue dlq` |
58
+ | `jump` | Execute action, then continue | `Schema -> jump Refresh then retry` |
59
+
60
+ See: [error-handling](./error-handling/)
61
+
62
+ ### Authentication Types
63
+ ```vague
64
+ source API { auth: none } # Public API
65
+ source API { auth: bearer } # Bearer token
66
+ source API { auth: oauth2 } # OAuth2
67
+ source API { auth: basic } # Basic auth
68
+ source API { auth: api_key } # API key
69
+ ```
70
+
71
+ ### Pagination Strategies
72
+ ```vague
73
+ paginate: offset(page, 100) # Offset pagination
74
+ paginate: page(page, 100) # Page number pagination
75
+ paginate: cursor(cursor, 100, "nextCursor") # Cursor pagination
76
+ ```
77
+
78
+ ## Running Examples
79
+
80
+ ```bash
81
+ # Build first
82
+ npm run build
83
+
84
+ # Run any example
85
+ node dist/cli.js examples/<example>/<file>.vague --verbose
86
+
87
+ # Run multi-file mission (folder)
88
+ node dist/cli.js examples/github-sync --verbose
89
+
90
+ # Dry run (no actual API calls)
91
+ node dist/cli.js examples/xero/invoices.vague --dry-run
92
+
93
+ # With credentials
94
+ node dist/cli.js examples/xero/invoices.vague --auth credentials.json
95
+ ```
96
+
97
+ ## Credentials Format
98
+
99
+ Create a `credentials.json` file:
100
+ ```json
101
+ {
102
+ "SourceName": {
103
+ "type": "bearer",
104
+ "token": "your-token"
105
+ },
106
+ "OAuthSource": {
107
+ "type": "oauth2",
108
+ "accessToken": "your-access-token",
109
+ "refreshToken": "your-refresh-token"
110
+ }
111
+ }
112
+ ```
@@ -0,0 +1,150 @@
1
+ # Error Handling Example
2
+
3
+ Demonstrates comprehensive error handling with schema matching and all flow control directives.
4
+
5
+ ## What it does
6
+
7
+ 1. **FetchPendingPayments**: Fetches payments with retry and auth refresh
8
+ 2. **CheckFraudRisk**: Checks each payment for fraud, routing high-risk to review queue
9
+ 3. **ProcessPayments**: Captures approved payments with full error handling
10
+ 4. **GenerateReport**: Creates a summary of processing results
11
+
12
+ ## Run
13
+
14
+ ```bash
15
+ node dist/cli.js examples/error-handling/payment-processor.vague --auth credentials.json --verbose
16
+ ```
17
+
18
+ ## Flow Control Directives
19
+
20
+ This example demonstrates all six flow control directives:
21
+
22
+ ### 1. `continue` - Proceed to next step
23
+ ```vague
24
+ match response {
25
+ FraudWarning where .risk_level == "low" -> continue
26
+ }
27
+ ```
28
+ When the condition matches, continue with the next steps in the action.
29
+
30
+ ### 2. `skip` - Skip remaining steps in current iteration
31
+ ```vague
32
+ match response {
33
+ _ -> skip // Unknown response - skip this payment, move to next
34
+ }
35
+ ```
36
+ Skips remaining steps for the current item in a `for` loop but continues with the next item.
37
+
38
+ ### 3. `abort "message"` - Halt mission with error
39
+ ```vague
40
+ match response {
41
+ ServerError -> abort "Payment gateway unavailable"
42
+ }
43
+ ```
44
+ Immediately stops the entire mission and reports the error.
45
+
46
+ ### 4. `retry { config }` - Retry with backoff
47
+ ```vague
48
+ match response {
49
+ RateLimitError -> retry {
50
+ maxAttempts: 5,
51
+ backoff: exponential, // or: linear, constant
52
+ initialDelay: 5000,
53
+ maxDelay: 120000
54
+ }
55
+ }
56
+ ```
57
+ Retries the current fetch with configurable backoff strategy.
58
+
59
+ ### 5. `queue target` - Send to dead-letter queue
60
+ ```vague
61
+ match response {
62
+ ServerError -> queue dead_letter_queue
63
+ }
64
+ ```
65
+ Parks the current item for later processing or manual review.
66
+
67
+ ### 6. `jump Action then retry` - Execute action, then continue
68
+ ```vague
69
+ match response {
70
+ AuthenticationError -> jump RefreshAuth then retry
71
+ }
72
+ ```
73
+ Jumps to another action (e.g., to refresh auth), then retries the original request.
74
+
75
+ ## Schema Matching Patterns
76
+
77
+ ### Simple Schema Match
78
+ ```vague
79
+ match response {
80
+ PaymentSuccess -> { store response -> payments }
81
+ }
82
+ ```
83
+
84
+ ### Schema with Guard Clause
85
+ ```vague
86
+ match response {
87
+ FraudWarning where .risk_level == "high" -> queue fraud_review
88
+ }
89
+ ```
90
+
91
+ ### Array Schema Match
92
+ ```vague
93
+ match response {
94
+ [PaymentSuccess] -> { store response -> payments { key: .id } }
95
+ }
96
+ ```
97
+
98
+ ### Wildcard (Catch-All)
99
+ ```vague
100
+ match response {
101
+ SuccessSchema -> continue,
102
+ ErrorSchema -> abort "Error occurred",
103
+ _ -> skip // Handle any other response
104
+ }
105
+ ```
106
+
107
+ ## Error Handling Patterns
108
+
109
+ ### 1. Retry with Auth Refresh
110
+ ```vague
111
+ AuthenticationError -> jump RefreshAuth then retry
112
+ ```
113
+
114
+ ### 2. Progressive Backoff
115
+ ```vague
116
+ RateLimitError -> retry {
117
+ maxAttempts: 5,
118
+ backoff: exponential,
119
+ initialDelay: 1000,
120
+ maxDelay: 60000
121
+ }
122
+ ```
123
+
124
+ ### 3. Dead Letter Queue for Failures
125
+ ```vague
126
+ ServerError -> queue dead_letter_queue
127
+ ```
128
+
129
+ ### 4. Conditional Processing
130
+ ```vague
131
+ match response {
132
+ FraudWarning where .risk_level == "low" -> continue,
133
+ FraudWarning where .risk_level == "medium" -> {
134
+ store { ... } -> review_queue
135
+ },
136
+ FraudWarning where .risk_level == "high" -> {
137
+ store { ... } -> fraud_queue
138
+ }
139
+ }
140
+ ```
141
+
142
+ ## Features demonstrated
143
+
144
+ - All 6 flow control directives
145
+ - Schema matching with guard clauses
146
+ - Retry with exponential/linear/constant backoff
147
+ - Token refresh via `jump...then retry`
148
+ - Dead letter queue pattern
149
+ - Conditional routing based on response content
150
+ - Error logging and audit trails
@@ -0,0 +1,287 @@
1
+ // Payment Processing Pipeline with Comprehensive Error Handling
2
+ // Demonstrates all flow control directives: continue, skip, abort, retry, queue, jump
3
+
4
+ mission ProcessPayments {
5
+
6
+ // ============================================================
7
+ // SOURCES
8
+ // ============================================================
9
+
10
+ source PaymentGateway {
11
+ auth: bearer,
12
+ base: "https://api.paymentgateway.com/v1",
13
+ rateLimit: {
14
+ strategy: "pause",
15
+ maxWait: 60,
16
+ fallbackRpm: 100
17
+ }
18
+ }
19
+
20
+ source FraudDetection {
21
+ auth: api_key,
22
+ base: "https://fraud.example.com/api"
23
+ }
24
+
25
+ // ============================================================
26
+ // STORES
27
+ // ============================================================
28
+
29
+ store pending_payments: memory("pending")
30
+ store processed_payments: sql("payments")
31
+ store failed_payments: memory("failed")
32
+ store fraud_review_queue: memory("fraud_review")
33
+ store dead_letter_queue: memory("dlq")
34
+
35
+ // ============================================================
36
+ // SCHEMAS - Response Types
37
+ // ============================================================
38
+
39
+ schema PaymentSuccess {
40
+ id: string,
41
+ status: string,
42
+ amount: decimal,
43
+ currency: string,
44
+ captured_at: date
45
+ }
46
+
47
+ schema PaymentPending {
48
+ id: string,
49
+ status: string,
50
+ requires_action: boolean
51
+ }
52
+
53
+ schema RateLimitError {
54
+ error: string,
55
+ retry_after: int
56
+ }
57
+
58
+ schema AuthenticationError {
59
+ error: string,
60
+ code: string
61
+ }
62
+
63
+ schema ValidationError {
64
+ error: string,
65
+ field: string,
66
+ message: string
67
+ }
68
+
69
+ schema FraudWarning {
70
+ risk_score: decimal,
71
+ risk_level: string,
72
+ recommendation: string
73
+ }
74
+
75
+ schema ServerError {
76
+ error: string,
77
+ request_id: string
78
+ }
79
+
80
+ // ============================================================
81
+ // ACTION: Fetch Pending Payments
82
+ // ============================================================
83
+
84
+ action FetchPendingPayments {
85
+ get "/payments" {
86
+ body: { "status": "pending" },
87
+ retry: {
88
+ maxAttempts: 3,
89
+ backoff: "exponential",
90
+ initialDelay: 1000
91
+ }
92
+ }
93
+
94
+ match response {
95
+ // Success - store and continue
96
+ [PaymentSuccess] -> {
97
+ store response -> pending_payments { key: .id }
98
+ },
99
+
100
+ // Rate limited - retry with backoff
101
+ RateLimitError -> retry {
102
+ maxAttempts: 5,
103
+ backoff: exponential,
104
+ initialDelay: 5000,
105
+ maxDelay: 120000
106
+ },
107
+
108
+ // Auth error - refresh token and retry
109
+ AuthenticationError -> jump RefreshAuth then retry,
110
+
111
+ // Server error - abort the mission
112
+ ServerError -> abort "Payment gateway unavailable",
113
+
114
+ // Unexpected response - log and continue with empty
115
+ _ -> {
116
+ store {
117
+ error: "Unexpected response fetching payments",
118
+ response: response,
119
+ timestamp: now()
120
+ } -> failed_payments { key: now() }
121
+ }
122
+ }
123
+ }
124
+
125
+ // ============================================================
126
+ // ACTION: Refresh Authentication (called via jump)
127
+ // ============================================================
128
+
129
+ action RefreshAuth {
130
+ post "/auth/refresh" {
131
+ source: PaymentGateway,
132
+ body: {
133
+ "refresh_token": env("PAYMENT_REFRESH_TOKEN")
134
+ }
135
+ }
136
+
137
+ match response {
138
+ _ where .access_token != null -> continue,
139
+ _ -> abort "Failed to refresh authentication"
140
+ }
141
+ }
142
+
143
+ // ============================================================
144
+ // ACTION: Check Fraud Risk
145
+ // ============================================================
146
+
147
+ action CheckFraudRisk {
148
+ for payment in pending_payments {
149
+ post "/check" {
150
+ source: FraudDetection,
151
+ body: {
152
+ "payment_id": payment.id,
153
+ "amount": payment.amount,
154
+ "currency": payment.currency
155
+ }
156
+ }
157
+
158
+ match response {
159
+ // Low risk - continue processing
160
+ FraudWarning where .risk_level == "low" -> continue,
161
+
162
+ // Medium risk - queue for human review, skip this payment
163
+ FraudWarning where .risk_level == "medium" -> {
164
+ store {
165
+ payment_id: payment.id,
166
+ risk_score: response.risk_score,
167
+ reason: "Medium risk - requires review"
168
+ } -> fraud_review_queue { key: payment.id }
169
+ },
170
+
171
+ // High risk - queue and skip
172
+ FraudWarning where .risk_level == "high" -> {
173
+ store {
174
+ payment_id: payment.id,
175
+ risk_score: response.risk_score,
176
+ reason: "High fraud risk detected"
177
+ } -> fraud_review_queue { key: payment.id }
178
+ },
179
+
180
+ // Fraud service error - queue to DLQ for later processing
181
+ ServerError -> queue dead_letter_queue,
182
+
183
+ // Rate limited - retry
184
+ RateLimitError -> retry {
185
+ maxAttempts: 3,
186
+ backoff: constant,
187
+ initialDelay: 10000
188
+ },
189
+
190
+ // Unknown - skip but log
191
+ _ -> skip
192
+ }
193
+ }
194
+ }
195
+
196
+ // ============================================================
197
+ // ACTION: Process Approved Payments
198
+ // ============================================================
199
+
200
+ action ProcessPayments {
201
+ // Only process payments not in fraud review
202
+ for payment in pending_payments where not exists(fraud_review_queue[payment.id]) {
203
+ post "/payments/{payment.id}/capture" {
204
+ source: PaymentGateway,
205
+ body: {
206
+ "idempotency_key": payment.id + "_capture"
207
+ }
208
+ }
209
+
210
+ match response {
211
+ // Successfully captured
212
+ PaymentSuccess -> {
213
+ store response -> processed_payments {
214
+ key: .id,
215
+ upsert: true
216
+ }
217
+ },
218
+
219
+ // Payment requires additional action (3DS, etc)
220
+ PaymentPending where .requires_action == true -> {
221
+ store {
222
+ payment_id: payment.id,
223
+ reason: "Requires customer action",
224
+ status: "pending_action"
225
+ } -> failed_payments { key: payment.id }
226
+ },
227
+
228
+ // Validation error - payment data issue
229
+ ValidationError -> {
230
+ store {
231
+ payment_id: payment.id,
232
+ error: response.message,
233
+ field: response.field,
234
+ status: "invalid"
235
+ } -> failed_payments { key: payment.id }
236
+ },
237
+
238
+ // Rate limited
239
+ RateLimitError -> retry {
240
+ maxAttempts: 3,
241
+ backoff: exponential,
242
+ initialDelay: 2000
243
+ },
244
+
245
+ // Auth expired during processing
246
+ AuthenticationError -> jump RefreshAuth then retry,
247
+
248
+ // Server error - queue for retry later
249
+ ServerError -> queue dead_letter_queue,
250
+
251
+ // Catch-all - queue to DLQ
252
+ _ -> queue dead_letter_queue
253
+ }
254
+ }
255
+ }
256
+
257
+ // ============================================================
258
+ // ACTION: Generate Report
259
+ // ============================================================
260
+
261
+ action GenerateReport {
262
+ map {
263
+ processed: length(processed_payments),
264
+ failed: length(failed_payments),
265
+ fraud_flagged: length(fraud_review_queue),
266
+ queued_for_retry: length(dead_letter_queue),
267
+ completed_at: now()
268
+ } -> report
269
+
270
+ validate report {
271
+ assume .processed >= 0
272
+ }
273
+
274
+ store response -> processed_payments {
275
+ key: "report_" + now()
276
+ }
277
+ }
278
+
279
+ // ============================================================
280
+ // PIPELINE
281
+ // ============================================================
282
+
283
+ run FetchPendingPayments
284
+ then CheckFraudRisk
285
+ then ProcessPayments
286
+ then GenerateReport
287
+ }
@@ -0,0 +1,74 @@
1
+ # GitHub Sync Example
2
+
3
+ Demonstrates multi-file missions, parallel execution, and error handling with flow control.
4
+
5
+ ## Folder Structure
6
+
7
+ This mission is organized as a folder with separate action files:
8
+
9
+ ```
10
+ github-sync/
11
+ ├── mission.vague # Main file: sources, stores, schemas, pipeline
12
+ ├── fetch-issues.vague # Fetches issues with pagination and error handling
13
+ ├── fetch-prs.vague # Fetches pull requests with error handling
14
+ ├── normalize.vague # Normalizes to unified schema
15
+ └── README.md
16
+ ```
17
+
18
+ ## What it does
19
+
20
+ 1. **FetchIssues** and **FetchPRs** run in **parallel** to fetch data concurrently
21
+ 2. **Normalize** runs after both complete, unifying issues and PRs into `work_items`
22
+
23
+ ## Run
24
+
25
+ ```bash
26
+ # Run from folder path
27
+ node dist/cli.js examples/github-sync --auth credentials.json --verbose
28
+
29
+ # Environment variables needed
30
+ export GITHUB_OWNER=your-org
31
+ export GITHUB_REPO=your-repo
32
+ ```
33
+
34
+ Requires a `credentials.json`:
35
+ ```json
36
+ {
37
+ "GitHub": {
38
+ "type": "bearer",
39
+ "token": "ghp_your_github_token"
40
+ }
41
+ }
42
+ ```
43
+
44
+ ## Features demonstrated
45
+
46
+ ### Multi-file Missions
47
+ - `mission.vague` contains sources, stores, schemas, and pipeline
48
+ - Action files (`fetch-issues.vague`, etc.) are automatically discovered and merged
49
+ - Actions can reference stores and schemas defined in the root file
50
+
51
+ ### Parallel Execution
52
+ ```vague
53
+ run [FetchIssues, FetchPRs] then Normalize
54
+ ```
55
+ - `[FetchIssues, FetchPRs]` runs both actions concurrently
56
+ - `then Normalize` waits for both to complete before running
57
+
58
+ ### Schema Overloading with Match Steps
59
+ ```vague
60
+ match response {
61
+ [GitHubIssue] -> { store response -> issues_raw },
62
+ RateLimitError -> retry { maxAttempts: 5 },
63
+ NotFoundError -> abort "Repository not found",
64
+ _ -> skip
65
+ }
66
+ ```
67
+
68
+ ### Flow Control Directives
69
+ - `continue` - Proceed to next step
70
+ - `skip` - Skip remaining steps in current action
71
+ - `abort "message"` - Halt mission with error
72
+ - `retry { ... }` - Retry with backoff configuration
73
+ - `queue target` - Send to dead-letter queue
74
+ - `jump ActionName then retry` - Execute another action, then retry
@@ -0,0 +1,47 @@
1
+ // Fetch GitHub Issues with error handling
2
+ // External action file - automatically merged into mission
3
+
4
+ action FetchIssues {
5
+ get "/repos/{GITHUB_OWNER}/{GITHUB_REPO}/issues" {
6
+ source: GitHub,
7
+ body: {
8
+ "state": "all",
9
+ "per_page": 100
10
+ },
11
+ paginate: page(page, 100),
12
+ until: length(response) == 0,
13
+ retry: {
14
+ maxAttempts: 3,
15
+ backoff: "exponential",
16
+ initialDelay: 1000
17
+ }
18
+ }
19
+
20
+ // Handle different response types with schema matching
21
+ match response {
22
+ // Success - continue processing
23
+ [GitHubIssue] -> {
24
+ store response -> issues_raw { key: .id }
25
+ },
26
+
27
+ // Rate limited - retry with backoff
28
+ RateLimitError -> retry {
29
+ maxAttempts: 5,
30
+ backoff: exponential,
31
+ initialDelay: 60000,
32
+ maxDelay: 300000
33
+ },
34
+
35
+ // Repo not found - abort mission
36
+ NotFoundError -> abort "Repository not found - check GITHUB_OWNER and GITHUB_REPO",
37
+
38
+ // Unexpected response - log and skip
39
+ _ -> {
40
+ store {
41
+ error: "Unexpected response in FetchIssues",
42
+ response: response,
43
+ timestamp: now()
44
+ } -> errors { key: now() }
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,40 @@
1
+ // Fetch GitHub Pull Requests with error handling
2
+ // External action file - automatically merged into mission
3
+
4
+ action FetchPRs {
5
+ get "/repos/{GITHUB_OWNER}/{GITHUB_REPO}/pulls" {
6
+ source: GitHub,
7
+ body: {
8
+ "state": "all",
9
+ "per_page": 100
10
+ },
11
+ paginate: page(page, 100),
12
+ until: length(response) == 0,
13
+ retry: {
14
+ maxAttempts: 3,
15
+ backoff: "exponential",
16
+ initialDelay: 1000
17
+ }
18
+ }
19
+
20
+ // Handle different response types
21
+ match response {
22
+ // Success - store PRs
23
+ [GitHubPR] -> {
24
+ store response -> prs_raw { key: .id }
25
+ },
26
+
27
+ // Rate limited - retry
28
+ RateLimitError -> retry {
29
+ maxAttempts: 5,
30
+ backoff: exponential,
31
+ initialDelay: 60000
32
+ },
33
+
34
+ // Not found - abort
35
+ NotFoundError -> abort "Repository not found",
36
+
37
+ // Fallback - log error and skip
38
+ _ -> skip
39
+ }
40
+ }