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
package/package.json
CHANGED
|
@@ -1,40 +1,107 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reqon-dsl",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "A DSL framework for fetch, map, validate pipelines - built on Vague",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
8
|
"bin": {
|
|
9
|
-
"reqon": "dist/cli.js"
|
|
9
|
+
"reqon": "dist/cli.js",
|
|
10
|
+
"reqon-mcp": "dist/mcp/server.js"
|
|
10
11
|
},
|
|
11
12
|
"scripts": {
|
|
12
|
-
"build": "tsc",
|
|
13
|
-
"dev": "tsc --watch",
|
|
13
|
+
"build": "tsc -p tsconfig.build.json",
|
|
14
|
+
"dev": "tsc -p tsconfig.build.json --watch",
|
|
15
|
+
"typecheck": "tsc --noEmit",
|
|
14
16
|
"test": "vitest",
|
|
15
17
|
"test:run": "vitest run",
|
|
16
18
|
"test:coverage": "vitest run --coverage",
|
|
19
|
+
"test:integration": "RUN_NETWORK_TESTS=1 vitest run src/api-integration.test.ts",
|
|
20
|
+
"test:crash": "vitest run src/durability/",
|
|
21
|
+
"test:pg": "vitest run src/execution-log/postgres-store.test.ts",
|
|
22
|
+
"lint": "eslint src/",
|
|
23
|
+
"lint:fix": "eslint src/ --fix",
|
|
24
|
+
"format": "prettier --write src/",
|
|
25
|
+
"format:check": "prettier --check src/",
|
|
17
26
|
"bench": "npx tsx src/benchmark/index.ts",
|
|
18
27
|
"bench:lexer": "npx tsx src/benchmark/index.ts --suite lexer",
|
|
19
28
|
"bench:parser": "npx tsx src/benchmark/index.ts --suite parser",
|
|
20
29
|
"bench:evaluator": "npx tsx src/benchmark/index.ts --suite evaluator",
|
|
21
30
|
"bench:store": "npx tsx src/benchmark/index.ts --suite store",
|
|
22
31
|
"bench:resilience": "npx tsx src/benchmark/index.ts --suite resilience",
|
|
23
|
-
"bench:e2e": "npx tsx src/benchmark/index.ts --suite e2e"
|
|
32
|
+
"bench:e2e": "npx tsx src/benchmark/index.ts --suite e2e",
|
|
33
|
+
"prerelease": "npm run test:run && npm run build",
|
|
34
|
+
"release": "node scripts/release.js",
|
|
35
|
+
"release:dry-run": "npm publish --dry-run",
|
|
36
|
+
"version:patch": "npm version patch --no-git-tag-version",
|
|
37
|
+
"version:minor": "npm version minor --no-git-tag-version",
|
|
38
|
+
"version:major": "npm version major --no-git-tag-version",
|
|
39
|
+
"prepare": "husky"
|
|
24
40
|
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist",
|
|
43
|
+
"CHANGELOG.md",
|
|
44
|
+
"README.md"
|
|
45
|
+
],
|
|
25
46
|
"engines": {
|
|
26
|
-
"node": ">=
|
|
47
|
+
"node": ">=20"
|
|
27
48
|
},
|
|
49
|
+
"repository": {
|
|
50
|
+
"type": "git",
|
|
51
|
+
"url": "git+https://github.com/mcclowes/reqon.git"
|
|
52
|
+
},
|
|
53
|
+
"bugs": {
|
|
54
|
+
"url": "https://github.com/mcclowes/reqon/issues"
|
|
55
|
+
},
|
|
56
|
+
"homepage": "https://github.com/mcclowes/reqon#readme",
|
|
57
|
+
"keywords": [
|
|
58
|
+
"dsl",
|
|
59
|
+
"data-pipeline",
|
|
60
|
+
"fetch",
|
|
61
|
+
"api",
|
|
62
|
+
"declarative",
|
|
63
|
+
"etl",
|
|
64
|
+
"vague"
|
|
65
|
+
],
|
|
28
66
|
"author": "Max Clayton Clowes <max@mcclowes.com>",
|
|
29
67
|
"license": "ISC",
|
|
30
68
|
"dependencies": {
|
|
31
69
|
"@apidevtools/swagger-parser": "^12.1.0",
|
|
32
|
-
"
|
|
33
|
-
"
|
|
70
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
71
|
+
"dotenv": "^17.2.3",
|
|
72
|
+
"vague-lang": "^3.3.0",
|
|
73
|
+
"zod": "^4.2.1"
|
|
74
|
+
},
|
|
75
|
+
"peerDependencies": {
|
|
76
|
+
"better-sqlite3": ">=11",
|
|
77
|
+
"pg": ">=8"
|
|
78
|
+
},
|
|
79
|
+
"peerDependenciesMeta": {
|
|
80
|
+
"better-sqlite3": {
|
|
81
|
+
"optional": true
|
|
82
|
+
},
|
|
83
|
+
"pg": {
|
|
84
|
+
"optional": true
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"lint-staged": {
|
|
88
|
+
"src/**/*.{ts,tsx}": [
|
|
89
|
+
"eslint --fix",
|
|
90
|
+
"prettier --write"
|
|
91
|
+
]
|
|
34
92
|
},
|
|
35
93
|
"devDependencies": {
|
|
36
|
-
"@
|
|
94
|
+
"@eslint/js": "^9.17.0",
|
|
95
|
+
"@types/node": "^25.0.3",
|
|
96
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
97
|
+
"better-sqlite3": "^12.11.1",
|
|
98
|
+
"eslint": "^9.17.0",
|
|
99
|
+
"husky": "^9.1.7",
|
|
100
|
+
"lint-staged": "^16.2.7",
|
|
101
|
+
"pg": "^8.22.0",
|
|
102
|
+
"prettier": "^3.4.2",
|
|
37
103
|
"typescript": "^5.9.3",
|
|
104
|
+
"typescript-eslint": "^8.18.2",
|
|
38
105
|
"vitest": "^4.0.15"
|
|
39
106
|
}
|
|
40
107
|
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"permissions": {
|
|
3
|
-
"allow": [
|
|
4
|
-
"Bash(npm init -y)",
|
|
5
|
-
"Bash(npm install)",
|
|
6
|
-
"Bash(npm run build:*)",
|
|
7
|
-
"Bash(npm run test:run:*)",
|
|
8
|
-
"Bash(npx vitest run src/debug.test.ts)",
|
|
9
|
-
"Bash(npx vitest:*)",
|
|
10
|
-
"Bash(git init:*)",
|
|
11
|
-
"Bash(git add:*)",
|
|
12
|
-
"Bash(git commit:*)",
|
|
13
|
-
"Bash(git push:*)",
|
|
14
|
-
"Bash(npm install:*)",
|
|
15
|
-
"Bash(node dist/cli.js:*)",
|
|
16
|
-
"Bash(ls:*)",
|
|
17
|
-
"Bash(node:*)",
|
|
18
|
-
"Bash(cat:*)",
|
|
19
|
-
"Bash(git checkout:*)",
|
|
20
|
-
"Bash(git rebase:*)",
|
|
21
|
-
"Bash(find:*)",
|
|
22
|
-
"Bash(git fetch:*)",
|
|
23
|
-
"Bash(xargs sed:*)",
|
|
24
|
-
"Bash(for f in examples/**/*.reqon)",
|
|
25
|
-
"Bash(do mv $f $f%.reqon.vague)",
|
|
26
|
-
"Bash(done)",
|
|
27
|
-
"Bash(npx:*)",
|
|
28
|
-
"Skill(reqon)"
|
|
29
|
-
]
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# API Integration Patterns Skill
|
|
2
|
-
|
|
3
|
-
Use this skill when implementing API client functionality, authentication flows, rate limiting, or pagination in Reqon.
|
|
4
|
-
|
|
5
|
-
## Capabilities
|
|
6
|
-
|
|
7
|
-
### OAuth2 Token Refresh Flows
|
|
8
|
-
- Implement automatic token refresh on 401 responses
|
|
9
|
-
- Handle refresh token rotation
|
|
10
|
-
- Store and retrieve tokens securely
|
|
11
|
-
- Support authorization_code, client_credentials, and refresh_token grants
|
|
12
|
-
|
|
13
|
-
### Rate Limiting with Exponential Backoff
|
|
14
|
-
- Parse rate limit headers (X-RateLimit-*, Retry-After)
|
|
15
|
-
- Implement exponential backoff with jitter
|
|
16
|
-
- Queue requests when rate limited
|
|
17
|
-
- Respect per-endpoint rate limits
|
|
18
|
-
|
|
19
|
-
### Pagination Pattern Implementations
|
|
20
|
-
- **Cursor-based**: Use `next_cursor` or `after` parameters
|
|
21
|
-
- **Offset-based**: Use `offset` and `limit` parameters
|
|
22
|
-
- **Page-based**: Use `page` and `per_page` parameters
|
|
23
|
-
- **Link header**: Parse RFC 5988 Link headers
|
|
24
|
-
|
|
25
|
-
## Context Files
|
|
26
|
-
When using this skill, read:
|
|
27
|
-
- `src/interpreter/http.ts` - HTTP client implementation
|
|
28
|
-
- `src/interpreter/executor.ts` - Fetch execution logic
|
|
29
|
-
- `src/ast/nodes.ts` - FetchNode, PaginationConfig types
|
|
30
|
-
|
|
31
|
-
## Implementation Patterns
|
|
32
|
-
|
|
33
|
-
### OAuth2 Token Refresh
|
|
34
|
-
```typescript
|
|
35
|
-
async function fetchWithAuth(url: string, auth: OAuth2Auth): Promise<Response> {
|
|
36
|
-
let response = await fetch(url, {
|
|
37
|
-
headers: { Authorization: `Bearer ${auth.accessToken}` }
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
if (response.status === 401 && auth.refreshToken) {
|
|
41
|
-
const newTokens = await refreshAccessToken(auth);
|
|
42
|
-
auth.accessToken = newTokens.access_token;
|
|
43
|
-
response = await fetch(url, {
|
|
44
|
-
headers: { Authorization: `Bearer ${auth.accessToken}` }
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
return response;
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Exponential Backoff
|
|
53
|
-
```typescript
|
|
54
|
-
async function fetchWithBackoff(
|
|
55
|
-
url: string,
|
|
56
|
-
maxRetries = 5,
|
|
57
|
-
baseDelay = 1000
|
|
58
|
-
): Promise<Response> {
|
|
59
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
60
|
-
const response = await fetch(url);
|
|
61
|
-
|
|
62
|
-
if (response.status === 429) {
|
|
63
|
-
const retryAfter = response.headers.get('Retry-After');
|
|
64
|
-
const delay = retryAfter
|
|
65
|
-
? parseInt(retryAfter) * 1000
|
|
66
|
-
: baseDelay * Math.pow(2, attempt) + Math.random() * 1000;
|
|
67
|
-
await sleep(delay);
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return response;
|
|
72
|
-
}
|
|
73
|
-
throw new Error('Max retries exceeded');
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Pagination Patterns
|
|
78
|
-
|
|
79
|
-
#### Cursor-based
|
|
80
|
-
```typescript
|
|
81
|
-
async function* paginateCursor(baseUrl: string) {
|
|
82
|
-
let cursor: string | undefined;
|
|
83
|
-
do {
|
|
84
|
-
const url = cursor ? `${baseUrl}?cursor=${cursor}` : baseUrl;
|
|
85
|
-
const response = await fetch(url);
|
|
86
|
-
const data = await response.json();
|
|
87
|
-
yield data.items;
|
|
88
|
-
cursor = data.next_cursor;
|
|
89
|
-
} while (cursor);
|
|
90
|
-
}
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
#### Offset-based
|
|
94
|
-
```typescript
|
|
95
|
-
async function* paginateOffset(baseUrl: string, limit = 100) {
|
|
96
|
-
let offset = 0;
|
|
97
|
-
let hasMore = true;
|
|
98
|
-
while (hasMore) {
|
|
99
|
-
const response = await fetch(`${baseUrl}?offset=${offset}&limit=${limit}`);
|
|
100
|
-
const data = await response.json();
|
|
101
|
-
yield data.items;
|
|
102
|
-
offset += limit;
|
|
103
|
-
hasMore = data.items.length === limit;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
#### Link Header
|
|
109
|
-
```typescript
|
|
110
|
-
function parseLinks(header: string): Record<string, string> {
|
|
111
|
-
const links: Record<string, string> = {};
|
|
112
|
-
header.split(',').forEach(part => {
|
|
113
|
-
const match = part.match(/<([^>]+)>;\s*rel="([^"]+)"/);
|
|
114
|
-
if (match) links[match[2]] = match[1];
|
|
115
|
-
});
|
|
116
|
-
return links;
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## Rate Limit Headers
|
|
121
|
-
Common headers to parse:
|
|
122
|
-
- `X-RateLimit-Limit` - Request limit per window
|
|
123
|
-
- `X-RateLimit-Remaining` - Requests remaining
|
|
124
|
-
- `X-RateLimit-Reset` - Unix timestamp when limit resets
|
|
125
|
-
- `Retry-After` - Seconds to wait (on 429/503)
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# Database Schema Skill
|
|
2
|
-
|
|
3
|
-
Use this skill when working on SQL/NoSQL store adapters or database-related functionality in Reqon.
|
|
4
|
-
|
|
5
|
-
## Capabilities
|
|
6
|
-
|
|
7
|
-
### Generating Store Implementations
|
|
8
|
-
- Create PostgreSQL store adapters implementing the `StoreAdapter` interface from `src/stores/types.ts`
|
|
9
|
-
- Create MySQL store adapters with appropriate driver usage
|
|
10
|
-
- Create MongoDB/DynamoDB NoSQL adapters
|
|
11
|
-
|
|
12
|
-
### Creating Migration Files
|
|
13
|
-
- Generate SQL migration files for schema creation
|
|
14
|
-
- Create up/down migration pairs for reversibility
|
|
15
|
-
- Handle incremental schema changes
|
|
16
|
-
|
|
17
|
-
### Type Mapping
|
|
18
|
-
Map Reqon/Vague DSL types to database column types:
|
|
19
|
-
|
|
20
|
-
| DSL Type | PostgreSQL | MySQL | MongoDB |
|
|
21
|
-
|----------|------------|-------|---------|
|
|
22
|
-
| string | TEXT/VARCHAR | VARCHAR | String |
|
|
23
|
-
| number | NUMERIC/INTEGER | DECIMAL/INT | Number |
|
|
24
|
-
| boolean | BOOLEAN | TINYINT(1) | Boolean |
|
|
25
|
-
| array | JSONB | JSON | Array |
|
|
26
|
-
| object | JSONB | JSON | Object |
|
|
27
|
-
| date | TIMESTAMP | DATETIME | Date |
|
|
28
|
-
|
|
29
|
-
## Context Files
|
|
30
|
-
When using this skill, read:
|
|
31
|
-
- `src/stores/types.ts` - StoreAdapter interface
|
|
32
|
-
- `src/stores/memory.ts` - Reference implementation
|
|
33
|
-
- `src/ast/nodes.ts` - Schema and type definitions
|
|
34
|
-
|
|
35
|
-
## Implementation Patterns
|
|
36
|
-
|
|
37
|
-
### Store Adapter Structure
|
|
38
|
-
```typescript
|
|
39
|
-
import { StoreAdapter, StoreRecord } from './types';
|
|
40
|
-
|
|
41
|
-
export class PostgresStore implements StoreAdapter {
|
|
42
|
-
async get(key: string): Promise<StoreRecord | undefined> { }
|
|
43
|
-
async set(key: string, value: StoreRecord): Promise<void> { }
|
|
44
|
-
async delete(key: string): Promise<boolean> { }
|
|
45
|
-
async query(filter: Record<string, unknown>): Promise<StoreRecord[]> { }
|
|
46
|
-
async upsert(key: string, value: StoreRecord): Promise<void> { }
|
|
47
|
-
}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### Migration File Naming
|
|
51
|
-
Use timestamp-based naming: `YYYYMMDDHHMMSS_description.sql`
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
# Language/DSL Design Skill
|
|
2
|
-
|
|
3
|
-
Use this skill when extending Reqon's DSL syntax, implementing new language constructs, or working on the lexer/parser.
|
|
4
|
-
|
|
5
|
-
## Architecture Overview
|
|
6
|
-
|
|
7
|
-
Reqon extends Vague's language infrastructure:
|
|
8
|
-
- **Vague** provides: lexer base, expression syntax, match expressions, core AST
|
|
9
|
-
- **Reqon** adds: mission/action/fetch/store constructs, execution semantics
|
|
10
|
-
|
|
11
|
-
## Capabilities
|
|
12
|
-
|
|
13
|
-
### Implementing New DSL Constructs
|
|
14
|
-
- Add new keywords to `src/lexer/tokens.ts`
|
|
15
|
-
- Extend the lexer in `src/lexer/lexer.ts`
|
|
16
|
-
- Add parser rules in `src/parser/parser.ts`
|
|
17
|
-
- Define AST nodes in `src/ast/nodes.ts`
|
|
18
|
-
|
|
19
|
-
### Writing Parser Tests
|
|
20
|
-
- Create comprehensive test cases in `src/parser/parser.test.ts`
|
|
21
|
-
- Test edge cases and error conditions
|
|
22
|
-
- Use Vitest's describe/it/expect patterns
|
|
23
|
-
|
|
24
|
-
### Generating Better Error Messages
|
|
25
|
-
- Include line and column numbers in parse errors
|
|
26
|
-
- Provide context about what was expected
|
|
27
|
-
- Suggest fixes for common mistakes
|
|
28
|
-
|
|
29
|
-
## Context Files
|
|
30
|
-
When using this skill, read:
|
|
31
|
-
- `src/lexer/tokens.ts` - Token definitions
|
|
32
|
-
- `src/lexer/lexer.ts` - Lexer implementation
|
|
33
|
-
- `src/parser/parser.ts` - Main parser
|
|
34
|
-
- `src/parser/base.ts` - Parser utilities
|
|
35
|
-
- `src/ast/nodes.ts` - AST node types
|
|
36
|
-
|
|
37
|
-
## Implementation Patterns
|
|
38
|
-
|
|
39
|
-
### Adding a New Keyword
|
|
40
|
-
1. Add token type to `ReqonTokenType` enum in `tokens.ts`
|
|
41
|
-
2. Add keyword mapping in `REQON_KEYWORDS` in `lexer.ts`
|
|
42
|
-
3. Add parsing logic in `parser.ts`
|
|
43
|
-
4. Define AST node in `nodes.ts`
|
|
44
|
-
|
|
45
|
-
### Token Definition Pattern
|
|
46
|
-
```typescript
|
|
47
|
-
export enum ReqonTokenType {
|
|
48
|
-
// ... existing tokens
|
|
49
|
-
NEW_KEYWORD = 'NEW_KEYWORD',
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export const REQON_KEYWORDS: Record<string, ReqonTokenType> = {
|
|
53
|
-
// ... existing keywords
|
|
54
|
-
'newkeyword': ReqonTokenType.NEW_KEYWORD,
|
|
55
|
-
};
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
### Parser Rule Pattern
|
|
59
|
-
```typescript
|
|
60
|
-
private parseNewConstruct(): NewConstructNode {
|
|
61
|
-
this.expect(ReqonTokenType.NEW_KEYWORD);
|
|
62
|
-
const name = this.parseIdentifier();
|
|
63
|
-
// ... parse body
|
|
64
|
-
return { type: 'NewConstruct', name, ... };
|
|
65
|
-
}
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Error Message Pattern
|
|
69
|
-
```typescript
|
|
70
|
-
throw new ParseError(
|
|
71
|
-
`Expected ${expected} but found ${actual}`,
|
|
72
|
-
{ line: token.line, column: token.column }
|
|
73
|
-
);
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
## Planned Constructs (from TODO.md)
|
|
77
|
-
- `is` type checking: `assume .items is array`
|
|
78
|
-
- Parallel execution: `run Step1, Step2 then Step3`
|
|
79
|
-
- Conditional actions: `run Step1 then Step2 if condition`
|
|
80
|
-
- Variables/let bindings: `let x = expression`
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
# Property-Based Testing Skill
|
|
2
|
-
|
|
3
|
-
Use this skill when implementing property-based tests, fuzzing the parser, or generating mock API responses.
|
|
4
|
-
|
|
5
|
-
## Capabilities
|
|
6
|
-
|
|
7
|
-
### Generating Fuzzing Inputs for the Parser
|
|
8
|
-
- Generate random valid Reqon programs
|
|
9
|
-
- Generate edge-case inputs (empty strings, unicode, deeply nested)
|
|
10
|
-
- Generate semi-valid inputs to test error recovery
|
|
11
|
-
- Mutate valid programs to find parser bugs
|
|
12
|
-
|
|
13
|
-
### Writing Vitest Property-Based Tests
|
|
14
|
-
- Use fast-check or similar libraries
|
|
15
|
-
- Define properties that should hold for all inputs
|
|
16
|
-
- Shrink failing cases to minimal reproductions
|
|
17
|
-
- Combine with traditional example-based tests
|
|
18
|
-
|
|
19
|
-
### Creating Mock API Responses
|
|
20
|
-
- Generate responses matching Reqon schemas
|
|
21
|
-
- Create varied test data (edge cases, nulls, arrays)
|
|
22
|
-
- Simulate pagination responses
|
|
23
|
-
- Mock error responses (4xx, 5xx)
|
|
24
|
-
|
|
25
|
-
## Context Files
|
|
26
|
-
When using this skill, read:
|
|
27
|
-
- `src/parser/parser.test.ts` - Existing parser tests
|
|
28
|
-
- `src/integration.test.ts` - Integration test patterns
|
|
29
|
-
- `src/ast/nodes.ts` - AST structure for generation
|
|
30
|
-
- `src/lexer/tokens.ts` - Valid tokens for fuzzing
|
|
31
|
-
|
|
32
|
-
## Implementation Patterns
|
|
33
|
-
|
|
34
|
-
### Property-Based Test Setup
|
|
35
|
-
```typescript
|
|
36
|
-
import { describe, it, expect } from 'vitest';
|
|
37
|
-
import * as fc from 'fast-check';
|
|
38
|
-
import { parse } from './parser';
|
|
39
|
-
import { lex } from '../lexer';
|
|
40
|
-
|
|
41
|
-
describe('Parser Properties', () => {
|
|
42
|
-
it('should parse any valid mission without throwing', () => {
|
|
43
|
-
fc.assert(
|
|
44
|
-
fc.property(validMissionArb, (mission) => {
|
|
45
|
-
expect(() => parse(lex(mission))).not.toThrow();
|
|
46
|
-
})
|
|
47
|
-
);
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### Arbitrary Generators for Reqon
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
// Generate valid identifiers
|
|
56
|
-
const identifierArb = fc.stringOf(
|
|
57
|
-
fc.constantFrom(...'abcdefghijklmnopqrstuvwxyz_'),
|
|
58
|
-
{ minLength: 1, maxLength: 20 }
|
|
59
|
-
).filter(s => /^[a-z_][a-z0-9_]*$/i.test(s));
|
|
60
|
-
|
|
61
|
-
// Generate valid string literals
|
|
62
|
-
const stringLiteralArb = fc.string().map(s => `"${s.replace(/"/g, '\\"')}"`);
|
|
63
|
-
|
|
64
|
-
// Generate valid fetch paths
|
|
65
|
-
const pathArb = fc.array(identifierArb, { minLength: 1, maxLength: 5 })
|
|
66
|
-
.map(parts => '/' + parts.join('/'));
|
|
67
|
-
|
|
68
|
-
// Generate valid actions
|
|
69
|
-
const actionArb = fc.record({
|
|
70
|
-
name: identifierArb,
|
|
71
|
-
path: pathArb,
|
|
72
|
-
}).map(({ name, path }) => `action ${name} { fetch ${path} }`);
|
|
73
|
-
|
|
74
|
-
// Generate valid missions
|
|
75
|
-
const validMissionArb = fc.record({
|
|
76
|
-
name: identifierArb,
|
|
77
|
-
url: fc.webUrl(),
|
|
78
|
-
actions: fc.array(actionArb, { minLength: 1, maxLength: 5 }),
|
|
79
|
-
}).map(({ name, url, actions }) => `
|
|
80
|
-
mission ${name} {
|
|
81
|
-
source api { url: "${url}" }
|
|
82
|
-
${actions.join('\n')}
|
|
83
|
-
}
|
|
84
|
-
`);
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Mock Response Generation
|
|
88
|
-
```typescript
|
|
89
|
-
// Generate mock response matching schema
|
|
90
|
-
const mockResponseArb = (schema: SchemaNode): fc.Arbitrary<unknown> => {
|
|
91
|
-
switch (schema.type) {
|
|
92
|
-
case 'string': return fc.string();
|
|
93
|
-
case 'number': return fc.double();
|
|
94
|
-
case 'boolean': return fc.boolean();
|
|
95
|
-
case 'array': return fc.array(mockResponseArb(schema.items));
|
|
96
|
-
case 'object': return fc.record(
|
|
97
|
-
Object.fromEntries(
|
|
98
|
-
Object.entries(schema.properties).map(
|
|
99
|
-
([k, v]) => [k, mockResponseArb(v)]
|
|
100
|
-
)
|
|
101
|
-
)
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
// Generate paginated response
|
|
107
|
-
const paginatedResponseArb = <T>(itemArb: fc.Arbitrary<T>) =>
|
|
108
|
-
fc.record({
|
|
109
|
-
items: fc.array(itemArb, { minLength: 0, maxLength: 100 }),
|
|
110
|
-
next_cursor: fc.option(fc.hexaString({ minLength: 16, maxLength: 16 })),
|
|
111
|
-
total: fc.nat(),
|
|
112
|
-
});
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
### Parser Fuzzing Strategies
|
|
116
|
-
```typescript
|
|
117
|
-
// Mutation-based fuzzing
|
|
118
|
-
const mutateProgram = (valid: string): fc.Arbitrary<string> =>
|
|
119
|
-
fc.oneof(
|
|
120
|
-
// Delete random character
|
|
121
|
-
fc.nat({ max: valid.length - 1 }).map(i =>
|
|
122
|
-
valid.slice(0, i) + valid.slice(i + 1)
|
|
123
|
-
),
|
|
124
|
-
// Insert random character
|
|
125
|
-
fc.tuple(fc.nat({ max: valid.length }), fc.char()).map(([i, c]) =>
|
|
126
|
-
valid.slice(0, i) + c + valid.slice(i)
|
|
127
|
-
),
|
|
128
|
-
// Replace random character
|
|
129
|
-
fc.tuple(fc.nat({ max: valid.length - 1 }), fc.char()).map(([i, c]) =>
|
|
130
|
-
valid.slice(0, i) + c + valid.slice(i + 1)
|
|
131
|
-
)
|
|
132
|
-
);
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## Dependencies
|
|
136
|
-
Add to `package.json`:
|
|
137
|
-
```json
|
|
138
|
-
{
|
|
139
|
-
"devDependencies": {
|
|
140
|
-
"fast-check": "^3.15.0"
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
```
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: reqon
|
|
3
|
-
# prettier-ignore
|
|
4
|
-
description: Use when writing or editing .vague files for Reqon declarative API data pipelines
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Reqon
|
|
8
|
-
|
|
9
|
-
Declarative DSL for fetch, map, validate pipelines. File extension: `.vague`
|
|
10
|
-
|
|
11
|
-
## Quick Start
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
mission SyncData {
|
|
15
|
-
source API { auth: bearer, base: "https://api.example.com" }
|
|
16
|
-
store items: memory("items")
|
|
17
|
-
|
|
18
|
-
action Fetch {
|
|
19
|
-
get "/items" { paginate: page(page, 100), until: length(response) == 0 }
|
|
20
|
-
store response -> items { key: .id }
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
run Fetch
|
|
24
|
-
}
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Core Constructs
|
|
28
|
-
|
|
29
|
-
- `mission` - Pipeline container (sources, stores, schemas, actions)
|
|
30
|
-
- `source` - API: auth (bearer/basic/api_key/oauth2), base, headers, rateLimit
|
|
31
|
-
- `store` - Storage: `memory("name")`, `file("path")`, `sql("table")`
|
|
32
|
-
- `action` - Pipeline step: fetch, map, validate, store
|
|
33
|
-
- `run [A, B] then C` - Parallel then sequential execution
|
|
34
|
-
- `match response { Schema -> ..., _ -> skip }` - Pattern matching
|
|
35
|
-
- `for item in store where .active { ... }` - Iteration with filter
|
|
36
|
-
|
|
37
|
-
## Flow Control
|
|
38
|
-
|
|
39
|
-
`continue`, `skip`, `abort "msg"`, `retry {...}`, `queue dlq`, `jump Action then retry`
|
|
40
|
-
|
|
41
|
-
## Reference Files
|
|
42
|
-
|
|
43
|
-
- [references/syntax.md](references/syntax.md) - Full DSL syntax
|
|
44
|
-
- [references/examples.md](references/examples.md) - Complete examples
|