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,287 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import { mkdir, writeFile, rm } from 'node:fs/promises';
|
|
3
|
-
import { join } from 'node:path';
|
|
4
|
-
import { loadMission, isMissionFolder, getMissionName } from './index.js';
|
|
5
|
-
const TEST_DIR = '.test-missions';
|
|
6
|
-
describe('Mission Loader', () => {
|
|
7
|
-
beforeEach(async () => {
|
|
8
|
-
await mkdir(TEST_DIR, { recursive: true });
|
|
9
|
-
});
|
|
10
|
-
afterEach(async () => {
|
|
11
|
-
await rm(TEST_DIR, { recursive: true, force: true });
|
|
12
|
-
});
|
|
13
|
-
describe('single file loading', () => {
|
|
14
|
-
it('loads a single .reqon file', async () => {
|
|
15
|
-
const filePath = join(TEST_DIR, 'simple.reqon');
|
|
16
|
-
await writeFile(filePath, `
|
|
17
|
-
mission Simple {
|
|
18
|
-
source Api {
|
|
19
|
-
auth: none,
|
|
20
|
-
base: "https://api.example.com"
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
store data: memory("items")
|
|
24
|
-
|
|
25
|
-
action Fetch {
|
|
26
|
-
fetch GET "/items" { source: Api }
|
|
27
|
-
store response -> data
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
run Fetch
|
|
31
|
-
}
|
|
32
|
-
`);
|
|
33
|
-
const result = await loadMission(filePath);
|
|
34
|
-
expect(result.sourceFiles).toHaveLength(1);
|
|
35
|
-
expect(result.sourceFiles[0]).toContain('simple.reqon');
|
|
36
|
-
const mission = result.program.statements.find(s => s.type === 'MissionDefinition');
|
|
37
|
-
expect(mission).toBeDefined();
|
|
38
|
-
expect(mission.name).toBe('Simple');
|
|
39
|
-
expect(mission.actions).toHaveLength(1);
|
|
40
|
-
});
|
|
41
|
-
it('loads a single .vague file', async () => {
|
|
42
|
-
const filePath = join(TEST_DIR, 'simple.vague');
|
|
43
|
-
await writeFile(filePath, `
|
|
44
|
-
mission Simple {
|
|
45
|
-
source Api {
|
|
46
|
-
auth: none,
|
|
47
|
-
base: "https://api.example.com"
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
store data: memory("items")
|
|
51
|
-
|
|
52
|
-
action Fetch {
|
|
53
|
-
fetch GET "/items" { source: Api }
|
|
54
|
-
store response -> data
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
run Fetch
|
|
58
|
-
}
|
|
59
|
-
`);
|
|
60
|
-
const result = await loadMission(filePath);
|
|
61
|
-
expect(result.sourceFiles).toHaveLength(1);
|
|
62
|
-
expect(result.sourceFiles[0]).toContain('simple.vague');
|
|
63
|
-
const mission = result.program.statements.find(s => s.type === 'MissionDefinition');
|
|
64
|
-
expect(mission).toBeDefined();
|
|
65
|
-
expect(mission.name).toBe('Simple');
|
|
66
|
-
});
|
|
67
|
-
});
|
|
68
|
-
describe('folder loading', () => {
|
|
69
|
-
it('loads mission from folder with separate action files', async () => {
|
|
70
|
-
const missionDir = join(TEST_DIR, 'sync-invoices');
|
|
71
|
-
await mkdir(missionDir, { recursive: true });
|
|
72
|
-
// Root mission file
|
|
73
|
-
await writeFile(join(missionDir, 'mission.reqon'), `
|
|
74
|
-
mission SyncInvoices {
|
|
75
|
-
source Xero {
|
|
76
|
-
auth: oauth2,
|
|
77
|
-
base: "https://api.xero.com"
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
store invoices: memory("invoices")
|
|
81
|
-
store details: memory("invoice_details")
|
|
82
|
-
|
|
83
|
-
run FetchList then Hydrate
|
|
84
|
-
}
|
|
85
|
-
`);
|
|
86
|
-
// Action files
|
|
87
|
-
await writeFile(join(missionDir, 'fetch-list.reqon'), `
|
|
88
|
-
action FetchList {
|
|
89
|
-
fetch GET "/invoices" { source: Xero }
|
|
90
|
-
store response -> invoices
|
|
91
|
-
}
|
|
92
|
-
`);
|
|
93
|
-
await writeFile(join(missionDir, 'hydrate.reqon'), `
|
|
94
|
-
action Hydrate {
|
|
95
|
-
for invoice in invoices {
|
|
96
|
-
fetch GET "/invoices/{invoice.id}" { source: Xero }
|
|
97
|
-
store response -> details
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
`);
|
|
101
|
-
const result = await loadMission(missionDir);
|
|
102
|
-
expect(result.sourceFiles).toHaveLength(3);
|
|
103
|
-
expect(result.baseDir).toContain('sync-invoices');
|
|
104
|
-
const mission = result.program.statements.find(s => s.type === 'MissionDefinition');
|
|
105
|
-
expect(mission).toBeDefined();
|
|
106
|
-
expect(mission.name).toBe('SyncInvoices');
|
|
107
|
-
expect(mission.actions).toHaveLength(2);
|
|
108
|
-
const actionNames = mission.actions.map((a) => a.name);
|
|
109
|
-
expect(actionNames).toContain('FetchList');
|
|
110
|
-
expect(actionNames).toContain('Hydrate');
|
|
111
|
-
});
|
|
112
|
-
it('errors if mission.reqon is missing from folder', async () => {
|
|
113
|
-
const missionDir = join(TEST_DIR, 'no-root');
|
|
114
|
-
await mkdir(missionDir, { recursive: true });
|
|
115
|
-
await writeFile(join(missionDir, 'action.reqon'), `
|
|
116
|
-
action SomeAction {
|
|
117
|
-
fetch GET "/test" { source: Api }
|
|
118
|
-
}
|
|
119
|
-
`);
|
|
120
|
-
await expect(loadMission(missionDir)).rejects.toThrow(/must contain a root file/);
|
|
121
|
-
});
|
|
122
|
-
it('errors if action file contains a mission definition', async () => {
|
|
123
|
-
const missionDir = join(TEST_DIR, 'bad-action');
|
|
124
|
-
await mkdir(missionDir, { recursive: true });
|
|
125
|
-
await writeFile(join(missionDir, 'mission.reqon'), `
|
|
126
|
-
mission Main {
|
|
127
|
-
source Api { auth: none, base: "https://api.example.com" }
|
|
128
|
-
store data: memory("data")
|
|
129
|
-
run Fetch
|
|
130
|
-
}
|
|
131
|
-
`);
|
|
132
|
-
await writeFile(join(missionDir, 'nested.reqon'), `
|
|
133
|
-
mission NestedMission {
|
|
134
|
-
source Api { auth: none, base: "https://other.com" }
|
|
135
|
-
store data: memory("data")
|
|
136
|
-
run Something
|
|
137
|
-
}
|
|
138
|
-
`);
|
|
139
|
-
await expect(loadMission(missionDir)).rejects.toThrow(/should not contain a mission definition/);
|
|
140
|
-
});
|
|
141
|
-
it('errors on duplicate action names', async () => {
|
|
142
|
-
const missionDir = join(TEST_DIR, 'duplicate');
|
|
143
|
-
await mkdir(missionDir, { recursive: true });
|
|
144
|
-
await writeFile(join(missionDir, 'mission.reqon'), `
|
|
145
|
-
mission Main {
|
|
146
|
-
source Api { auth: none, base: "https://api.example.com" }
|
|
147
|
-
store data: memory("data")
|
|
148
|
-
|
|
149
|
-
action Fetch {
|
|
150
|
-
fetch GET "/a" { source: Api }
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
run Fetch
|
|
154
|
-
}
|
|
155
|
-
`);
|
|
156
|
-
await writeFile(join(missionDir, 'fetch.reqon'), `
|
|
157
|
-
action Fetch {
|
|
158
|
-
fetch GET "/b" { source: Api }
|
|
159
|
-
}
|
|
160
|
-
`);
|
|
161
|
-
await expect(loadMission(missionDir)).rejects.toThrow(/Duplicate action definition: 'Fetch'/);
|
|
162
|
-
});
|
|
163
|
-
it('errors if pipeline references unknown action', async () => {
|
|
164
|
-
const missionDir = join(TEST_DIR, 'unknown-action');
|
|
165
|
-
await mkdir(missionDir, { recursive: true });
|
|
166
|
-
await writeFile(join(missionDir, 'mission.reqon'), `
|
|
167
|
-
mission Main {
|
|
168
|
-
source Api { auth: none, base: "https://api.example.com" }
|
|
169
|
-
store data: memory("data")
|
|
170
|
-
|
|
171
|
-
action Fetch {
|
|
172
|
-
fetch GET "/items" { source: Api }
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
run Fetch then NonExistent
|
|
176
|
-
}
|
|
177
|
-
`);
|
|
178
|
-
await expect(loadMission(missionDir)).rejects.toThrow(/Pipeline references unknown action: 'NonExistent'/);
|
|
179
|
-
});
|
|
180
|
-
it('supports inline actions alongside external files', async () => {
|
|
181
|
-
const missionDir = join(TEST_DIR, 'mixed');
|
|
182
|
-
await mkdir(missionDir, { recursive: true });
|
|
183
|
-
await writeFile(join(missionDir, 'mission.reqon'), `
|
|
184
|
-
mission Mixed {
|
|
185
|
-
source Api { auth: none, base: "https://api.example.com" }
|
|
186
|
-
store data: memory("data")
|
|
187
|
-
|
|
188
|
-
action InlineAction {
|
|
189
|
-
fetch GET "/inline" { source: Api }
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
run InlineAction then ExternalAction
|
|
193
|
-
}
|
|
194
|
-
`);
|
|
195
|
-
await writeFile(join(missionDir, 'external.reqon'), `
|
|
196
|
-
action ExternalAction {
|
|
197
|
-
fetch GET "/external" { source: Api }
|
|
198
|
-
store response -> data
|
|
199
|
-
}
|
|
200
|
-
`);
|
|
201
|
-
const result = await loadMission(missionDir);
|
|
202
|
-
const mission = result.program.statements.find(s => s.type === 'MissionDefinition');
|
|
203
|
-
expect(mission.actions).toHaveLength(2);
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
describe('isMissionFolder', () => {
|
|
207
|
-
it('returns true for folder with mission.reqon', async () => {
|
|
208
|
-
const missionDir = join(TEST_DIR, 'valid-folder');
|
|
209
|
-
await mkdir(missionDir, { recursive: true });
|
|
210
|
-
await writeFile(join(missionDir, 'mission.reqon'), 'mission X { run A }');
|
|
211
|
-
expect(await isMissionFolder(missionDir)).toBe(true);
|
|
212
|
-
});
|
|
213
|
-
it('returns true for folder with mission.vague', async () => {
|
|
214
|
-
const missionDir = join(TEST_DIR, 'vague-folder');
|
|
215
|
-
await mkdir(missionDir, { recursive: true });
|
|
216
|
-
await writeFile(join(missionDir, 'mission.vague'), 'mission X { run A }');
|
|
217
|
-
expect(await isMissionFolder(missionDir)).toBe(true);
|
|
218
|
-
});
|
|
219
|
-
it('returns false for folder without mission.reqon', async () => {
|
|
220
|
-
const missionDir = join(TEST_DIR, 'invalid-folder');
|
|
221
|
-
await mkdir(missionDir, { recursive: true });
|
|
222
|
-
expect(await isMissionFolder(missionDir)).toBe(false);
|
|
223
|
-
});
|
|
224
|
-
it('returns false for a file', async () => {
|
|
225
|
-
const filePath = join(TEST_DIR, 'file.reqon');
|
|
226
|
-
await writeFile(filePath, 'mission X { run A }');
|
|
227
|
-
expect(await isMissionFolder(filePath)).toBe(false);
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
describe('getMissionName', () => {
|
|
231
|
-
it('extracts name from folder path', () => {
|
|
232
|
-
expect(getMissionName('/path/to/sync-invoices')).toBe('sync-invoices');
|
|
233
|
-
});
|
|
234
|
-
it('extracts name from .reqon file path', () => {
|
|
235
|
-
expect(getMissionName('/path/to/sync-invoices.reqon')).toBe('sync-invoices');
|
|
236
|
-
});
|
|
237
|
-
it('extracts name from .vague file path', () => {
|
|
238
|
-
expect(getMissionName('/path/to/sync-invoices.vague')).toBe('sync-invoices');
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
describe('.vague file priority', () => {
|
|
242
|
-
it('prefers .vague over .reqon in folder mode', async () => {
|
|
243
|
-
const missionDir = join(TEST_DIR, 'both-extensions');
|
|
244
|
-
await mkdir(missionDir, { recursive: true });
|
|
245
|
-
// Create both files - .vague should be preferred
|
|
246
|
-
await writeFile(join(missionDir, 'mission.vague'), `
|
|
247
|
-
mission FromVague {
|
|
248
|
-
source Api { auth: none, base: "https://api.example.com" }
|
|
249
|
-
store data: memory("data")
|
|
250
|
-
action Fetch { fetch GET "/vague" { source: Api } }
|
|
251
|
-
run Fetch
|
|
252
|
-
}
|
|
253
|
-
`);
|
|
254
|
-
await writeFile(join(missionDir, 'mission.reqon'), `
|
|
255
|
-
mission FromReqon {
|
|
256
|
-
source Api { auth: none, base: "https://api.example.com" }
|
|
257
|
-
store data: memory("data")
|
|
258
|
-
action Fetch { fetch GET "/reqon" { source: Api } }
|
|
259
|
-
run Fetch
|
|
260
|
-
}
|
|
261
|
-
`);
|
|
262
|
-
const result = await loadMission(missionDir);
|
|
263
|
-
const mission = result.program.statements.find(s => s.type === 'MissionDefinition');
|
|
264
|
-
expect(mission.name).toBe('FromVague');
|
|
265
|
-
});
|
|
266
|
-
it('loads folder with mission.vague and .vague action files', async () => {
|
|
267
|
-
const missionDir = join(TEST_DIR, 'vague-folder-mode');
|
|
268
|
-
await mkdir(missionDir, { recursive: true });
|
|
269
|
-
await writeFile(join(missionDir, 'mission.vague'), `
|
|
270
|
-
mission VagueMode {
|
|
271
|
-
source Api { auth: none, base: "https://api.example.com" }
|
|
272
|
-
store data: memory("data")
|
|
273
|
-
run Fetch
|
|
274
|
-
}
|
|
275
|
-
`);
|
|
276
|
-
await writeFile(join(missionDir, 'fetch.vague'), `
|
|
277
|
-
action Fetch {
|
|
278
|
-
fetch GET "/items" { source: Api }
|
|
279
|
-
}
|
|
280
|
-
`);
|
|
281
|
-
const result = await loadMission(missionDir);
|
|
282
|
-
expect(result.sourceFiles).toHaveLength(2);
|
|
283
|
-
expect(result.sourceFiles[0]).toContain('mission.vague');
|
|
284
|
-
expect(result.sourceFiles[1]).toContain('fetch.vague');
|
|
285
|
-
});
|
|
286
|
-
});
|
|
287
|
-
});
|
package/dist/oas/oas.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/oas/oas.test.js
DELETED
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeAll } from 'vitest';
|
|
2
|
-
import { loadOAS, resolveOperation, getResponseSchema, clearCache } from './loader.js';
|
|
3
|
-
import { validateResponse } from './validator.js';
|
|
4
|
-
import { ReqonLexer } from '../lexer/index.js';
|
|
5
|
-
import { ReqonParser } from '../parser/parser.js';
|
|
6
|
-
describe('OAS Loader', () => {
|
|
7
|
-
beforeAll(() => {
|
|
8
|
-
clearCache();
|
|
9
|
-
});
|
|
10
|
-
it('loads and parses an OpenAPI spec', async () => {
|
|
11
|
-
const source = await loadOAS('./examples/petstore/openapi.yaml');
|
|
12
|
-
expect(source.baseUrl).toBe('https://api.petstore.example.com/v1');
|
|
13
|
-
expect(source.operations.size).toBe(3);
|
|
14
|
-
expect(source.schemas.size).toBe(2);
|
|
15
|
-
});
|
|
16
|
-
it('resolves operations by operationId', async () => {
|
|
17
|
-
const source = await loadOAS('./examples/petstore/openapi.yaml');
|
|
18
|
-
const listPets = resolveOperation(source, 'listPets');
|
|
19
|
-
expect(listPets.method).toBe('GET');
|
|
20
|
-
expect(listPets.path).toBe('/pets');
|
|
21
|
-
const getPet = resolveOperation(source, 'getPet');
|
|
22
|
-
expect(getPet.method).toBe('GET');
|
|
23
|
-
expect(getPet.path).toBe('/pets/{petId}');
|
|
24
|
-
const createPet = resolveOperation(source, 'createPet');
|
|
25
|
-
expect(createPet.method).toBe('POST');
|
|
26
|
-
expect(createPet.path).toBe('/pets');
|
|
27
|
-
});
|
|
28
|
-
it('throws for unknown operationId', async () => {
|
|
29
|
-
const source = await loadOAS('./examples/petstore/openapi.yaml');
|
|
30
|
-
expect(() => resolveOperation(source, 'unknownOp')).toThrow(/not found/);
|
|
31
|
-
});
|
|
32
|
-
it('extracts response schemas', async () => {
|
|
33
|
-
const source = await loadOAS('./examples/petstore/openapi.yaml');
|
|
34
|
-
const schema = getResponseSchema(source, 'getPet');
|
|
35
|
-
expect(schema).toBeDefined();
|
|
36
|
-
expect(schema?.type).toBe('object');
|
|
37
|
-
expect(schema?.properties).toHaveProperty('id');
|
|
38
|
-
expect(schema?.properties).toHaveProperty('name');
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
describe('OAS Validator', () => {
|
|
42
|
-
it('validates a valid response', () => {
|
|
43
|
-
const schema = {
|
|
44
|
-
type: 'object',
|
|
45
|
-
required: ['id', 'name'],
|
|
46
|
-
properties: {
|
|
47
|
-
id: { type: 'string' },
|
|
48
|
-
name: { type: 'string' },
|
|
49
|
-
age: { type: 'integer', minimum: 0 },
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
const data = { id: '123', name: 'Fluffy', age: 3 };
|
|
53
|
-
const result = validateResponse(data, schema);
|
|
54
|
-
expect(result.valid).toBe(true);
|
|
55
|
-
expect(result.errors).toHaveLength(0);
|
|
56
|
-
});
|
|
57
|
-
it('catches missing required properties', () => {
|
|
58
|
-
const schema = {
|
|
59
|
-
type: 'object',
|
|
60
|
-
required: ['id', 'name'],
|
|
61
|
-
properties: {
|
|
62
|
-
id: { type: 'string' },
|
|
63
|
-
name: { type: 'string' },
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
const data = { id: '123' }; // missing 'name'
|
|
67
|
-
const result = validateResponse(data, schema);
|
|
68
|
-
expect(result.valid).toBe(false);
|
|
69
|
-
expect(result.errors.some(e => e.path === 'name')).toBe(true);
|
|
70
|
-
});
|
|
71
|
-
it('catches type mismatches', () => {
|
|
72
|
-
const schema = {
|
|
73
|
-
type: 'object',
|
|
74
|
-
properties: {
|
|
75
|
-
age: { type: 'integer' },
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
const data = { age: 'not a number' };
|
|
79
|
-
const result = validateResponse(data, schema);
|
|
80
|
-
expect(result.valid).toBe(false);
|
|
81
|
-
expect(result.errors[0].path).toBe('age');
|
|
82
|
-
});
|
|
83
|
-
it('validates arrays', () => {
|
|
84
|
-
const schema = {
|
|
85
|
-
type: 'array',
|
|
86
|
-
items: {
|
|
87
|
-
type: 'object',
|
|
88
|
-
required: ['id'],
|
|
89
|
-
properties: {
|
|
90
|
-
id: { type: 'string' },
|
|
91
|
-
},
|
|
92
|
-
},
|
|
93
|
-
};
|
|
94
|
-
const validData = [{ id: '1' }, { id: '2' }];
|
|
95
|
-
expect(validateResponse(validData, schema).valid).toBe(true);
|
|
96
|
-
const invalidData = [{ id: '1' }, { noId: true }];
|
|
97
|
-
const result = validateResponse(invalidData, schema);
|
|
98
|
-
expect(result.valid).toBe(false);
|
|
99
|
-
expect(result.errors[0].path).toBe('[1].id');
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
describe('OAS Parser Integration', () => {
|
|
103
|
-
function parse(source) {
|
|
104
|
-
const lexer = new ReqonLexer(source);
|
|
105
|
-
const tokens = lexer.tokenize();
|
|
106
|
-
const parser = new ReqonParser(tokens);
|
|
107
|
-
return parser.parse();
|
|
108
|
-
}
|
|
109
|
-
it('parses source with OAS spec path', () => {
|
|
110
|
-
const source = `
|
|
111
|
-
mission TestOAS {
|
|
112
|
-
source Petstore from "./examples/petstore.yaml" {
|
|
113
|
-
auth: bearer
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
store pets: memory("pets")
|
|
117
|
-
|
|
118
|
-
action FetchPets {
|
|
119
|
-
fetch Petstore.listPets
|
|
120
|
-
|
|
121
|
-
store response.pets -> pets {
|
|
122
|
-
key: .id
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
run FetchPets
|
|
127
|
-
}
|
|
128
|
-
`;
|
|
129
|
-
const program = parse(source);
|
|
130
|
-
expect(program.type).toBe('ReqonProgram');
|
|
131
|
-
const mission = program.statements[0];
|
|
132
|
-
if (mission.type === 'MissionDefinition') {
|
|
133
|
-
expect(mission.sources[0].specPath).toBe('./examples/petstore.yaml');
|
|
134
|
-
expect(mission.sources[0].config.base).toBeUndefined();
|
|
135
|
-
const action = mission.actions[0];
|
|
136
|
-
const fetchStep = action.steps[0];
|
|
137
|
-
if (fetchStep.type === 'FetchStep') {
|
|
138
|
-
expect(fetchStep.operationRef).toBeDefined();
|
|
139
|
-
expect(fetchStep.operationRef?.source).toBe('Petstore');
|
|
140
|
-
expect(fetchStep.operationRef?.operationId).toBe('listPets');
|
|
141
|
-
expect(fetchStep.method).toBeUndefined();
|
|
142
|
-
expect(fetchStep.path).toBeUndefined();
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
it('parses source with OAS and explicit base URL override', () => {
|
|
147
|
-
const source = `
|
|
148
|
-
mission TestOAS {
|
|
149
|
-
source Petstore from "./examples/petstore.yaml" {
|
|
150
|
-
auth: bearer,
|
|
151
|
-
base: "https://staging.petstore.com/v1"
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
store pets: memory("pets")
|
|
155
|
-
|
|
156
|
-
action Fetch {
|
|
157
|
-
fetch GET "/custom-path"
|
|
158
|
-
store response -> pets { key: .id }
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
run Fetch
|
|
162
|
-
}
|
|
163
|
-
`;
|
|
164
|
-
const program = parse(source);
|
|
165
|
-
const mission = program.statements[0];
|
|
166
|
-
if (mission.type === 'MissionDefinition') {
|
|
167
|
-
expect(mission.sources[0].specPath).toBe('./examples/petstore.yaml');
|
|
168
|
-
expect(mission.sources[0].config.base).toBe('https://staging.petstore.com/v1');
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
it('supports both OAS and traditional fetch in same mission', () => {
|
|
172
|
-
const source = `
|
|
173
|
-
mission MixedFetch {
|
|
174
|
-
source Petstore from "./examples/petstore.yaml" {
|
|
175
|
-
auth: bearer
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
source Legacy {
|
|
179
|
-
auth: bearer,
|
|
180
|
-
base: "https://legacy.api.com"
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
store pets: memory("pets")
|
|
184
|
-
|
|
185
|
-
action FetchFromOAS {
|
|
186
|
-
fetch Petstore.listPets
|
|
187
|
-
store response.pets -> pets { key: .id }
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
action FetchFromLegacy {
|
|
191
|
-
fetch GET "/old-endpoint" {
|
|
192
|
-
source: Legacy
|
|
193
|
-
}
|
|
194
|
-
store response -> pets { key: .id }
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
run FetchFromOAS then FetchFromLegacy
|
|
198
|
-
}
|
|
199
|
-
`;
|
|
200
|
-
const program = parse(source);
|
|
201
|
-
const mission = program.statements[0];
|
|
202
|
-
if (mission.type === 'MissionDefinition') {
|
|
203
|
-
expect(mission.sources).toHaveLength(2);
|
|
204
|
-
const oasAction = mission.actions[0];
|
|
205
|
-
const legacyAction = mission.actions[1];
|
|
206
|
-
const oasFetch = oasAction.steps[0];
|
|
207
|
-
const legacyFetch = legacyAction.steps[0];
|
|
208
|
-
if (oasFetch.type === 'FetchStep' && legacyFetch.type === 'FetchStep') {
|
|
209
|
-
// OAS fetch
|
|
210
|
-
expect(oasFetch.operationRef).toBeDefined();
|
|
211
|
-
expect(oasFetch.method).toBeUndefined();
|
|
212
|
-
// Traditional fetch
|
|
213
|
-
expect(legacyFetch.operationRef).toBeUndefined();
|
|
214
|
-
expect(legacyFetch.method).toBe('GET');
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|