reqon-dsl 0.2.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/.claude/settings.local.json +31 -0
- package/.claude/skills/api-integration.md +125 -0
- package/.claude/skills/database-schema.md +51 -0
- package/.claude/skills/dsl-design.md +80 -0
- package/.claude/skills/property-testing.md +143 -0
- package/.claude/skills/reqon/SKILL.md +44 -0
- package/.claude/skills/reqon/references/examples.md +206 -0
- package/.claude/skills/reqon/references/syntax.md +263 -0
- package/.claude/skills/vscode-extension.md +113 -0
- package/.github/dependabot.yml +32 -0
- package/.github/pull_request_template.md +21 -0
- package/.github/workflows/ci.yml +174 -0
- package/.github/workflows/release.yml +73 -0
- package/CLAUDE.md +72 -0
- package/CONTRIBUTING.md +161 -0
- package/README.md +235 -0
- package/TODO.md +51 -0
- package/dist/ast/index.d.ts +1 -0
- package/dist/ast/index.js +1 -0
- package/dist/ast/nodes.d.ts +237 -0
- package/dist/ast/nodes.js +12 -0
- package/dist/auth/auth.test.d.ts +1 -0
- package/dist/auth/auth.test.js +255 -0
- package/dist/auth/circuit-breaker.d.ts +115 -0
- package/dist/auth/circuit-breaker.js +267 -0
- package/dist/auth/credentials.d.ts +91 -0
- package/dist/auth/credentials.js +169 -0
- package/dist/auth/index.d.ts +5 -0
- package/dist/auth/index.js +8 -0
- package/dist/auth/oauth2-provider.d.ts +41 -0
- package/dist/auth/oauth2-provider.js +131 -0
- package/dist/auth/rate-limiter.d.ts +61 -0
- package/dist/auth/rate-limiter.js +380 -0
- package/dist/auth/token-store.d.ts +30 -0
- package/dist/auth/token-store.js +148 -0
- package/dist/auth/types.d.ts +142 -0
- package/dist/auth/types.js +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +270 -0
- package/dist/errors/errors.test.d.ts +1 -0
- package/dist/errors/errors.test.js +165 -0
- package/dist/errors/index.d.ts +83 -0
- package/dist/errors/index.js +159 -0
- package/dist/execution/execution.test.d.ts +1 -0
- package/dist/execution/execution.test.js +246 -0
- package/dist/execution/index.d.ts +4 -0
- package/dist/execution/index.js +2 -0
- package/dist/execution/state.d.ts +136 -0
- package/dist/execution/state.js +82 -0
- package/dist/execution/store.d.ts +52 -0
- package/dist/execution/store.js +120 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.js +57 -0
- package/dist/integration.test.d.ts +1 -0
- package/dist/integration.test.js +168 -0
- package/dist/interpreter/context.d.ts +15 -0
- package/dist/interpreter/context.js +29 -0
- package/dist/interpreter/evaluator.d.ts +5 -0
- package/dist/interpreter/evaluator.js +223 -0
- package/dist/interpreter/evaluator.test.d.ts +1 -0
- package/dist/interpreter/evaluator.test.js +512 -0
- package/dist/interpreter/executor.d.ts +131 -0
- package/dist/interpreter/executor.js +663 -0
- package/dist/interpreter/fetch-handler.d.ts +43 -0
- package/dist/interpreter/fetch-handler.js +203 -0
- package/dist/interpreter/http.d.ts +57 -0
- package/dist/interpreter/http.js +210 -0
- package/dist/interpreter/http.test.d.ts +1 -0
- package/dist/interpreter/http.test.js +299 -0
- package/dist/interpreter/index.d.ts +7 -0
- package/dist/interpreter/index.js +7 -0
- package/dist/interpreter/pagination.d.ts +63 -0
- package/dist/interpreter/pagination.js +155 -0
- package/dist/interpreter/progress.test.d.ts +1 -0
- package/dist/interpreter/progress.test.js +216 -0
- package/dist/interpreter/schema-matcher.d.ts +16 -0
- package/dist/interpreter/schema-matcher.js +136 -0
- package/dist/interpreter/schema-matcher.test.d.ts +1 -0
- package/dist/interpreter/schema-matcher.test.js +122 -0
- package/dist/interpreter/signals.d.ts +57 -0
- package/dist/interpreter/signals.js +73 -0
- package/dist/interpreter/step-handlers/for-handler.d.ts +17 -0
- package/dist/interpreter/step-handlers/for-handler.js +51 -0
- package/dist/interpreter/step-handlers/index.d.ts +8 -0
- package/dist/interpreter/step-handlers/index.js +8 -0
- package/dist/interpreter/step-handlers/map-handler.d.ts +10 -0
- package/dist/interpreter/step-handlers/map-handler.js +20 -0
- package/dist/interpreter/step-handlers/match-handler.d.ts +27 -0
- package/dist/interpreter/step-handlers/match-handler.js +61 -0
- package/dist/interpreter/step-handlers/store-handler.d.ts +13 -0
- package/dist/interpreter/step-handlers/store-handler.js +66 -0
- package/dist/interpreter/step-handlers/types.d.ts +15 -0
- package/dist/interpreter/step-handlers/types.js +1 -0
- package/dist/interpreter/step-handlers/validate-handler.d.ts +10 -0
- package/dist/interpreter/step-handlers/validate-handler.js +26 -0
- package/dist/interpreter/step-handlers/webhook-handler.d.ts +36 -0
- package/dist/interpreter/step-handlers/webhook-handler.js +104 -0
- package/dist/lexer/index.d.ts +10 -0
- package/dist/lexer/index.js +12 -0
- package/dist/lexer/lexer.d.ts +24 -0
- package/dist/lexer/lexer.js +264 -0
- package/dist/lexer/lexer.test.d.ts +1 -0
- package/dist/lexer/lexer.test.js +259 -0
- package/dist/lexer/tokens.d.ts +69 -0
- package/dist/lexer/tokens.js +146 -0
- package/dist/loader/index.d.ts +36 -0
- package/dist/loader/index.js +220 -0
- package/dist/loader/loader.test.d.ts +1 -0
- package/dist/loader/loader.test.js +287 -0
- package/dist/oas/index.d.ts +4 -0
- package/dist/oas/index.js +2 -0
- package/dist/oas/loader.d.ts +21 -0
- package/dist/oas/loader.js +82 -0
- package/dist/oas/oas.test.d.ts +1 -0
- package/dist/oas/oas.test.js +218 -0
- package/dist/oas/validator.d.ts +12 -0
- package/dist/oas/validator.js +227 -0
- package/dist/parser/base.d.ts +33 -0
- package/dist/parser/base.js +97 -0
- package/dist/parser/expressions.d.ts +27 -0
- package/dist/parser/expressions.js +248 -0
- package/dist/parser/expressions.test.d.ts +1 -0
- package/dist/parser/expressions.test.js +378 -0
- package/dist/parser/index.d.ts +3 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/match.test.d.ts +1 -0
- package/dist/parser/match.test.js +254 -0
- package/dist/parser/parser.d.ts +68 -0
- package/dist/parser/parser.js +1229 -0
- package/dist/parser/parser.test.d.ts +1 -0
- package/dist/parser/parser.test.js +333 -0
- package/dist/parser/schedule.test.d.ts +1 -0
- package/dist/parser/schedule.test.js +241 -0
- package/dist/plugin.d.ts +35 -0
- package/dist/plugin.js +68 -0
- package/dist/scheduler/cron-parser.d.ts +32 -0
- package/dist/scheduler/cron-parser.js +198 -0
- package/dist/scheduler/cron-parser.test.d.ts +1 -0
- package/dist/scheduler/cron-parser.test.js +188 -0
- package/dist/scheduler/index.d.ts +3 -0
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/scheduler.d.ts +81 -0
- package/dist/scheduler/scheduler.js +376 -0
- package/dist/scheduler/types.d.ts +65 -0
- package/dist/scheduler/types.js +1 -0
- package/dist/stores/factory.d.ts +36 -0
- package/dist/stores/factory.js +73 -0
- package/dist/stores/file.d.ts +60 -0
- package/dist/stores/file.js +173 -0
- package/dist/stores/file.test.d.ts +1 -0
- package/dist/stores/file.test.js +165 -0
- package/dist/stores/index.d.ts +6 -0
- package/dist/stores/index.js +5 -0
- package/dist/stores/memory.d.ts +19 -0
- package/dist/stores/memory.js +51 -0
- package/dist/stores/memory.test.d.ts +1 -0
- package/dist/stores/memory.test.js +157 -0
- package/dist/stores/postgrest.d.ts +55 -0
- package/dist/stores/postgrest.js +217 -0
- package/dist/stores/stores.test.d.ts +1 -0
- package/dist/stores/stores.test.js +158 -0
- package/dist/stores/types.d.ts +31 -0
- package/dist/stores/types.js +26 -0
- package/dist/sync/index.d.ts +4 -0
- package/dist/sync/index.js +2 -0
- package/dist/sync/state.d.ts +69 -0
- package/dist/sync/state.js +66 -0
- package/dist/sync/store.d.ts +49 -0
- package/dist/sync/store.js +93 -0
- package/dist/sync/sync.test.d.ts +1 -0
- package/dist/sync/sync.test.js +221 -0
- package/dist/utils/async.d.ts +7 -0
- package/dist/utils/async.js +9 -0
- package/dist/utils/file.d.ts +38 -0
- package/dist/utils/file.js +92 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/logger.d.ts +34 -0
- package/dist/utils/logger.js +39 -0
- package/dist/utils/path.d.ts +12 -0
- package/dist/utils/path.js +41 -0
- package/dist/webhook/index.d.ts +8 -0
- package/dist/webhook/index.js +7 -0
- package/dist/webhook/server.d.ts +84 -0
- package/dist/webhook/server.js +319 -0
- package/dist/webhook/store.d.ts +67 -0
- package/dist/webhook/store.js +193 -0
- package/dist/webhook/types.d.ts +88 -0
- package/dist/webhook/types.js +6 -0
- package/docusaurus/README.md +41 -0
- package/docusaurus/docs/advanced/execution-state.md +283 -0
- package/docusaurus/docs/advanced/extending-reqon.md +388 -0
- package/docusaurus/docs/advanced/multi-file-missions.md +250 -0
- package/docusaurus/docs/advanced/parallel-execution.md +353 -0
- package/docusaurus/docs/api-reference.md +443 -0
- package/docusaurus/docs/authentication/api-key.md +339 -0
- package/docusaurus/docs/authentication/basic.md +276 -0
- package/docusaurus/docs/authentication/bearer.md +282 -0
- package/docusaurus/docs/authentication/oauth2.md +317 -0
- package/docusaurus/docs/authentication/overview.md +251 -0
- package/docusaurus/docs/cli.md +229 -0
- package/docusaurus/docs/core-concepts/actions.md +286 -0
- package/docusaurus/docs/core-concepts/missions.md +264 -0
- package/docusaurus/docs/core-concepts/schemas.md +353 -0
- package/docusaurus/docs/core-concepts/sources.md +339 -0
- package/docusaurus/docs/core-concepts/stores.md +332 -0
- package/docusaurus/docs/dsl-syntax/expressions.md +361 -0
- package/docusaurus/docs/dsl-syntax/fetch.md +293 -0
- package/docusaurus/docs/dsl-syntax/for-loops.md +324 -0
- package/docusaurus/docs/dsl-syntax/map.md +345 -0
- package/docusaurus/docs/dsl-syntax/match.md +387 -0
- package/docusaurus/docs/dsl-syntax/pipelines.md +397 -0
- package/docusaurus/docs/dsl-syntax/validate.md +401 -0
- package/docusaurus/docs/error-handling/dead-letter-queues.md +399 -0
- package/docusaurus/docs/error-handling/flow-control.md +337 -0
- package/docusaurus/docs/error-handling/retry-strategies.md +368 -0
- package/docusaurus/docs/examples.md +488 -0
- package/docusaurus/docs/getting-started.md +256 -0
- package/docusaurus/docs/http/circuit-breaker.md +401 -0
- package/docusaurus/docs/http/incremental-sync.md +394 -0
- package/docusaurus/docs/http/pagination.md +361 -0
- package/docusaurus/docs/http/rate-limiting.md +383 -0
- package/docusaurus/docs/http/requests.md +328 -0
- package/docusaurus/docs/http/retry.md +402 -0
- package/docusaurus/docs/intro.md +90 -0
- package/docusaurus/docs/openapi/loading-specs.md +305 -0
- package/docusaurus/docs/openapi/operation-calls.md +314 -0
- package/docusaurus/docs/openapi/overview.md +212 -0
- package/docusaurus/docs/openapi/response-validation.md +344 -0
- package/docusaurus/docs/scheduling/cron.md +305 -0
- package/docusaurus/docs/scheduling/daemon-mode.md +317 -0
- package/docusaurus/docs/scheduling/intervals.md +289 -0
- package/docusaurus/docs/scheduling/overview.md +231 -0
- package/docusaurus/docs/stores/custom-adapters.md +376 -0
- package/docusaurus/docs/stores/file.md +236 -0
- package/docusaurus/docs/stores/memory.md +193 -0
- package/docusaurus/docs/stores/overview.md +274 -0
- package/docusaurus/docs/stores/postgrest.md +316 -0
- package/docusaurus/docusaurus.config.ts +148 -0
- package/docusaurus/package-lock.json +18029 -0
- package/docusaurus/package.json +47 -0
- package/docusaurus/sidebars.ts +155 -0
- package/docusaurus/src/components/HomepageFeatures/index.tsx +105 -0
- package/docusaurus/src/components/HomepageFeatures/styles.module.css +12 -0
- package/docusaurus/src/css/custom.css +169 -0
- package/docusaurus/src/pages/index.module.css +48 -0
- package/docusaurus/src/pages/index.tsx +110 -0
- package/docusaurus/src/pages/markdown-page.md +7 -0
- 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 +10 -0
- package/docusaurus/static/img/undraw_docusaurus_mountain.svg +171 -0
- package/docusaurus/static/img/undraw_docusaurus_react.svg +170 -0
- package/docusaurus/static/img/undraw_docusaurus_tree.svg +40 -0
- package/docusaurus/tsconfig.json +8 -0
- package/examples/README.md +112 -0
- package/examples/error-handling/README.md +150 -0
- package/examples/error-handling/payment-processor.vague +287 -0
- package/examples/github-sync/README.md +74 -0
- package/examples/github-sync/fetch-issues.vague +47 -0
- package/examples/github-sync/fetch-prs.vague +40 -0
- package/examples/github-sync/mission.vague +101 -0
- package/examples/github-sync/normalize.vague +70 -0
- package/examples/jsonplaceholder/README.md +28 -0
- package/examples/jsonplaceholder/posts.vague +48 -0
- package/examples/petstore/README.md +35 -0
- package/examples/petstore/openapi.yaml +97 -0
- package/examples/petstore/sync.vague +52 -0
- package/examples/temporal-comparison/README.md +297 -0
- package/examples/temporal-comparison/reconciliation.vague +355 -0
- package/examples/temporal-comparison/temporal/activities/index.ts +8 -0
- package/examples/temporal-comparison/temporal/activities/shipstation.ts +225 -0
- package/examples/temporal-comparison/temporal/activities/shopify.ts +257 -0
- package/examples/temporal-comparison/temporal/activities/storage.ts +198 -0
- package/examples/temporal-comparison/temporal/activities/stripe.ts +169 -0
- package/examples/temporal-comparison/temporal/activities/validation.ts +205 -0
- package/examples/temporal-comparison/temporal/client/schedule.ts +218 -0
- package/examples/temporal-comparison/temporal/config/retry.ts +63 -0
- package/examples/temporal-comparison/temporal/types/index.ts +129 -0
- package/examples/temporal-comparison/temporal/workers/main.ts +130 -0
- package/examples/temporal-comparison/temporal/workflows/orderReconciliation.ts +262 -0
- package/examples/xero/README.md +88 -0
- package/examples/xero/invoices.vague +189 -0
- package/package.json +40 -0
- package/src/api-integration.test.ts +954 -0
- package/src/ast/index.ts +1 -0
- package/src/ast/nodes.ts +310 -0
- package/src/auth/auth.test.ts +326 -0
- package/src/auth/circuit-breaker.test.ts +390 -0
- package/src/auth/circuit-breaker.ts +379 -0
- package/src/auth/credentials.test.ts +273 -0
- package/src/auth/credentials.ts +246 -0
- package/src/auth/index.ts +40 -0
- package/src/auth/oauth2-provider.ts +177 -0
- package/src/auth/rate-limiter.ts +459 -0
- package/src/auth/token-store.ts +177 -0
- package/src/auth/types.ts +159 -0
- package/src/benchmark/e2e.bench.ts +288 -0
- package/src/benchmark/evaluator.bench.ts +331 -0
- package/src/benchmark/fixtures.ts +295 -0
- package/src/benchmark/index.ts +108 -0
- package/src/benchmark/lexer.bench.ts +69 -0
- package/src/benchmark/parser.bench.ts +103 -0
- package/src/benchmark/resilience.bench.ts +193 -0
- package/src/benchmark/store.bench.ts +147 -0
- package/src/benchmark/utils.ts +230 -0
- package/src/cli.ts +313 -0
- package/src/errors/errors.test.ts +234 -0
- package/src/errors/index.ts +223 -0
- package/src/execution/execution.test.ts +307 -0
- package/src/execution/index.ts +21 -0
- package/src/execution/state.ts +207 -0
- package/src/execution/store.ts +188 -0
- package/src/index.ts +169 -0
- package/src/integration.test.ts +192 -0
- package/src/interpreter/context.ts +57 -0
- package/src/interpreter/evaluator.test.ts +796 -0
- package/src/interpreter/evaluator.ts +245 -0
- package/src/interpreter/executor.ts +946 -0
- package/src/interpreter/fetch-handler.ts +302 -0
- package/src/interpreter/http.test.ts +423 -0
- package/src/interpreter/http.ts +308 -0
- package/src/interpreter/index.ts +32 -0
- package/src/interpreter/pagination.ts +207 -0
- package/src/interpreter/progress.test.ts +276 -0
- package/src/interpreter/schema-matcher.test.ts +160 -0
- package/src/interpreter/schema-matcher.ts +168 -0
- package/src/interpreter/signals.ts +73 -0
- package/src/interpreter/step-handlers/for-handler.ts +65 -0
- package/src/interpreter/step-handlers/index.ts +17 -0
- package/src/interpreter/step-handlers/map-handler.ts +24 -0
- package/src/interpreter/step-handlers/match-handler.ts +101 -0
- package/src/interpreter/step-handlers/store-handler.ts +78 -0
- package/src/interpreter/step-handlers/types.ts +17 -0
- package/src/interpreter/step-handlers/validate-handler.ts +30 -0
- package/src/interpreter/step-handlers/webhook-handler.ts +142 -0
- package/src/lexer/index.ts +18 -0
- package/src/lexer/lexer.test.ts +316 -0
- package/src/lexer/tokens.ts +179 -0
- package/src/loader/index.ts +288 -0
- package/src/loader/loader.test.ts +360 -0
- package/src/oas/index.ts +4 -0
- package/src/oas/loader.ts +126 -0
- package/src/oas/oas.test.ts +254 -0
- package/src/oas/validator.ts +299 -0
- package/src/parser/base.ts +124 -0
- package/src/parser/expressions.test.ts +525 -0
- package/src/parser/expressions.ts +314 -0
- package/src/parser/index.ts +3 -0
- package/src/parser/match.test.ts +296 -0
- package/src/parser/parser.test.ts +739 -0
- package/src/parser/parser.ts +1469 -0
- package/src/parser/schedule.test.ts +287 -0
- package/src/parser/webhook.test.ts +248 -0
- package/src/plugin.ts +83 -0
- package/src/scheduler/cron-parser.test.ts +236 -0
- package/src/scheduler/cron-parser.ts +236 -0
- package/src/scheduler/index.ts +10 -0
- package/src/scheduler/scheduler.ts +443 -0
- package/src/scheduler/types.ts +71 -0
- package/src/stores/factory.ts +104 -0
- package/src/stores/file.test.ts +276 -0
- package/src/stores/file.ts +211 -0
- package/src/stores/index.ts +6 -0
- package/src/stores/memory.test.ts +238 -0
- package/src/stores/memory.ts +63 -0
- package/src/stores/postgrest.test.ts +488 -0
- package/src/stores/postgrest.ts +263 -0
- package/src/stores/stores.test.ts +197 -0
- package/src/stores/types.ts +58 -0
- package/src/sync/index.ts +16 -0
- package/src/sync/state.ts +126 -0
- package/src/sync/store.ts +139 -0
- package/src/sync/sync.test.ts +271 -0
- package/src/utils/async.ts +10 -0
- package/src/utils/file.ts +106 -0
- package/src/utils/index.ts +14 -0
- package/src/utils/logger.ts +53 -0
- package/src/utils/path.ts +47 -0
- package/src/webhook/index.ts +15 -0
- package/src/webhook/server.test.ts +253 -0
- package/src/webhook/server.ts +389 -0
- package/src/webhook/store.ts +239 -0
- package/src/webhook/types.ts +93 -0
- package/tsconfig.json +17 -0
- package/vitest.config.ts +39 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
---
|
|
2
|
+
sidebar_position: 4
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Incremental Sync
|
|
6
|
+
|
|
7
|
+
Incremental sync allows you to fetch only changes since the last run, reducing API calls and improving performance.
|
|
8
|
+
|
|
9
|
+
## Basic Usage
|
|
10
|
+
|
|
11
|
+
```vague
|
|
12
|
+
get "/items" {
|
|
13
|
+
since: lastSync
|
|
14
|
+
}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
This automatically:
|
|
18
|
+
1. Checks when the last successful sync occurred
|
|
19
|
+
2. Adds a timestamp parameter to the request
|
|
20
|
+
3. Updates the checkpoint after successful completion
|
|
21
|
+
|
|
22
|
+
## How It Works
|
|
23
|
+
|
|
24
|
+
### First Run
|
|
25
|
+
|
|
26
|
+
On the first run, no `since` parameter is added:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
GET /items
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Subsequent Runs
|
|
33
|
+
|
|
34
|
+
On subsequent runs, the last sync timestamp is used:
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
GET /items?modified_since=2024-01-20T10:30:00Z
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Checkpoint Storage
|
|
41
|
+
|
|
42
|
+
Checkpoints are stored in `.vague-data/` by default:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
.vague-data/
|
|
46
|
+
├── sync-checkpoints.json
|
|
47
|
+
└── stores/
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## Configuration
|
|
51
|
+
|
|
52
|
+
### Custom Parameter Name
|
|
53
|
+
|
|
54
|
+
Specify the API's expected parameter:
|
|
55
|
+
|
|
56
|
+
```vague
|
|
57
|
+
get "/items" {
|
|
58
|
+
since: lastSync,
|
|
59
|
+
sinceParam: "updatedAfter"
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Generates: `?updatedAfter=2024-01-20T10:30:00Z`
|
|
64
|
+
|
|
65
|
+
### Date Format
|
|
66
|
+
|
|
67
|
+
Customize the date format:
|
|
68
|
+
|
|
69
|
+
```vague
|
|
70
|
+
get "/items" {
|
|
71
|
+
since: lastSync,
|
|
72
|
+
sinceFormat: "YYYY-MM-DD"
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Common formats:
|
|
77
|
+
- `"ISO"` - ISO 8601 (default): `2024-01-20T10:30:00Z`
|
|
78
|
+
- `"YYYY-MM-DD"` - Date only: `2024-01-20`
|
|
79
|
+
- `"timestamp"` - Unix timestamp: `1705748400`
|
|
80
|
+
- `"epoch"` - Unix epoch milliseconds: `1705748400000`
|
|
81
|
+
|
|
82
|
+
### Custom Checkpoint Key
|
|
83
|
+
|
|
84
|
+
Override the automatic checkpoint key:
|
|
85
|
+
|
|
86
|
+
```vague
|
|
87
|
+
get "/items" {
|
|
88
|
+
since: lastSync,
|
|
89
|
+
syncKey: "items-main-sync"
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Combining with Pagination
|
|
94
|
+
|
|
95
|
+
```vague
|
|
96
|
+
get "/items" {
|
|
97
|
+
paginate: offset(offset, 100),
|
|
98
|
+
until: length(response.items) == 0,
|
|
99
|
+
since: lastSync
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
The `since` parameter is added to each paginated request.
|
|
104
|
+
|
|
105
|
+
## Combining with Filters
|
|
106
|
+
|
|
107
|
+
```vague
|
|
108
|
+
get "/items" {
|
|
109
|
+
params: {
|
|
110
|
+
status: "active",
|
|
111
|
+
type: "order"
|
|
112
|
+
},
|
|
113
|
+
since: lastSync
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Generates: `?status=active&type=order&modified_since=2024-01-20T10:30:00Z`
|
|
118
|
+
|
|
119
|
+
## Handling Updates
|
|
120
|
+
|
|
121
|
+
Use upsert mode for incremental updates:
|
|
122
|
+
|
|
123
|
+
```vague
|
|
124
|
+
action IncrementalSync {
|
|
125
|
+
get "/items" {
|
|
126
|
+
paginate: offset(offset, 100),
|
|
127
|
+
until: length(response.items) == 0,
|
|
128
|
+
since: lastSync
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
for item in response.items {
|
|
132
|
+
store item -> items { key: .id, upsert: true }
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Per-Source Checkpoints
|
|
138
|
+
|
|
139
|
+
Different sources maintain separate checkpoints:
|
|
140
|
+
|
|
141
|
+
```vague
|
|
142
|
+
mission MultiSourceSync {
|
|
143
|
+
source Xero { auth: oauth2, base: "https://api.xero.com" }
|
|
144
|
+
source QuickBooks { auth: oauth2, base: "https://quickbooks.api.com" }
|
|
145
|
+
|
|
146
|
+
action SyncXero {
|
|
147
|
+
get Xero "/invoices" { since: lastSync }
|
|
148
|
+
// Uses Xero-specific checkpoint
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
action SyncQuickBooks {
|
|
152
|
+
get QuickBooks "/invoices" { since: lastSync }
|
|
153
|
+
// Uses QuickBooks-specific checkpoint
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Per-Endpoint Checkpoints
|
|
159
|
+
|
|
160
|
+
Each endpoint maintains its own checkpoint:
|
|
161
|
+
|
|
162
|
+
```vague
|
|
163
|
+
action SyncAll {
|
|
164
|
+
get "/customers" { since: lastSync }
|
|
165
|
+
// Checkpoint: source-/customers
|
|
166
|
+
|
|
167
|
+
get "/orders" { since: lastSync }
|
|
168
|
+
// Checkpoint: source-/orders
|
|
169
|
+
|
|
170
|
+
get "/products" { since: lastSync }
|
|
171
|
+
// Checkpoint: source-/products
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## Resetting Checkpoints
|
|
176
|
+
|
|
177
|
+
### Via CLI
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# Reset all checkpoints
|
|
181
|
+
rm -rf .vague-data/sync-checkpoints.json
|
|
182
|
+
|
|
183
|
+
# Then run a full sync
|
|
184
|
+
reqon sync.vague
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### Programmatically
|
|
188
|
+
|
|
189
|
+
```typescript
|
|
190
|
+
import { execute, clearSyncCheckpoints } from 'reqon';
|
|
191
|
+
|
|
192
|
+
// Clear all checkpoints
|
|
193
|
+
await clearSyncCheckpoints();
|
|
194
|
+
|
|
195
|
+
// Or clear specific checkpoint
|
|
196
|
+
await clearSyncCheckpoint('source-/items');
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Full Sync vs Incremental
|
|
200
|
+
|
|
201
|
+
### Force Full Sync
|
|
202
|
+
|
|
203
|
+
Sometimes you need a full resync:
|
|
204
|
+
|
|
205
|
+
```vague
|
|
206
|
+
action FullSync {
|
|
207
|
+
get "/items" // No since option = full sync
|
|
208
|
+
store response -> items { key: .id, upsert: true }
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
action IncrementalSync {
|
|
212
|
+
get "/items" { since: lastSync }
|
|
213
|
+
store response -> items { key: .id, upsert: true }
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Use conditional in pipeline
|
|
217
|
+
run IncrementalSync // Default: incremental
|
|
218
|
+
// Or: run FullSync when needed
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Conditional Sync
|
|
222
|
+
|
|
223
|
+
```vague
|
|
224
|
+
action SmartSync {
|
|
225
|
+
get "/status"
|
|
226
|
+
|
|
227
|
+
match response {
|
|
228
|
+
{ needsFullSync: true } -> {
|
|
229
|
+
get "/items"
|
|
230
|
+
store response -> items { key: .id }
|
|
231
|
+
},
|
|
232
|
+
_ -> {
|
|
233
|
+
get "/items" { since: lastSync }
|
|
234
|
+
store response -> items { key: .id, upsert: true }
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
## Handling Deletions
|
|
241
|
+
|
|
242
|
+
Incremental sync doesn't automatically handle deleted items. Handle this based on your API:
|
|
243
|
+
|
|
244
|
+
### Soft Deletes
|
|
245
|
+
|
|
246
|
+
```vague
|
|
247
|
+
get "/items" {
|
|
248
|
+
params: { includeDeleted: true },
|
|
249
|
+
since: lastSync
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
for item in response.items {
|
|
253
|
+
match item {
|
|
254
|
+
{ deleted: true } -> {
|
|
255
|
+
// Remove from local store
|
|
256
|
+
delete items[item.id]
|
|
257
|
+
},
|
|
258
|
+
_ -> store item -> items { key: .id, upsert: true }
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Deletion Endpoint
|
|
264
|
+
|
|
265
|
+
```vague
|
|
266
|
+
action SyncItems {
|
|
267
|
+
get "/items" { since: lastSync }
|
|
268
|
+
store response -> items { key: .id, upsert: true }
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
action SyncDeletions {
|
|
272
|
+
get "/items/deleted" { since: lastSync }
|
|
273
|
+
|
|
274
|
+
for deletion in response.deletions {
|
|
275
|
+
delete items[deletion.id]
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
run [SyncItems, SyncDeletions]
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
## Best Practices
|
|
283
|
+
|
|
284
|
+
### Always Use Upsert
|
|
285
|
+
|
|
286
|
+
```vague
|
|
287
|
+
// Good: handles both new and updated items
|
|
288
|
+
store item -> items { key: .id, upsert: true }
|
|
289
|
+
|
|
290
|
+
// Risky: may fail on duplicates
|
|
291
|
+
store item -> items { key: .id }
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
### Handle Empty Responses
|
|
295
|
+
|
|
296
|
+
```vague
|
|
297
|
+
get "/items" { since: lastSync }
|
|
298
|
+
|
|
299
|
+
match response {
|
|
300
|
+
{ items: [] } -> {
|
|
301
|
+
// No updates since last sync - this is fine
|
|
302
|
+
continue
|
|
303
|
+
},
|
|
304
|
+
_ -> {
|
|
305
|
+
for item in response.items {
|
|
306
|
+
store item -> items { key: .id, upsert: true }
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### Log Sync Progress
|
|
313
|
+
|
|
314
|
+
```vague
|
|
315
|
+
action IncrementalSync {
|
|
316
|
+
get "/items" { since: lastSync }
|
|
317
|
+
|
|
318
|
+
store {
|
|
319
|
+
timestamp: now(),
|
|
320
|
+
itemCount: length(response.items),
|
|
321
|
+
type: "incremental"
|
|
322
|
+
} -> syncLogs
|
|
323
|
+
|
|
324
|
+
for item in response.items {
|
|
325
|
+
store item -> items { key: .id, upsert: true }
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Schedule Regular Syncs
|
|
331
|
+
|
|
332
|
+
```vague
|
|
333
|
+
mission RegularSync {
|
|
334
|
+
schedule: every 15 minutes
|
|
335
|
+
|
|
336
|
+
action Sync {
|
|
337
|
+
get "/items" { since: lastSync }
|
|
338
|
+
store response -> items { key: .id, upsert: true }
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
run Sync
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
## Troubleshooting
|
|
346
|
+
|
|
347
|
+
### Checkpoint Not Updating
|
|
348
|
+
|
|
349
|
+
Checkpoints only update on successful completion. Check for errors:
|
|
350
|
+
|
|
351
|
+
```vague
|
|
352
|
+
action DebugSync {
|
|
353
|
+
get "/items" { since: lastSync }
|
|
354
|
+
|
|
355
|
+
match response {
|
|
356
|
+
{ error: e } -> {
|
|
357
|
+
store { error: e, timestamp: now() } -> syncErrors
|
|
358
|
+
abort e
|
|
359
|
+
},
|
|
360
|
+
_ -> continue
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
for item in response.items {
|
|
364
|
+
store item -> items { key: .id, upsert: true }
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
```
|
|
368
|
+
|
|
369
|
+
### Wrong Date Format
|
|
370
|
+
|
|
371
|
+
Match your API's expected format:
|
|
372
|
+
|
|
373
|
+
```vague
|
|
374
|
+
// For APIs expecting ISO 8601
|
|
375
|
+
get "/items" { since: lastSync }
|
|
376
|
+
|
|
377
|
+
// For APIs expecting Unix timestamp
|
|
378
|
+
get "/items" { since: lastSync, sinceFormat: "timestamp" }
|
|
379
|
+
|
|
380
|
+
// For APIs expecting date only
|
|
381
|
+
get "/items" { since: lastSync, sinceFormat: "YYYY-MM-DD" }
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### Missing Updates
|
|
385
|
+
|
|
386
|
+
Ensure your API uses the same field for filtering:
|
|
387
|
+
|
|
388
|
+
```vague
|
|
389
|
+
// If API uses "updatedAt" field
|
|
390
|
+
get "/items" { since: lastSync, sinceParam: "updatedAt" }
|
|
391
|
+
|
|
392
|
+
// If API uses "modifiedSince" parameter
|
|
393
|
+
get "/items" { since: lastSync, sinceParam: "modifiedSince" }
|
|
394
|
+
```
|