reqon-dsl 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +22 -0
- package/dist/ast/nodes.d.ts +83 -4
- package/dist/ast/nodes.js +14 -0
- package/dist/auth/circuit-breaker.js +7 -6
- package/dist/auth/rate-limiter.d.ts +4 -0
- package/dist/auth/rate-limiter.js +9 -16
- package/dist/cli.d.ts +13 -0
- package/dist/cli.js +84 -4
- package/dist/config/constants.d.ts +141 -0
- package/dist/config/constants.js +128 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.js +4 -0
- package/dist/control/index.d.ts +2 -0
- package/dist/control/index.js +1 -0
- package/dist/control/server.d.ts +88 -0
- package/dist/control/server.js +238 -0
- package/dist/control/types.d.ts +55 -0
- package/dist/control/types.js +7 -0
- package/dist/debug/cli-debugger.d.ts +17 -0
- package/dist/debug/cli-debugger.js +180 -0
- package/dist/debug/controller.d.ts +94 -0
- package/dist/debug/controller.js +45 -0
- package/dist/debug/index.d.ts +6 -0
- package/dist/debug/index.js +5 -0
- package/dist/errors/index.d.ts +67 -0
- package/dist/errors/index.js +89 -1
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/state.d.ts +24 -0
- package/dist/index.d.ts +21 -1
- package/dist/index.js +33 -2
- package/dist/interpreter/context.d.ts +14 -0
- package/dist/interpreter/context.js +15 -0
- package/dist/interpreter/evaluator.d.ts +63 -1
- package/dist/interpreter/evaluator.js +186 -39
- package/dist/interpreter/executor.d.ts +70 -14
- package/dist/interpreter/executor.js +503 -174
- package/dist/interpreter/fetch-handler.d.ts +9 -0
- package/dist/interpreter/fetch-handler.js +133 -24
- package/dist/interpreter/http.d.ts +5 -0
- package/dist/interpreter/http.js +26 -12
- package/dist/interpreter/index.d.ts +3 -1
- package/dist/interpreter/index.js +2 -0
- package/dist/interpreter/pagination.d.ts +11 -2
- package/dist/interpreter/pagination.js +95 -31
- package/dist/interpreter/signals.d.ts +8 -0
- package/dist/interpreter/signals.js +12 -0
- package/dist/interpreter/source-manager.d.ts +75 -0
- package/dist/interpreter/source-manager.js +157 -0
- package/dist/interpreter/step-handlers/apply-handler.d.ts +29 -0
- package/dist/interpreter/step-handlers/apply-handler.js +79 -0
- package/dist/interpreter/step-handlers/for-handler.d.ts +13 -0
- package/dist/interpreter/step-handlers/for-handler.js +71 -4
- package/dist/interpreter/step-handlers/index.d.ts +4 -2
- package/dist/interpreter/step-handlers/index.js +4 -2
- package/dist/interpreter/step-handlers/match-handler.d.ts +9 -0
- package/dist/interpreter/step-handlers/match-handler.js +43 -16
- package/dist/interpreter/step-handlers/pause-handler.d.ts +52 -0
- package/dist/interpreter/step-handlers/pause-handler.js +87 -0
- package/dist/interpreter/step-handlers/store-handler.d.ts +11 -1
- package/dist/interpreter/step-handlers/store-handler.js +45 -13
- package/dist/interpreter/step-handlers/types.d.ts +3 -0
- package/dist/interpreter/step-handlers/validate-handler.d.ts +2 -1
- package/dist/interpreter/step-handlers/validate-handler.js +4 -2
- package/dist/interpreter/step-handlers/webhook-handler.d.ts +3 -0
- package/dist/interpreter/step-handlers/webhook-handler.js +18 -2
- package/dist/interpreter/store-manager.d.ts +46 -0
- package/dist/interpreter/store-manager.js +66 -0
- package/dist/lexer/index.d.ts +11 -4
- package/dist/lexer/index.js +11 -4
- package/dist/lexer/tokens.d.ts +17 -1
- package/dist/lexer/tokens.js +36 -0
- package/dist/mcp/index.d.ts +11 -0
- package/dist/mcp/index.js +11 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.js +451 -0
- package/dist/oas/index.d.ts +2 -0
- package/dist/oas/index.js +1 -0
- package/dist/oas/mock-generator.d.ts +12 -0
- package/dist/oas/mock-generator.js +187 -0
- package/dist/observability/events.d.ts +244 -0
- package/dist/observability/events.js +90 -0
- package/dist/observability/index.d.ts +15 -0
- package/dist/observability/index.js +12 -0
- package/dist/observability/logger.d.ts +106 -0
- package/dist/observability/logger.js +259 -0
- package/dist/observability/otel.d.ts +135 -0
- package/dist/observability/otel.js +386 -0
- package/dist/parser/action-parser.d.ts +105 -0
- package/dist/parser/action-parser.js +645 -0
- package/dist/parser/expressions.d.ts +13 -0
- package/dist/parser/expressions.js +72 -2
- package/dist/parser/fetch-parser.d.ts +27 -0
- package/dist/parser/fetch-parser.js +269 -0
- package/dist/parser/index.d.ts +17 -0
- package/dist/parser/index.js +17 -0
- package/dist/parser/parser.d.ts +44 -46
- package/dist/parser/parser.js +122 -1070
- package/dist/parser/pipeline-parser.d.ts +12 -0
- package/dist/parser/pipeline-parser.js +52 -0
- package/dist/parser/schedule-parser.d.ts +7 -0
- package/dist/parser/schedule-parser.js +137 -0
- package/dist/parser/source-parser.d.ts +9 -0
- package/dist/parser/source-parser.js +151 -0
- package/dist/pause/index.d.ts +14 -0
- package/dist/pause/index.js +11 -0
- package/dist/pause/manager.d.ts +118 -0
- package/dist/pause/manager.js +245 -0
- package/dist/pause/state.d.ts +93 -0
- package/dist/pause/state.js +103 -0
- package/dist/pause/store.d.ts +61 -0
- package/dist/pause/store.js +156 -0
- package/dist/plugin.d.ts +9 -12
- package/dist/plugin.js +10 -13
- package/dist/stores/factory.d.ts +1 -1
- package/dist/stores/factory.js +3 -2
- package/dist/stores/file.d.ts +26 -0
- package/dist/stores/file.js +64 -10
- package/dist/stores/index.d.ts +16 -1
- package/dist/stores/index.js +16 -1
- package/dist/stores/memory.d.ts +4 -0
- package/dist/stores/memory.js +11 -0
- package/dist/stores/types.d.ts +17 -0
- package/dist/stores/types.js +12 -0
- package/dist/trace/index.d.ts +16 -0
- package/dist/trace/index.js +12 -0
- package/dist/trace/recorder.d.ts +71 -0
- package/dist/trace/recorder.js +144 -0
- package/dist/trace/replay.d.ts +132 -0
- package/dist/trace/replay.js +264 -0
- package/dist/trace/state.d.ts +102 -0
- package/dist/trace/state.js +86 -0
- package/dist/trace/store.d.ts +69 -0
- package/dist/trace/store.js +225 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/type-guards.d.ts +58 -0
- package/dist/utils/type-guards.js +92 -0
- package/dist/webhook/server.js +7 -6
- package/package.json +55 -6
- package/.claude/settings.local.json +0 -31
- package/.claude/skills/api-integration.md +0 -125
- package/.claude/skills/database-schema.md +0 -51
- package/.claude/skills/dsl-design.md +0 -80
- package/.claude/skills/property-testing.md +0 -143
- package/.claude/skills/reqon/SKILL.md +0 -44
- package/.claude/skills/reqon/references/examples.md +0 -206
- package/.claude/skills/reqon/references/syntax.md +0 -263
- package/.claude/skills/vscode-extension.md +0 -113
- package/.github/dependabot.yml +0 -32
- package/.github/pull_request_template.md +0 -21
- package/.github/workflows/ci.yml +0 -174
- package/.github/workflows/release.yml +0 -73
- package/CLAUDE.md +0 -72
- package/CONTRIBUTING.md +0 -161
- package/TODO.md +0 -51
- package/dist/auth/auth.test.d.ts +0 -1
- package/dist/auth/auth.test.js +0 -255
- package/dist/errors/errors.test.d.ts +0 -1
- package/dist/errors/errors.test.js +0 -165
- package/dist/execution/execution.test.d.ts +0 -1
- package/dist/execution/execution.test.js +0 -246
- package/dist/integration.test.d.ts +0 -1
- package/dist/integration.test.js +0 -168
- package/dist/interpreter/evaluator.test.d.ts +0 -1
- package/dist/interpreter/evaluator.test.js +0 -512
- package/dist/interpreter/http.test.d.ts +0 -1
- package/dist/interpreter/http.test.js +0 -299
- package/dist/interpreter/progress.test.d.ts +0 -1
- package/dist/interpreter/progress.test.js +0 -216
- package/dist/interpreter/schema-matcher.test.d.ts +0 -1
- package/dist/interpreter/schema-matcher.test.js +0 -122
- package/dist/lexer/lexer.d.ts +0 -24
- package/dist/lexer/lexer.js +0 -264
- package/dist/lexer/lexer.test.d.ts +0 -1
- package/dist/lexer/lexer.test.js +0 -259
- package/dist/loader/loader.test.d.ts +0 -1
- package/dist/loader/loader.test.js +0 -287
- package/dist/oas/oas.test.d.ts +0 -1
- package/dist/oas/oas.test.js +0 -218
- package/dist/parser/expressions.test.d.ts +0 -1
- package/dist/parser/expressions.test.js +0 -378
- package/dist/parser/match.test.d.ts +0 -1
- package/dist/parser/match.test.js +0 -254
- package/dist/parser/parser.test.d.ts +0 -1
- package/dist/parser/parser.test.js +0 -333
- package/dist/parser/schedule.test.d.ts +0 -1
- package/dist/parser/schedule.test.js +0 -241
- package/dist/scheduler/cron-parser.test.d.ts +0 -1
- package/dist/scheduler/cron-parser.test.js +0 -188
- package/dist/stores/file.test.d.ts +0 -1
- package/dist/stores/file.test.js +0 -165
- package/dist/stores/memory.test.d.ts +0 -1
- package/dist/stores/memory.test.js +0 -157
- package/dist/stores/stores.test.d.ts +0 -1
- package/dist/stores/stores.test.js +0 -158
- package/dist/sync/sync.test.d.ts +0 -1
- package/dist/sync/sync.test.js +0 -221
- package/docusaurus/README.md +0 -41
- package/docusaurus/docs/advanced/execution-state.md +0 -283
- package/docusaurus/docs/advanced/extending-reqon.md +0 -388
- package/docusaurus/docs/advanced/multi-file-missions.md +0 -250
- package/docusaurus/docs/advanced/parallel-execution.md +0 -353
- package/docusaurus/docs/api-reference.md +0 -443
- package/docusaurus/docs/authentication/api-key.md +0 -339
- package/docusaurus/docs/authentication/basic.md +0 -276
- package/docusaurus/docs/authentication/bearer.md +0 -282
- package/docusaurus/docs/authentication/oauth2.md +0 -317
- package/docusaurus/docs/authentication/overview.md +0 -251
- package/docusaurus/docs/cli.md +0 -229
- package/docusaurus/docs/core-concepts/actions.md +0 -286
- package/docusaurus/docs/core-concepts/missions.md +0 -264
- package/docusaurus/docs/core-concepts/schemas.md +0 -353
- package/docusaurus/docs/core-concepts/sources.md +0 -339
- package/docusaurus/docs/core-concepts/stores.md +0 -332
- package/docusaurus/docs/dsl-syntax/expressions.md +0 -361
- package/docusaurus/docs/dsl-syntax/fetch.md +0 -293
- package/docusaurus/docs/dsl-syntax/for-loops.md +0 -324
- package/docusaurus/docs/dsl-syntax/map.md +0 -345
- package/docusaurus/docs/dsl-syntax/match.md +0 -387
- package/docusaurus/docs/dsl-syntax/pipelines.md +0 -397
- package/docusaurus/docs/dsl-syntax/validate.md +0 -401
- package/docusaurus/docs/error-handling/dead-letter-queues.md +0 -399
- package/docusaurus/docs/error-handling/flow-control.md +0 -337
- package/docusaurus/docs/error-handling/retry-strategies.md +0 -368
- package/docusaurus/docs/examples.md +0 -488
- package/docusaurus/docs/getting-started.md +0 -256
- package/docusaurus/docs/http/circuit-breaker.md +0 -401
- package/docusaurus/docs/http/incremental-sync.md +0 -394
- package/docusaurus/docs/http/pagination.md +0 -361
- package/docusaurus/docs/http/rate-limiting.md +0 -383
- package/docusaurus/docs/http/requests.md +0 -328
- package/docusaurus/docs/http/retry.md +0 -402
- package/docusaurus/docs/intro.md +0 -90
- package/docusaurus/docs/openapi/loading-specs.md +0 -305
- package/docusaurus/docs/openapi/operation-calls.md +0 -314
- package/docusaurus/docs/openapi/overview.md +0 -212
- package/docusaurus/docs/openapi/response-validation.md +0 -344
- package/docusaurus/docs/scheduling/cron.md +0 -305
- package/docusaurus/docs/scheduling/daemon-mode.md +0 -317
- package/docusaurus/docs/scheduling/intervals.md +0 -289
- package/docusaurus/docs/scheduling/overview.md +0 -231
- package/docusaurus/docs/stores/custom-adapters.md +0 -376
- package/docusaurus/docs/stores/file.md +0 -236
- package/docusaurus/docs/stores/memory.md +0 -193
- package/docusaurus/docs/stores/overview.md +0 -274
- package/docusaurus/docs/stores/postgrest.md +0 -316
- package/docusaurus/docusaurus.config.ts +0 -148
- package/docusaurus/package-lock.json +0 -18029
- package/docusaurus/package.json +0 -47
- package/docusaurus/sidebars.ts +0 -155
- package/docusaurus/src/components/HomepageFeatures/index.tsx +0 -105
- package/docusaurus/src/components/HomepageFeatures/styles.module.css +0 -12
- package/docusaurus/src/css/custom.css +0 -169
- package/docusaurus/src/pages/index.module.css +0 -48
- package/docusaurus/src/pages/index.tsx +0 -110
- package/docusaurus/src/pages/markdown-page.md +0 -7
- package/docusaurus/static/.nojekyll +0 -0
- package/docusaurus/static/img/docusaurus-social-card.jpg +0 -0
- package/docusaurus/static/img/docusaurus.png +0 -0
- package/docusaurus/static/img/favicon.ico +0 -0
- package/docusaurus/static/img/logo.svg +0 -10
- package/docusaurus/static/img/undraw_docusaurus_mountain.svg +0 -171
- package/docusaurus/static/img/undraw_docusaurus_react.svg +0 -170
- package/docusaurus/static/img/undraw_docusaurus_tree.svg +0 -40
- package/docusaurus/tsconfig.json +0 -8
- package/examples/README.md +0 -112
- package/examples/error-handling/README.md +0 -150
- package/examples/error-handling/payment-processor.vague +0 -287
- package/examples/github-sync/README.md +0 -74
- package/examples/github-sync/fetch-issues.vague +0 -47
- package/examples/github-sync/fetch-prs.vague +0 -40
- package/examples/github-sync/mission.vague +0 -101
- package/examples/github-sync/normalize.vague +0 -70
- package/examples/jsonplaceholder/README.md +0 -28
- package/examples/jsonplaceholder/posts.vague +0 -48
- package/examples/petstore/README.md +0 -35
- package/examples/petstore/openapi.yaml +0 -97
- package/examples/petstore/sync.vague +0 -52
- package/examples/temporal-comparison/README.md +0 -297
- package/examples/temporal-comparison/reconciliation.vague +0 -355
- package/examples/temporal-comparison/temporal/activities/index.ts +0 -8
- package/examples/temporal-comparison/temporal/activities/shipstation.ts +0 -225
- package/examples/temporal-comparison/temporal/activities/shopify.ts +0 -257
- package/examples/temporal-comparison/temporal/activities/storage.ts +0 -198
- package/examples/temporal-comparison/temporal/activities/stripe.ts +0 -169
- package/examples/temporal-comparison/temporal/activities/validation.ts +0 -205
- package/examples/temporal-comparison/temporal/client/schedule.ts +0 -218
- package/examples/temporal-comparison/temporal/config/retry.ts +0 -63
- package/examples/temporal-comparison/temporal/types/index.ts +0 -129
- package/examples/temporal-comparison/temporal/workers/main.ts +0 -130
- package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +0 -262
- package/examples/xero/README.md +0 -88
- package/examples/xero/invoices.vague +0 -189
- package/src/api-integration.test.ts +0 -954
- package/src/ast/index.ts +0 -1
- package/src/ast/nodes.ts +0 -310
- package/src/auth/auth.test.ts +0 -326
- package/src/auth/circuit-breaker.test.ts +0 -390
- package/src/auth/circuit-breaker.ts +0 -379
- package/src/auth/credentials.test.ts +0 -273
- package/src/auth/credentials.ts +0 -246
- package/src/auth/index.ts +0 -40
- package/src/auth/oauth2-provider.ts +0 -177
- package/src/auth/rate-limiter.ts +0 -459
- package/src/auth/token-store.ts +0 -177
- package/src/auth/types.ts +0 -159
- package/src/benchmark/e2e.bench.ts +0 -288
- package/src/benchmark/evaluator.bench.ts +0 -331
- package/src/benchmark/fixtures.ts +0 -295
- package/src/benchmark/index.ts +0 -108
- package/src/benchmark/lexer.bench.ts +0 -69
- package/src/benchmark/parser.bench.ts +0 -103
- package/src/benchmark/resilience.bench.ts +0 -193
- package/src/benchmark/store.bench.ts +0 -147
- package/src/benchmark/utils.ts +0 -230
- package/src/cli.ts +0 -313
- package/src/errors/errors.test.ts +0 -234
- package/src/errors/index.ts +0 -223
- package/src/execution/execution.test.ts +0 -307
- package/src/execution/index.ts +0 -21
- package/src/execution/state.ts +0 -207
- package/src/execution/store.ts +0 -188
- package/src/index.ts +0 -169
- package/src/integration.test.ts +0 -192
- package/src/interpreter/context.ts +0 -57
- package/src/interpreter/evaluator.test.ts +0 -796
- package/src/interpreter/evaluator.ts +0 -245
- package/src/interpreter/executor.ts +0 -946
- package/src/interpreter/fetch-handler.ts +0 -302
- package/src/interpreter/http.test.ts +0 -423
- package/src/interpreter/http.ts +0 -308
- package/src/interpreter/index.ts +0 -32
- package/src/interpreter/pagination.ts +0 -207
- package/src/interpreter/progress.test.ts +0 -276
- package/src/interpreter/schema-matcher.test.ts +0 -160
- package/src/interpreter/schema-matcher.ts +0 -168
- package/src/interpreter/signals.ts +0 -73
- package/src/interpreter/step-handlers/for-handler.ts +0 -65
- package/src/interpreter/step-handlers/index.ts +0 -17
- package/src/interpreter/step-handlers/map-handler.ts +0 -24
- package/src/interpreter/step-handlers/match-handler.ts +0 -101
- package/src/interpreter/step-handlers/store-handler.ts +0 -78
- package/src/interpreter/step-handlers/types.ts +0 -17
- package/src/interpreter/step-handlers/validate-handler.ts +0 -30
- package/src/interpreter/step-handlers/webhook-handler.ts +0 -142
- package/src/lexer/index.ts +0 -18
- package/src/lexer/lexer.test.ts +0 -316
- package/src/lexer/tokens.ts +0 -179
- package/src/loader/index.ts +0 -288
- package/src/loader/loader.test.ts +0 -360
- package/src/oas/index.ts +0 -4
- package/src/oas/loader.ts +0 -126
- package/src/oas/oas.test.ts +0 -254
- package/src/oas/validator.ts +0 -299
- package/src/parser/base.ts +0 -124
- package/src/parser/expressions.test.ts +0 -525
- package/src/parser/expressions.ts +0 -314
- package/src/parser/index.ts +0 -3
- package/src/parser/match.test.ts +0 -296
- package/src/parser/parser.test.ts +0 -739
- package/src/parser/parser.ts +0 -1469
- package/src/parser/schedule.test.ts +0 -287
- package/src/parser/webhook.test.ts +0 -248
- package/src/plugin.ts +0 -83
- package/src/scheduler/cron-parser.test.ts +0 -236
- package/src/scheduler/cron-parser.ts +0 -236
- package/src/scheduler/index.ts +0 -10
- package/src/scheduler/scheduler.ts +0 -443
- package/src/scheduler/types.ts +0 -71
- package/src/stores/factory.ts +0 -104
- package/src/stores/file.test.ts +0 -276
- package/src/stores/file.ts +0 -211
- package/src/stores/index.ts +0 -6
- package/src/stores/memory.test.ts +0 -238
- package/src/stores/memory.ts +0 -63
- package/src/stores/postgrest.test.ts +0 -488
- package/src/stores/postgrest.ts +0 -263
- package/src/stores/stores.test.ts +0 -197
- package/src/stores/types.ts +0 -58
- package/src/sync/index.ts +0 -16
- package/src/sync/state.ts +0 -126
- package/src/sync/store.ts +0 -139
- package/src/sync/sync.test.ts +0 -271
- package/src/utils/async.ts +0 -10
- package/src/utils/file.ts +0 -106
- package/src/utils/index.ts +0 -14
- package/src/utils/logger.ts +0 -53
- package/src/utils/path.ts +0 -47
- package/src/webhook/index.ts +0 -15
- package/src/webhook/server.test.ts +0 -253
- package/src/webhook/server.ts +0 -389
- package/src/webhook/store.ts +0 -239
- package/src/webhook/types.ts +0 -93
- package/tsconfig.json +0 -17
- package/vitest.config.ts +0 -39
package/dist/sync/sync.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/sync/sync.test.js
DELETED
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import { rmSync, existsSync } from 'node:fs';
|
|
3
|
-
import { generateCheckpointKey, formatSinceDate, parseSinceDate, EPOCH, } from './state.js';
|
|
4
|
-
import { FileSyncStore, MemorySyncStore } from './store.js';
|
|
5
|
-
import { ReqonLexer } from '../lexer/index.js';
|
|
6
|
-
import { ReqonParser } from '../parser/parser.js';
|
|
7
|
-
const TEST_DIR = '.reqon-test-sync';
|
|
8
|
-
describe('Sync State Utilities', () => {
|
|
9
|
-
describe('generateCheckpointKey', () => {
|
|
10
|
-
it('generates key from source and operationId', () => {
|
|
11
|
-
const key = generateCheckpointKey('Xero', 'getInvoices');
|
|
12
|
-
expect(key).toBe('Xero:getInvoices');
|
|
13
|
-
});
|
|
14
|
-
it('generates key from source and endpoint', () => {
|
|
15
|
-
const key = generateCheckpointKey('API', undefined, '/invoices');
|
|
16
|
-
expect(key).toBe('API:/invoices');
|
|
17
|
-
});
|
|
18
|
-
it('normalizes endpoints (removes trailing slashes)', () => {
|
|
19
|
-
const key = generateCheckpointKey('API', undefined, '/invoices/');
|
|
20
|
-
expect(key).toBe('API:/invoices');
|
|
21
|
-
});
|
|
22
|
-
it('falls back to source only', () => {
|
|
23
|
-
const key = generateCheckpointKey('API');
|
|
24
|
-
expect(key).toBe('API');
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
describe('formatSinceDate', () => {
|
|
28
|
-
const date = new Date('2024-01-15T10:30:00.000Z');
|
|
29
|
-
it('formats as ISO string', () => {
|
|
30
|
-
expect(formatSinceDate(date, 'iso')).toBe('2024-01-15T10:30:00.000Z');
|
|
31
|
-
});
|
|
32
|
-
it('formats as Unix timestamp (seconds)', () => {
|
|
33
|
-
expect(formatSinceDate(date, 'unix')).toBe('1705314600');
|
|
34
|
-
});
|
|
35
|
-
it('formats as Unix timestamp (milliseconds)', () => {
|
|
36
|
-
expect(formatSinceDate(date, 'unix-ms')).toBe('1705314600000');
|
|
37
|
-
});
|
|
38
|
-
it('formats as date only', () => {
|
|
39
|
-
expect(formatSinceDate(date, 'date-only')).toBe('2024-01-15');
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
describe('parseSinceDate', () => {
|
|
43
|
-
it('parses ISO string', () => {
|
|
44
|
-
const result = parseSinceDate('2024-01-15T10:30:00.000Z');
|
|
45
|
-
expect(result).toBeInstanceOf(Date);
|
|
46
|
-
expect(result?.toISOString()).toBe('2024-01-15T10:30:00.000Z');
|
|
47
|
-
});
|
|
48
|
-
it('parses Unix timestamp (seconds)', () => {
|
|
49
|
-
const result = parseSinceDate(1705314600);
|
|
50
|
-
expect(result).toBeInstanceOf(Date);
|
|
51
|
-
expect(result?.getTime()).toBe(1705314600000);
|
|
52
|
-
});
|
|
53
|
-
it('parses Unix timestamp (milliseconds)', () => {
|
|
54
|
-
const result = parseSinceDate(1705314600000);
|
|
55
|
-
expect(result).toBeInstanceOf(Date);
|
|
56
|
-
expect(result?.getTime()).toBe(1705314600000);
|
|
57
|
-
});
|
|
58
|
-
it('returns null for invalid input', () => {
|
|
59
|
-
expect(parseSinceDate('not a date')).toBeNull();
|
|
60
|
-
expect(parseSinceDate(null)).toBeNull();
|
|
61
|
-
expect(parseSinceDate(undefined)).toBeNull();
|
|
62
|
-
});
|
|
63
|
-
it('passes through Date objects', () => {
|
|
64
|
-
const date = new Date();
|
|
65
|
-
expect(parseSinceDate(date)).toBe(date);
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
describe('MemorySyncStore', () => {
|
|
70
|
-
let store;
|
|
71
|
-
beforeEach(() => {
|
|
72
|
-
store = new MemorySyncStore();
|
|
73
|
-
});
|
|
74
|
-
it('returns EPOCH for unknown keys', async () => {
|
|
75
|
-
const lastSync = await store.getLastSync('unknown');
|
|
76
|
-
expect(lastSync.getTime()).toBe(EPOCH.getTime());
|
|
77
|
-
});
|
|
78
|
-
it('records and retrieves sync checkpoints', async () => {
|
|
79
|
-
const syncedAt = new Date();
|
|
80
|
-
await store.recordSync({
|
|
81
|
-
key: 'Xero:getInvoices',
|
|
82
|
-
syncedAt,
|
|
83
|
-
recordCount: 100,
|
|
84
|
-
});
|
|
85
|
-
const lastSync = await store.getLastSync('Xero:getInvoices');
|
|
86
|
-
expect(lastSync.getTime()).toBe(syncedAt.getTime());
|
|
87
|
-
const checkpoint = await store.getCheckpoint('Xero:getInvoices');
|
|
88
|
-
expect(checkpoint?.recordCount).toBe(100);
|
|
89
|
-
});
|
|
90
|
-
it('lists all checkpoints', async () => {
|
|
91
|
-
await store.recordSync({ key: 'A', syncedAt: new Date() });
|
|
92
|
-
await store.recordSync({ key: 'B', syncedAt: new Date() });
|
|
93
|
-
const all = await store.list();
|
|
94
|
-
expect(all).toHaveLength(2);
|
|
95
|
-
});
|
|
96
|
-
it('clears specific checkpoint', async () => {
|
|
97
|
-
await store.recordSync({ key: 'A', syncedAt: new Date() });
|
|
98
|
-
await store.recordSync({ key: 'B', syncedAt: new Date() });
|
|
99
|
-
await store.clear('A');
|
|
100
|
-
expect(await store.getCheckpoint('A')).toBeNull();
|
|
101
|
-
expect(await store.getCheckpoint('B')).not.toBeNull();
|
|
102
|
-
});
|
|
103
|
-
it('clears all checkpoints', async () => {
|
|
104
|
-
await store.recordSync({ key: 'A', syncedAt: new Date() });
|
|
105
|
-
await store.recordSync({ key: 'B', syncedAt: new Date() });
|
|
106
|
-
await store.clearAll();
|
|
107
|
-
const all = await store.list();
|
|
108
|
-
expect(all).toHaveLength(0);
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
describe('FileSyncStore', () => {
|
|
112
|
-
let store;
|
|
113
|
-
beforeEach(() => {
|
|
114
|
-
if (existsSync(TEST_DIR)) {
|
|
115
|
-
rmSync(TEST_DIR, { recursive: true });
|
|
116
|
-
}
|
|
117
|
-
store = new FileSyncStore('test-mission', TEST_DIR);
|
|
118
|
-
});
|
|
119
|
-
afterEach(() => {
|
|
120
|
-
if (existsSync(TEST_DIR)) {
|
|
121
|
-
rmSync(TEST_DIR, { recursive: true });
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
it('creates sync directory', async () => {
|
|
125
|
-
// Trigger initialization by calling any async method
|
|
126
|
-
await store.list();
|
|
127
|
-
expect(existsSync(TEST_DIR)).toBe(true);
|
|
128
|
-
});
|
|
129
|
-
it('persists checkpoints to disk', async () => {
|
|
130
|
-
const syncedAt = new Date();
|
|
131
|
-
await store.recordSync({
|
|
132
|
-
key: 'test-key',
|
|
133
|
-
syncedAt,
|
|
134
|
-
recordCount: 50,
|
|
135
|
-
});
|
|
136
|
-
// Create new store instance
|
|
137
|
-
const newStore = new FileSyncStore('test-mission', TEST_DIR);
|
|
138
|
-
const checkpoint = await newStore.getCheckpoint('test-key');
|
|
139
|
-
expect(checkpoint).not.toBeNull();
|
|
140
|
-
expect(checkpoint?.syncedAt.getTime()).toBe(syncedAt.getTime());
|
|
141
|
-
expect(checkpoint?.recordCount).toBe(50);
|
|
142
|
-
});
|
|
143
|
-
});
|
|
144
|
-
describe('Parser: since config', () => {
|
|
145
|
-
function parse(source) {
|
|
146
|
-
const lexer = new ReqonLexer(source);
|
|
147
|
-
const tokens = lexer.tokenize();
|
|
148
|
-
const parser = new ReqonParser(tokens);
|
|
149
|
-
return parser.parse();
|
|
150
|
-
}
|
|
151
|
-
it('parses since: lastSync', () => {
|
|
152
|
-
const source = `
|
|
153
|
-
mission Test {
|
|
154
|
-
source API { auth: bearer, base: "https://api.example.com" }
|
|
155
|
-
store items: memory("items")
|
|
156
|
-
|
|
157
|
-
action Fetch {
|
|
158
|
-
fetch GET "/items" {
|
|
159
|
-
since: lastSync
|
|
160
|
-
}
|
|
161
|
-
store response -> items { key: .id }
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
run Fetch
|
|
165
|
-
}
|
|
166
|
-
`;
|
|
167
|
-
const program = parse(source);
|
|
168
|
-
const mission = program.statements[0];
|
|
169
|
-
const fetch = mission.actions[0].steps[0];
|
|
170
|
-
expect(fetch.since).toBeDefined();
|
|
171
|
-
expect(fetch.since?.type).toBe('lastSync');
|
|
172
|
-
});
|
|
173
|
-
it('parses since: lastSync("custom-key")', () => {
|
|
174
|
-
const source = `
|
|
175
|
-
mission Test {
|
|
176
|
-
source API { auth: bearer, base: "https://api.example.com" }
|
|
177
|
-
store items: memory("items")
|
|
178
|
-
|
|
179
|
-
action Fetch {
|
|
180
|
-
fetch GET "/items" {
|
|
181
|
-
since: lastSync("my-custom-key")
|
|
182
|
-
}
|
|
183
|
-
store response -> items { key: .id }
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
run Fetch
|
|
187
|
-
}
|
|
188
|
-
`;
|
|
189
|
-
const program = parse(source);
|
|
190
|
-
const mission = program.statements[0];
|
|
191
|
-
const fetch = mission.actions[0].steps[0];
|
|
192
|
-
expect(fetch.since?.type).toBe('lastSync');
|
|
193
|
-
expect(fetch.since?.key).toBe('my-custom-key');
|
|
194
|
-
});
|
|
195
|
-
it('parses since: lastSync with options', () => {
|
|
196
|
-
const source = `
|
|
197
|
-
mission Test {
|
|
198
|
-
source API { auth: bearer, base: "https://api.example.com" }
|
|
199
|
-
store items: memory("items")
|
|
200
|
-
|
|
201
|
-
action Fetch {
|
|
202
|
-
fetch GET "/items" {
|
|
203
|
-
since: lastSync {
|
|
204
|
-
param: "modified_since",
|
|
205
|
-
format: unix
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
store response -> items { key: .id }
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
run Fetch
|
|
212
|
-
}
|
|
213
|
-
`;
|
|
214
|
-
const program = parse(source);
|
|
215
|
-
const mission = program.statements[0];
|
|
216
|
-
const fetch = mission.actions[0].steps[0];
|
|
217
|
-
expect(fetch.since?.type).toBe('lastSync');
|
|
218
|
-
expect(fetch.since?.param).toBe('modified_since');
|
|
219
|
-
expect(fetch.since?.format).toBe('unix');
|
|
220
|
-
});
|
|
221
|
-
});
|
package/docusaurus/README.md
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Website
|
|
2
|
-
|
|
3
|
-
This website is built using [Docusaurus](https://docusaurus.io/), a modern static website generator.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
yarn
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Local Development
|
|
12
|
-
|
|
13
|
-
```bash
|
|
14
|
-
yarn start
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
|
|
18
|
-
|
|
19
|
-
## Build
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
yarn build
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
This command generates static content into the `build` directory and can be served using any static contents hosting service.
|
|
26
|
-
|
|
27
|
-
## Deployment
|
|
28
|
-
|
|
29
|
-
Using SSH:
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
USE_SSH=true yarn deploy
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
Not using SSH:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
GIT_USER=<Your GitHub username> yarn deploy
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.
|
|
@@ -1,283 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
sidebar_position: 2
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Execution State
|
|
6
|
-
|
|
7
|
-
Reqon maintains execution state for resumable missions and audit trails.
|
|
8
|
-
|
|
9
|
-
## State Storage
|
|
10
|
-
|
|
11
|
-
State is stored in `.vague-data/`:
|
|
12
|
-
|
|
13
|
-
```
|
|
14
|
-
.vague-data/
|
|
15
|
-
├── execution/
|
|
16
|
-
│ ├── CustomerSync-2024-01-20T09-00-00.json
|
|
17
|
-
│ └── CustomerSync-2024-01-20T10-00-00.json
|
|
18
|
-
├── sync-checkpoints.json
|
|
19
|
-
└── stores/
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Execution Record
|
|
23
|
-
|
|
24
|
-
Each execution creates a record:
|
|
25
|
-
|
|
26
|
-
```json
|
|
27
|
-
{
|
|
28
|
-
"executionId": "exec_abc123",
|
|
29
|
-
"mission": "CustomerSync",
|
|
30
|
-
"startedAt": "2024-01-20T09:00:00Z",
|
|
31
|
-
"completedAt": "2024-01-20T09:02:30Z",
|
|
32
|
-
"status": "completed",
|
|
33
|
-
"actionsRun": ["FetchCustomers", "TransformCustomers"],
|
|
34
|
-
"errors": [],
|
|
35
|
-
"stores": {
|
|
36
|
-
"customers": {
|
|
37
|
-
"count": 1523,
|
|
38
|
-
"added": 42,
|
|
39
|
-
"updated": 18
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## State Fields
|
|
46
|
-
|
|
47
|
-
| Field | Description |
|
|
48
|
-
|-------|-------------|
|
|
49
|
-
| `executionId` | Unique execution identifier |
|
|
50
|
-
| `mission` | Mission name |
|
|
51
|
-
| `startedAt` | Start timestamp |
|
|
52
|
-
| `completedAt` | Completion timestamp |
|
|
53
|
-
| `status` | `running`, `completed`, `failed`, `interrupted` |
|
|
54
|
-
| `actionsRun` | Actions that completed |
|
|
55
|
-
| `activeStep` | Currently running step (if in progress) |
|
|
56
|
-
| `errors` | Array of errors encountered |
|
|
57
|
-
|
|
58
|
-
## Checkpoints
|
|
59
|
-
|
|
60
|
-
### Sync Checkpoints
|
|
61
|
-
|
|
62
|
-
Track incremental sync progress:
|
|
63
|
-
|
|
64
|
-
```json
|
|
65
|
-
{
|
|
66
|
-
"API-/customers": {
|
|
67
|
-
"lastSync": "2024-01-20T09:00:00Z",
|
|
68
|
-
"itemsSynced": 1523
|
|
69
|
-
},
|
|
70
|
-
"API-/orders": {
|
|
71
|
-
"lastSync": "2024-01-20T08:45:00Z",
|
|
72
|
-
"itemsSynced": 8721
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### Action Checkpoints
|
|
78
|
-
|
|
79
|
-
Track progress within long-running actions:
|
|
80
|
-
|
|
81
|
-
```json
|
|
82
|
-
{
|
|
83
|
-
"FetchCustomers": {
|
|
84
|
-
"page": 15,
|
|
85
|
-
"itemsProcessed": 1500
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## Resumable Execution
|
|
91
|
-
|
|
92
|
-
### Automatic Resume
|
|
93
|
-
|
|
94
|
-
If a mission is interrupted, Reqon can resume:
|
|
95
|
-
|
|
96
|
-
```bash
|
|
97
|
-
reqon ./missions/ --resume
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
### Resume Point Detection
|
|
101
|
-
|
|
102
|
-
```json
|
|
103
|
-
{
|
|
104
|
-
"executionId": "exec_abc123",
|
|
105
|
-
"status": "interrupted",
|
|
106
|
-
"activeStep": {
|
|
107
|
-
"action": "TransformCustomers",
|
|
108
|
-
"index": 523,
|
|
109
|
-
"item": { "id": "cust_524" }
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Resume starts from `item 523` in `TransformCustomers`.
|
|
115
|
-
|
|
116
|
-
## Accessing State
|
|
117
|
-
|
|
118
|
-
### Programmatically
|
|
119
|
-
|
|
120
|
-
```typescript
|
|
121
|
-
import { execute, getExecutionState } from 'reqon';
|
|
122
|
-
|
|
123
|
-
// Get last execution
|
|
124
|
-
const lastState = await getExecutionState('CustomerSync');
|
|
125
|
-
|
|
126
|
-
// Get specific execution
|
|
127
|
-
const state = await getExecutionState('CustomerSync', 'exec_abc123');
|
|
128
|
-
|
|
129
|
-
// Get all executions
|
|
130
|
-
const history = await getExecutionHistory('CustomerSync', { limit: 10 });
|
|
131
|
-
```
|
|
132
|
-
|
|
133
|
-
### Via CLI
|
|
134
|
-
|
|
135
|
-
```bash
|
|
136
|
-
# Show last execution
|
|
137
|
-
reqon status CustomerSync
|
|
138
|
-
|
|
139
|
-
# Show execution history
|
|
140
|
-
reqon history CustomerSync --limit 10
|
|
141
|
-
|
|
142
|
-
# Show specific execution
|
|
143
|
-
reqon status CustomerSync --execution exec_abc123
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
## State Cleanup
|
|
147
|
-
|
|
148
|
-
### Automatic Cleanup
|
|
149
|
-
|
|
150
|
-
```vague
|
|
151
|
-
mission CustomerSync {
|
|
152
|
-
stateRetention: 7 days // Keep 7 days of history
|
|
153
|
-
}
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
### Manual Cleanup
|
|
157
|
-
|
|
158
|
-
```bash
|
|
159
|
-
# Clear old state
|
|
160
|
-
reqon cleanup --older-than 30d
|
|
161
|
-
|
|
162
|
-
# Clear specific mission
|
|
163
|
-
reqon cleanup CustomerSync --all
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
## Monitoring
|
|
167
|
-
|
|
168
|
-
### Execution Callbacks
|
|
169
|
-
|
|
170
|
-
```typescript
|
|
171
|
-
import { execute } from 'reqon';
|
|
172
|
-
|
|
173
|
-
const result = await execute(source, {
|
|
174
|
-
progressCallbacks: {
|
|
175
|
-
onActionStart: (action) => {
|
|
176
|
-
console.log(`Starting: ${action}`);
|
|
177
|
-
},
|
|
178
|
-
onActionComplete: (action, duration) => {
|
|
179
|
-
console.log(`Completed: ${action} in ${duration}ms`);
|
|
180
|
-
},
|
|
181
|
-
onError: (error) => {
|
|
182
|
-
console.error(`Error: ${error.message}`);
|
|
183
|
-
},
|
|
184
|
-
onProgress: (progress) => {
|
|
185
|
-
console.log(`Progress: ${progress.current}/${progress.total}`);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
});
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
### Metrics Export
|
|
192
|
-
|
|
193
|
-
```bash
|
|
194
|
-
reqon ./missions/ --daemon --metrics-port 9090
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
Exposes Prometheus metrics:
|
|
198
|
-
|
|
199
|
-
```
|
|
200
|
-
reqon_execution_duration_seconds{mission="CustomerSync"}
|
|
201
|
-
reqon_execution_items_processed{mission="CustomerSync"}
|
|
202
|
-
reqon_execution_errors_total{mission="CustomerSync"}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
## State Persistence
|
|
206
|
-
|
|
207
|
-
### File-Based (Default)
|
|
208
|
-
|
|
209
|
-
```vague
|
|
210
|
-
mission CustomerSync {
|
|
211
|
-
stateStore: file // Default
|
|
212
|
-
}
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
### Custom State Store
|
|
216
|
-
|
|
217
|
-
```typescript
|
|
218
|
-
import { execute, setStateStore } from 'reqon';
|
|
219
|
-
|
|
220
|
-
setStateStore({
|
|
221
|
-
async save(state) {
|
|
222
|
-
await database.insert('execution_state', state);
|
|
223
|
-
},
|
|
224
|
-
async load(executionId) {
|
|
225
|
-
return database.findOne('execution_state', { executionId });
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
## Best Practices
|
|
231
|
-
|
|
232
|
-
### Enable for Long-Running Missions
|
|
233
|
-
|
|
234
|
-
```vague
|
|
235
|
-
mission LongSync {
|
|
236
|
-
enableState: true
|
|
237
|
-
stateRetention: 30 days
|
|
238
|
-
}
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### Use Checkpoints for Large Datasets
|
|
242
|
-
|
|
243
|
-
```vague
|
|
244
|
-
action ProcessLargeDataset {
|
|
245
|
-
for item in items checkpoint every 100 {
|
|
246
|
-
// State saved every 100 items
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
```
|
|
250
|
-
|
|
251
|
-
### Monitor Execution Health
|
|
252
|
-
|
|
253
|
-
```bash
|
|
254
|
-
# Set up alerting for failed executions
|
|
255
|
-
reqon ./missions/ --daemon --alert-on-failure
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
## Troubleshooting
|
|
259
|
-
|
|
260
|
-
### State Not Persisting
|
|
261
|
-
|
|
262
|
-
Check directory permissions:
|
|
263
|
-
|
|
264
|
-
```bash
|
|
265
|
-
ls -la .vague-data/
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
### Resume Not Working
|
|
269
|
-
|
|
270
|
-
Verify state file exists:
|
|
271
|
-
|
|
272
|
-
```bash
|
|
273
|
-
cat .vague-data/execution/CustomerSync-*.json | jq '.status'
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### State Too Large
|
|
277
|
-
|
|
278
|
-
Reduce retention or clean up:
|
|
279
|
-
|
|
280
|
-
```bash
|
|
281
|
-
du -sh .vague-data/
|
|
282
|
-
reqon cleanup --older-than 7d
|
|
283
|
-
```
|