reqon-dsl 0.2.0 → 0.3.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.
- package/CHANGELOG.md +7 -0
- package/README.md +22 -0
- package/dist/ast/nodes.d.ts +83 -4
- package/dist/ast/nodes.js +14 -0
- package/dist/auth/circuit-breaker.js +7 -6
- package/dist/auth/rate-limiter.d.ts +4 -0
- package/dist/auth/rate-limiter.js +9 -16
- package/dist/cli.d.ts +13 -0
- package/dist/cli.js +84 -4
- package/dist/config/constants.d.ts +141 -0
- package/dist/config/constants.js +128 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.js +4 -0
- package/dist/control/index.d.ts +2 -0
- package/dist/control/index.js +1 -0
- package/dist/control/server.d.ts +88 -0
- package/dist/control/server.js +238 -0
- package/dist/control/types.d.ts +55 -0
- package/dist/control/types.js +7 -0
- package/dist/debug/cli-debugger.d.ts +17 -0
- package/dist/debug/cli-debugger.js +180 -0
- package/dist/debug/controller.d.ts +94 -0
- package/dist/debug/controller.js +45 -0
- package/dist/debug/index.d.ts +6 -0
- package/dist/debug/index.js +5 -0
- package/dist/errors/index.d.ts +67 -0
- package/dist/errors/index.js +89 -1
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/state.d.ts +24 -0
- package/dist/index.d.ts +21 -1
- package/dist/index.js +33 -2
- package/dist/interpreter/context.d.ts +14 -0
- package/dist/interpreter/context.js +15 -0
- package/dist/interpreter/evaluator.d.ts +63 -1
- package/dist/interpreter/evaluator.js +186 -39
- package/dist/interpreter/executor.d.ts +70 -14
- package/dist/interpreter/executor.js +503 -174
- package/dist/interpreter/fetch-handler.d.ts +9 -0
- package/dist/interpreter/fetch-handler.js +133 -24
- package/dist/interpreter/http.d.ts +5 -0
- package/dist/interpreter/http.js +26 -12
- package/dist/interpreter/index.d.ts +3 -1
- package/dist/interpreter/index.js +2 -0
- package/dist/interpreter/pagination.d.ts +11 -2
- package/dist/interpreter/pagination.js +95 -31
- package/dist/interpreter/signals.d.ts +8 -0
- package/dist/interpreter/signals.js +12 -0
- package/dist/interpreter/source-manager.d.ts +75 -0
- package/dist/interpreter/source-manager.js +157 -0
- package/dist/interpreter/step-handlers/apply-handler.d.ts +29 -0
- package/dist/interpreter/step-handlers/apply-handler.js +79 -0
- package/dist/interpreter/step-handlers/for-handler.d.ts +13 -0
- package/dist/interpreter/step-handlers/for-handler.js +71 -4
- package/dist/interpreter/step-handlers/index.d.ts +4 -2
- package/dist/interpreter/step-handlers/index.js +4 -2
- package/dist/interpreter/step-handlers/match-handler.d.ts +9 -0
- package/dist/interpreter/step-handlers/match-handler.js +43 -16
- package/dist/interpreter/step-handlers/pause-handler.d.ts +52 -0
- package/dist/interpreter/step-handlers/pause-handler.js +87 -0
- package/dist/interpreter/step-handlers/store-handler.d.ts +11 -1
- package/dist/interpreter/step-handlers/store-handler.js +45 -13
- package/dist/interpreter/step-handlers/types.d.ts +3 -0
- package/dist/interpreter/step-handlers/validate-handler.d.ts +2 -1
- package/dist/interpreter/step-handlers/validate-handler.js +4 -2
- package/dist/interpreter/step-handlers/webhook-handler.d.ts +3 -0
- package/dist/interpreter/step-handlers/webhook-handler.js +18 -2
- package/dist/interpreter/store-manager.d.ts +46 -0
- package/dist/interpreter/store-manager.js +66 -0
- package/dist/lexer/index.d.ts +11 -4
- package/dist/lexer/index.js +11 -4
- package/dist/lexer/tokens.d.ts +17 -1
- package/dist/lexer/tokens.js +36 -0
- package/dist/mcp/index.d.ts +11 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.js +451 -0
- package/dist/oas/index.d.ts +2 -0
- package/dist/oas/index.js +1 -0
- package/dist/oas/mock-generator.d.ts +12 -0
- package/dist/oas/mock-generator.js +187 -0
- package/dist/observability/events.d.ts +244 -0
- package/dist/observability/events.js +90 -0
- package/dist/observability/index.d.ts +15 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/logger.d.ts +106 -0
- package/dist/observability/logger.js +259 -0
- package/dist/observability/otel.d.ts +135 -0
- package/dist/observability/otel.js +386 -0
- package/dist/parser/action-parser.d.ts +105 -0
- package/dist/parser/action-parser.js +645 -0
- package/dist/parser/expressions.d.ts +13 -0
- package/dist/parser/expressions.js +72 -2
- package/dist/parser/fetch-parser.d.ts +27 -0
- package/dist/parser/fetch-parser.js +269 -0
- package/dist/parser/index.d.ts +17 -0
- package/dist/parser/index.js +17 -0
- package/dist/parser/parser.d.ts +44 -46
- package/dist/parser/parser.js +122 -1070
- package/dist/parser/pipeline-parser.d.ts +12 -0
- package/dist/parser/pipeline-parser.js +52 -0
- package/dist/parser/schedule-parser.d.ts +7 -0
- package/dist/parser/schedule-parser.js +137 -0
- package/dist/parser/source-parser.d.ts +9 -0
- package/dist/parser/source-parser.js +151 -0
- package/dist/pause/index.d.ts +14 -0
- package/dist/pause/index.js +11 -0
- package/dist/pause/manager.d.ts +118 -0
- package/dist/pause/manager.js +245 -0
- package/dist/pause/state.d.ts +93 -0
- package/dist/pause/state.js +103 -0
- package/dist/pause/store.d.ts +61 -0
- package/dist/pause/store.js +156 -0
- package/dist/plugin.d.ts +9 -12
- package/dist/plugin.js +10 -13
- package/dist/stores/factory.d.ts +1 -1
- package/dist/stores/factory.js +3 -2
- package/dist/stores/file.d.ts +26 -0
- package/dist/stores/file.js +64 -10
- package/dist/stores/index.d.ts +16 -1
- package/dist/stores/index.js +16 -1
- package/dist/stores/memory.d.ts +4 -0
- package/dist/stores/memory.js +11 -0
- package/dist/stores/types.d.ts +17 -0
- package/dist/stores/types.js +12 -0
- package/dist/trace/index.d.ts +16 -0
- package/dist/trace/index.js +12 -0
- package/dist/trace/recorder.d.ts +71 -0
- package/dist/trace/recorder.js +144 -0
- package/dist/trace/replay.d.ts +132 -0
- package/dist/trace/replay.js +264 -0
- package/dist/trace/state.d.ts +102 -0
- package/dist/trace/state.js +86 -0
- package/dist/trace/store.d.ts +69 -0
- package/dist/trace/store.js +225 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/type-guards.d.ts +58 -0
- package/dist/utils/type-guards.js +92 -0
- package/dist/webhook/server.js +7 -6
- package/package.json +55 -6
- package/.claude/settings.local.json +0 -31
- package/.claude/skills/api-integration.md +0 -125
- package/.claude/skills/database-schema.md +0 -51
- package/.claude/skills/dsl-design.md +0 -80
- package/.claude/skills/property-testing.md +0 -143
- package/.claude/skills/reqon/SKILL.md +0 -44
- package/.claude/skills/reqon/references/examples.md +0 -206
- package/.claude/skills/reqon/references/syntax.md +0 -263
- package/.claude/skills/vscode-extension.md +0 -113
- package/.github/dependabot.yml +0 -32
- package/.github/pull_request_template.md +0 -21
- package/.github/workflows/ci.yml +0 -174
- package/.github/workflows/release.yml +0 -73
- package/CLAUDE.md +0 -72
- package/CONTRIBUTING.md +0 -161
- package/TODO.md +0 -51
- package/dist/auth/auth.test.d.ts +0 -1
- package/dist/auth/auth.test.js +0 -255
- package/dist/errors/errors.test.d.ts +0 -1
- package/dist/errors/errors.test.js +0 -165
- package/dist/execution/execution.test.d.ts +0 -1
- package/dist/execution/execution.test.js +0 -246
- package/dist/integration.test.d.ts +0 -1
- package/dist/integration.test.js +0 -168
- package/dist/interpreter/evaluator.test.d.ts +0 -1
- package/dist/interpreter/evaluator.test.js +0 -512
- package/dist/interpreter/http.test.d.ts +0 -1
- package/dist/interpreter/http.test.js +0 -299
- package/dist/interpreter/progress.test.d.ts +0 -1
- package/dist/interpreter/progress.test.js +0 -216
- package/dist/interpreter/schema-matcher.test.d.ts +0 -1
- package/dist/interpreter/schema-matcher.test.js +0 -122
- package/dist/lexer/lexer.d.ts +0 -24
- package/dist/lexer/lexer.js +0 -264
- package/dist/lexer/lexer.test.d.ts +0 -1
- package/dist/lexer/lexer.test.js +0 -259
- package/dist/loader/loader.test.d.ts +0 -1
- package/dist/loader/loader.test.js +0 -287
- package/dist/oas/oas.test.d.ts +0 -1
- package/dist/oas/oas.test.js +0 -218
- package/dist/parser/expressions.test.d.ts +0 -1
- package/dist/parser/expressions.test.js +0 -378
- package/dist/parser/match.test.d.ts +0 -1
- package/dist/parser/match.test.js +0 -254
- package/dist/parser/parser.test.d.ts +0 -1
- package/dist/parser/parser.test.js +0 -333
- package/dist/parser/schedule.test.d.ts +0 -1
- package/dist/parser/schedule.test.js +0 -241
- package/dist/scheduler/cron-parser.test.d.ts +0 -1
- package/dist/scheduler/cron-parser.test.js +0 -188
- package/dist/stores/file.test.d.ts +0 -1
- package/dist/stores/file.test.js +0 -165
- package/dist/stores/memory.test.d.ts +0 -1
- package/dist/stores/memory.test.js +0 -157
- package/dist/stores/stores.test.d.ts +0 -1
- package/dist/stores/stores.test.js +0 -158
- package/dist/sync/sync.test.d.ts +0 -1
- package/dist/sync/sync.test.js +0 -221
- package/docusaurus/README.md +0 -41
- package/docusaurus/docs/advanced/execution-state.md +0 -283
- package/docusaurus/docs/advanced/extending-reqon.md +0 -388
- package/docusaurus/docs/advanced/multi-file-missions.md +0 -250
- package/docusaurus/docs/advanced/parallel-execution.md +0 -353
- package/docusaurus/docs/api-reference.md +0 -443
- package/docusaurus/docs/authentication/api-key.md +0 -339
- package/docusaurus/docs/authentication/basic.md +0 -276
- package/docusaurus/docs/authentication/bearer.md +0 -282
- package/docusaurus/docs/authentication/oauth2.md +0 -317
- package/docusaurus/docs/authentication/overview.md +0 -251
- package/docusaurus/docs/cli.md +0 -229
- package/docusaurus/docs/core-concepts/actions.md +0 -286
- package/docusaurus/docs/core-concepts/missions.md +0 -264
- package/docusaurus/docs/core-concepts/schemas.md +0 -353
- package/docusaurus/docs/core-concepts/sources.md +0 -339
- package/docusaurus/docs/core-concepts/stores.md +0 -332
- package/docusaurus/docs/dsl-syntax/expressions.md +0 -361
- package/docusaurus/docs/dsl-syntax/fetch.md +0 -293
- package/docusaurus/docs/dsl-syntax/for-loops.md +0 -324
- package/docusaurus/docs/dsl-syntax/map.md +0 -345
- package/docusaurus/docs/dsl-syntax/match.md +0 -387
- package/docusaurus/docs/dsl-syntax/pipelines.md +0 -397
- package/docusaurus/docs/dsl-syntax/validate.md +0 -401
- package/docusaurus/docs/error-handling/dead-letter-queues.md +0 -399
- package/docusaurus/docs/error-handling/flow-control.md +0 -337
- package/docusaurus/docs/error-handling/retry-strategies.md +0 -368
- package/docusaurus/docs/examples.md +0 -488
- package/docusaurus/docs/getting-started.md +0 -256
- package/docusaurus/docs/http/circuit-breaker.md +0 -401
- package/docusaurus/docs/http/incremental-sync.md +0 -394
- package/docusaurus/docs/http/pagination.md +0 -361
- package/docusaurus/docs/http/rate-limiting.md +0 -383
- package/docusaurus/docs/http/requests.md +0 -328
- package/docusaurus/docs/http/retry.md +0 -402
- package/docusaurus/docs/intro.md +0 -90
- package/docusaurus/docs/openapi/loading-specs.md +0 -305
- package/docusaurus/docs/openapi/operation-calls.md +0 -314
- package/docusaurus/docs/openapi/overview.md +0 -212
- package/docusaurus/docs/openapi/response-validation.md +0 -344
- package/docusaurus/docs/scheduling/cron.md +0 -305
- package/docusaurus/docs/scheduling/daemon-mode.md +0 -317
- package/docusaurus/docs/scheduling/intervals.md +0 -289
- package/docusaurus/docs/scheduling/overview.md +0 -231
- package/docusaurus/docs/stores/custom-adapters.md +0 -376
- package/docusaurus/docs/stores/file.md +0 -236
- package/docusaurus/docs/stores/memory.md +0 -193
- package/docusaurus/docs/stores/overview.md +0 -274
- package/docusaurus/docs/stores/postgrest.md +0 -316
- package/docusaurus/docusaurus.config.ts +0 -148
- package/docusaurus/package-lock.json +0 -18029
- package/docusaurus/package.json +0 -47
- package/docusaurus/sidebars.ts +0 -155
- package/docusaurus/src/components/HomepageFeatures/index.tsx +0 -105
- package/docusaurus/src/components/HomepageFeatures/styles.module.css +0 -12
- package/docusaurus/src/css/custom.css +0 -169
- package/docusaurus/src/pages/index.module.css +0 -48
- package/docusaurus/src/pages/index.tsx +0 -110
- package/docusaurus/src/pages/markdown-page.md +0 -7
- package/docusaurus/static/.nojekyll +0 -0
- package/docusaurus/static/img/docusaurus-social-card.jpg +0 -0
- package/docusaurus/static/img/docusaurus.png +0 -0
- package/docusaurus/static/img/favicon.ico +0 -0
- package/docusaurus/static/img/logo.svg +0 -10
- package/docusaurus/static/img/undraw_docusaurus_mountain.svg +0 -171
- package/docusaurus/static/img/undraw_docusaurus_react.svg +0 -170
- package/docusaurus/static/img/undraw_docusaurus_tree.svg +0 -40
- package/docusaurus/tsconfig.json +0 -8
- package/examples/README.md +0 -112
- package/examples/error-handling/README.md +0 -150
- package/examples/error-handling/payment-processor.vague +0 -287
- package/examples/github-sync/README.md +0 -74
- package/examples/github-sync/fetch-issues.vague +0 -47
- package/examples/github-sync/fetch-prs.vague +0 -40
- package/examples/github-sync/mission.vague +0 -101
- package/examples/github-sync/normalize.vague +0 -70
- package/examples/jsonplaceholder/README.md +0 -28
- package/examples/jsonplaceholder/posts.vague +0 -48
- package/examples/petstore/README.md +0 -35
- package/examples/petstore/openapi.yaml +0 -97
- package/examples/petstore/sync.vague +0 -52
- package/examples/temporal-comparison/README.md +0 -297
- package/examples/temporal-comparison/reconciliation.vague +0 -355
- package/examples/temporal-comparison/temporal/activities/index.ts +0 -8
- package/examples/temporal-comparison/temporal/activities/shipstation.ts +0 -225
- package/examples/temporal-comparison/temporal/activities/shopify.ts +0 -257
- package/examples/temporal-comparison/temporal/activities/storage.ts +0 -198
- package/examples/temporal-comparison/temporal/activities/stripe.ts +0 -169
- package/examples/temporal-comparison/temporal/activities/validation.ts +0 -205
- package/examples/temporal-comparison/temporal/client/schedule.ts +0 -218
- package/examples/temporal-comparison/temporal/config/retry.ts +0 -63
- package/examples/temporal-comparison/temporal/types/index.ts +0 -129
- package/examples/temporal-comparison/temporal/workers/main.ts +0 -130
- package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +0 -262
- package/examples/xero/README.md +0 -88
- package/examples/xero/invoices.vague +0 -189
- package/src/api-integration.test.ts +0 -954
- package/src/ast/index.ts +0 -1
- package/src/ast/nodes.ts +0 -310
- package/src/auth/auth.test.ts +0 -326
- package/src/auth/circuit-breaker.test.ts +0 -390
- package/src/auth/circuit-breaker.ts +0 -379
- package/src/auth/credentials.test.ts +0 -273
- package/src/auth/credentials.ts +0 -246
- package/src/auth/index.ts +0 -40
- package/src/auth/oauth2-provider.ts +0 -177
- package/src/auth/rate-limiter.ts +0 -459
- package/src/auth/token-store.ts +0 -177
- package/src/auth/types.ts +0 -159
- package/src/benchmark/e2e.bench.ts +0 -288
- package/src/benchmark/evaluator.bench.ts +0 -331
- package/src/benchmark/fixtures.ts +0 -295
- package/src/benchmark/index.ts +0 -108
- package/src/benchmark/lexer.bench.ts +0 -69
- package/src/benchmark/parser.bench.ts +0 -103
- package/src/benchmark/resilience.bench.ts +0 -193
- package/src/benchmark/store.bench.ts +0 -147
- package/src/benchmark/utils.ts +0 -230
- package/src/cli.ts +0 -313
- package/src/errors/errors.test.ts +0 -234
- package/src/errors/index.ts +0 -223
- package/src/execution/execution.test.ts +0 -307
- package/src/execution/index.ts +0 -21
- package/src/execution/state.ts +0 -207
- package/src/execution/store.ts +0 -188
- package/src/index.ts +0 -169
- package/src/integration.test.ts +0 -192
- package/src/interpreter/context.ts +0 -57
- package/src/interpreter/evaluator.test.ts +0 -796
- package/src/interpreter/evaluator.ts +0 -245
- package/src/interpreter/executor.ts +0 -946
- package/src/interpreter/fetch-handler.ts +0 -302
- package/src/interpreter/http.test.ts +0 -423
- package/src/interpreter/http.ts +0 -308
- package/src/interpreter/index.ts +0 -32
- package/src/interpreter/pagination.ts +0 -207
- package/src/interpreter/progress.test.ts +0 -276
- package/src/interpreter/schema-matcher.test.ts +0 -160
- package/src/interpreter/schema-matcher.ts +0 -168
- package/src/interpreter/signals.ts +0 -73
- package/src/interpreter/step-handlers/for-handler.ts +0 -65
- package/src/interpreter/step-handlers/index.ts +0 -17
- package/src/interpreter/step-handlers/map-handler.ts +0 -24
- package/src/interpreter/step-handlers/match-handler.ts +0 -101
- package/src/interpreter/step-handlers/store-handler.ts +0 -78
- package/src/interpreter/step-handlers/types.ts +0 -17
- package/src/interpreter/step-handlers/validate-handler.ts +0 -30
- package/src/interpreter/step-handlers/webhook-handler.ts +0 -142
- package/src/lexer/index.ts +0 -18
- package/src/lexer/lexer.test.ts +0 -316
- package/src/lexer/tokens.ts +0 -179
- package/src/loader/index.ts +0 -288
- package/src/loader/loader.test.ts +0 -360
- package/src/oas/index.ts +0 -4
- package/src/oas/loader.ts +0 -126
- package/src/oas/oas.test.ts +0 -254
- package/src/oas/validator.ts +0 -299
- package/src/parser/base.ts +0 -124
- package/src/parser/expressions.test.ts +0 -525
- package/src/parser/expressions.ts +0 -314
- package/src/parser/index.ts +0 -3
- package/src/parser/match.test.ts +0 -296
- package/src/parser/parser.test.ts +0 -739
- package/src/parser/parser.ts +0 -1469
- package/src/parser/schedule.test.ts +0 -287
- package/src/parser/webhook.test.ts +0 -248
- package/src/plugin.ts +0 -83
- package/src/scheduler/cron-parser.test.ts +0 -236
- package/src/scheduler/cron-parser.ts +0 -236
- package/src/scheduler/index.ts +0 -10
- package/src/scheduler/scheduler.ts +0 -443
- package/src/scheduler/types.ts +0 -71
- package/src/stores/factory.ts +0 -104
- package/src/stores/file.test.ts +0 -276
- package/src/stores/file.ts +0 -211
- package/src/stores/index.ts +0 -6
- package/src/stores/memory.test.ts +0 -238
- package/src/stores/memory.ts +0 -63
- package/src/stores/postgrest.test.ts +0 -488
- package/src/stores/postgrest.ts +0 -263
- package/src/stores/stores.test.ts +0 -197
- package/src/stores/types.ts +0 -58
- package/src/sync/index.ts +0 -16
- package/src/sync/state.ts +0 -126
- package/src/sync/store.ts +0 -139
- package/src/sync/sync.test.ts +0 -271
- package/src/utils/async.ts +0 -10
- package/src/utils/file.ts +0 -106
- package/src/utils/index.ts +0 -14
- package/src/utils/logger.ts +0 -53
- package/src/utils/path.ts +0 -47
- package/src/webhook/index.ts +0 -15
- package/src/webhook/server.test.ts +0 -253
- package/src/webhook/server.ts +0 -389
- package/src/webhook/store.ts +0 -239
- package/src/webhook/types.ts +0 -93
- package/tsconfig.json +0 -17
- package/vitest.config.ts +0 -39
|
@@ -1,293 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 1
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Fetch Steps
|
|
6
|
-
|
|
7
|
-
Fetch steps make HTTP requests to APIs. They're the primary way to retrieve data in Reqon.
|
|
8
|
-
|
|
9
|
-
## HTTP Methods
|
|
10
|
-
|
|
11
|
-
```vague
|
|
12
|
-
// GET request
|
|
13
|
-
get "/users"
|
|
14
|
-
|
|
15
|
-
// POST request
|
|
16
|
-
post "/users" { body: { name: "John" } }
|
|
17
|
-
|
|
18
|
-
// PUT request
|
|
19
|
-
put "/users/123" { body: { name: "Jane" } }
|
|
20
|
-
|
|
21
|
-
// PATCH request
|
|
22
|
-
patch "/users/123" { body: { email: "jane@example.com" } }
|
|
23
|
-
|
|
24
|
-
// DELETE request
|
|
25
|
-
delete "/users/123"
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Request Options
|
|
29
|
-
|
|
30
|
-
### Query Parameters
|
|
31
|
-
|
|
32
|
-
```vague
|
|
33
|
-
get "/users" {
|
|
34
|
-
params: {
|
|
35
|
-
limit: 100,
|
|
36
|
-
offset: 0,
|
|
37
|
-
status: "active"
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
### Request Body
|
|
43
|
-
|
|
44
|
-
```vague
|
|
45
|
-
post "/users" {
|
|
46
|
-
body: {
|
|
47
|
-
name: "John Doe",
|
|
48
|
-
email: "john@example.com",
|
|
49
|
-
roles: ["user", "admin"]
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Custom Headers
|
|
55
|
-
|
|
56
|
-
```vague
|
|
57
|
-
get "/users" {
|
|
58
|
-
headers: {
|
|
59
|
-
"X-Custom-Header": "value",
|
|
60
|
-
"Accept": "application/json"
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
## Pagination
|
|
66
|
-
|
|
67
|
-
### Offset-Based
|
|
68
|
-
|
|
69
|
-
```vague
|
|
70
|
-
get "/users" {
|
|
71
|
-
paginate: offset(page, 100),
|
|
72
|
-
until: length(response) == 0
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
Parameters:
|
|
77
|
-
- `page` - Query parameter name for offset value
|
|
78
|
-
- `100` - Page size
|
|
79
|
-
|
|
80
|
-
### Page Number-Based
|
|
81
|
-
|
|
82
|
-
```vague
|
|
83
|
-
get "/users" {
|
|
84
|
-
paginate: page(pageNum, 50),
|
|
85
|
-
until: response.meta.hasNext == false
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Parameters:
|
|
90
|
-
- `pageNum` - Query parameter name for page number
|
|
91
|
-
- `50` - Page size
|
|
92
|
-
|
|
93
|
-
### Cursor-Based
|
|
94
|
-
|
|
95
|
-
```vague
|
|
96
|
-
get "/users" {
|
|
97
|
-
paginate: cursor(cursor, 100, "meta.nextCursor"),
|
|
98
|
-
until: response.meta.nextCursor == null
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
Parameters:
|
|
103
|
-
- `cursor` - Query parameter name
|
|
104
|
-
- `100` - Page size
|
|
105
|
-
- `"meta.nextCursor"` - Path to next cursor in response
|
|
106
|
-
|
|
107
|
-
See [Pagination](../http/pagination) for detailed documentation.
|
|
108
|
-
|
|
109
|
-
## Termination Conditions
|
|
110
|
-
|
|
111
|
-
The `until` option specifies when to stop paginating:
|
|
112
|
-
|
|
113
|
-
```vague
|
|
114
|
-
// Stop when empty response
|
|
115
|
-
get "/users" {
|
|
116
|
-
paginate: offset(page, 100),
|
|
117
|
-
until: length(response) == 0
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Stop when no more pages
|
|
121
|
-
get "/users" {
|
|
122
|
-
paginate: page(p, 50),
|
|
123
|
-
until: response.pagination.hasNext == false
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Stop when cursor is null
|
|
127
|
-
get "/users" {
|
|
128
|
-
paginate: cursor(c, 100, "nextCursor"),
|
|
129
|
-
until: response.nextCursor == null
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
// Stop after N items
|
|
133
|
-
get "/users" {
|
|
134
|
-
paginate: offset(page, 100),
|
|
135
|
-
until: length(response) == 0 or page > 10
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## Retry Configuration
|
|
140
|
-
|
|
141
|
-
```vague
|
|
142
|
-
get "/users" {
|
|
143
|
-
retry: {
|
|
144
|
-
maxAttempts: 3,
|
|
145
|
-
backoff: exponential,
|
|
146
|
-
initialDelay: 1000,
|
|
147
|
-
maxDelay: 30000
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
Options:
|
|
153
|
-
- `maxAttempts` - Maximum retry attempts
|
|
154
|
-
- `backoff` - Strategy: `exponential`, `linear`, or `constant`
|
|
155
|
-
- `initialDelay` - First retry delay in milliseconds
|
|
156
|
-
- `maxDelay` - Maximum delay between retries
|
|
157
|
-
|
|
158
|
-
See [Retry Strategies](../http/retry) for details.
|
|
159
|
-
|
|
160
|
-
## Incremental Sync
|
|
161
|
-
|
|
162
|
-
Fetch only changes since last run:
|
|
163
|
-
|
|
164
|
-
```vague
|
|
165
|
-
get "/users" {
|
|
166
|
-
since: lastSync
|
|
167
|
-
}
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
This automatically adds a timestamp parameter to the request.
|
|
171
|
-
|
|
172
|
-
See [Incremental Sync](../http/incremental-sync) for details.
|
|
173
|
-
|
|
174
|
-
## Response Handling
|
|
175
|
-
|
|
176
|
-
The `response` variable is automatically set after each fetch:
|
|
177
|
-
|
|
178
|
-
```vague
|
|
179
|
-
action FetchUsers {
|
|
180
|
-
get "/users"
|
|
181
|
-
|
|
182
|
-
// response contains the parsed JSON body
|
|
183
|
-
for user in response.data {
|
|
184
|
-
store user -> users { key: .id }
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### Response Structure
|
|
190
|
-
|
|
191
|
-
```vague
|
|
192
|
-
action InspectResponse {
|
|
193
|
-
get "/users"
|
|
194
|
-
|
|
195
|
-
// Access body data
|
|
196
|
-
store response.users -> users { key: .id }
|
|
197
|
-
|
|
198
|
-
// Check response metadata
|
|
199
|
-
validate {
|
|
200
|
-
assume response.total > 0
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
## Named Source Requests
|
|
206
|
-
|
|
207
|
-
When you have multiple sources, specify which to use:
|
|
208
|
-
|
|
209
|
-
```vague
|
|
210
|
-
mission MultiSource {
|
|
211
|
-
source Primary { auth: bearer, base: "https://primary.api.com" }
|
|
212
|
-
source Secondary { auth: bearer, base: "https://secondary.api.com" }
|
|
213
|
-
|
|
214
|
-
action FetchBoth {
|
|
215
|
-
// Default source (first defined)
|
|
216
|
-
get "/users"
|
|
217
|
-
|
|
218
|
-
// Explicit source
|
|
219
|
-
get Secondary "/backup-users"
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
## Dynamic Paths
|
|
225
|
-
|
|
226
|
-
Use expressions in paths:
|
|
227
|
-
|
|
228
|
-
```vague
|
|
229
|
-
action FetchUserOrders {
|
|
230
|
-
for user in users {
|
|
231
|
-
get concat("/users/", user.id, "/orders")
|
|
232
|
-
store response -> orders { key: .id }
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
## OpenAPI Operation Calls
|
|
238
|
-
|
|
239
|
-
When using OAS sources, use `call` syntax:
|
|
240
|
-
|
|
241
|
-
```vague
|
|
242
|
-
source Petstore from "./petstore.yaml" { auth: bearer }
|
|
243
|
-
|
|
244
|
-
action FetchPets {
|
|
245
|
-
call Petstore.listPets {
|
|
246
|
-
params: { limit: 100 }
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
call Petstore.getPetById {
|
|
250
|
-
params: { petId: "123" }
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
See [OpenAPI Integration](../category/openapi-integration) for details.
|
|
256
|
-
|
|
257
|
-
## Complete Example
|
|
258
|
-
|
|
259
|
-
```vague
|
|
260
|
-
mission DataSync {
|
|
261
|
-
source API {
|
|
262
|
-
auth: bearer,
|
|
263
|
-
base: "https://api.example.com/v1"
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
store users: file("users")
|
|
267
|
-
|
|
268
|
-
action FetchAllUsers {
|
|
269
|
-
get "/users" {
|
|
270
|
-
params: { include: "profile" },
|
|
271
|
-
headers: { "Accept-Version": "2.0" },
|
|
272
|
-
paginate: offset(offset, 100),
|
|
273
|
-
until: length(response.users) == 0,
|
|
274
|
-
retry: {
|
|
275
|
-
maxAttempts: 3,
|
|
276
|
-
backoff: exponential,
|
|
277
|
-
initialDelay: 1000
|
|
278
|
-
},
|
|
279
|
-
since: lastSync
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
for user in response.users {
|
|
283
|
-
validate user {
|
|
284
|
-
assume .id is string,
|
|
285
|
-
assume .email is string
|
|
286
|
-
}
|
|
287
|
-
store user -> users { key: .id, upsert: true }
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
run FetchAllUsers
|
|
292
|
-
}
|
|
293
|
-
```
|
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 2
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# For Loops
|
|
6
|
-
|
|
7
|
-
For loops iterate over collections, allowing you to process each item individually.
|
|
8
|
-
|
|
9
|
-
## Basic Syntax
|
|
10
|
-
|
|
11
|
-
```vague
|
|
12
|
-
for item in collection {
|
|
13
|
-
// steps to execute for each item
|
|
14
|
-
}
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
## Iterating Over Response Data
|
|
18
|
-
|
|
19
|
-
```vague
|
|
20
|
-
action ProcessUsers {
|
|
21
|
-
get "/users"
|
|
22
|
-
|
|
23
|
-
for user in response.data {
|
|
24
|
-
store user -> users { key: .id }
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Iterating Over Store Data
|
|
30
|
-
|
|
31
|
-
```vague
|
|
32
|
-
action ProcessStoredData {
|
|
33
|
-
for customer in customers {
|
|
34
|
-
get concat("/customers/", customer.id, "/orders")
|
|
35
|
-
store response -> orders { key: .id }
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Filtering with Where
|
|
41
|
-
|
|
42
|
-
Add conditions to filter items:
|
|
43
|
-
|
|
44
|
-
```vague
|
|
45
|
-
action ProcessActiveUsers {
|
|
46
|
-
get "/users"
|
|
47
|
-
|
|
48
|
-
// Single condition
|
|
49
|
-
for user in response.data where .status == "active" {
|
|
50
|
-
store user -> activeUsers { key: .id }
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
### Multiple Conditions
|
|
56
|
-
|
|
57
|
-
```vague
|
|
58
|
-
action ProcessPremiumActiveUsers {
|
|
59
|
-
for user in users where .status == "active" and .tier == "premium" {
|
|
60
|
-
// Process premium active users
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### Comparison Operators
|
|
66
|
-
|
|
67
|
-
```vague
|
|
68
|
-
// Equality
|
|
69
|
-
for item in items where .status == "pending" { }
|
|
70
|
-
|
|
71
|
-
// Inequality
|
|
72
|
-
for item in items where .status != "cancelled" { }
|
|
73
|
-
|
|
74
|
-
// Numeric comparisons
|
|
75
|
-
for item in items where .price > 100 { }
|
|
76
|
-
for item in items where .quantity >= 10 { }
|
|
77
|
-
for item in items where .discount < 0.5 { }
|
|
78
|
-
for item in items where .stock <= 0 { }
|
|
79
|
-
|
|
80
|
-
// String contains
|
|
81
|
-
for item in items where .email contains "@example.com" { }
|
|
82
|
-
|
|
83
|
-
// Type checking
|
|
84
|
-
for item in items where .tags is array { }
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Complex Conditions
|
|
88
|
-
|
|
89
|
-
```vague
|
|
90
|
-
for order in orders where (.status == "pending" or .status == "processing") and .total > 100 {
|
|
91
|
-
// Process high-value pending/processing orders
|
|
92
|
-
}
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Nested Loops
|
|
96
|
-
|
|
97
|
-
```vague
|
|
98
|
-
action ProcessOrderItems {
|
|
99
|
-
for order in orders {
|
|
100
|
-
for item in order.lineItems {
|
|
101
|
-
map item -> OrderItem {
|
|
102
|
-
orderId: order.id,
|
|
103
|
-
productId: item.productId,
|
|
104
|
-
quantity: item.quantity,
|
|
105
|
-
price: item.unitPrice
|
|
106
|
-
}
|
|
107
|
-
store item -> orderItems { key: concat(order.id, "-", item.productId) }
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
## Variable Scope
|
|
114
|
-
|
|
115
|
-
Loop variables are scoped to their block:
|
|
116
|
-
|
|
117
|
-
```vague
|
|
118
|
-
action ScopedVariables {
|
|
119
|
-
get "/users"
|
|
120
|
-
|
|
121
|
-
for user in response.users {
|
|
122
|
-
// user is available here
|
|
123
|
-
|
|
124
|
-
for order in user.orders {
|
|
125
|
-
// Both user and order are available
|
|
126
|
-
|
|
127
|
-
map order -> EnrichedOrder {
|
|
128
|
-
orderId: order.id,
|
|
129
|
-
userId: user.id,
|
|
130
|
-
userName: user.name
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
// order is no longer available
|
|
134
|
-
}
|
|
135
|
-
// user is no longer available
|
|
136
|
-
}
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
## Accessing Loop Item Properties
|
|
140
|
-
|
|
141
|
-
Use dot notation to access properties:
|
|
142
|
-
|
|
143
|
-
```vague
|
|
144
|
-
for user in users {
|
|
145
|
-
// Direct access
|
|
146
|
-
store user -> allUsers { key: .id }
|
|
147
|
-
|
|
148
|
-
// Nested access
|
|
149
|
-
validate user {
|
|
150
|
-
assume .profile.email is string
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// In expressions
|
|
154
|
-
map user -> Output {
|
|
155
|
-
fullName: concat(.firstName, " ", .lastName),
|
|
156
|
-
domain: split(.email, "@")[1]
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
## Iterating Over Paginated Results
|
|
162
|
-
|
|
163
|
-
Combine pagination with iteration:
|
|
164
|
-
|
|
165
|
-
```vague
|
|
166
|
-
action FetchAllOrders {
|
|
167
|
-
get "/orders" {
|
|
168
|
-
paginate: offset(page, 100),
|
|
169
|
-
until: length(response.orders) == 0
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// This runs after ALL pages are fetched
|
|
173
|
-
for order in response.orders {
|
|
174
|
-
store order -> orders { key: .id }
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
For processing each page separately:
|
|
180
|
-
|
|
181
|
-
```vague
|
|
182
|
-
action ProcessPagesSequentially {
|
|
183
|
-
get "/orders" {
|
|
184
|
-
paginate: offset(page, 100),
|
|
185
|
-
until: length(response.orders) == 0
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Pagination accumulates all results in response
|
|
189
|
-
// Then the for loop processes them
|
|
190
|
-
for order in response.orders {
|
|
191
|
-
match order {
|
|
192
|
-
{ status: "urgent" } -> {
|
|
193
|
-
get concat("/orders/", order.id, "/expedite")
|
|
194
|
-
},
|
|
195
|
-
_ -> continue
|
|
196
|
-
}
|
|
197
|
-
store order -> orders { key: .id }
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
## Breaking Out of Loops
|
|
203
|
-
|
|
204
|
-
Use `skip` in match to skip to the next iteration:
|
|
205
|
-
|
|
206
|
-
```vague
|
|
207
|
-
for user in users {
|
|
208
|
-
match user {
|
|
209
|
-
{ status: "inactive" } -> skip,
|
|
210
|
-
{ status: "banned" } -> skip,
|
|
211
|
-
_ -> continue
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Only runs for active, non-banned users
|
|
215
|
-
store user -> activeUsers { key: .id }
|
|
216
|
-
}
|
|
217
|
-
```
|
|
218
|
-
|
|
219
|
-
## Error Handling in Loops
|
|
220
|
-
|
|
221
|
-
Handle errors per-item:
|
|
222
|
-
|
|
223
|
-
```vague
|
|
224
|
-
for user in users {
|
|
225
|
-
get concat("/users/", user.id, "/details")
|
|
226
|
-
|
|
227
|
-
match response {
|
|
228
|
-
{ error: _ } -> {
|
|
229
|
-
// Log error and continue
|
|
230
|
-
store { userId: user.id, error: response.error } -> errors { key: user.id }
|
|
231
|
-
skip
|
|
232
|
-
},
|
|
233
|
-
_ -> continue
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
store response -> userDetails { key: user.id }
|
|
237
|
-
}
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
## Performance Considerations
|
|
241
|
-
|
|
242
|
-
### Batch Operations
|
|
243
|
-
|
|
244
|
-
Instead of individual requests:
|
|
245
|
-
|
|
246
|
-
```vague
|
|
247
|
-
// Less efficient: one request per user
|
|
248
|
-
for user in users {
|
|
249
|
-
get concat("/users/", user.id)
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
Consider batching if the API supports it:
|
|
254
|
-
|
|
255
|
-
```vague
|
|
256
|
-
// More efficient: batch request
|
|
257
|
-
post "/users/batch" {
|
|
258
|
-
body: { ids: users.map(.id) }
|
|
259
|
-
}
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
### Parallel Processing
|
|
263
|
-
|
|
264
|
-
For independent operations, consider parallel actions:
|
|
265
|
-
|
|
266
|
-
```vague
|
|
267
|
-
run [FetchOrders, FetchProducts, FetchCustomers] then MergeData
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
## Complete Example
|
|
271
|
-
|
|
272
|
-
```vague
|
|
273
|
-
mission OrderProcessing {
|
|
274
|
-
source API { auth: bearer, base: "https://api.example.com" }
|
|
275
|
-
|
|
276
|
-
store orders: file("orders")
|
|
277
|
-
store enrichedOrders: file("enriched-orders")
|
|
278
|
-
store errors: file("errors")
|
|
279
|
-
|
|
280
|
-
action ProcessOrders {
|
|
281
|
-
get "/orders" {
|
|
282
|
-
paginate: offset(page, 100),
|
|
283
|
-
until: length(response.data) == 0
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
for order in response.data where .status != "cancelled" {
|
|
287
|
-
// Validate order
|
|
288
|
-
validate order {
|
|
289
|
-
assume .id is string,
|
|
290
|
-
assume .total > 0,
|
|
291
|
-
assume .items is array
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
// Fetch customer details
|
|
295
|
-
get concat("/customers/", order.customerId)
|
|
296
|
-
|
|
297
|
-
match response {
|
|
298
|
-
{ error: _ } -> {
|
|
299
|
-
store { orderId: order.id, error: "Customer not found" } -> errors
|
|
300
|
-
skip
|
|
301
|
-
},
|
|
302
|
-
_ -> continue
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
// Enrich order with customer data
|
|
306
|
-
map order -> EnrichedOrder {
|
|
307
|
-
id: order.id,
|
|
308
|
-
total: order.total,
|
|
309
|
-
status: order.status,
|
|
310
|
-
customer: {
|
|
311
|
-
id: response.id,
|
|
312
|
-
name: response.name,
|
|
313
|
-
email: response.email
|
|
314
|
-
},
|
|
315
|
-
items: order.items
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
store order -> enrichedOrders { key: .id }
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
run ProcessOrders
|
|
323
|
-
}
|
|
324
|
-
```
|