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,51 @@
1
+ import { evaluate } from '../evaluator.js';
2
+ import { childContext, setVariable, getVariable } from '../context.js';
3
+ /**
4
+ * Handles for...in...where iteration steps
5
+ */
6
+ export class ForHandler {
7
+ deps;
8
+ constructor(deps) {
9
+ this.deps = deps;
10
+ }
11
+ async execute(step) {
12
+ const collection = await this.getCollection(step);
13
+ // Apply filter if present
14
+ const filtered = step.condition
15
+ ? collection.filter((item) => evaluate(step.condition, this.deps.ctx, item))
16
+ : collection;
17
+ this.deps.log(`Iterating over ${filtered.length} items`);
18
+ // Execute steps for each item
19
+ for (const item of filtered) {
20
+ await this.executeForItem(step, item);
21
+ }
22
+ }
23
+ async getCollection(step) {
24
+ let collection;
25
+ if (step.collection.type === 'Identifier') {
26
+ // It's a store reference
27
+ const store = this.deps.ctx.stores.get(step.collection.name);
28
+ if (store) {
29
+ collection = await store.list();
30
+ }
31
+ else {
32
+ collection = getVariable(this.deps.ctx, step.collection.name) ?? [];
33
+ }
34
+ }
35
+ else {
36
+ collection = evaluate(step.collection, this.deps.ctx);
37
+ }
38
+ if (!Array.isArray(collection)) {
39
+ throw new Error('For loop collection must be an array');
40
+ }
41
+ return collection;
42
+ }
43
+ async executeForItem(step, item) {
44
+ const childCtx = childContext(this.deps.ctx);
45
+ setVariable(childCtx, step.variable, item);
46
+ // Execute each inner step with child context
47
+ for (const innerStep of step.steps) {
48
+ await this.deps.executeStep(innerStep, this.deps.actionName, childCtx);
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,8 @@
1
+ export { type StepHandler, type StepHandlerDeps } from './types.js';
2
+ export { ForHandler, type ForHandlerDeps } from './for-handler.js';
3
+ export { MapHandler } from './map-handler.js';
4
+ export { ValidateHandler } from './validate-handler.js';
5
+ export { StoreHandler } from './store-handler.js';
6
+ export { MatchHandler, type MatchHandlerDeps, type MatchResult } from './match-handler.js';
7
+ export { WebhookHandler, type WebhookHandlerDeps, type WebhookHandlerResult } from './webhook-handler.js';
8
+ export { NoMatchError, AbortError, SkipSignal, RetrySignal, JumpSignal, QueueSignal, } from '../signals.js';
@@ -0,0 +1,8 @@
1
+ export { ForHandler } from './for-handler.js';
2
+ export { MapHandler } from './map-handler.js';
3
+ export { ValidateHandler } from './validate-handler.js';
4
+ export { StoreHandler } from './store-handler.js';
5
+ export { MatchHandler } from './match-handler.js';
6
+ export { WebhookHandler } from './webhook-handler.js';
7
+ // Export signals from the canonical location
8
+ export { NoMatchError, AbortError, SkipSignal, RetrySignal, JumpSignal, QueueSignal, } from '../signals.js';
@@ -0,0 +1,10 @@
1
+ import type { MapStep } from '../../ast/nodes.js';
2
+ import type { StepHandler, StepHandlerDeps } from './types.js';
3
+ /**
4
+ * Handles map...-> transformation steps
5
+ */
6
+ export declare class MapHandler implements StepHandler<MapStep> {
7
+ private deps;
8
+ constructor(deps: StepHandlerDeps);
9
+ execute(step: MapStep): Promise<void>;
10
+ }
@@ -0,0 +1,20 @@
1
+ import { evaluate } from '../evaluator.js';
2
+ /**
3
+ * Handles map...-> transformation steps
4
+ */
5
+ export class MapHandler {
6
+ deps;
7
+ constructor(deps) {
8
+ this.deps = deps;
9
+ }
10
+ async execute(step) {
11
+ const source = evaluate(step.source, this.deps.ctx);
12
+ const mapped = {};
13
+ for (const mapping of step.mappings) {
14
+ mapped[mapping.field] = evaluate(mapping.expression, this.deps.ctx, source);
15
+ }
16
+ // Store mapped result in response for next step
17
+ this.deps.ctx.response = mapped;
18
+ this.deps.log(`Mapped to ${step.targetSchema}`);
19
+ }
20
+ }
@@ -0,0 +1,27 @@
1
+ import type { MatchStep, ActionStep, FlowDirective } from '../../ast/nodes.js';
2
+ import type { StepHandlerDeps } from './types.js';
3
+ import type { ExecutionContext } from '../context.js';
4
+ /**
5
+ * Result of executing a match step
6
+ */
7
+ export interface MatchResult {
8
+ /** The schema that matched (or '_' for wildcard) */
9
+ matchedSchema: string;
10
+ /** Flow directive if the arm specifies one */
11
+ flow?: FlowDirective;
12
+ /** Whether steps were executed (vs flow directive) */
13
+ stepsExecuted: boolean;
14
+ }
15
+ export interface MatchHandlerDeps extends StepHandlerDeps {
16
+ executeStep: (step: ActionStep, actionName: string, ctx: ExecutionContext) => Promise<void>;
17
+ actionName: string;
18
+ }
19
+ /**
20
+ * Handles match steps (schema overloading with flow control)
21
+ */
22
+ export declare class MatchHandler {
23
+ private deps;
24
+ constructor(deps: MatchHandlerDeps);
25
+ execute(step: MatchStep): Promise<void>;
26
+ private handleFlowDirective;
27
+ }
@@ -0,0 +1,61 @@
1
+ import { evaluate } from '../evaluator.js';
2
+ import { findMatchingSchema } from '../schema-matcher.js';
3
+ import { NoMatchError, AbortError, SkipSignal, RetrySignal, JumpSignal, QueueSignal, } from '../signals.js';
4
+ /**
5
+ * Handles match steps (schema overloading with flow control)
6
+ */
7
+ export class MatchHandler {
8
+ deps;
9
+ constructor(deps) {
10
+ this.deps = deps;
11
+ }
12
+ async execute(step) {
13
+ const value = evaluate(step.target, this.deps.ctx);
14
+ // Get schema names from arms in order
15
+ const schemaNames = step.arms.map(arm => arm.schema);
16
+ // Find matching schema
17
+ const matchedSchema = findMatchingSchema(value, this.deps.ctx.schemas, schemaNames);
18
+ if (!matchedSchema) {
19
+ throw new NoMatchError(value);
20
+ }
21
+ this.deps.log(`Matched schema: ${matchedSchema}`);
22
+ // Find the matching arm
23
+ const arm = step.arms.find(a => a.schema === matchedSchema);
24
+ if (!arm) {
25
+ // Shouldn't happen if findMatchingSchema works correctly
26
+ throw new NoMatchError(value);
27
+ }
28
+ // Handle flow directive
29
+ if (arm.flow) {
30
+ // 'continue' means proceed normally - don't throw
31
+ if (arm.flow.type === 'continue') {
32
+ return;
33
+ }
34
+ this.handleFlowDirective(arm.flow, value);
35
+ }
36
+ // Execute steps
37
+ if (arm.steps) {
38
+ for (const innerStep of arm.steps) {
39
+ await this.deps.executeStep(innerStep, this.deps.actionName, this.deps.ctx);
40
+ }
41
+ }
42
+ }
43
+ handleFlowDirective(flow, value) {
44
+ switch (flow.type) {
45
+ case 'skip':
46
+ throw new SkipSignal();
47
+ case 'abort':
48
+ throw new AbortError(flow.message);
49
+ case 'retry':
50
+ throw new RetrySignal(flow.backoff);
51
+ case 'jump':
52
+ throw new JumpSignal(flow.action, flow.then);
53
+ case 'queue':
54
+ throw new QueueSignal(value, flow.target);
55
+ default:
56
+ // This should never happen if TypeScript is working correctly
57
+ const _exhaustive = flow;
58
+ throw new Error(`Unknown flow directive: ${_exhaustive.type}`);
59
+ }
60
+ }
61
+ }
@@ -0,0 +1,13 @@
1
+ import type { StoreStep } from '../../ast/nodes.js';
2
+ import type { StepHandler, StepHandlerDeps } from './types.js';
3
+ /**
4
+ * Handles store steps for persisting data
5
+ */
6
+ export declare class StoreHandler implements StepHandler<StoreStep> {
7
+ private deps;
8
+ constructor(deps: StepHandlerDeps);
9
+ execute(step: StoreStep): Promise<void>;
10
+ private storeMany;
11
+ private storeOne;
12
+ private storeRecord;
13
+ }
@@ -0,0 +1,66 @@
1
+ import { evaluate } from '../evaluator.js';
2
+ /**
3
+ * Handles store steps for persisting data
4
+ */
5
+ export class StoreHandler {
6
+ deps;
7
+ constructor(deps) {
8
+ this.deps = deps;
9
+ }
10
+ async execute(step) {
11
+ const store = this.deps.ctx.stores.get(step.target);
12
+ if (!store) {
13
+ throw new Error(`Store not found: ${step.target}`);
14
+ }
15
+ const source = evaluate(step.source, this.deps.ctx);
16
+ if (Array.isArray(source)) {
17
+ await this.storeMany(step, store, source);
18
+ }
19
+ else {
20
+ await this.storeOne(step, store, source);
21
+ }
22
+ }
23
+ async storeMany(step, store, items) {
24
+ // Use bulk operation if available and not doing upserts (which need individual handling)
25
+ if (store.bulkSet && !step.options.upsert) {
26
+ const records = [];
27
+ for (const item of items) {
28
+ const record = item;
29
+ const key = step.options.key
30
+ ? String(evaluate(step.options.key, this.deps.ctx, record))
31
+ : String(record.id ?? Math.random());
32
+ if (step.options.partial !== undefined) {
33
+ record._partial = step.options.partial;
34
+ }
35
+ records.push({ key, value: record });
36
+ }
37
+ await store.bulkSet(records);
38
+ }
39
+ else {
40
+ // Fall back to individual operations for upserts or stores without bulkSet
41
+ for (const item of items) {
42
+ const record = item;
43
+ await this.storeRecord(step, store, record);
44
+ }
45
+ }
46
+ this.deps.log(`Stored ${items.length} items to ${step.target}`);
47
+ }
48
+ async storeOne(step, store, record) {
49
+ await this.storeRecord(step, store, record);
50
+ this.deps.log(`Stored item to ${step.target}`);
51
+ }
52
+ async storeRecord(step, store, record) {
53
+ const key = step.options.key
54
+ ? String(evaluate(step.options.key, this.deps.ctx, record))
55
+ : String(record.id ?? Math.random());
56
+ if (step.options.partial !== undefined) {
57
+ record._partial = step.options.partial;
58
+ }
59
+ if (step.options.upsert) {
60
+ await store.update(key, record);
61
+ }
62
+ else {
63
+ await store.set(key, record);
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,15 @@
1
+ import type { ActionStep } from '../../ast/nodes.js';
2
+ import type { ExecutionContext } from '../context.js';
3
+ /**
4
+ * Dependencies injected into step handlers
5
+ */
6
+ export interface StepHandlerDeps {
7
+ ctx: ExecutionContext;
8
+ log: (message: string) => void;
9
+ }
10
+ /**
11
+ * Base interface for step handlers
12
+ */
13
+ export interface StepHandler<TStep extends ActionStep> {
14
+ execute(step: TStep): Promise<void>;
15
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { ValidateStep } from '../../ast/nodes.js';
2
+ import type { StepHandler, StepHandlerDeps } from './types.js';
3
+ /**
4
+ * Handles validate steps with assume constraints
5
+ */
6
+ export declare class ValidateHandler implements StepHandler<ValidateStep> {
7
+ private deps;
8
+ constructor(deps: StepHandlerDeps);
9
+ execute(step: ValidateStep): Promise<void>;
10
+ }
@@ -0,0 +1,26 @@
1
+ import { evaluate } from '../evaluator.js';
2
+ /**
3
+ * Handles validate steps with assume constraints
4
+ */
5
+ export class ValidateHandler {
6
+ deps;
7
+ constructor(deps) {
8
+ this.deps = deps;
9
+ }
10
+ async execute(step) {
11
+ const target = evaluate(step.target, this.deps.ctx);
12
+ for (const constraint of step.constraints) {
13
+ const result = evaluate(constraint.condition, this.deps.ctx, target);
14
+ if (!result) {
15
+ const message = constraint.message ?? `Validation failed: ${JSON.stringify(constraint.condition)}`;
16
+ if (constraint.severity === 'error') {
17
+ throw new Error(message);
18
+ }
19
+ else {
20
+ this.deps.log(`Warning: ${message}`);
21
+ }
22
+ }
23
+ }
24
+ this.deps.log('Validation passed');
25
+ }
26
+ }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Webhook Handler
3
+ *
4
+ * Handles the 'wait' step for waiting on webhook callbacks.
5
+ */
6
+ import type { WebhookStep } from '../../ast/nodes.js';
7
+ import type { ExecutionContext } from '../context.js';
8
+ import type { WebhookServer, WebhookRegistration, WebhookEvent } from '../../webhook/index.js';
9
+ /**
10
+ * Dependencies for the webhook handler
11
+ */
12
+ export interface WebhookHandlerDeps {
13
+ ctx: ExecutionContext;
14
+ webhookServer: WebhookServer;
15
+ executionId: string;
16
+ log: (message: string) => void;
17
+ }
18
+ /**
19
+ * Result of webhook handler execution
20
+ */
21
+ export interface WebhookHandlerResult {
22
+ registration: WebhookRegistration;
23
+ events: WebhookEvent[];
24
+ webhookUrl: string;
25
+ }
26
+ /**
27
+ * Handler for webhook (wait) steps
28
+ */
29
+ export declare class WebhookHandler {
30
+ private deps;
31
+ constructor(deps: WebhookHandlerDeps);
32
+ /**
33
+ * Execute the wait step
34
+ */
35
+ execute(step: WebhookStep): Promise<WebhookHandlerResult>;
36
+ }
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Webhook Handler
3
+ *
4
+ * Handles the 'wait' step for waiting on webhook callbacks.
5
+ */
6
+ import { evaluate } from '../evaluator.js';
7
+ import { RetrySignal } from '../signals.js';
8
+ /**
9
+ * Handler for webhook (wait) steps
10
+ */
11
+ export class WebhookHandler {
12
+ deps;
13
+ constructor(deps) {
14
+ this.deps = deps;
15
+ }
16
+ /**
17
+ * Execute the wait step
18
+ */
19
+ async execute(step) {
20
+ const { ctx, webhookServer, executionId, log } = this.deps;
21
+ // Register webhook endpoint
22
+ const timeout = step.timeout ?? 300000; // 5 minutes default
23
+ const expectedEvents = step.expectedEvents ?? 1;
24
+ const registration = await webhookServer.register(executionId, {
25
+ path: step.path,
26
+ timeout,
27
+ expectedEvents,
28
+ filter: step.eventFilter ? JSON.stringify(step.eventFilter) : undefined,
29
+ });
30
+ const webhookUrl = webhookServer.getWebhookUrl(registration);
31
+ log(`Waiting for webhook: ${webhookUrl} (timeout: ${timeout}ms, expected: ${expectedEvents})`);
32
+ // Set the webhook URL in context for use in subsequent steps
33
+ ctx.response = {
34
+ webhookId: registration.id,
35
+ webhookUrl,
36
+ webhookPath: registration.path,
37
+ };
38
+ // Wait for webhook events
39
+ const result = await webhookServer.waitForEvents(registration.id, timeout);
40
+ if (result.timedOut) {
41
+ log(`Webhook timeout: ${webhookUrl}`);
42
+ // Check if retry is configured
43
+ if (step.retryOnTimeout) {
44
+ throw new RetrySignal(step.retryOnTimeout);
45
+ }
46
+ // If not retrying, still return partial results
47
+ if (result.events.length === 0) {
48
+ throw new Error(`Webhook timeout: no events received within ${timeout}ms`);
49
+ }
50
+ }
51
+ // Filter events if filter expression provided
52
+ let events = result.events;
53
+ if (step.eventFilter && events.length > 0) {
54
+ events = events.filter((event) => {
55
+ try {
56
+ const filterCtx = { ...ctx, response: event.body };
57
+ return evaluate(step.eventFilter, filterCtx);
58
+ }
59
+ catch {
60
+ return true; // Include on filter error
61
+ }
62
+ });
63
+ }
64
+ log(`Received ${events.length} webhook event(s)`);
65
+ // Set response to webhook events
66
+ if (events.length === 1) {
67
+ ctx.response = events[0].body;
68
+ }
69
+ else {
70
+ ctx.response = events.map((e) => e.body);
71
+ }
72
+ // Store events if storage configured
73
+ if (step.storage) {
74
+ const store = ctx.stores.get(step.storage.target);
75
+ if (store) {
76
+ for (const event of events) {
77
+ const data = event.body;
78
+ let key;
79
+ if (step.storage.key) {
80
+ const keyCtx = { ...ctx, response: event.body };
81
+ const keyValue = evaluate(step.storage.key, keyCtx);
82
+ key = String(keyValue);
83
+ }
84
+ else {
85
+ // Generate a key from the event ID
86
+ key = event.id;
87
+ }
88
+ await store.set(key, data);
89
+ log(`Stored webhook event: ${key}`);
90
+ }
91
+ }
92
+ else {
93
+ log(`Warning: Store '${step.storage.target}' not found for webhook storage`);
94
+ }
95
+ }
96
+ // Clean up registration
97
+ await webhookServer.unregister(registration.id);
98
+ return {
99
+ registration,
100
+ events,
101
+ webhookUrl,
102
+ };
103
+ }
104
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Lexer module for Reqon.
3
+ *
4
+ * Uses Vague's Lexer with Reqon keywords registered via the plugin system.
5
+ * Importing this module automatically registers the Reqon plugin.
6
+ */
7
+ import '../plugin.js';
8
+ export { Lexer, Lexer as ReqonLexer, TokenType, type Token } from 'vague-lang';
9
+ export { ReqonTokenType, REQON_KEYWORDS } from './tokens.js';
10
+ export type { Token as ReqonToken } from 'vague-lang';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Lexer module for Reqon.
3
+ *
4
+ * Uses Vague's Lexer with Reqon keywords registered via the plugin system.
5
+ * Importing this module automatically registers the Reqon plugin.
6
+ */
7
+ // Import plugin to auto-register Reqon keywords with Vague
8
+ import '../plugin.js';
9
+ // Re-export Vague's Lexer and TokenType as the primary lexer
10
+ export { Lexer, Lexer as ReqonLexer, TokenType } from 'vague-lang';
11
+ // Export Reqon-specific token types and keywords
12
+ export { ReqonTokenType, REQON_KEYWORDS } from './tokens.js';
@@ -0,0 +1,24 @@
1
+ import { type ReqonToken } from './tokens.js';
2
+ export declare class ReqonLexer {
3
+ private source;
4
+ private pos;
5
+ private line;
6
+ private column;
7
+ constructor(source: string);
8
+ tokenize(): ReqonToken[];
9
+ private nextToken;
10
+ private readString;
11
+ private readNumber;
12
+ private readIdentifier;
13
+ private readOperator;
14
+ private skipWhitespace;
15
+ private skipLineComment;
16
+ private makeToken;
17
+ private peek;
18
+ private peekNext;
19
+ private advance;
20
+ private isAtEnd;
21
+ private isDigit;
22
+ private isAlpha;
23
+ private isAlphaNumeric;
24
+ }