reqon-dsl 0.2.0 → 0.4.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 +45 -3
- package/dist/ast/nodes.d.ts +91 -4
- package/dist/ast/nodes.js +14 -0
- package/dist/auth/circuit-breaker.d.ts +11 -0
- package/dist/auth/circuit-breaker.js +90 -18
- package/dist/auth/credentials.d.ts +6 -1
- package/dist/auth/credentials.js +12 -4
- package/dist/auth/oauth2-provider.js +13 -3
- package/dist/auth/rate-limiter.d.ts +12 -1
- package/dist/auth/rate-limiter.js +39 -26
- package/dist/auth/token-store.js +8 -1
- package/dist/cli.d.ts +24 -1
- package/dist/cli.js +149 -10
- package/dist/config/constants.d.ts +152 -0
- package/dist/config/constants.js +139 -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 +105 -0
- package/dist/control/server.js +315 -0
- package/dist/control/types.d.ts +61 -0
- package/dist/control/types.js +7 -0
- package/dist/debug/cli-debugger.d.ts +17 -0
- package/dist/debug/cli-debugger.js +185 -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/execution/store.js +2 -2
- package/dist/execution-log/events.d.ts +125 -0
- package/dist/execution-log/events.js +17 -0
- package/dist/execution-log/fold.d.ts +38 -0
- package/dist/execution-log/fold.js +54 -0
- package/dist/execution-log/index.d.ts +18 -0
- package/dist/execution-log/index.js +6 -0
- package/dist/execution-log/postgres-store.d.ts +36 -0
- package/dist/execution-log/postgres-store.js +108 -0
- package/dist/execution-log/resume.d.ts +11 -0
- package/dist/execution-log/resume.js +5 -0
- package/dist/execution-log/sqlite-store.d.ts +16 -0
- package/dist/execution-log/sqlite-store.js +101 -0
- package/dist/execution-log/store.d.ts +72 -0
- package/dist/execution-log/store.js +182 -0
- package/dist/index.d.ts +23 -2
- package/dist/index.js +35 -3
- package/dist/interpreter/context.d.ts +29 -0
- package/dist/interpreter/context.js +18 -0
- package/dist/interpreter/evaluator.d.ts +63 -1
- package/dist/interpreter/evaluator.js +219 -42
- package/dist/interpreter/executor.d.ts +132 -14
- package/dist/interpreter/executor.js +883 -178
- package/dist/interpreter/fetch-handler.d.ts +48 -1
- package/dist/interpreter/fetch-handler.js +216 -38
- package/dist/interpreter/http.d.ts +34 -0
- package/dist/interpreter/http.js +203 -28
- package/dist/interpreter/index.d.ts +5 -3
- package/dist/interpreter/index.js +4 -2
- package/dist/interpreter/pagination.d.ts +12 -3
- package/dist/interpreter/pagination.js +102 -32
- 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 +16 -0
- package/dist/interpreter/step-handlers/for-handler.js +89 -7
- 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 +47 -17
- 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 +17 -1
- package/dist/interpreter/step-handlers/store-handler.js +61 -20
- 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 +7 -2
- package/dist/interpreter/step-handlers/webhook-handler.d.ts +4 -0
- package/dist/interpreter/step-handlers/webhook-handler.js +31 -5
- package/dist/interpreter/store-manager.d.ts +46 -0
- package/dist/interpreter/store-manager.js +70 -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/loader/index.js +5 -8
- package/dist/mcp/index.d.ts +11 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/sandbox.d.ts +41 -0
- package/dist/mcp/sandbox.js +76 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.js +504 -0
- package/dist/oas/index.d.ts +2 -0
- package/dist/oas/index.js +1 -0
- package/dist/oas/loader.d.ts +13 -1
- package/dist/oas/loader.js +25 -3
- package/dist/oas/mock-generator.d.ts +12 -0
- package/dist/oas/mock-generator.js +196 -0
- package/dist/oas/validator.js +45 -5
- package/dist/observability/events.d.ts +248 -0
- package/dist/observability/events.js +85 -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 +266 -0
- package/dist/observability/otel.d.ts +143 -0
- package/dist/observability/otel.js +421 -0
- package/dist/parser/action-parser.d.ts +105 -0
- package/dist/parser/action-parser.js +645 -0
- package/dist/parser/base.d.ts +7 -0
- package/dist/parser/base.js +11 -0
- package/dist/parser/expressions.d.ts +14 -0
- package/dist/parser/expressions.js +89 -6
- package/dist/parser/fetch-parser.d.ts +27 -0
- package/dist/parser/fetch-parser.js +280 -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 +15 -0
- package/dist/pause/index.js +12 -0
- package/dist/pause/log-store.d.ts +33 -0
- package/dist/pause/log-store.js +98 -0
- package/dist/pause/manager.d.ts +130 -0
- package/dist/pause/manager.js +294 -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 +158 -0
- package/dist/plugin.d.ts +9 -12
- package/dist/plugin.js +10 -13
- package/dist/scheduler/cron-parser.d.ts +10 -3
- package/dist/scheduler/cron-parser.js +227 -48
- package/dist/scheduler/scheduler.js +56 -22
- package/dist/stores/factory.d.ts +7 -1
- package/dist/stores/factory.js +14 -3
- package/dist/stores/file.d.ts +26 -0
- package/dist/stores/file.js +67 -21
- 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 +8 -6
- package/dist/stores/postgrest.d.ts +28 -0
- package/dist/stores/postgrest.js +84 -37
- package/dist/stores/types.d.ts +17 -0
- package/dist/stores/types.js +12 -0
- package/dist/sync/index.d.ts +3 -2
- package/dist/sync/index.js +2 -1
- package/dist/sync/log-store.d.ts +30 -0
- package/dist/sync/log-store.js +45 -0
- package/dist/sync/store.js +1 -1
- package/dist/trace/index.d.ts +18 -0
- package/dist/trace/index.js +13 -0
- package/dist/trace/log-view.d.ts +57 -0
- package/dist/trace/log-view.js +76 -0
- package/dist/trace/recorder.d.ts +75 -0
- package/dist/trace/recorder.js +157 -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 +75 -0
- package/dist/trace/store.js +250 -0
- package/dist/utils/deep-merge.d.ts +10 -0
- package/dist/utils/deep-merge.js +23 -0
- package/dist/utils/file.d.ts +13 -4
- package/dist/utils/file.js +70 -12
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.js +2 -1
- package/dist/utils/long-timeout.d.ts +19 -0
- package/dist/utils/long-timeout.js +33 -0
- package/dist/utils/path.d.ts +22 -1
- package/dist/utils/path.js +46 -1
- package/dist/utils/redact.d.ts +22 -0
- package/dist/utils/redact.js +42 -0
- package/dist/utils/type-guards.d.ts +58 -0
- package/dist/utils/type-guards.js +92 -0
- package/dist/webhook/server.d.ts +9 -0
- package/dist/webhook/server.js +122 -36
- package/dist/webhook/types.d.ts +9 -1
- package/package.json +76 -9
- 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,388 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 4
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Extending Reqon
|
|
6
|
-
|
|
7
|
-
Extend Reqon with custom functions, store adapters, and integrations.
|
|
8
|
-
|
|
9
|
-
## Custom Functions
|
|
10
|
-
|
|
11
|
-
Register custom functions for use in expressions:
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
import { registerFunction, execute } from 'reqon';
|
|
15
|
-
|
|
16
|
-
// Register a custom function
|
|
17
|
-
registerFunction('formatCurrency', (amount: number, currency: string) => {
|
|
18
|
-
return new Intl.NumberFormat('en-US', {
|
|
19
|
-
style: 'currency',
|
|
20
|
-
currency
|
|
21
|
-
}).format(amount);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
// Use in mission
|
|
25
|
-
await execute(`
|
|
26
|
-
mission Example {
|
|
27
|
-
action Format {
|
|
28
|
-
map order -> Formatted {
|
|
29
|
-
total: formatCurrency(.amount, "USD")
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
`);
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Function Types
|
|
37
|
-
|
|
38
|
-
```typescript
|
|
39
|
-
// Simple function
|
|
40
|
-
registerFunction('double', (x: number) => x * 2);
|
|
41
|
-
|
|
42
|
-
// Async function
|
|
43
|
-
registerFunction('fetchRate', async (currency: string) => {
|
|
44
|
-
const response = await fetch(`/rates/${currency}`);
|
|
45
|
-
return response.json();
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
// Variadic function
|
|
49
|
-
registerFunction('sum', (...args: number[]) => {
|
|
50
|
-
return args.reduce((a, b) => a + b, 0);
|
|
51
|
-
});
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Using Custom Functions
|
|
55
|
-
|
|
56
|
-
```vague
|
|
57
|
-
map order -> Output {
|
|
58
|
-
doubled: double(.quantity),
|
|
59
|
-
rate: fetchRate(.currency),
|
|
60
|
-
total: sum(.item1, .item2, .item3)
|
|
61
|
-
}
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
## Custom Store Adapters
|
|
65
|
-
|
|
66
|
-
See [Custom Adapters](../stores/custom-adapters) for full documentation.
|
|
67
|
-
|
|
68
|
-
```typescript
|
|
69
|
-
import { registerStoreAdapter, StoreAdapter } from 'reqon';
|
|
70
|
-
|
|
71
|
-
class MyStoreAdapter implements StoreAdapter {
|
|
72
|
-
async get(key: string) { /* ... */ }
|
|
73
|
-
async set(key: string, value: any) { /* ... */ }
|
|
74
|
-
async update(key: string, partial: any) { /* ... */ }
|
|
75
|
-
async delete(key: string) { /* ... */ }
|
|
76
|
-
async list(filter?: any) { /* ... */ }
|
|
77
|
-
async clear() { /* ... */ }
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
registerStoreAdapter('mystore', (name, config) => {
|
|
81
|
-
return new MyStoreAdapter(config);
|
|
82
|
-
});
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
## Custom Auth Providers
|
|
86
|
-
|
|
87
|
-
```typescript
|
|
88
|
-
import { registerAuthProvider, AuthProvider } from 'reqon';
|
|
89
|
-
|
|
90
|
-
class MyAuthProvider implements AuthProvider {
|
|
91
|
-
async getToken(): Promise<string> {
|
|
92
|
-
// Custom token acquisition logic
|
|
93
|
-
return 'my-token';
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async refreshToken(): Promise<string> {
|
|
97
|
-
// Custom refresh logic
|
|
98
|
-
return 'new-token';
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
async getHeaders(): Promise<Record<string, string>> {
|
|
102
|
-
const token = await this.getToken();
|
|
103
|
-
return {
|
|
104
|
-
'Authorization': `Bearer ${token}`,
|
|
105
|
-
'X-Custom-Auth': 'value'
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
registerAuthProvider('myauth', (config) => {
|
|
111
|
-
return new MyAuthProvider(config);
|
|
112
|
-
});
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
Usage:
|
|
116
|
-
|
|
117
|
-
```vague
|
|
118
|
-
source API {
|
|
119
|
-
auth: myauth,
|
|
120
|
-
base: "https://api.example.com"
|
|
121
|
-
}
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## Custom Step Handlers
|
|
125
|
-
|
|
126
|
-
Add custom step types:
|
|
127
|
-
|
|
128
|
-
```typescript
|
|
129
|
-
import { registerStepHandler, ExecutionContext } from 'reqon';
|
|
130
|
-
|
|
131
|
-
registerStepHandler('notify', async (step, ctx: ExecutionContext) => {
|
|
132
|
-
const { channel, message } = step.options;
|
|
133
|
-
|
|
134
|
-
await sendNotification(channel, message);
|
|
135
|
-
|
|
136
|
-
return { success: true };
|
|
137
|
-
});
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
Usage:
|
|
141
|
-
|
|
142
|
-
```vague
|
|
143
|
-
action WithNotification {
|
|
144
|
-
get "/data"
|
|
145
|
-
store response -> data { key: .id }
|
|
146
|
-
|
|
147
|
-
notify {
|
|
148
|
-
channel: "slack",
|
|
149
|
-
message: concat("Synced ", length(response), " items")
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## Plugins
|
|
155
|
-
|
|
156
|
-
### Creating a Plugin
|
|
157
|
-
|
|
158
|
-
```typescript
|
|
159
|
-
import { Plugin, Reqon } from 'reqon';
|
|
160
|
-
|
|
161
|
-
const myPlugin: Plugin = {
|
|
162
|
-
name: 'my-plugin',
|
|
163
|
-
version: '1.0.0',
|
|
164
|
-
|
|
165
|
-
install(reqon: Reqon) {
|
|
166
|
-
// Register functions
|
|
167
|
-
reqon.registerFunction('myFunc', () => {});
|
|
168
|
-
|
|
169
|
-
// Register store adapters
|
|
170
|
-
reqon.registerStoreAdapter('mystore', () => {});
|
|
171
|
-
|
|
172
|
-
// Add hooks
|
|
173
|
-
reqon.hooks.beforeExecute.tap('my-plugin', (mission) => {
|
|
174
|
-
console.log(`Starting: ${mission.name}`);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
reqon.hooks.afterExecute.tap('my-plugin', (result) => {
|
|
178
|
-
console.log(`Completed: ${result.duration}ms`);
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
|
|
183
|
-
export default myPlugin;
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### Using a Plugin
|
|
187
|
-
|
|
188
|
-
```typescript
|
|
189
|
-
import { Reqon } from 'reqon';
|
|
190
|
-
import myPlugin from './my-plugin';
|
|
191
|
-
|
|
192
|
-
const reqon = new Reqon();
|
|
193
|
-
reqon.use(myPlugin);
|
|
194
|
-
|
|
195
|
-
await reqon.execute(source);
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
## Execution Hooks
|
|
199
|
-
|
|
200
|
-
### Available Hooks
|
|
201
|
-
|
|
202
|
-
```typescript
|
|
203
|
-
reqon.hooks.beforeParse.tap('plugin', (source) => {
|
|
204
|
-
// Before parsing mission source
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
reqon.hooks.afterParse.tap('plugin', (ast) => {
|
|
208
|
-
// After parsing, before execution
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
reqon.hooks.beforeExecute.tap('plugin', (mission) => {
|
|
212
|
-
// Before mission starts
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
reqon.hooks.afterExecute.tap('plugin', (result) => {
|
|
216
|
-
// After mission completes
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
reqon.hooks.beforeAction.tap('plugin', (action) => {
|
|
220
|
-
// Before each action
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
reqon.hooks.afterAction.tap('plugin', (action, result) => {
|
|
224
|
-
// After each action
|
|
225
|
-
});
|
|
226
|
-
|
|
227
|
-
reqon.hooks.beforeStep.tap('plugin', (step) => {
|
|
228
|
-
// Before each step
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
reqon.hooks.afterStep.tap('plugin', (step, result) => {
|
|
232
|
-
// After each step
|
|
233
|
-
});
|
|
234
|
-
|
|
235
|
-
reqon.hooks.onError.tap('plugin', (error, context) => {
|
|
236
|
-
// On any error
|
|
237
|
-
});
|
|
238
|
-
```
|
|
239
|
-
|
|
240
|
-
### Hook Examples
|
|
241
|
-
|
|
242
|
-
```typescript
|
|
243
|
-
// Logging hook
|
|
244
|
-
reqon.hooks.beforeAction.tap('logger', (action) => {
|
|
245
|
-
console.log(`[${new Date().toISOString()}] Starting: ${action.name}`);
|
|
246
|
-
});
|
|
247
|
-
|
|
248
|
-
// Metrics hook
|
|
249
|
-
reqon.hooks.afterAction.tap('metrics', (action, result) => {
|
|
250
|
-
metrics.record('action_duration', {
|
|
251
|
-
action: action.name,
|
|
252
|
-
duration: result.duration,
|
|
253
|
-
success: result.success
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
|
|
257
|
-
// Error notification hook
|
|
258
|
-
reqon.hooks.onError.tap('notify', (error, context) => {
|
|
259
|
-
sendSlackMessage(`Error in ${context.mission}: ${error.message}`);
|
|
260
|
-
});
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
## Custom Pagination Strategies
|
|
264
|
-
|
|
265
|
-
```typescript
|
|
266
|
-
import { registerPaginationStrategy, PaginationStrategy } from 'reqon';
|
|
267
|
-
|
|
268
|
-
class LinkHeaderPagination implements PaginationStrategy {
|
|
269
|
-
private nextUrl: string | null = null;
|
|
270
|
-
|
|
271
|
-
getInitialParams(): Record<string, any> {
|
|
272
|
-
return {};
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
hasMore(): boolean {
|
|
276
|
-
return this.nextUrl !== null;
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
getNextParams(): Record<string, any> {
|
|
280
|
-
// Parse from nextUrl
|
|
281
|
-
return { url: this.nextUrl };
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
updateFromResponse(response: any, headers: Headers): void {
|
|
285
|
-
const linkHeader = headers.get('Link');
|
|
286
|
-
this.nextUrl = parseLinkHeader(linkHeader).next;
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
registerPaginationStrategy('link', () => new LinkHeaderPagination());
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
Usage:
|
|
294
|
-
|
|
295
|
-
```vague
|
|
296
|
-
get "/items" {
|
|
297
|
-
paginate: link(),
|
|
298
|
-
until: !hasMore
|
|
299
|
-
}
|
|
300
|
-
```
|
|
301
|
-
|
|
302
|
-
## Programmatic API
|
|
303
|
-
|
|
304
|
-
### Full Control
|
|
305
|
-
|
|
306
|
-
```typescript
|
|
307
|
-
import { Reqon, parse, createContext } from 'reqon';
|
|
308
|
-
|
|
309
|
-
// Parse source
|
|
310
|
-
const ast = parse(source);
|
|
311
|
-
|
|
312
|
-
// Create execution context
|
|
313
|
-
const ctx = createContext({
|
|
314
|
-
stores: new Map(),
|
|
315
|
-
sources: new Map(),
|
|
316
|
-
variables: new Map()
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
// Execute with custom options
|
|
320
|
-
const reqon = new Reqon();
|
|
321
|
-
const result = await reqon.executeMission(ast.missions[0], ctx, {
|
|
322
|
-
dryRun: false,
|
|
323
|
-
progressCallbacks: {
|
|
324
|
-
onProgress: (p) => updateUI(p)
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
```
|
|
328
|
-
|
|
329
|
-
### AST Manipulation
|
|
330
|
-
|
|
331
|
-
```typescript
|
|
332
|
-
import { parse, transform } from 'reqon';
|
|
333
|
-
|
|
334
|
-
const ast = parse(source);
|
|
335
|
-
|
|
336
|
-
// Transform AST
|
|
337
|
-
const transformed = transform(ast, {
|
|
338
|
-
visitFetchStep(node) {
|
|
339
|
-
// Add retry to all fetches
|
|
340
|
-
return {
|
|
341
|
-
...node,
|
|
342
|
-
options: {
|
|
343
|
-
...node.options,
|
|
344
|
-
retry: { maxAttempts: 3 }
|
|
345
|
-
}
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
## Best Practices
|
|
352
|
-
|
|
353
|
-
### Namespace Functions
|
|
354
|
-
|
|
355
|
-
```typescript
|
|
356
|
-
// Good: namespaced
|
|
357
|
-
registerFunction('myPlugin_formatDate', () => {});
|
|
358
|
-
|
|
359
|
-
// Avoid: may conflict
|
|
360
|
-
registerFunction('format', () => {});
|
|
361
|
-
```
|
|
362
|
-
|
|
363
|
-
### Document Extensions
|
|
364
|
-
|
|
365
|
-
```typescript
|
|
366
|
-
/**
|
|
367
|
-
* Formats a phone number to E.164 format
|
|
368
|
-
* @param phone - Raw phone number
|
|
369
|
-
* @param country - ISO country code
|
|
370
|
-
* @returns Formatted phone number
|
|
371
|
-
* @example formatPhone("555-1234", "US") => "+15551234"
|
|
372
|
-
*/
|
|
373
|
-
registerFunction('formatPhone', (phone, country) => {});
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
### Test Thoroughly
|
|
377
|
-
|
|
378
|
-
```typescript
|
|
379
|
-
describe('formatPhone', () => {
|
|
380
|
-
it('formats US numbers', () => {
|
|
381
|
-
expect(formatPhone('555-1234', 'US')).toBe('+15551234');
|
|
382
|
-
});
|
|
383
|
-
|
|
384
|
-
it('handles international numbers', () => {
|
|
385
|
-
expect(formatPhone('7911 123456', 'GB')).toBe('+447911123456');
|
|
386
|
-
});
|
|
387
|
-
});
|
|
388
|
-
```
|
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 1
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Multi-File Missions
|
|
6
|
-
|
|
7
|
-
For complex missions, organize your code across multiple files in a folder structure.
|
|
8
|
-
|
|
9
|
-
## Folder Structure
|
|
10
|
-
|
|
11
|
-
```
|
|
12
|
-
missions/
|
|
13
|
-
└── customer-sync/
|
|
14
|
-
├── mission.vague # Main mission definition
|
|
15
|
-
├── actions/
|
|
16
|
-
│ ├── fetch.vague # Fetch actions
|
|
17
|
-
│ ├── transform.vague
|
|
18
|
-
│ └── export.vague
|
|
19
|
-
└── schemas/
|
|
20
|
-
└── customer.vague
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Main Mission File
|
|
24
|
-
|
|
25
|
-
The `mission.vague` file defines the mission structure:
|
|
26
|
-
|
|
27
|
-
```vague
|
|
28
|
-
// mission.vague
|
|
29
|
-
mission CustomerSync {
|
|
30
|
-
source API {
|
|
31
|
-
auth: oauth2,
|
|
32
|
-
base: "https://api.example.com"
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
store rawCustomers: memory("raw")
|
|
36
|
-
store customers: file("customers")
|
|
37
|
-
store errors: file("errors")
|
|
38
|
-
|
|
39
|
-
// Actions are loaded from actions/*.vague
|
|
40
|
-
// Schemas are loaded from schemas/*.vague
|
|
41
|
-
|
|
42
|
-
run FetchCustomers then TransformCustomers then ExportCustomers
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Action Files
|
|
47
|
-
|
|
48
|
-
### actions/fetch.vague
|
|
49
|
-
|
|
50
|
-
```vague
|
|
51
|
-
action FetchCustomers {
|
|
52
|
-
get "/customers" {
|
|
53
|
-
paginate: offset(offset, 100),
|
|
54
|
-
until: length(response.data) == 0,
|
|
55
|
-
since: lastSync
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
store response.data -> rawCustomers { key: .id }
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### actions/transform.vague
|
|
63
|
-
|
|
64
|
-
```vague
|
|
65
|
-
action TransformCustomers {
|
|
66
|
-
for customer in rawCustomers {
|
|
67
|
-
validate customer {
|
|
68
|
-
assume .id is string,
|
|
69
|
-
assume .email is string
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
map customer -> StandardCustomer {
|
|
73
|
-
id: .id,
|
|
74
|
-
name: concat(.firstName, " ", .lastName),
|
|
75
|
-
email: lowercase(.email),
|
|
76
|
-
createdAt: parseDate(.created_at)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
store customer -> customers { key: .id, upsert: true }
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
### actions/export.vague
|
|
85
|
-
|
|
86
|
-
```vague
|
|
87
|
-
action ExportCustomers {
|
|
88
|
-
for customer in customers where .updatedAt > lastExport {
|
|
89
|
-
post ExportAPI "/customers" {
|
|
90
|
-
body: customer
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
match response {
|
|
94
|
-
{ error: e } -> queue errors { item: { id: customer.id, error: e } },
|
|
95
|
-
_ -> continue
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## Schema Files
|
|
102
|
-
|
|
103
|
-
### schemas/customer.vague
|
|
104
|
-
|
|
105
|
-
```vague
|
|
106
|
-
schema RawCustomer {
|
|
107
|
-
id: string,
|
|
108
|
-
firstName: string,
|
|
109
|
-
lastName: string,
|
|
110
|
-
email: string,
|
|
111
|
-
created_at: string
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
schema StandardCustomer {
|
|
115
|
-
id: string,
|
|
116
|
-
name: string,
|
|
117
|
-
email: string,
|
|
118
|
-
createdAt: date
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
schema ExportError {
|
|
122
|
-
id: string,
|
|
123
|
-
error: string,
|
|
124
|
-
timestamp: date
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
## Running Multi-File Missions
|
|
129
|
-
|
|
130
|
-
### Run the Folder
|
|
131
|
-
|
|
132
|
-
```bash
|
|
133
|
-
reqon ./missions/customer-sync/
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
### Run with Options
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
reqon ./missions/customer-sync/ --auth ./credentials.json --verbose
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
## File Loading Order
|
|
143
|
-
|
|
144
|
-
1. `mission.vague` (required)
|
|
145
|
-
2. `schemas/*.vague` (loaded first)
|
|
146
|
-
3. `actions/*.vague` (loaded after schemas)
|
|
147
|
-
|
|
148
|
-
## Benefits
|
|
149
|
-
|
|
150
|
-
### Organization
|
|
151
|
-
|
|
152
|
-
| Single File | Multi-File |
|
|
153
|
-
|-------------|------------|
|
|
154
|
-
| All code in one file | Logical separation |
|
|
155
|
-
| Hard to navigate | Easy to find code |
|
|
156
|
-
| Merge conflicts | Independent editing |
|
|
157
|
-
|
|
158
|
-
### Maintainability
|
|
159
|
-
|
|
160
|
-
- Each file has single responsibility
|
|
161
|
-
- Easier code reviews
|
|
162
|
-
- Better version control
|
|
163
|
-
|
|
164
|
-
### Reusability
|
|
165
|
-
|
|
166
|
-
```
|
|
167
|
-
missions/
|
|
168
|
-
├── shared/
|
|
169
|
-
│ └── schemas/
|
|
170
|
-
│ └── common.vague
|
|
171
|
-
├── customer-sync/
|
|
172
|
-
│ └── mission.vague (imports shared)
|
|
173
|
-
└── order-sync/
|
|
174
|
-
└── mission.vague (imports shared)
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
## Best Practices
|
|
178
|
-
|
|
179
|
-
### Naming Conventions
|
|
180
|
-
|
|
181
|
-
```
|
|
182
|
-
actions/
|
|
183
|
-
├── fetch-customers.vague # Verb-noun
|
|
184
|
-
├── transform-customers.vague
|
|
185
|
-
└── export-customers.vague
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### One Action Per File
|
|
189
|
-
|
|
190
|
-
```vague
|
|
191
|
-
// actions/fetch-customers.vague
|
|
192
|
-
action FetchCustomers {
|
|
193
|
-
// Single responsibility
|
|
194
|
-
}
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
### Group Related Schemas
|
|
198
|
-
|
|
199
|
-
```vague
|
|
200
|
-
// schemas/customer.vague
|
|
201
|
-
schema RawCustomer { ... }
|
|
202
|
-
schema StandardCustomer { ... }
|
|
203
|
-
schema CustomerError { ... }
|
|
204
|
-
```
|
|
205
|
-
|
|
206
|
-
### Document with Comments
|
|
207
|
-
|
|
208
|
-
```vague
|
|
209
|
-
// actions/fetch-customers.vague
|
|
210
|
-
|
|
211
|
-
// FetchCustomers retrieves customer data from the API
|
|
212
|
-
// Uses pagination and incremental sync for efficiency
|
|
213
|
-
action FetchCustomers {
|
|
214
|
-
// Fetch with pagination
|
|
215
|
-
get "/customers" {
|
|
216
|
-
paginate: offset(offset, 100),
|
|
217
|
-
until: length(response.data) == 0,
|
|
218
|
-
since: lastSync
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
// Store raw data for processing
|
|
222
|
-
store response.data -> rawCustomers { key: .id }
|
|
223
|
-
}
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
## Troubleshooting
|
|
227
|
-
|
|
228
|
-
### "Mission not found"
|
|
229
|
-
|
|
230
|
-
Ensure `mission.vague` exists in the folder:
|
|
231
|
-
|
|
232
|
-
```bash
|
|
233
|
-
ls ./missions/customer-sync/mission.vague
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
### "Action not found"
|
|
237
|
-
|
|
238
|
-
Check action file is in `actions/` folder:
|
|
239
|
-
|
|
240
|
-
```bash
|
|
241
|
-
ls ./missions/customer-sync/actions/
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### "Schema not found"
|
|
245
|
-
|
|
246
|
-
Check schema file is in `schemas/` folder:
|
|
247
|
-
|
|
248
|
-
```bash
|
|
249
|
-
ls ./missions/customer-sync/schemas/
|
|
250
|
-
```
|