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
|
@@ -5,10 +5,23 @@ export interface IsExpression {
|
|
|
5
5
|
operand: Expression;
|
|
6
6
|
typeCheck: string;
|
|
7
7
|
}
|
|
8
|
+
export interface ObjectLiteralExpression {
|
|
9
|
+
type: 'ObjectLiteral';
|
|
10
|
+
properties: ObjectProperty[];
|
|
11
|
+
}
|
|
12
|
+
export interface ObjectProperty {
|
|
13
|
+
key: string;
|
|
14
|
+
value: Expression;
|
|
15
|
+
}
|
|
8
16
|
export declare class ReqonExpressionParser extends ReqonParserBase {
|
|
17
|
+
private expressionDepth;
|
|
9
18
|
parseExpression(): Expression;
|
|
10
19
|
parseLogicalExpression(): Expression;
|
|
11
20
|
private parseTernary;
|
|
21
|
+
private parseTernaryBranch;
|
|
22
|
+
private parseTernaryBranchOr;
|
|
23
|
+
private parseTernaryBranchAnd;
|
|
24
|
+
private parseTernaryBranchNot;
|
|
12
25
|
private parseOr;
|
|
13
26
|
private parseAnd;
|
|
14
27
|
private parseNot;
|
|
@@ -23,5 +36,6 @@ export declare class ReqonExpressionParser extends ReqonParserBase {
|
|
|
23
36
|
parsePrimary(): Expression;
|
|
24
37
|
private parseMatchExpression;
|
|
25
38
|
private parseOrderedSequence;
|
|
39
|
+
private parseObjectLiteral;
|
|
26
40
|
parseQualifiedName(): QualifiedName;
|
|
27
41
|
}
|
|
@@ -1,9 +1,22 @@
|
|
|
1
1
|
import { TokenType } from 'vague-lang';
|
|
2
2
|
import { ReqonTokenType } from '../lexer/tokens.js';
|
|
3
3
|
import { ReqonParserBase } from './base.js';
|
|
4
|
+
// Guards unbounded recursive descent from blowing the JS stack on deeply nested
|
|
5
|
+
// input, surfacing a structured ParseError instead of a raw V8 RangeError.
|
|
6
|
+
const MAX_EXPRESSION_DEPTH = 200;
|
|
4
7
|
export class ReqonExpressionParser extends ReqonParserBase {
|
|
8
|
+
expressionDepth = 0;
|
|
5
9
|
parseExpression() {
|
|
6
|
-
|
|
10
|
+
if (++this.expressionDepth > MAX_EXPRESSION_DEPTH) {
|
|
11
|
+
this.expressionDepth--;
|
|
12
|
+
throw this.error('Expression nesting too deep (maximum depth 200 exceeded)');
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
return this.parseTernary();
|
|
16
|
+
}
|
|
17
|
+
finally {
|
|
18
|
+
this.expressionDepth--;
|
|
19
|
+
}
|
|
7
20
|
}
|
|
8
21
|
parseLogicalExpression() {
|
|
9
22
|
return this.parseOr();
|
|
@@ -11,9 +24,9 @@ export class ReqonExpressionParser extends ReqonParserBase {
|
|
|
11
24
|
parseTernary() {
|
|
12
25
|
const condition = this.parseOr();
|
|
13
26
|
if (this.match(TokenType.QUESTION)) {
|
|
14
|
-
const consequent = this.
|
|
27
|
+
const consequent = this.parseTernaryBranch();
|
|
15
28
|
this.consume(TokenType.COLON, "Expected ':' in ternary expression");
|
|
16
|
-
const alternate = this.
|
|
29
|
+
const alternate = this.parseTernaryBranch();
|
|
17
30
|
return {
|
|
18
31
|
type: 'TernaryExpression',
|
|
19
32
|
condition,
|
|
@@ -23,6 +36,46 @@ export class ReqonExpressionParser extends ReqonParserBase {
|
|
|
23
36
|
}
|
|
24
37
|
return condition;
|
|
25
38
|
}
|
|
39
|
+
// Parse a ternary branch - allows nested ternaries but skips superposition
|
|
40
|
+
parseTernaryBranch() {
|
|
41
|
+
const expr = this.parseTernaryBranchOr();
|
|
42
|
+
if (this.match(TokenType.QUESTION)) {
|
|
43
|
+
const consequent = this.parseTernaryBranch();
|
|
44
|
+
this.consume(TokenType.COLON, "Expected ':' in ternary expression");
|
|
45
|
+
const alternate = this.parseTernaryBranch();
|
|
46
|
+
return {
|
|
47
|
+
type: 'TernaryExpression',
|
|
48
|
+
condition: expr,
|
|
49
|
+
consequent,
|
|
50
|
+
alternate,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return expr;
|
|
54
|
+
}
|
|
55
|
+
parseTernaryBranchOr() {
|
|
56
|
+
let left = this.parseTernaryBranchAnd();
|
|
57
|
+
while (this.match(TokenType.OR)) {
|
|
58
|
+
const right = this.parseTernaryBranchAnd();
|
|
59
|
+
left = { type: 'LogicalExpression', operator: 'or', left, right };
|
|
60
|
+
}
|
|
61
|
+
return left;
|
|
62
|
+
}
|
|
63
|
+
parseTernaryBranchAnd() {
|
|
64
|
+
let left = this.parseTernaryBranchNot();
|
|
65
|
+
while (this.match(TokenType.AND)) {
|
|
66
|
+
const right = this.parseTernaryBranchNot();
|
|
67
|
+
left = { type: 'LogicalExpression', operator: 'and', left, right };
|
|
68
|
+
}
|
|
69
|
+
return left;
|
|
70
|
+
}
|
|
71
|
+
parseTernaryBranchNot() {
|
|
72
|
+
if (this.match(TokenType.NOT)) {
|
|
73
|
+
const operand = this.parseTernaryBranchNot();
|
|
74
|
+
return { type: 'NotExpression', operand };
|
|
75
|
+
}
|
|
76
|
+
// Skip superposition, go directly to comparison
|
|
77
|
+
return this.parseComparison();
|
|
78
|
+
}
|
|
26
79
|
parseOr() {
|
|
27
80
|
let left = this.parseAnd();
|
|
28
81
|
while (this.match(TokenType.OR)) {
|
|
@@ -78,7 +131,7 @@ export class ReqonExpressionParser extends ReqonParserBase {
|
|
|
78
131
|
// Check for 'is' type checking: expr is array, expr is string, etc.
|
|
79
132
|
if (this.check(ReqonTokenType.IS)) {
|
|
80
133
|
this.advance(); // consume 'is'
|
|
81
|
-
const typeCheck = this.
|
|
134
|
+
const typeCheck = this.consumeName("Expected type name after 'is'").value;
|
|
82
135
|
return { type: 'IsExpression', operand: left, typeCheck };
|
|
83
136
|
}
|
|
84
137
|
return left;
|
|
@@ -140,7 +193,7 @@ export class ReqonExpressionParser extends ReqonParserBase {
|
|
|
140
193
|
}
|
|
141
194
|
}
|
|
142
195
|
else if (this.match(TokenType.DOT)) {
|
|
143
|
-
const name = this.
|
|
196
|
+
const name = this.consumeName('Expected property name').value;
|
|
144
197
|
if (expr.type === 'Identifier') {
|
|
145
198
|
expr = { type: 'QualifiedName', parts: [expr.name, name] };
|
|
146
199
|
}
|
|
@@ -200,6 +253,10 @@ export class ReqonExpressionParser extends ReqonParserBase {
|
|
|
200
253
|
if (this.match(TokenType.FALSE)) {
|
|
201
254
|
return { type: 'Literal', value: false, dataType: 'boolean' };
|
|
202
255
|
}
|
|
256
|
+
// Object literal: { key: value, ... }
|
|
257
|
+
if (this.match(TokenType.LBRACE)) {
|
|
258
|
+
return this.parseObjectLiteral();
|
|
259
|
+
}
|
|
203
260
|
// Identifier (including HTTP method tokens that can be used as identifiers)
|
|
204
261
|
if (this.checkIdentifier()) {
|
|
205
262
|
const name = this.advance().value;
|
|
@@ -207,7 +264,7 @@ export class ReqonExpressionParser extends ReqonParserBase {
|
|
|
207
264
|
}
|
|
208
265
|
// .field shorthand
|
|
209
266
|
if (this.match(TokenType.DOT)) {
|
|
210
|
-
const name = this.
|
|
267
|
+
const name = this.consumeName("Expected field name after '.'").value;
|
|
211
268
|
return { type: 'Identifier', name };
|
|
212
269
|
}
|
|
213
270
|
throw this.error(`Unexpected token: ${this.peek().value}`);
|
|
@@ -237,6 +294,32 @@ export class ReqonExpressionParser extends ReqonParserBase {
|
|
|
237
294
|
this.consume(TokenType.RBRACKET, "Expected ']'");
|
|
238
295
|
return { type: 'OrderedSequenceType', elements };
|
|
239
296
|
}
|
|
297
|
+
parseObjectLiteral() {
|
|
298
|
+
const properties = [];
|
|
299
|
+
// Handle empty object {}
|
|
300
|
+
if (this.check(TokenType.RBRACE)) {
|
|
301
|
+
this.advance();
|
|
302
|
+
return { type: 'ObjectLiteral', properties };
|
|
303
|
+
}
|
|
304
|
+
do {
|
|
305
|
+
// Key can be an identifier or a string
|
|
306
|
+
let key;
|
|
307
|
+
if (this.check(TokenType.STRING)) {
|
|
308
|
+
key = this.advance().value;
|
|
309
|
+
}
|
|
310
|
+
else if (this.checkIdentifier()) {
|
|
311
|
+
key = this.advance().value;
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
throw this.error('Expected property key (identifier or string)');
|
|
315
|
+
}
|
|
316
|
+
this.consume(TokenType.COLON, "Expected ':' after property key");
|
|
317
|
+
const value = this.parseExpression();
|
|
318
|
+
properties.push({ key, value });
|
|
319
|
+
} while (this.match(TokenType.COMMA) && !this.check(TokenType.RBRACE));
|
|
320
|
+
this.consume(TokenType.RBRACE, "Expected '}'");
|
|
321
|
+
return { type: 'ObjectLiteral', properties };
|
|
322
|
+
}
|
|
240
323
|
parseQualifiedName() {
|
|
241
324
|
const parts = [];
|
|
242
325
|
parts.push(this.consume(TokenType.IDENTIFIER, 'Expected identifier').value);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { FetchStep, PaginationConfig, RetryConfig, SinceConfig } from '../ast/nodes.js';
|
|
2
|
+
import { ScheduleParser } from './schedule-parser.js';
|
|
3
|
+
export declare class FetchParser extends ScheduleParser {
|
|
4
|
+
/**
|
|
5
|
+
* Check if current token is an HTTP method keyword
|
|
6
|
+
*/
|
|
7
|
+
protected checkHttpMethod(): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Parse HTTP method syntax: get "/path" { options }
|
|
10
|
+
*/
|
|
11
|
+
protected parseHttpMethodStep(): FetchStep;
|
|
12
|
+
/**
|
|
13
|
+
* Parse OAS-style call: call Source.operationId { options }
|
|
14
|
+
*/
|
|
15
|
+
protected parseCallStep(): FetchStep;
|
|
16
|
+
/**
|
|
17
|
+
* Parse fetch options block (shared between HTTP methods and call)
|
|
18
|
+
*/
|
|
19
|
+
protected parseFetchOptions(): Partial<FetchStep>;
|
|
20
|
+
/**
|
|
21
|
+
* Parse a fetch option key, handling keyword tokens that can appear as keys
|
|
22
|
+
*/
|
|
23
|
+
private parseFetchOptionKey;
|
|
24
|
+
protected parseSinceConfig(): SinceConfig;
|
|
25
|
+
protected parsePaginationConfig(): PaginationConfig;
|
|
26
|
+
protected parseRetryConfig(): RetryConfig;
|
|
27
|
+
}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fetch step parsing
|
|
3
|
+
* Handles parsing of HTTP fetch steps (get, post, put, patch, delete, call).
|
|
4
|
+
*/
|
|
5
|
+
import { TokenType } from 'vague-lang';
|
|
6
|
+
import { ReqonTokenType } from '../lexer/tokens.js';
|
|
7
|
+
import { ScheduleParser } from './schedule-parser.js';
|
|
8
|
+
export class FetchParser extends ScheduleParser {
|
|
9
|
+
/**
|
|
10
|
+
* Check if current token is an HTTP method keyword
|
|
11
|
+
*/
|
|
12
|
+
checkHttpMethod() {
|
|
13
|
+
const t = this.peek().type;
|
|
14
|
+
return (t === ReqonTokenType.GET ||
|
|
15
|
+
t === ReqonTokenType.POST ||
|
|
16
|
+
t === ReqonTokenType.PUT ||
|
|
17
|
+
t === ReqonTokenType.PATCH ||
|
|
18
|
+
t === ReqonTokenType.DELETE);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse HTTP method syntax: get "/path" { options }
|
|
22
|
+
*/
|
|
23
|
+
parseHttpMethodStep() {
|
|
24
|
+
const methodToken = this.advance();
|
|
25
|
+
let method;
|
|
26
|
+
switch (methodToken.type) {
|
|
27
|
+
case ReqonTokenType.GET:
|
|
28
|
+
method = 'GET';
|
|
29
|
+
break;
|
|
30
|
+
case ReqonTokenType.POST:
|
|
31
|
+
method = 'POST';
|
|
32
|
+
break;
|
|
33
|
+
case ReqonTokenType.PUT:
|
|
34
|
+
method = 'PUT';
|
|
35
|
+
break;
|
|
36
|
+
case ReqonTokenType.PATCH:
|
|
37
|
+
method = 'PATCH';
|
|
38
|
+
break;
|
|
39
|
+
case ReqonTokenType.DELETE:
|
|
40
|
+
method = 'DELETE';
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
throw this.error(`Unexpected HTTP method token: ${methodToken.value}`);
|
|
44
|
+
}
|
|
45
|
+
const path = this.parseExpression();
|
|
46
|
+
// Parse optional config block
|
|
47
|
+
const options = this.parseFetchOptions();
|
|
48
|
+
return {
|
|
49
|
+
type: 'FetchStep',
|
|
50
|
+
method,
|
|
51
|
+
path,
|
|
52
|
+
...options,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse OAS-style call: call Source.operationId { options }
|
|
57
|
+
*/
|
|
58
|
+
parseCallStep() {
|
|
59
|
+
this.consume(ReqonTokenType.CALL, "Expected 'call'");
|
|
60
|
+
// OAS-style: call Source.operationId
|
|
61
|
+
const sourceName = this.consume(TokenType.IDENTIFIER, 'Expected source name').value;
|
|
62
|
+
this.consume(TokenType.DOT, "Expected '.'");
|
|
63
|
+
const opId = this.consume(TokenType.IDENTIFIER, 'Expected operationId').value;
|
|
64
|
+
const operationRef = { source: sourceName, operationId: opId };
|
|
65
|
+
const options = this.parseFetchOptions();
|
|
66
|
+
return {
|
|
67
|
+
type: 'FetchStep',
|
|
68
|
+
operationRef,
|
|
69
|
+
...options,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Parse fetch options block (shared between HTTP methods and call)
|
|
74
|
+
*/
|
|
75
|
+
parseFetchOptions() {
|
|
76
|
+
let source;
|
|
77
|
+
let body;
|
|
78
|
+
let headers;
|
|
79
|
+
let paginate;
|
|
80
|
+
let until;
|
|
81
|
+
let retry;
|
|
82
|
+
let since;
|
|
83
|
+
let backfill;
|
|
84
|
+
if (this.match(TokenType.LBRACE)) {
|
|
85
|
+
while (!this.check(TokenType.RBRACE) && !this.isAtEnd()) {
|
|
86
|
+
const key = this.parseFetchOptionKey();
|
|
87
|
+
this.consume(TokenType.COLON, "Expected ':'");
|
|
88
|
+
switch (key) {
|
|
89
|
+
case 'source':
|
|
90
|
+
source = this.consume(TokenType.IDENTIFIER, 'Expected source name').value;
|
|
91
|
+
break;
|
|
92
|
+
case 'body':
|
|
93
|
+
body = this.parseExpression();
|
|
94
|
+
break;
|
|
95
|
+
case 'paginate':
|
|
96
|
+
paginate = this.parsePaginationConfig();
|
|
97
|
+
break;
|
|
98
|
+
case 'until':
|
|
99
|
+
until = this.parseExpression();
|
|
100
|
+
break;
|
|
101
|
+
case 'retry':
|
|
102
|
+
retry = this.parseRetryConfig();
|
|
103
|
+
break;
|
|
104
|
+
case 'since':
|
|
105
|
+
since = this.parseSinceConfig();
|
|
106
|
+
break;
|
|
107
|
+
case 'backfill':
|
|
108
|
+
backfill = this.match(TokenType.TRUE);
|
|
109
|
+
if (!backfill) {
|
|
110
|
+
this.consume(TokenType.FALSE, "Expected 'true' or 'false'");
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
default:
|
|
114
|
+
throw this.error(`Unknown fetch option: ${key}`);
|
|
115
|
+
}
|
|
116
|
+
this.match(TokenType.COMMA);
|
|
117
|
+
}
|
|
118
|
+
this.consume(TokenType.RBRACE, "Expected '}'");
|
|
119
|
+
}
|
|
120
|
+
return { source, body, headers, paginate, until, retry, since, backfill };
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Parse a fetch option key, handling keyword tokens that can appear as keys
|
|
124
|
+
*/
|
|
125
|
+
parseFetchOptionKey() {
|
|
126
|
+
if (this.check(ReqonTokenType.SOURCE)) {
|
|
127
|
+
this.advance();
|
|
128
|
+
return 'source';
|
|
129
|
+
}
|
|
130
|
+
else if (this.check(ReqonTokenType.PAGINATE)) {
|
|
131
|
+
this.advance();
|
|
132
|
+
return 'paginate';
|
|
133
|
+
}
|
|
134
|
+
else if (this.check(ReqonTokenType.UNTIL)) {
|
|
135
|
+
this.advance();
|
|
136
|
+
return 'until';
|
|
137
|
+
}
|
|
138
|
+
else if (this.check(ReqonTokenType.RETRY)) {
|
|
139
|
+
this.advance();
|
|
140
|
+
return 'retry';
|
|
141
|
+
}
|
|
142
|
+
else if (this.check(ReqonTokenType.SINCE)) {
|
|
143
|
+
this.advance();
|
|
144
|
+
return 'since';
|
|
145
|
+
}
|
|
146
|
+
return this.consume(TokenType.IDENTIFIER, 'Expected option key').value;
|
|
147
|
+
}
|
|
148
|
+
parseSinceConfig() {
|
|
149
|
+
// since: lastSync
|
|
150
|
+
// since: lastSync("custom-key")
|
|
151
|
+
// since: lastSync { param: "modified_since", format: "unix" }
|
|
152
|
+
// since: lastSync { header: "If-Modified-Since" }
|
|
153
|
+
if (this.check(ReqonTokenType.LAST_SYNC)) {
|
|
154
|
+
this.advance();
|
|
155
|
+
let key;
|
|
156
|
+
let param;
|
|
157
|
+
let header;
|
|
158
|
+
let format;
|
|
159
|
+
let updateFrom;
|
|
160
|
+
// Check for optional key: lastSync("key")
|
|
161
|
+
if (this.match(TokenType.LPAREN)) {
|
|
162
|
+
key = this.consume(TokenType.STRING, 'Expected checkpoint key').value;
|
|
163
|
+
this.consume(TokenType.RPAREN, "Expected ')'");
|
|
164
|
+
}
|
|
165
|
+
// Check for optional config block
|
|
166
|
+
if (this.match(TokenType.LBRACE)) {
|
|
167
|
+
while (!this.check(TokenType.RBRACE) && !this.isAtEnd()) {
|
|
168
|
+
const optionKey = this.consume(TokenType.IDENTIFIER, 'Expected option key').value;
|
|
169
|
+
this.consume(TokenType.COLON, "Expected ':'");
|
|
170
|
+
switch (optionKey) {
|
|
171
|
+
case 'param':
|
|
172
|
+
param = this.consume(TokenType.STRING, 'Expected param name').value;
|
|
173
|
+
break;
|
|
174
|
+
case 'header':
|
|
175
|
+
header = this.consume(TokenType.STRING, 'Expected header name').value;
|
|
176
|
+
break;
|
|
177
|
+
case 'format':
|
|
178
|
+
format = this.consume(TokenType.IDENTIFIER, 'Expected format')
|
|
179
|
+
.value;
|
|
180
|
+
break;
|
|
181
|
+
case 'updateFrom':
|
|
182
|
+
updateFrom = this.consume(TokenType.STRING, 'Expected field path').value;
|
|
183
|
+
break;
|
|
184
|
+
default:
|
|
185
|
+
throw this.error(`Unknown since option: ${optionKey}`);
|
|
186
|
+
}
|
|
187
|
+
this.match(TokenType.COMMA);
|
|
188
|
+
}
|
|
189
|
+
this.consume(TokenType.RBRACE, "Expected '}'");
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
type: 'lastSync',
|
|
193
|
+
key,
|
|
194
|
+
param,
|
|
195
|
+
header,
|
|
196
|
+
format,
|
|
197
|
+
updateFrom,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
// since: <expression> - custom expression for the timestamp
|
|
201
|
+
const expression = this.parseExpression();
|
|
202
|
+
return {
|
|
203
|
+
type: 'expression',
|
|
204
|
+
expression,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
parsePaginationConfig() {
|
|
208
|
+
const typeToken = this.advance();
|
|
209
|
+
let type;
|
|
210
|
+
switch (typeToken.type) {
|
|
211
|
+
case ReqonTokenType.OFFSET:
|
|
212
|
+
type = 'offset';
|
|
213
|
+
break;
|
|
214
|
+
case ReqonTokenType.CURSOR:
|
|
215
|
+
type = 'cursor';
|
|
216
|
+
break;
|
|
217
|
+
case ReqonTokenType.PAGE:
|
|
218
|
+
type = 'page';
|
|
219
|
+
break;
|
|
220
|
+
default:
|
|
221
|
+
throw this.error(`Unknown pagination type: ${typeToken.value}`);
|
|
222
|
+
}
|
|
223
|
+
this.consume(TokenType.LPAREN, "Expected '('");
|
|
224
|
+
// Accept keyword tokens as param names (e.g., 'page', 'offset', 'cursor')
|
|
225
|
+
let param;
|
|
226
|
+
if (this.check(ReqonTokenType.PAGE)) {
|
|
227
|
+
param = this.advance().value;
|
|
228
|
+
}
|
|
229
|
+
else if (this.check(ReqonTokenType.OFFSET)) {
|
|
230
|
+
param = this.advance().value;
|
|
231
|
+
}
|
|
232
|
+
else if (this.check(ReqonTokenType.CURSOR)) {
|
|
233
|
+
param = this.advance().value;
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
param = this.consume(TokenType.IDENTIFIER, 'Expected param name').value;
|
|
237
|
+
}
|
|
238
|
+
this.consume(TokenType.COMMA, "Expected ','");
|
|
239
|
+
const pageSize = parseInt(this.consume(TokenType.NUMBER, 'Expected page size').value, 10);
|
|
240
|
+
let cursorPath;
|
|
241
|
+
if (type === 'cursor' && this.match(TokenType.COMMA)) {
|
|
242
|
+
cursorPath = this.consume(TokenType.STRING, 'Expected cursor path').value;
|
|
243
|
+
}
|
|
244
|
+
this.consume(TokenType.RPAREN, "Expected ')'");
|
|
245
|
+
return { type, param, pageSize, cursorPath };
|
|
246
|
+
}
|
|
247
|
+
parseRetryConfig() {
|
|
248
|
+
this.consume(TokenType.LBRACE, "Expected '{'");
|
|
249
|
+
let maxAttempts = 3;
|
|
250
|
+
let backoff = 'exponential';
|
|
251
|
+
let initialDelay = 1000;
|
|
252
|
+
let maxDelay;
|
|
253
|
+
let timeout;
|
|
254
|
+
while (!this.check(TokenType.RBRACE) && !this.isAtEnd()) {
|
|
255
|
+
const key = this.consume(TokenType.IDENTIFIER, 'Expected retry option').value;
|
|
256
|
+
this.consume(TokenType.COLON, "Expected ':'");
|
|
257
|
+
switch (key) {
|
|
258
|
+
case 'maxAttempts':
|
|
259
|
+
maxAttempts = parseInt(this.consume(TokenType.NUMBER, 'Expected number').value, 10);
|
|
260
|
+
break;
|
|
261
|
+
case 'backoff':
|
|
262
|
+
backoff = this.consume(TokenType.IDENTIFIER, 'Expected backoff type')
|
|
263
|
+
.value;
|
|
264
|
+
break;
|
|
265
|
+
case 'initialDelay':
|
|
266
|
+
initialDelay = parseInt(this.consume(TokenType.NUMBER, 'Expected number').value, 10);
|
|
267
|
+
break;
|
|
268
|
+
case 'maxDelay':
|
|
269
|
+
maxDelay = parseInt(this.consume(TokenType.NUMBER, 'Expected number').value, 10);
|
|
270
|
+
break;
|
|
271
|
+
case 'timeout':
|
|
272
|
+
timeout = parseInt(this.consume(TokenType.NUMBER, 'Expected number').value, 10);
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
this.match(TokenType.COMMA);
|
|
276
|
+
}
|
|
277
|
+
this.consume(TokenType.RBRACE, "Expected '}'");
|
|
278
|
+
return { maxAttempts, backoff, initialDelay, maxDelay, timeout };
|
|
279
|
+
}
|
|
280
|
+
}
|
package/dist/parser/index.d.ts
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Parser module exports - inheritance chain of specialized parsers
|
|
4
|
+
* note: Parser classes form inheritance chain (Base -> Expression -> Source -> Schedule -> Fetch -> Action -> Pipeline -> ReqonParser)
|
|
5
|
+
* exports:
|
|
6
|
+
* - ReqonParser - top-level parser for .vague files
|
|
7
|
+
* related:
|
|
8
|
+
* - ./parser.ts - ReqonParser implementation
|
|
9
|
+
* - ./base.ts - token manipulation utilities
|
|
10
|
+
* - ../lexer/index.ts - tokenization
|
|
11
|
+
* ---
|
|
12
|
+
*/
|
|
1
13
|
export { ReqonParser } from './parser.js';
|
|
2
14
|
export { ReqonExpressionParser } from './expressions.js';
|
|
3
15
|
export { ReqonParserBase } from './base.js';
|
|
16
|
+
export { SourceParser } from './source-parser.js';
|
|
17
|
+
export { ScheduleParser } from './schedule-parser.js';
|
|
18
|
+
export { FetchParser } from './fetch-parser.js';
|
|
19
|
+
export { ActionParser } from './action-parser.js';
|
|
20
|
+
export { PipelineParser } from './pipeline-parser.js';
|
package/dist/parser/index.js
CHANGED
|
@@ -1,3 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Parser module exports - inheritance chain of specialized parsers
|
|
4
|
+
* note: Parser classes form inheritance chain (Base -> Expression -> Source -> Schedule -> Fetch -> Action -> Pipeline -> ReqonParser)
|
|
5
|
+
* exports:
|
|
6
|
+
* - ReqonParser - top-level parser for .vague files
|
|
7
|
+
* related:
|
|
8
|
+
* - ./parser.ts - ReqonParser implementation
|
|
9
|
+
* - ./base.ts - token manipulation utilities
|
|
10
|
+
* - ../lexer/index.ts - tokenization
|
|
11
|
+
* ---
|
|
12
|
+
*/
|
|
1
13
|
export { ReqonParser } from './parser.js';
|
|
2
14
|
export { ReqonExpressionParser } from './expressions.js';
|
|
3
15
|
export { ReqonParserBase } from './base.js';
|
|
16
|
+
export { SourceParser } from './source-parser.js';
|
|
17
|
+
export { ScheduleParser } from './schedule-parser.js';
|
|
18
|
+
export { FetchParser } from './fetch-parser.js';
|
|
19
|
+
export { ActionParser } from './action-parser.js';
|
|
20
|
+
export { PipelineParser } from './pipeline-parser.js';
|
package/dist/parser/parser.d.ts
CHANGED
|
@@ -1,68 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ---
|
|
3
|
+
* purpose: Top-level parser - combines all domain-specific parser modules
|
|
4
|
+
* inputs:
|
|
5
|
+
* - Token[] from lexer
|
|
6
|
+
* - source string for error messages
|
|
7
|
+
* outputs:
|
|
8
|
+
* - ReqonProgram AST
|
|
9
|
+
* related:
|
|
10
|
+
* - ./pipeline-parser.ts - parent class (pipeline stage parsing)
|
|
11
|
+
* - ./action-parser.ts - action/step parsing
|
|
12
|
+
* - ./fetch-parser.ts - HTTP fetch parsing
|
|
13
|
+
* - ../ast/nodes.ts - AST node types
|
|
14
|
+
* ---
|
|
15
|
+
*/
|
|
1
16
|
import { type Token } from 'vague-lang';
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
export declare class ReqonParser extends
|
|
17
|
+
import type { ReqonProgram, PipelineDefinition } from '../ast/nodes.js';
|
|
18
|
+
import { PipelineParser } from './pipeline-parser.js';
|
|
19
|
+
export declare class ReqonParser extends PipelineParser {
|
|
5
20
|
constructor(tokens: Token[], source?: string, filePath?: string);
|
|
21
|
+
/**
|
|
22
|
+
* Parse a complete Reqon program
|
|
23
|
+
*/
|
|
6
24
|
parse(): ReqonProgram;
|
|
25
|
+
/**
|
|
26
|
+
* Parse a top-level statement
|
|
27
|
+
*/
|
|
7
28
|
private parseStatement;
|
|
29
|
+
/**
|
|
30
|
+
* Parse a mission definition
|
|
31
|
+
*/
|
|
8
32
|
private parseMission;
|
|
9
33
|
/**
|
|
10
|
-
*
|
|
34
|
+
* Parse checkpoint configuration: checkpoint: afterStep | onFailure
|
|
11
35
|
*/
|
|
12
|
-
private
|
|
36
|
+
private parseCheckpointConfig;
|
|
13
37
|
/**
|
|
14
|
-
*
|
|
38
|
+
* Parse trace configuration: trace: full | minimal
|
|
15
39
|
*/
|
|
16
|
-
private
|
|
40
|
+
private parseTraceConfig;
|
|
17
41
|
/**
|
|
18
|
-
* Validate that all action references in
|
|
42
|
+
* Validate that all store, source, action, and transform references in actions exist
|
|
19
43
|
*/
|
|
20
|
-
private
|
|
21
|
-
private parseSchedule;
|
|
22
|
-
private parseIntervalSchedule;
|
|
23
|
-
private parseScheduleRetryConfig;
|
|
24
|
-
private parseSource;
|
|
25
|
-
private parseSourceConfig;
|
|
26
|
-
private parseRateLimitConfig;
|
|
27
|
-
private parseCircuitBreakerConfig;
|
|
28
|
-
private parseAuthConfig;
|
|
29
|
-
private parseStoreDefinition;
|
|
30
|
-
private parseAction;
|
|
31
|
-
private parseActionStep;
|
|
32
|
-
private checkHttpMethod;
|
|
44
|
+
private validateActionReferences;
|
|
33
45
|
/**
|
|
34
|
-
*
|
|
46
|
+
* Recursively validate store, source, action, and transform references in action steps
|
|
35
47
|
*/
|
|
36
|
-
private
|
|
48
|
+
private validateStepsReferences;
|
|
37
49
|
/**
|
|
38
|
-
*
|
|
39
|
-
* For direct HTTP requests, use: get "/path", post "/path", etc.
|
|
50
|
+
* Validate references in a single step
|
|
40
51
|
*/
|
|
41
|
-
private
|
|
42
|
-
private parseSinceConfig;
|
|
43
|
-
private parsePaginationConfig;
|
|
44
|
-
private parseRetryConfig;
|
|
45
|
-
private parseForStep;
|
|
46
|
-
private parseMapStep;
|
|
47
|
-
private parseValidateStep;
|
|
48
|
-
private parseStoreStep;
|
|
49
|
-
private parseMatchStep;
|
|
50
|
-
private parseMatchArm;
|
|
51
|
-
private tryParseFlowDirective;
|
|
52
|
-
private parseLetStep;
|
|
52
|
+
private validateStepReferences;
|
|
53
53
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
54
|
+
* Validate that all action references in the pipeline exist
|
|
55
|
+
* Note: This is called by the loader after action merging
|
|
56
56
|
*/
|
|
57
|
-
|
|
57
|
+
validatePipelineReferences(pipeline: PipelineDefinition, definedActions: Set<string>): void;
|
|
58
58
|
/**
|
|
59
|
-
* Parse
|
|
59
|
+
* Parse an import statement
|
|
60
60
|
*/
|
|
61
|
-
private parseWebhookStorageConfig;
|
|
62
|
-
private parsePipeline;
|
|
63
|
-
private parsePipelineStage;
|
|
64
|
-
private parseSchema;
|
|
65
|
-
private parseFieldDefinition;
|
|
66
61
|
private parseImport;
|
|
62
|
+
/**
|
|
63
|
+
* Parse a let statement
|
|
64
|
+
*/
|
|
67
65
|
private parseLet;
|
|
68
66
|
}
|