reqon-dsl 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +22 -0
- package/dist/ast/nodes.d.ts +83 -4
- package/dist/ast/nodes.js +14 -0
- package/dist/auth/circuit-breaker.js +7 -6
- package/dist/auth/rate-limiter.d.ts +4 -0
- package/dist/auth/rate-limiter.js +9 -16
- package/dist/cli.d.ts +13 -0
- package/dist/cli.js +84 -4
- package/dist/config/constants.d.ts +141 -0
- package/dist/config/constants.js +128 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.js +4 -0
- package/dist/control/index.d.ts +2 -0
- package/dist/control/index.js +1 -0
- package/dist/control/server.d.ts +88 -0
- package/dist/control/server.js +238 -0
- package/dist/control/types.d.ts +55 -0
- package/dist/control/types.js +7 -0
- package/dist/debug/cli-debugger.d.ts +17 -0
- package/dist/debug/cli-debugger.js +180 -0
- package/dist/debug/controller.d.ts +94 -0
- package/dist/debug/controller.js +45 -0
- package/dist/debug/index.d.ts +6 -0
- package/dist/debug/index.js +5 -0
- package/dist/errors/index.d.ts +67 -0
- package/dist/errors/index.js +89 -1
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/state.d.ts +24 -0
- package/dist/index.d.ts +21 -1
- package/dist/index.js +33 -2
- package/dist/interpreter/context.d.ts +14 -0
- package/dist/interpreter/context.js +15 -0
- package/dist/interpreter/evaluator.d.ts +63 -1
- package/dist/interpreter/evaluator.js +186 -39
- package/dist/interpreter/executor.d.ts +70 -14
- package/dist/interpreter/executor.js +503 -174
- package/dist/interpreter/fetch-handler.d.ts +9 -0
- package/dist/interpreter/fetch-handler.js +133 -24
- package/dist/interpreter/http.d.ts +5 -0
- package/dist/interpreter/http.js +26 -12
- package/dist/interpreter/index.d.ts +3 -1
- package/dist/interpreter/index.js +2 -0
- package/dist/interpreter/pagination.d.ts +11 -2
- package/dist/interpreter/pagination.js +95 -31
- package/dist/interpreter/signals.d.ts +8 -0
- package/dist/interpreter/signals.js +12 -0
- package/dist/interpreter/source-manager.d.ts +75 -0
- package/dist/interpreter/source-manager.js +157 -0
- package/dist/interpreter/step-handlers/apply-handler.d.ts +29 -0
- package/dist/interpreter/step-handlers/apply-handler.js +79 -0
- package/dist/interpreter/step-handlers/for-handler.d.ts +13 -0
- package/dist/interpreter/step-handlers/for-handler.js +71 -4
- package/dist/interpreter/step-handlers/index.d.ts +4 -2
- package/dist/interpreter/step-handlers/index.js +4 -2
- package/dist/interpreter/step-handlers/match-handler.d.ts +9 -0
- package/dist/interpreter/step-handlers/match-handler.js +43 -16
- package/dist/interpreter/step-handlers/pause-handler.d.ts +52 -0
- package/dist/interpreter/step-handlers/pause-handler.js +87 -0
- package/dist/interpreter/step-handlers/store-handler.d.ts +11 -1
- package/dist/interpreter/step-handlers/store-handler.js +45 -13
- package/dist/interpreter/step-handlers/types.d.ts +3 -0
- package/dist/interpreter/step-handlers/validate-handler.d.ts +2 -1
- package/dist/interpreter/step-handlers/validate-handler.js +4 -2
- package/dist/interpreter/step-handlers/webhook-handler.d.ts +3 -0
- package/dist/interpreter/step-handlers/webhook-handler.js +18 -2
- package/dist/interpreter/store-manager.d.ts +46 -0
- package/dist/interpreter/store-manager.js +66 -0
- package/dist/lexer/index.d.ts +11 -4
- package/dist/lexer/index.js +11 -4
- package/dist/lexer/tokens.d.ts +17 -1
- package/dist/lexer/tokens.js +36 -0
- package/dist/mcp/index.d.ts +11 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.js +451 -0
- package/dist/oas/index.d.ts +2 -0
- package/dist/oas/index.js +1 -0
- package/dist/oas/mock-generator.d.ts +12 -0
- package/dist/oas/mock-generator.js +187 -0
- package/dist/observability/events.d.ts +244 -0
- package/dist/observability/events.js +90 -0
- package/dist/observability/index.d.ts +15 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/logger.d.ts +106 -0
- package/dist/observability/logger.js +259 -0
- package/dist/observability/otel.d.ts +135 -0
- package/dist/observability/otel.js +386 -0
- package/dist/parser/action-parser.d.ts +105 -0
- package/dist/parser/action-parser.js +645 -0
- package/dist/parser/expressions.d.ts +13 -0
- package/dist/parser/expressions.js +72 -2
- package/dist/parser/fetch-parser.d.ts +27 -0
- package/dist/parser/fetch-parser.js +269 -0
- package/dist/parser/index.d.ts +17 -0
- package/dist/parser/index.js +17 -0
- package/dist/parser/parser.d.ts +44 -46
- package/dist/parser/parser.js +122 -1070
- package/dist/parser/pipeline-parser.d.ts +12 -0
- package/dist/parser/pipeline-parser.js +52 -0
- package/dist/parser/schedule-parser.d.ts +7 -0
- package/dist/parser/schedule-parser.js +137 -0
- package/dist/parser/source-parser.d.ts +9 -0
- package/dist/parser/source-parser.js +151 -0
- package/dist/pause/index.d.ts +14 -0
- package/dist/pause/index.js +11 -0
- package/dist/pause/manager.d.ts +118 -0
- package/dist/pause/manager.js +245 -0
- package/dist/pause/state.d.ts +93 -0
- package/dist/pause/state.js +103 -0
- package/dist/pause/store.d.ts +61 -0
- package/dist/pause/store.js +156 -0
- package/dist/plugin.d.ts +9 -12
- package/dist/plugin.js +10 -13
- package/dist/stores/factory.d.ts +1 -1
- package/dist/stores/factory.js +3 -2
- package/dist/stores/file.d.ts +26 -0
- package/dist/stores/file.js +64 -10
- package/dist/stores/index.d.ts +16 -1
- package/dist/stores/index.js +16 -1
- package/dist/stores/memory.d.ts +4 -0
- package/dist/stores/memory.js +11 -0
- package/dist/stores/types.d.ts +17 -0
- package/dist/stores/types.js +12 -0
- package/dist/trace/index.d.ts +16 -0
- package/dist/trace/index.js +12 -0
- package/dist/trace/recorder.d.ts +71 -0
- package/dist/trace/recorder.js +144 -0
- package/dist/trace/replay.d.ts +132 -0
- package/dist/trace/replay.js +264 -0
- package/dist/trace/state.d.ts +102 -0
- package/dist/trace/state.js +86 -0
- package/dist/trace/store.d.ts +69 -0
- package/dist/trace/store.js +225 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/type-guards.d.ts +58 -0
- package/dist/utils/type-guards.js +92 -0
- package/dist/webhook/server.js +7 -6
- package/package.json +55 -6
- package/.claude/settings.local.json +0 -31
- package/.claude/skills/api-integration.md +0 -125
- package/.claude/skills/database-schema.md +0 -51
- package/.claude/skills/dsl-design.md +0 -80
- package/.claude/skills/property-testing.md +0 -143
- package/.claude/skills/reqon/SKILL.md +0 -44
- package/.claude/skills/reqon/references/examples.md +0 -206
- package/.claude/skills/reqon/references/syntax.md +0 -263
- package/.claude/skills/vscode-extension.md +0 -113
- package/.github/dependabot.yml +0 -32
- package/.github/pull_request_template.md +0 -21
- package/.github/workflows/ci.yml +0 -174
- package/.github/workflows/release.yml +0 -73
- package/CLAUDE.md +0 -72
- package/CONTRIBUTING.md +0 -161
- package/TODO.md +0 -51
- package/dist/auth/auth.test.d.ts +0 -1
- package/dist/auth/auth.test.js +0 -255
- package/dist/errors/errors.test.d.ts +0 -1
- package/dist/errors/errors.test.js +0 -165
- package/dist/execution/execution.test.d.ts +0 -1
- package/dist/execution/execution.test.js +0 -246
- package/dist/integration.test.d.ts +0 -1
- package/dist/integration.test.js +0 -168
- package/dist/interpreter/evaluator.test.d.ts +0 -1
- package/dist/interpreter/evaluator.test.js +0 -512
- package/dist/interpreter/http.test.d.ts +0 -1
- package/dist/interpreter/http.test.js +0 -299
- package/dist/interpreter/progress.test.d.ts +0 -1
- package/dist/interpreter/progress.test.js +0 -216
- package/dist/interpreter/schema-matcher.test.d.ts +0 -1
- package/dist/interpreter/schema-matcher.test.js +0 -122
- package/dist/lexer/lexer.d.ts +0 -24
- package/dist/lexer/lexer.js +0 -264
- package/dist/lexer/lexer.test.d.ts +0 -1
- package/dist/lexer/lexer.test.js +0 -259
- package/dist/loader/loader.test.d.ts +0 -1
- package/dist/loader/loader.test.js +0 -287
- package/dist/oas/oas.test.d.ts +0 -1
- package/dist/oas/oas.test.js +0 -218
- package/dist/parser/expressions.test.d.ts +0 -1
- package/dist/parser/expressions.test.js +0 -378
- package/dist/parser/match.test.d.ts +0 -1
- package/dist/parser/match.test.js +0 -254
- package/dist/parser/parser.test.d.ts +0 -1
- package/dist/parser/parser.test.js +0 -333
- package/dist/parser/schedule.test.d.ts +0 -1
- package/dist/parser/schedule.test.js +0 -241
- package/dist/scheduler/cron-parser.test.d.ts +0 -1
- package/dist/scheduler/cron-parser.test.js +0 -188
- package/dist/stores/file.test.d.ts +0 -1
- package/dist/stores/file.test.js +0 -165
- package/dist/stores/memory.test.d.ts +0 -1
- package/dist/stores/memory.test.js +0 -157
- package/dist/stores/stores.test.d.ts +0 -1
- package/dist/stores/stores.test.js +0 -158
- package/dist/sync/sync.test.d.ts +0 -1
- package/dist/sync/sync.test.js +0 -221
- package/docusaurus/README.md +0 -41
- package/docusaurus/docs/advanced/execution-state.md +0 -283
- package/docusaurus/docs/advanced/extending-reqon.md +0 -388
- package/docusaurus/docs/advanced/multi-file-missions.md +0 -250
- package/docusaurus/docs/advanced/parallel-execution.md +0 -353
- package/docusaurus/docs/api-reference.md +0 -443
- package/docusaurus/docs/authentication/api-key.md +0 -339
- package/docusaurus/docs/authentication/basic.md +0 -276
- package/docusaurus/docs/authentication/bearer.md +0 -282
- package/docusaurus/docs/authentication/oauth2.md +0 -317
- package/docusaurus/docs/authentication/overview.md +0 -251
- package/docusaurus/docs/cli.md +0 -229
- package/docusaurus/docs/core-concepts/actions.md +0 -286
- package/docusaurus/docs/core-concepts/missions.md +0 -264
- package/docusaurus/docs/core-concepts/schemas.md +0 -353
- package/docusaurus/docs/core-concepts/sources.md +0 -339
- package/docusaurus/docs/core-concepts/stores.md +0 -332
- package/docusaurus/docs/dsl-syntax/expressions.md +0 -361
- package/docusaurus/docs/dsl-syntax/fetch.md +0 -293
- package/docusaurus/docs/dsl-syntax/for-loops.md +0 -324
- package/docusaurus/docs/dsl-syntax/map.md +0 -345
- package/docusaurus/docs/dsl-syntax/match.md +0 -387
- package/docusaurus/docs/dsl-syntax/pipelines.md +0 -397
- package/docusaurus/docs/dsl-syntax/validate.md +0 -401
- package/docusaurus/docs/error-handling/dead-letter-queues.md +0 -399
- package/docusaurus/docs/error-handling/flow-control.md +0 -337
- package/docusaurus/docs/error-handling/retry-strategies.md +0 -368
- package/docusaurus/docs/examples.md +0 -488
- package/docusaurus/docs/getting-started.md +0 -256
- package/docusaurus/docs/http/circuit-breaker.md +0 -401
- package/docusaurus/docs/http/incremental-sync.md +0 -394
- package/docusaurus/docs/http/pagination.md +0 -361
- package/docusaurus/docs/http/rate-limiting.md +0 -383
- package/docusaurus/docs/http/requests.md +0 -328
- package/docusaurus/docs/http/retry.md +0 -402
- package/docusaurus/docs/intro.md +0 -90
- package/docusaurus/docs/openapi/loading-specs.md +0 -305
- package/docusaurus/docs/openapi/operation-calls.md +0 -314
- package/docusaurus/docs/openapi/overview.md +0 -212
- package/docusaurus/docs/openapi/response-validation.md +0 -344
- package/docusaurus/docs/scheduling/cron.md +0 -305
- package/docusaurus/docs/scheduling/daemon-mode.md +0 -317
- package/docusaurus/docs/scheduling/intervals.md +0 -289
- package/docusaurus/docs/scheduling/overview.md +0 -231
- package/docusaurus/docs/stores/custom-adapters.md +0 -376
- package/docusaurus/docs/stores/file.md +0 -236
- package/docusaurus/docs/stores/memory.md +0 -193
- package/docusaurus/docs/stores/overview.md +0 -274
- package/docusaurus/docs/stores/postgrest.md +0 -316
- package/docusaurus/docusaurus.config.ts +0 -148
- package/docusaurus/package-lock.json +0 -18029
- package/docusaurus/package.json +0 -47
- package/docusaurus/sidebars.ts +0 -155
- package/docusaurus/src/components/HomepageFeatures/index.tsx +0 -105
- package/docusaurus/src/components/HomepageFeatures/styles.module.css +0 -12
- package/docusaurus/src/css/custom.css +0 -169
- package/docusaurus/src/pages/index.module.css +0 -48
- package/docusaurus/src/pages/index.tsx +0 -110
- package/docusaurus/src/pages/markdown-page.md +0 -7
- package/docusaurus/static/.nojekyll +0 -0
- package/docusaurus/static/img/docusaurus-social-card.jpg +0 -0
- package/docusaurus/static/img/docusaurus.png +0 -0
- package/docusaurus/static/img/favicon.ico +0 -0
- package/docusaurus/static/img/logo.svg +0 -10
- package/docusaurus/static/img/undraw_docusaurus_mountain.svg +0 -171
- package/docusaurus/static/img/undraw_docusaurus_react.svg +0 -170
- package/docusaurus/static/img/undraw_docusaurus_tree.svg +0 -40
- package/docusaurus/tsconfig.json +0 -8
- package/examples/README.md +0 -112
- package/examples/error-handling/README.md +0 -150
- package/examples/error-handling/payment-processor.vague +0 -287
- package/examples/github-sync/README.md +0 -74
- package/examples/github-sync/fetch-issues.vague +0 -47
- package/examples/github-sync/fetch-prs.vague +0 -40
- package/examples/github-sync/mission.vague +0 -101
- package/examples/github-sync/normalize.vague +0 -70
- package/examples/jsonplaceholder/README.md +0 -28
- package/examples/jsonplaceholder/posts.vague +0 -48
- package/examples/petstore/README.md +0 -35
- package/examples/petstore/openapi.yaml +0 -97
- package/examples/petstore/sync.vague +0 -52
- package/examples/temporal-comparison/README.md +0 -297
- package/examples/temporal-comparison/reconciliation.vague +0 -355
- package/examples/temporal-comparison/temporal/activities/index.ts +0 -8
- package/examples/temporal-comparison/temporal/activities/shipstation.ts +0 -225
- package/examples/temporal-comparison/temporal/activities/shopify.ts +0 -257
- package/examples/temporal-comparison/temporal/activities/storage.ts +0 -198
- package/examples/temporal-comparison/temporal/activities/stripe.ts +0 -169
- package/examples/temporal-comparison/temporal/activities/validation.ts +0 -205
- package/examples/temporal-comparison/temporal/client/schedule.ts +0 -218
- package/examples/temporal-comparison/temporal/config/retry.ts +0 -63
- package/examples/temporal-comparison/temporal/types/index.ts +0 -129
- package/examples/temporal-comparison/temporal/workers/main.ts +0 -130
- package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +0 -262
- package/examples/xero/README.md +0 -88
- package/examples/xero/invoices.vague +0 -189
- package/src/api-integration.test.ts +0 -954
- package/src/ast/index.ts +0 -1
- package/src/ast/nodes.ts +0 -310
- package/src/auth/auth.test.ts +0 -326
- package/src/auth/circuit-breaker.test.ts +0 -390
- package/src/auth/circuit-breaker.ts +0 -379
- package/src/auth/credentials.test.ts +0 -273
- package/src/auth/credentials.ts +0 -246
- package/src/auth/index.ts +0 -40
- package/src/auth/oauth2-provider.ts +0 -177
- package/src/auth/rate-limiter.ts +0 -459
- package/src/auth/token-store.ts +0 -177
- package/src/auth/types.ts +0 -159
- package/src/benchmark/e2e.bench.ts +0 -288
- package/src/benchmark/evaluator.bench.ts +0 -331
- package/src/benchmark/fixtures.ts +0 -295
- package/src/benchmark/index.ts +0 -108
- package/src/benchmark/lexer.bench.ts +0 -69
- package/src/benchmark/parser.bench.ts +0 -103
- package/src/benchmark/resilience.bench.ts +0 -193
- package/src/benchmark/store.bench.ts +0 -147
- package/src/benchmark/utils.ts +0 -230
- package/src/cli.ts +0 -313
- package/src/errors/errors.test.ts +0 -234
- package/src/errors/index.ts +0 -223
- package/src/execution/execution.test.ts +0 -307
- package/src/execution/index.ts +0 -21
- package/src/execution/state.ts +0 -207
- package/src/execution/store.ts +0 -188
- package/src/index.ts +0 -169
- package/src/integration.test.ts +0 -192
- package/src/interpreter/context.ts +0 -57
- package/src/interpreter/evaluator.test.ts +0 -796
- package/src/interpreter/evaluator.ts +0 -245
- package/src/interpreter/executor.ts +0 -946
- package/src/interpreter/fetch-handler.ts +0 -302
- package/src/interpreter/http.test.ts +0 -423
- package/src/interpreter/http.ts +0 -308
- package/src/interpreter/index.ts +0 -32
- package/src/interpreter/pagination.ts +0 -207
- package/src/interpreter/progress.test.ts +0 -276
- package/src/interpreter/schema-matcher.test.ts +0 -160
- package/src/interpreter/schema-matcher.ts +0 -168
- package/src/interpreter/signals.ts +0 -73
- package/src/interpreter/step-handlers/for-handler.ts +0 -65
- package/src/interpreter/step-handlers/index.ts +0 -17
- package/src/interpreter/step-handlers/map-handler.ts +0 -24
- package/src/interpreter/step-handlers/match-handler.ts +0 -101
- package/src/interpreter/step-handlers/store-handler.ts +0 -78
- package/src/interpreter/step-handlers/types.ts +0 -17
- package/src/interpreter/step-handlers/validate-handler.ts +0 -30
- package/src/interpreter/step-handlers/webhook-handler.ts +0 -142
- package/src/lexer/index.ts +0 -18
- package/src/lexer/lexer.test.ts +0 -316
- package/src/lexer/tokens.ts +0 -179
- package/src/loader/index.ts +0 -288
- package/src/loader/loader.test.ts +0 -360
- package/src/oas/index.ts +0 -4
- package/src/oas/loader.ts +0 -126
- package/src/oas/oas.test.ts +0 -254
- package/src/oas/validator.ts +0 -299
- package/src/parser/base.ts +0 -124
- package/src/parser/expressions.test.ts +0 -525
- package/src/parser/expressions.ts +0 -314
- package/src/parser/index.ts +0 -3
- package/src/parser/match.test.ts +0 -296
- package/src/parser/parser.test.ts +0 -739
- package/src/parser/parser.ts +0 -1469
- package/src/parser/schedule.test.ts +0 -287
- package/src/parser/webhook.test.ts +0 -248
- package/src/plugin.ts +0 -83
- package/src/scheduler/cron-parser.test.ts +0 -236
- package/src/scheduler/cron-parser.ts +0 -236
- package/src/scheduler/index.ts +0 -10
- package/src/scheduler/scheduler.ts +0 -443
- package/src/scheduler/types.ts +0 -71
- package/src/stores/factory.ts +0 -104
- package/src/stores/file.test.ts +0 -276
- package/src/stores/file.ts +0 -211
- package/src/stores/index.ts +0 -6
- package/src/stores/memory.test.ts +0 -238
- package/src/stores/memory.ts +0 -63
- package/src/stores/postgrest.test.ts +0 -488
- package/src/stores/postgrest.ts +0 -263
- package/src/stores/stores.test.ts +0 -197
- package/src/stores/types.ts +0 -58
- package/src/sync/index.ts +0 -16
- package/src/sync/state.ts +0 -126
- package/src/sync/store.ts +0 -139
- package/src/sync/sync.test.ts +0 -271
- package/src/utils/async.ts +0 -10
- package/src/utils/file.ts +0 -106
- package/src/utils/index.ts +0 -14
- package/src/utils/logger.ts +0 -53
- package/src/utils/path.ts +0 -47
- package/src/webhook/index.ts +0 -15
- package/src/webhook/server.test.ts +0 -253
- package/src/webhook/server.ts +0 -389
- package/src/webhook/store.ts +0 -239
- package/src/webhook/types.ts +0 -93
- package/tsconfig.json +0 -17
- package/vitest.config.ts +0 -39
|
@@ -1,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
|
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
# Reqon Examples
|
|
2
|
-
|
|
3
|
-
## Simple API Sync
|
|
4
|
-
|
|
5
|
-
```
|
|
6
|
-
mission SyncUsers {
|
|
7
|
-
source API {
|
|
8
|
-
auth: bearer,
|
|
9
|
-
base: "https://api.example.com"
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
store users: memory("users")
|
|
13
|
-
|
|
14
|
-
action FetchUsers {
|
|
15
|
-
get "/users" {
|
|
16
|
-
paginate: page(page, 50),
|
|
17
|
-
until: length(response) == 0
|
|
18
|
-
}
|
|
19
|
-
store response -> users { key: .id }
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
run FetchUsers
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Multi-File Mission Structure
|
|
27
|
-
|
|
28
|
-
```
|
|
29
|
-
project/
|
|
30
|
-
├── mission.vague # Main: sources, stores, schemas, pipeline
|
|
31
|
-
├── fetch-data.vague # Action: FetchData
|
|
32
|
-
├── transform.vague # Action: Transform
|
|
33
|
-
└── validate.vague # Action: Validate
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Actions in separate files are automatically merged into the mission.
|
|
37
|
-
|
|
38
|
-
## Error Handling with Match
|
|
39
|
-
|
|
40
|
-
```
|
|
41
|
-
action FetchWithErrorHandling {
|
|
42
|
-
get "/data"
|
|
43
|
-
|
|
44
|
-
match response {
|
|
45
|
-
[DataSchema] -> {
|
|
46
|
-
store response -> data { key: .id }
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
RateLimitError -> retry {
|
|
50
|
-
maxAttempts: 5,
|
|
51
|
-
backoff: exponential,
|
|
52
|
-
initialDelay: 60000
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
AuthError -> jump RefreshToken then retry,
|
|
56
|
-
|
|
57
|
-
NotFoundError -> abort "Resource not found",
|
|
58
|
-
|
|
59
|
-
_ -> {
|
|
60
|
-
store {
|
|
61
|
-
error: "Unexpected response",
|
|
62
|
-
response: response,
|
|
63
|
-
timestamp: now()
|
|
64
|
-
} -> errors { key: now() }
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
## Data Transformation Pipeline
|
|
71
|
-
|
|
72
|
-
```
|
|
73
|
-
action TransformData {
|
|
74
|
-
for item in raw_items {
|
|
75
|
-
map item -> NormalizedItem {
|
|
76
|
-
id: "item_" + .id,
|
|
77
|
-
title: .name,
|
|
78
|
-
description: .body,
|
|
79
|
-
status: match .state {
|
|
80
|
-
"open" => "active",
|
|
81
|
-
"closed" => "completed",
|
|
82
|
-
_ => "unknown"
|
|
83
|
-
},
|
|
84
|
-
author: .user.login,
|
|
85
|
-
created_at: .created_at,
|
|
86
|
-
synced_at: now()
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
validate response {
|
|
90
|
-
assume length(.title) > 0
|
|
91
|
-
assume .id != null
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
store response -> normalized_items {
|
|
95
|
-
key: .id,
|
|
96
|
-
upsert: true
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## Parallel Execution
|
|
103
|
-
|
|
104
|
-
```
|
|
105
|
-
mission ParallelSync {
|
|
106
|
-
source GitHubAPI { auth: bearer, base: "https://api.github.com" }
|
|
107
|
-
|
|
108
|
-
store issues: memory("issues")
|
|
109
|
-
store prs: memory("prs")
|
|
110
|
-
store work_items: memory("work_items")
|
|
111
|
-
|
|
112
|
-
action FetchIssues {
|
|
113
|
-
get "/repos/{owner}/{repo}/issues"
|
|
114
|
-
store response -> issues { key: .id }
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
action FetchPRs {
|
|
118
|
-
get "/repos/{owner}/{repo}/pulls"
|
|
119
|
-
store response -> prs { key: .id }
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
action Normalize {
|
|
123
|
-
// Process both issues and PRs after parallel fetch
|
|
124
|
-
for issue in issues { ... }
|
|
125
|
-
for pr in prs { ... }
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// FetchIssues and FetchPRs run in parallel, then Normalize
|
|
129
|
-
run [FetchIssues, FetchPRs] then Normalize
|
|
130
|
-
}
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
## Incremental Sync
|
|
134
|
-
|
|
135
|
-
```
|
|
136
|
-
action IncrementalFetch {
|
|
137
|
-
get "/items" {
|
|
138
|
-
body: { "updated_after": lastSync },
|
|
139
|
-
since: lastSync
|
|
140
|
-
}
|
|
141
|
-
store response -> items { key: .id, upsert: true }
|
|
142
|
-
}
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
## Dead Letter Queue Pattern
|
|
146
|
-
|
|
147
|
-
```
|
|
148
|
-
action ProcessWithDLQ {
|
|
149
|
-
for item in pending {
|
|
150
|
-
post "/process/{item.id}"
|
|
151
|
-
|
|
152
|
-
match response {
|
|
153
|
-
SuccessSchema -> {
|
|
154
|
-
store response -> completed { key: .id }
|
|
155
|
-
},
|
|
156
|
-
|
|
157
|
-
TransientError -> retry {
|
|
158
|
-
maxAttempts: 3,
|
|
159
|
-
backoff: exponential,
|
|
160
|
-
initialDelay: 1000
|
|
161
|
-
},
|
|
162
|
-
|
|
163
|
-
// After retries exhausted or permanent error, queue for later
|
|
164
|
-
_ -> queue dead_letter_queue
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## Conditional Processing
|
|
171
|
-
|
|
172
|
-
```
|
|
173
|
-
action ProcessConditionally {
|
|
174
|
-
for payment in pending_payments
|
|
175
|
-
where not exists(fraud_queue[payment.id]) {
|
|
176
|
-
|
|
177
|
-
post "/payments/{payment.id}/capture"
|
|
178
|
-
|
|
179
|
-
match response {
|
|
180
|
-
PaymentSuccess -> {
|
|
181
|
-
store response -> completed { key: .id }
|
|
182
|
-
},
|
|
183
|
-
_ -> skip
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
## OpenAPI Integration
|
|
190
|
-
|
|
191
|
-
```
|
|
192
|
-
mission OpenAPIExample {
|
|
193
|
-
source API from "./openapi.yaml" {
|
|
194
|
-
auth: bearer,
|
|
195
|
-
base: "https://api.example.com"
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
action FetchUsers {
|
|
199
|
-
// Use operation ID from OpenAPI spec
|
|
200
|
-
call API.listUsers { query: { limit: 100 } }
|
|
201
|
-
store response -> users { key: .id }
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
run FetchUsers
|
|
205
|
-
}
|
|
206
|
-
```
|