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
package/docusaurus/docs/intro.md
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 1
|
|
3
|
-
slug: /
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Introduction to Reqon
|
|
7
|
-
|
|
8
|
-
Reqon is a **declarative DSL framework for building fetch, map, validate pipelines**. It's designed to make API data synchronization simple, reliable, and maintainable.
|
|
9
|
-
|
|
10
|
-
## What is Reqon?
|
|
11
|
-
|
|
12
|
-
Reqon allows you to define data pipelines using a clean, readable syntax. Instead of writing imperative code to fetch data, transform it, validate it, and store it, you declare *what* you want to happen, and Reqon handles *how* it happens.
|
|
13
|
-
|
|
14
|
-
```vague
|
|
15
|
-
mission SyncCustomers {
|
|
16
|
-
source API { auth: bearer, base: "https://api.example.com" }
|
|
17
|
-
store customers: file("customers")
|
|
18
|
-
|
|
19
|
-
action FetchCustomers {
|
|
20
|
-
get "/customers" { paginate: offset(page, 100) }
|
|
21
|
-
for customer in response.data {
|
|
22
|
-
map customer -> Customer {
|
|
23
|
-
id: .id,
|
|
24
|
-
name: .name,
|
|
25
|
-
email: .email
|
|
26
|
-
}
|
|
27
|
-
store customer -> customers { key: .id }
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
run FetchCustomers
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Why Reqon?
|
|
36
|
-
|
|
37
|
-
### Declarative by Design
|
|
38
|
-
|
|
39
|
-
Traditional data pipelines require writing boilerplate code for HTTP requests, pagination, retries, error handling, and more. Reqon abstracts these concerns into a clean DSL, letting you focus on your business logic.
|
|
40
|
-
|
|
41
|
-
### Built-in Best Practices
|
|
42
|
-
|
|
43
|
-
- **Automatic pagination** - Handle offset, page number, or cursor-based pagination
|
|
44
|
-
- **Retry with backoff** - Exponential, linear, or constant backoff strategies
|
|
45
|
-
- **Rate limiting** - Respects API rate limits automatically
|
|
46
|
-
- **Circuit breaker** - Prevents cascading failures
|
|
47
|
-
- **Incremental sync** - Only fetch changes since last run
|
|
48
|
-
|
|
49
|
-
### Extensible Architecture
|
|
50
|
-
|
|
51
|
-
Reqon is built on [Vague](https://github.com/mcclowes/vague), a general-purpose expression DSL. This means you get powerful expression syntax for transformations and validations, while Reqon adds the execution semantics for data pipelines.
|
|
52
|
-
|
|
53
|
-
## Architecture
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
┌─────────────────────────────────────────────┐
|
|
57
|
-
│ Reqon │
|
|
58
|
-
│ ┌─────────────────────────────────────┐ │
|
|
59
|
-
│ │ Missions, Actions, Pipelines │ │
|
|
60
|
-
│ │ HTTP, Stores, Scheduling │ │
|
|
61
|
-
│ └─────────────────────────────────────┘ │
|
|
62
|
-
│ │ │
|
|
63
|
-
│ ┌─────────────────▼─────────────────┐ │
|
|
64
|
-
│ │ Vague │ │
|
|
65
|
-
│ │ Lexer, Parser, Expressions │ │
|
|
66
|
-
│ │ Match, Schema, Types │ │
|
|
67
|
-
│ └───────────────────────────────────┘ │
|
|
68
|
-
└─────────────────────────────────────────────┘
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
- **Vague** provides the DSL layer (lexer, parser, expression syntax)
|
|
72
|
-
- **Reqon** provides the runtime/framework with execution semantics
|
|
73
|
-
|
|
74
|
-
For expression syntax, pattern matching, and schema definitions, refer to the [Vague documentation](https://github.com/mcclowes/vague).
|
|
75
|
-
|
|
76
|
-
## Key Concepts
|
|
77
|
-
|
|
78
|
-
| Concept | Description |
|
|
79
|
-
|---------|-------------|
|
|
80
|
-
| **Mission** | A complete data pipeline with sources, stores, and actions |
|
|
81
|
-
| **Source** | An API endpoint with authentication configuration |
|
|
82
|
-
| **Store** | A storage backend (memory, file, SQL, NoSQL) |
|
|
83
|
-
| **Action** | A sequence of steps that process data |
|
|
84
|
-
| **Step** | A single operation (fetch, map, validate, store, etc.) |
|
|
85
|
-
|
|
86
|
-
## Next Steps
|
|
87
|
-
|
|
88
|
-
- [Getting Started](./getting-started) - Install Reqon and run your first mission
|
|
89
|
-
- [Core Concepts](./category/core-concepts) - Learn about missions, actions, and more
|
|
90
|
-
- [Examples](./examples) - See real-world examples
|
|
@@ -1,305 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 2
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Loading OpenAPI Specs
|
|
6
|
-
|
|
7
|
-
Reqon can load OpenAPI specifications from files or URLs.
|
|
8
|
-
|
|
9
|
-
## Local Files
|
|
10
|
-
|
|
11
|
-
### YAML Format
|
|
12
|
-
|
|
13
|
-
```vague
|
|
14
|
-
source API from "./openapi.yaml" {
|
|
15
|
-
auth: bearer
|
|
16
|
-
}
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
### JSON Format
|
|
20
|
-
|
|
21
|
-
```vague
|
|
22
|
-
source API from "./openapi.json" {
|
|
23
|
-
auth: bearer
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
### Relative Paths
|
|
28
|
-
|
|
29
|
-
```vague
|
|
30
|
-
// Relative to mission file
|
|
31
|
-
source API from "./specs/api.yaml"
|
|
32
|
-
|
|
33
|
-
// Absolute path
|
|
34
|
-
source API from "/home/user/specs/api.yaml"
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Remote URLs
|
|
38
|
-
|
|
39
|
-
### Public Specs
|
|
40
|
-
|
|
41
|
-
```vague
|
|
42
|
-
source Petstore from "https://petstore3.swagger.io/api/v3/openapi.json" {
|
|
43
|
-
auth: none
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Authenticated Specs
|
|
48
|
-
|
|
49
|
-
```vague
|
|
50
|
-
source PrivateAPI from "https://api.company.com/openapi.json" {
|
|
51
|
-
auth: bearer,
|
|
52
|
-
specAuth: {
|
|
53
|
-
type: "bearer",
|
|
54
|
-
token: env("SPEC_TOKEN")
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Spec Caching
|
|
60
|
-
|
|
61
|
-
Reqon caches resolved specs:
|
|
62
|
-
|
|
63
|
-
```vague
|
|
64
|
-
// First run: downloads and caches
|
|
65
|
-
source API from "https://api.example.com/openapi.json"
|
|
66
|
-
|
|
67
|
-
// Subsequent runs: uses cache
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Cache Location
|
|
71
|
-
|
|
72
|
-
```
|
|
73
|
-
.vague-data/
|
|
74
|
-
└── oas-cache/
|
|
75
|
-
└── api.example.com-openapi.json
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
### Force Refresh
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
# Clear cache
|
|
82
|
-
rm -rf .vague-data/oas-cache/
|
|
83
|
-
|
|
84
|
-
# Or use --no-cache flag
|
|
85
|
-
reqon mission.vague --no-oas-cache
|
|
86
|
-
```
|
|
87
|
-
|
|
88
|
-
## Spec Structure
|
|
89
|
-
|
|
90
|
-
### Minimum Required
|
|
91
|
-
|
|
92
|
-
```yaml
|
|
93
|
-
openapi: 3.0.0
|
|
94
|
-
info:
|
|
95
|
-
title: My API
|
|
96
|
-
version: 1.0.0
|
|
97
|
-
servers:
|
|
98
|
-
- url: https://api.example.com
|
|
99
|
-
paths:
|
|
100
|
-
/items:
|
|
101
|
-
get:
|
|
102
|
-
operationId: listItems
|
|
103
|
-
responses:
|
|
104
|
-
'200':
|
|
105
|
-
description: Success
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### Full Example
|
|
109
|
-
|
|
110
|
-
```yaml
|
|
111
|
-
openapi: 3.0.0
|
|
112
|
-
info:
|
|
113
|
-
title: E-commerce API
|
|
114
|
-
version: 2.0.0
|
|
115
|
-
description: API for managing products and orders
|
|
116
|
-
|
|
117
|
-
servers:
|
|
118
|
-
- url: https://api.example.com/v2
|
|
119
|
-
description: Production
|
|
120
|
-
- url: https://staging.api.example.com/v2
|
|
121
|
-
description: Staging
|
|
122
|
-
|
|
123
|
-
paths:
|
|
124
|
-
/products:
|
|
125
|
-
get:
|
|
126
|
-
operationId: listProducts
|
|
127
|
-
summary: List all products
|
|
128
|
-
parameters:
|
|
129
|
-
- name: limit
|
|
130
|
-
in: query
|
|
131
|
-
schema:
|
|
132
|
-
type: integer
|
|
133
|
-
default: 20
|
|
134
|
-
- name: offset
|
|
135
|
-
in: query
|
|
136
|
-
schema:
|
|
137
|
-
type: integer
|
|
138
|
-
default: 0
|
|
139
|
-
responses:
|
|
140
|
-
'200':
|
|
141
|
-
description: Product list
|
|
142
|
-
content:
|
|
143
|
-
application/json:
|
|
144
|
-
schema:
|
|
145
|
-
type: array
|
|
146
|
-
items:
|
|
147
|
-
$ref: '#/components/schemas/Product'
|
|
148
|
-
|
|
149
|
-
/products/{id}:
|
|
150
|
-
get:
|
|
151
|
-
operationId: getProduct
|
|
152
|
-
parameters:
|
|
153
|
-
- name: id
|
|
154
|
-
in: path
|
|
155
|
-
required: true
|
|
156
|
-
schema:
|
|
157
|
-
type: string
|
|
158
|
-
responses:
|
|
159
|
-
'200':
|
|
160
|
-
description: Product details
|
|
161
|
-
content:
|
|
162
|
-
application/json:
|
|
163
|
-
schema:
|
|
164
|
-
$ref: '#/components/schemas/Product'
|
|
165
|
-
|
|
166
|
-
components:
|
|
167
|
-
schemas:
|
|
168
|
-
Product:
|
|
169
|
-
type: object
|
|
170
|
-
properties:
|
|
171
|
-
id:
|
|
172
|
-
type: string
|
|
173
|
-
name:
|
|
174
|
-
type: string
|
|
175
|
-
price:
|
|
176
|
-
type: number
|
|
177
|
-
required:
|
|
178
|
-
- id
|
|
179
|
-
- name
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
## Server Selection
|
|
183
|
-
|
|
184
|
-
### Default Server
|
|
185
|
-
|
|
186
|
-
Uses first server in spec:
|
|
187
|
-
|
|
188
|
-
```yaml
|
|
189
|
-
servers:
|
|
190
|
-
- url: https://api.example.com # Used by default
|
|
191
|
-
- url: https://staging.example.com
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
### Override Base URL
|
|
195
|
-
|
|
196
|
-
```vague
|
|
197
|
-
source API from "./spec.yaml" {
|
|
198
|
-
auth: bearer,
|
|
199
|
-
base: "https://custom.example.com" # Overrides spec
|
|
200
|
-
}
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
### Environment-Based
|
|
204
|
-
|
|
205
|
-
```vague
|
|
206
|
-
source API from "./spec.yaml" {
|
|
207
|
-
auth: bearer,
|
|
208
|
-
base: env("API_BASE_URL")
|
|
209
|
-
}
|
|
210
|
-
```
|
|
211
|
-
|
|
212
|
-
## Reference Resolution
|
|
213
|
-
|
|
214
|
-
Reqon resolves `$ref` references:
|
|
215
|
-
|
|
216
|
-
```yaml
|
|
217
|
-
# References within same file
|
|
218
|
-
$ref: '#/components/schemas/Product'
|
|
219
|
-
|
|
220
|
-
# External file references
|
|
221
|
-
$ref: './schemas/product.yaml'
|
|
222
|
-
```
|
|
223
|
-
|
|
224
|
-
## Validation
|
|
225
|
-
|
|
226
|
-
### On Load
|
|
227
|
-
|
|
228
|
-
Reqon validates the spec structure:
|
|
229
|
-
|
|
230
|
-
```
|
|
231
|
-
[Reqon] Loading OpenAPI spec from ./api.yaml
|
|
232
|
-
[Reqon] Spec valid: 15 operations found
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### Invalid Specs
|
|
236
|
-
|
|
237
|
-
```
|
|
238
|
-
[Reqon] Error: Invalid OpenAPI spec
|
|
239
|
-
- Missing required field: info.version
|
|
240
|
-
- Invalid path: /items must start with /
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
## Multiple Specs
|
|
244
|
-
|
|
245
|
-
### Per-Source
|
|
246
|
-
|
|
247
|
-
```vague
|
|
248
|
-
mission MultiAPI {
|
|
249
|
-
source Products from "./products.yaml" { auth: bearer }
|
|
250
|
-
source Orders from "./orders.yaml" { auth: bearer }
|
|
251
|
-
source Users from "./users.yaml" { auth: oauth2 }
|
|
252
|
-
|
|
253
|
-
action SyncAll {
|
|
254
|
-
call Products.listProducts
|
|
255
|
-
call Orders.listOrders
|
|
256
|
-
call Users.listUsers
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
### Shared Components
|
|
262
|
-
|
|
263
|
-
If specs share schemas, use a single bundled spec:
|
|
264
|
-
|
|
265
|
-
```vague
|
|
266
|
-
source API from "./bundled-api.yaml" { auth: bearer }
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
## Troubleshooting
|
|
270
|
-
|
|
271
|
-
### "Spec not found"
|
|
272
|
-
|
|
273
|
-
Check file path:
|
|
274
|
-
|
|
275
|
-
```bash
|
|
276
|
-
ls -la ./openapi.yaml
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
### "Invalid spec"
|
|
280
|
-
|
|
281
|
-
Validate externally:
|
|
282
|
-
|
|
283
|
-
```bash
|
|
284
|
-
npx swagger-cli validate ./openapi.yaml
|
|
285
|
-
```
|
|
286
|
-
|
|
287
|
-
### "Operation not found"
|
|
288
|
-
|
|
289
|
-
Check operation ID matches exactly:
|
|
290
|
-
|
|
291
|
-
```yaml
|
|
292
|
-
paths:
|
|
293
|
-
/items:
|
|
294
|
-
get:
|
|
295
|
-
operationId: listItems # Must match call API.listItems
|
|
296
|
-
```
|
|
297
|
-
|
|
298
|
-
### Network Issues
|
|
299
|
-
|
|
300
|
-
For remote specs:
|
|
301
|
-
|
|
302
|
-
```bash
|
|
303
|
-
# Test connectivity
|
|
304
|
-
curl -I https://api.example.com/openapi.json
|
|
305
|
-
```
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 3
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Operation Calls
|
|
6
|
-
|
|
7
|
-
Call OpenAPI operations using the `call` syntax with operation IDs.
|
|
8
|
-
|
|
9
|
-
## Basic Syntax
|
|
10
|
-
|
|
11
|
-
```vague
|
|
12
|
-
call SourceName.operationId
|
|
13
|
-
call SourceName.operationId { options }
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Simple Calls
|
|
17
|
-
|
|
18
|
-
### GET Operations
|
|
19
|
-
|
|
20
|
-
```vague
|
|
21
|
-
// OpenAPI: GET /pets with operationId: listPets
|
|
22
|
-
call Petstore.listPets
|
|
23
|
-
|
|
24
|
-
// OpenAPI: GET /pets/{petId} with operationId: getPetById
|
|
25
|
-
call Petstore.getPetById { params: { petId: "123" } }
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### POST Operations
|
|
29
|
-
|
|
30
|
-
```vague
|
|
31
|
-
// OpenAPI: POST /pets with operationId: addPet
|
|
32
|
-
call Petstore.addPet {
|
|
33
|
-
body: {
|
|
34
|
-
name: "Fluffy",
|
|
35
|
-
tag: "cat"
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### PUT/PATCH Operations
|
|
41
|
-
|
|
42
|
-
```vague
|
|
43
|
-
// PUT - full replacement
|
|
44
|
-
call API.updateItem {
|
|
45
|
-
params: { id: "123" },
|
|
46
|
-
body: { name: "New Name", status: "active" }
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// PATCH - partial update
|
|
50
|
-
call API.patchItem {
|
|
51
|
-
params: { id: "123" },
|
|
52
|
-
body: { status: "inactive" }
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### DELETE Operations
|
|
57
|
-
|
|
58
|
-
```vague
|
|
59
|
-
call API.deleteItem {
|
|
60
|
-
params: { id: "123" }
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Parameters
|
|
65
|
-
|
|
66
|
-
### Path Parameters
|
|
67
|
-
|
|
68
|
-
For `/pets/{petId}`:
|
|
69
|
-
|
|
70
|
-
```vague
|
|
71
|
-
call Petstore.getPetById {
|
|
72
|
-
params: { petId: "123" }
|
|
73
|
-
}
|
|
74
|
-
// Generates: GET /pets/123
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Query Parameters
|
|
78
|
-
|
|
79
|
-
For `/pets?limit=10&status=available`:
|
|
80
|
-
|
|
81
|
-
```vague
|
|
82
|
-
call Petstore.listPets {
|
|
83
|
-
params: {
|
|
84
|
-
limit: 10,
|
|
85
|
-
status: "available"
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Combined Parameters
|
|
91
|
-
|
|
92
|
-
```vague
|
|
93
|
-
call API.listUserOrders {
|
|
94
|
-
params: {
|
|
95
|
-
userId: "123", // Path: /users/{userId}/orders
|
|
96
|
-
status: "pending", // Query: ?status=pending
|
|
97
|
-
limit: 50 // Query: ?limit=50
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// Generates: GET /users/123/orders?status=pending&limit=50
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Request Body
|
|
104
|
-
|
|
105
|
-
### Simple Body
|
|
106
|
-
|
|
107
|
-
```vague
|
|
108
|
-
call API.createItem {
|
|
109
|
-
body: {
|
|
110
|
-
name: "Test Item",
|
|
111
|
-
price: 29.99
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Dynamic Body
|
|
117
|
-
|
|
118
|
-
```vague
|
|
119
|
-
for item in items {
|
|
120
|
-
call API.createItem {
|
|
121
|
-
body: {
|
|
122
|
-
name: item.name,
|
|
123
|
-
price: item.price,
|
|
124
|
-
metadata: {
|
|
125
|
-
source: "sync",
|
|
126
|
-
timestamp: now()
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### From Variable
|
|
134
|
-
|
|
135
|
-
```vague
|
|
136
|
-
map data -> Payload {
|
|
137
|
-
name: .name,
|
|
138
|
-
status: "active"
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
call API.createItem { body: data }
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
## Headers
|
|
145
|
-
|
|
146
|
-
### Custom Headers
|
|
147
|
-
|
|
148
|
-
```vague
|
|
149
|
-
call API.listItems {
|
|
150
|
-
headers: {
|
|
151
|
-
"X-Request-ID": uuid(),
|
|
152
|
-
"Accept-Language": "en-US"
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### Tenant Headers
|
|
158
|
-
|
|
159
|
-
```vague
|
|
160
|
-
call Xero.listInvoices {
|
|
161
|
-
headers: {
|
|
162
|
-
"Xero-Tenant-Id": env("XERO_TENANT_ID")
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
## Pagination with Operations
|
|
168
|
-
|
|
169
|
-
```vague
|
|
170
|
-
call API.listItems {
|
|
171
|
-
params: { limit: 100 },
|
|
172
|
-
paginate: offset(offset, 100),
|
|
173
|
-
until: length(response.items) == 0
|
|
174
|
-
}
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
### Cursor Pagination
|
|
178
|
-
|
|
179
|
-
```vague
|
|
180
|
-
call API.listItems {
|
|
181
|
-
paginate: cursor(cursor, 100, "meta.nextCursor"),
|
|
182
|
-
until: response.meta.nextCursor == null
|
|
183
|
-
}
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
## Combining Options
|
|
187
|
-
|
|
188
|
-
```vague
|
|
189
|
-
call API.searchItems {
|
|
190
|
-
params: {
|
|
191
|
-
query: "test",
|
|
192
|
-
limit: 50
|
|
193
|
-
},
|
|
194
|
-
headers: {
|
|
195
|
-
"X-Custom": "value"
|
|
196
|
-
},
|
|
197
|
-
paginate: cursor(after, 50, "pageInfo.endCursor"),
|
|
198
|
-
until: response.pageInfo.hasNextPage == false,
|
|
199
|
-
retry: {
|
|
200
|
-
maxAttempts: 3,
|
|
201
|
-
backoff: exponential
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
## Response Handling
|
|
207
|
-
|
|
208
|
-
```vague
|
|
209
|
-
action FetchWithHandling {
|
|
210
|
-
call API.getItem { params: { id: itemId } }
|
|
211
|
-
|
|
212
|
-
match response {
|
|
213
|
-
{ data: item } -> store item -> items { key: .id },
|
|
214
|
-
{ error: e } -> abort e,
|
|
215
|
-
_ -> abort "Unexpected response"
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
## Operation Chaining
|
|
221
|
-
|
|
222
|
-
```vague
|
|
223
|
-
action CreateAndFetch {
|
|
224
|
-
// Create
|
|
225
|
-
call API.createItem {
|
|
226
|
-
body: { name: "New Item" }
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
// response.id from creation
|
|
230
|
-
call API.getItem {
|
|
231
|
-
params: { id: response.id }
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
store response -> items { key: .id }
|
|
235
|
-
}
|
|
236
|
-
```
|
|
237
|
-
|
|
238
|
-
## Error Handling
|
|
239
|
-
|
|
240
|
-
```vague
|
|
241
|
-
call API.riskyOperation { params: { id: "123" } }
|
|
242
|
-
|
|
243
|
-
match response {
|
|
244
|
-
{ code: 400 } -> abort "Invalid request",
|
|
245
|
-
{ code: 401 } -> jump RefreshToken then retry,
|
|
246
|
-
{ code: 404 } -> skip,
|
|
247
|
-
{ code: 429 } -> retry { delay: 60000 },
|
|
248
|
-
{ code: 500 } -> retry { maxAttempts: 3 },
|
|
249
|
-
_ -> continue
|
|
250
|
-
}
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
## Dynamic Operation Calls
|
|
254
|
-
|
|
255
|
-
### Based on Condition
|
|
256
|
-
|
|
257
|
-
```vague
|
|
258
|
-
action SmartSync {
|
|
259
|
-
call API.checkItem { params: { id: item.id } }
|
|
260
|
-
|
|
261
|
-
match response {
|
|
262
|
-
{ exists: false } -> {
|
|
263
|
-
call API.createItem { body: item }
|
|
264
|
-
},
|
|
265
|
-
{ exists: true, needsUpdate: true } -> {
|
|
266
|
-
call API.updateItem { params: { id: item.id }, body: item }
|
|
267
|
-
},
|
|
268
|
-
_ -> continue
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
## Best Practices
|
|
274
|
-
|
|
275
|
-
### Match Operation IDs
|
|
276
|
-
|
|
277
|
-
```yaml
|
|
278
|
-
# In OpenAPI spec
|
|
279
|
-
operationId: listUsers # camelCase recommended
|
|
280
|
-
```
|
|
281
|
-
|
|
282
|
-
```vague
|
|
283
|
-
call API.listUsers # Match exactly
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
### Use Descriptive Operations
|
|
287
|
-
|
|
288
|
-
```yaml
|
|
289
|
-
# Good
|
|
290
|
-
operationId: createInvoice
|
|
291
|
-
operationId: getInvoiceById
|
|
292
|
-
operationId: listInvoicesByCustomer
|
|
293
|
-
|
|
294
|
-
# Avoid
|
|
295
|
-
operationId: post1
|
|
296
|
-
operationId: get2
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
### Handle All Response Codes
|
|
300
|
-
|
|
301
|
-
```vague
|
|
302
|
-
call API.operation
|
|
303
|
-
|
|
304
|
-
match response {
|
|
305
|
-
{ code: 200 } -> continue,
|
|
306
|
-
{ code: 201 } -> continue,
|
|
307
|
-
{ code: 204 } -> continue,
|
|
308
|
-
{ code: 400 } -> abort "Bad request",
|
|
309
|
-
{ code: 401 } -> jump RefreshAuth then retry,
|
|
310
|
-
{ code: 404 } -> skip,
|
|
311
|
-
{ code: 500 } -> retry { maxAttempts: 3 },
|
|
312
|
-
_ -> abort "Unexpected response"
|
|
313
|
-
}
|
|
314
|
-
```
|