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