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,331 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Evaluator benchmarks
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { Expression } from 'vague-lang';
|
|
6
|
+
import { evaluate, interpolatePath } from '../interpreter/evaluator.js';
|
|
7
|
+
import { createContext, setVariable } from '../interpreter/context.js';
|
|
8
|
+
import type { ExecutionContext } from '../interpreter/context.js';
|
|
9
|
+
import { BenchmarkSuite } from './utils.js';
|
|
10
|
+
|
|
11
|
+
// Create a rich test context
|
|
12
|
+
function createTestContext(): ExecutionContext {
|
|
13
|
+
const ctx = createContext();
|
|
14
|
+
|
|
15
|
+
// Set up variables
|
|
16
|
+
setVariable(ctx, 'user', {
|
|
17
|
+
id: '12345',
|
|
18
|
+
firstName: 'John',
|
|
19
|
+
lastName: 'Doe',
|
|
20
|
+
email: 'john@example.com',
|
|
21
|
+
age: 30,
|
|
22
|
+
active: true,
|
|
23
|
+
score: 85,
|
|
24
|
+
tags: ['admin', 'premium', 'verified'],
|
|
25
|
+
nested: {
|
|
26
|
+
level1: {
|
|
27
|
+
level2: {
|
|
28
|
+
level3: {
|
|
29
|
+
value: 42,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
setVariable(ctx, 'items', [
|
|
37
|
+
{ id: 1, name: 'Item 1', price: 10 },
|
|
38
|
+
{ id: 2, name: 'Item 2', price: 20 },
|
|
39
|
+
{ id: 3, name: 'Item 3', price: 30 },
|
|
40
|
+
]);
|
|
41
|
+
|
|
42
|
+
setVariable(ctx, 'a', 10);
|
|
43
|
+
setVariable(ctx, 'b', 20);
|
|
44
|
+
setVariable(ctx, 'c', 30);
|
|
45
|
+
setVariable(ctx, 'x', 5);
|
|
46
|
+
setVariable(ctx, 'y', 15);
|
|
47
|
+
|
|
48
|
+
// Set up response
|
|
49
|
+
ctx.response = {
|
|
50
|
+
data: {
|
|
51
|
+
users: [
|
|
52
|
+
{ id: 1, name: 'User 1' },
|
|
53
|
+
{ id: 2, name: 'User 2' },
|
|
54
|
+
],
|
|
55
|
+
total: 100,
|
|
56
|
+
},
|
|
57
|
+
status: 'success',
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
return ctx;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Expression factories
|
|
64
|
+
function literal(value: string | number | boolean): Expression {
|
|
65
|
+
return { type: 'Literal', value };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function identifier(name: string): Expression {
|
|
69
|
+
return { type: 'Identifier', name };
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function qualifiedName(...parts: string[]): Expression {
|
|
73
|
+
return { type: 'QualifiedName', parts };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function binary(left: Expression, operator: string, right: Expression): Expression {
|
|
77
|
+
return { type: 'BinaryExpression', left, operator, right } as Expression;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function logical(left: Expression, operator: 'and' | 'or', right: Expression): Expression {
|
|
81
|
+
return { type: 'LogicalExpression', left, operator, right } as Expression;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function call(callee: string, ...args: Expression[]): Expression {
|
|
85
|
+
return { type: 'CallExpression', callee, arguments: args } as Expression;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function ternary(condition: Expression, consequent: Expression, alternate: Expression): Expression {
|
|
89
|
+
return { type: 'TernaryExpression', condition, consequent, alternate } as Expression;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function matchExpr(value: Expression, arms: Array<{ pattern: Expression; result: Expression }>): Expression {
|
|
93
|
+
return { type: 'MatchExpression', value, arms } as Expression;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export async function runEvaluatorBenchmarks(): Promise<void> {
|
|
97
|
+
const suite = new BenchmarkSuite('Evaluator');
|
|
98
|
+
const ctx = createTestContext();
|
|
99
|
+
|
|
100
|
+
// Literal evaluation
|
|
101
|
+
suite.addSync('literal-string', () => {
|
|
102
|
+
return evaluate(literal('hello world'), ctx);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
suite.addSync('literal-number', () => {
|
|
106
|
+
return evaluate(literal(42), ctx);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Identifier evaluation
|
|
110
|
+
suite.addSync('identifier-simple', () => {
|
|
111
|
+
return evaluate(identifier('a'), ctx);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
suite.addSync('identifier-object', () => {
|
|
115
|
+
return evaluate(identifier('user'), ctx);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
// Qualified name (nested access)
|
|
119
|
+
suite.addSync('qualified-2-levels', () => {
|
|
120
|
+
return evaluate(qualifiedName('user', 'firstName'), ctx);
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
suite.addSync('qualified-4-levels', () => {
|
|
124
|
+
return evaluate(qualifiedName('user', 'nested', 'level1', 'level2'), ctx);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
suite.addSync('qualified-deep', () => {
|
|
128
|
+
return evaluate(qualifiedName('user', 'nested', 'level1', 'level2', 'level3', 'value'), ctx);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Arithmetic operations
|
|
132
|
+
suite.addSync('arithmetic-add', () => {
|
|
133
|
+
return evaluate(binary(identifier('a'), '+', identifier('b')), ctx);
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
suite.addSync('arithmetic-complex', () => {
|
|
137
|
+
// (a + b) * (c - x) / (y + 1)
|
|
138
|
+
const expr = binary(
|
|
139
|
+
binary(
|
|
140
|
+
binary(identifier('a'), '+', identifier('b')),
|
|
141
|
+
'*',
|
|
142
|
+
binary(identifier('c'), '-', identifier('x'))
|
|
143
|
+
),
|
|
144
|
+
'/',
|
|
145
|
+
binary(identifier('y'), '+', literal(1))
|
|
146
|
+
);
|
|
147
|
+
return evaluate(expr, ctx);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
suite.addSync('arithmetic-deeply-nested', () => {
|
|
151
|
+
// ((a + b) * (c + x)) + ((y - a) * (b - c))
|
|
152
|
+
const expr = binary(
|
|
153
|
+
binary(
|
|
154
|
+
binary(identifier('a'), '+', identifier('b')),
|
|
155
|
+
'*',
|
|
156
|
+
binary(identifier('c'), '+', identifier('x'))
|
|
157
|
+
),
|
|
158
|
+
'+',
|
|
159
|
+
binary(
|
|
160
|
+
binary(identifier('y'), '-', identifier('a')),
|
|
161
|
+
'*',
|
|
162
|
+
binary(identifier('b'), '-', identifier('c'))
|
|
163
|
+
)
|
|
164
|
+
);
|
|
165
|
+
return evaluate(expr, ctx);
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Comparison operations
|
|
169
|
+
suite.addSync('comparison-simple', () => {
|
|
170
|
+
return evaluate(binary(identifier('a'), '<', identifier('b')), ctx);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
suite.addSync('comparison-equality', () => {
|
|
174
|
+
return evaluate(binary(qualifiedName('user', 'active'), '==', literal(true)), ctx);
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
// Logical operations
|
|
178
|
+
suite.addSync('logical-and', () => {
|
|
179
|
+
return evaluate(
|
|
180
|
+
logical(
|
|
181
|
+
binary(identifier('a'), '>', literal(5)),
|
|
182
|
+
'and',
|
|
183
|
+
binary(identifier('b'), '<', literal(30))
|
|
184
|
+
),
|
|
185
|
+
ctx
|
|
186
|
+
);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
suite.addSync('logical-complex', () => {
|
|
190
|
+
// (a > 5 and b < 30) or (c == 30 and x != 10)
|
|
191
|
+
return evaluate(
|
|
192
|
+
logical(
|
|
193
|
+
logical(
|
|
194
|
+
binary(identifier('a'), '>', literal(5)),
|
|
195
|
+
'and',
|
|
196
|
+
binary(identifier('b'), '<', literal(30))
|
|
197
|
+
),
|
|
198
|
+
'or',
|
|
199
|
+
logical(
|
|
200
|
+
binary(identifier('c'), '==', literal(30)),
|
|
201
|
+
'and',
|
|
202
|
+
binary(identifier('x'), '!=', literal(10))
|
|
203
|
+
)
|
|
204
|
+
),
|
|
205
|
+
ctx
|
|
206
|
+
);
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
// Function calls
|
|
210
|
+
suite.addSync('call-length-array', () => {
|
|
211
|
+
return evaluate(call('length', qualifiedName('user', 'tags')), ctx);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
suite.addSync('call-sum', () => {
|
|
215
|
+
return evaluate(call('sum', identifier('items')), ctx);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
suite.addSync('call-first', () => {
|
|
219
|
+
return evaluate(call('first', identifier('items')), ctx);
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
// Ternary expressions
|
|
223
|
+
suite.addSync('ternary-simple', () => {
|
|
224
|
+
return evaluate(
|
|
225
|
+
ternary(
|
|
226
|
+
binary(identifier('a'), '>', literal(5)),
|
|
227
|
+
literal('yes'),
|
|
228
|
+
literal('no')
|
|
229
|
+
),
|
|
230
|
+
ctx
|
|
231
|
+
);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
suite.addSync('ternary-nested', () => {
|
|
235
|
+
return evaluate(
|
|
236
|
+
ternary(
|
|
237
|
+
binary(identifier('a'), '>', literal(50)),
|
|
238
|
+
literal('high'),
|
|
239
|
+
ternary(
|
|
240
|
+
binary(identifier('a'), '>', literal(20)),
|
|
241
|
+
literal('medium'),
|
|
242
|
+
literal('low')
|
|
243
|
+
)
|
|
244
|
+
),
|
|
245
|
+
ctx
|
|
246
|
+
);
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// Match expressions
|
|
250
|
+
suite.addSync('match-3-arms', () => {
|
|
251
|
+
return evaluate(
|
|
252
|
+
matchExpr(qualifiedName('user', 'score'), [
|
|
253
|
+
{ pattern: literal(100), result: literal('perfect') },
|
|
254
|
+
{ pattern: literal(85), result: literal('good') },
|
|
255
|
+
{ pattern: identifier('_'), result: literal('other') },
|
|
256
|
+
]),
|
|
257
|
+
ctx
|
|
258
|
+
);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
suite.addSync('match-6-arms', () => {
|
|
262
|
+
return evaluate(
|
|
263
|
+
matchExpr(identifier('a'), [
|
|
264
|
+
{ pattern: literal(1), result: literal('one') },
|
|
265
|
+
{ pattern: literal(2), result: literal('two') },
|
|
266
|
+
{ pattern: literal(5), result: literal('five') },
|
|
267
|
+
{ pattern: literal(10), result: literal('ten') },
|
|
268
|
+
{ pattern: literal(20), result: literal('twenty') },
|
|
269
|
+
{ pattern: identifier('_'), result: literal('other') },
|
|
270
|
+
]),
|
|
271
|
+
ctx
|
|
272
|
+
);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
// Path interpolation
|
|
276
|
+
suite.addSync('interpolate-simple', () => {
|
|
277
|
+
return interpolatePath('/users/{user.id}', ctx);
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
suite.addSync('interpolate-multiple', () => {
|
|
281
|
+
return interpolatePath('/users/{user.id}/orders/{a}/items/{b}', ctx);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
suite.print();
|
|
285
|
+
|
|
286
|
+
// Stress test suite
|
|
287
|
+
const stressSuite = new BenchmarkSuite('Evaluator Stress Tests');
|
|
288
|
+
|
|
289
|
+
// Many sequential evaluations
|
|
290
|
+
stressSuite.addSync('100-sequential-evals', () => {
|
|
291
|
+
let result: unknown;
|
|
292
|
+
for (let i = 0; i < 100; i++) {
|
|
293
|
+
result = evaluate(binary(identifier('a'), '+', literal(i)), ctx);
|
|
294
|
+
}
|
|
295
|
+
return result;
|
|
296
|
+
}, { iterations: 100 });
|
|
297
|
+
|
|
298
|
+
// Complex nested expression
|
|
299
|
+
const deeplyNestedExpr = binary(
|
|
300
|
+
binary(
|
|
301
|
+
binary(
|
|
302
|
+
binary(identifier('a'), '+', identifier('b')),
|
|
303
|
+
'*',
|
|
304
|
+
binary(identifier('c'), '-', identifier('x'))
|
|
305
|
+
),
|
|
306
|
+
'/',
|
|
307
|
+
binary(
|
|
308
|
+
binary(identifier('y'), '+', literal(1)),
|
|
309
|
+
'*',
|
|
310
|
+
binary(identifier('a'), '-', literal(2))
|
|
311
|
+
)
|
|
312
|
+
),
|
|
313
|
+
'+',
|
|
314
|
+
binary(
|
|
315
|
+
binary(identifier('b'), '*', identifier('c')),
|
|
316
|
+
'-',
|
|
317
|
+
binary(identifier('x'), '/', binary(identifier('y'), '+', literal(1)))
|
|
318
|
+
)
|
|
319
|
+
);
|
|
320
|
+
|
|
321
|
+
stressSuite.addSync('deeply-nested-expression', () => {
|
|
322
|
+
return evaluate(deeplyNestedExpr, ctx);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
stressSuite.print();
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Run if executed directly
|
|
329
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
330
|
+
runEvaluatorBenchmarks().catch(console.error);
|
|
331
|
+
}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSL fixtures of varying complexity for benchmarking
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// Simple: minimal valid DSL
|
|
6
|
+
export const SIMPLE_DSL = `
|
|
7
|
+
mission "simple"
|
|
8
|
+
source api from "https://api.example.com"
|
|
9
|
+
store results in memory
|
|
10
|
+
|
|
11
|
+
action fetchData
|
|
12
|
+
fetch "/data" from api
|
|
13
|
+
store response in results
|
|
14
|
+
`;
|
|
15
|
+
|
|
16
|
+
// Medium: typical real-world usage with mapping and validation
|
|
17
|
+
export const MEDIUM_DSL = `
|
|
18
|
+
mission "medium-complexity"
|
|
19
|
+
source api from "https://api.example.com" with
|
|
20
|
+
auth: bearer "token123"
|
|
21
|
+
rateLimit: 100
|
|
22
|
+
|
|
23
|
+
store users in memory
|
|
24
|
+
store orders in memory
|
|
25
|
+
|
|
26
|
+
action fetchUsers
|
|
27
|
+
fetch "/users" from api
|
|
28
|
+
for user in response.data where user.active == true
|
|
29
|
+
map user -> {
|
|
30
|
+
id: user.id,
|
|
31
|
+
name: user.firstName + " " + user.lastName,
|
|
32
|
+
email: user.email
|
|
33
|
+
}
|
|
34
|
+
validate
|
|
35
|
+
assume id is string
|
|
36
|
+
assume name is string
|
|
37
|
+
assume email is string
|
|
38
|
+
store mapped in users with key: mapped.id
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
action fetchOrders
|
|
42
|
+
fetch "/orders" from api with
|
|
43
|
+
pagination: offset
|
|
44
|
+
pageSize: 50
|
|
45
|
+
for order in response
|
|
46
|
+
map order -> {
|
|
47
|
+
orderId: order.id,
|
|
48
|
+
total: order.amount * 100,
|
|
49
|
+
status: order.status
|
|
50
|
+
}
|
|
51
|
+
store mapped in orders with key: mapped.orderId
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
run fetchUsers then fetchOrders
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
// Complex: multiple sources, conditional logic, nested transformations
|
|
58
|
+
export const COMPLEX_DSL = `
|
|
59
|
+
mission "complex-pipeline"
|
|
60
|
+
source primaryApi from "https://api.primary.com" with
|
|
61
|
+
auth: oauth2 {
|
|
62
|
+
tokenUrl: "https://auth.primary.com/token",
|
|
63
|
+
clientId: "client123",
|
|
64
|
+
clientSecret: "secret456",
|
|
65
|
+
scope: "read write"
|
|
66
|
+
}
|
|
67
|
+
timeout: 30000
|
|
68
|
+
retries: 3
|
|
69
|
+
backoff: exponential
|
|
70
|
+
circuitBreaker: {
|
|
71
|
+
failureThreshold: 5,
|
|
72
|
+
resetTimeout: 60000
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
source secondaryApi from "https://api.secondary.com" with
|
|
76
|
+
auth: apiKey {
|
|
77
|
+
header: "X-API-Key",
|
|
78
|
+
value: "key789"
|
|
79
|
+
}
|
|
80
|
+
rateLimit: 50
|
|
81
|
+
|
|
82
|
+
store products in memory
|
|
83
|
+
store inventory in memory
|
|
84
|
+
store combined in memory
|
|
85
|
+
store errors in memory
|
|
86
|
+
|
|
87
|
+
action fetchProducts
|
|
88
|
+
fetch "/products" from primaryApi with
|
|
89
|
+
pagination: cursor
|
|
90
|
+
pageSize: 100
|
|
91
|
+
since: lastSync
|
|
92
|
+
for product in response.items where product.status != "deleted"
|
|
93
|
+
map product -> {
|
|
94
|
+
sku: product.sku,
|
|
95
|
+
name: product.name,
|
|
96
|
+
price: product.price.amount,
|
|
97
|
+
currency: product.price.currency,
|
|
98
|
+
category: product.category.name,
|
|
99
|
+
tags: product.tags
|
|
100
|
+
}
|
|
101
|
+
validate
|
|
102
|
+
assume sku is string
|
|
103
|
+
assume name is string
|
|
104
|
+
assume price is number
|
|
105
|
+
assume price > 0
|
|
106
|
+
store mapped in products with key: mapped.sku
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
action fetchInventory
|
|
110
|
+
fetch "/inventory" from secondaryApi with
|
|
111
|
+
pagination: page
|
|
112
|
+
pageSize: 200
|
|
113
|
+
for item in response.data
|
|
114
|
+
map item -> {
|
|
115
|
+
sku: item.productSku,
|
|
116
|
+
quantity: item.onHand,
|
|
117
|
+
warehouse: item.location.warehouse,
|
|
118
|
+
lastUpdated: item.updatedAt
|
|
119
|
+
}
|
|
120
|
+
validate
|
|
121
|
+
assume sku is string
|
|
122
|
+
assume quantity is number
|
|
123
|
+
assume quantity >= 0
|
|
124
|
+
store mapped in inventory with key: mapped.sku + "-" + mapped.warehouse
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
action combineData
|
|
128
|
+
for product in products
|
|
129
|
+
for inv in inventory where inv.sku == product.sku
|
|
130
|
+
map { product: product, inventory: inv } -> {
|
|
131
|
+
sku: product.sku,
|
|
132
|
+
name: product.name,
|
|
133
|
+
price: product.price,
|
|
134
|
+
quantity: inv.quantity,
|
|
135
|
+
warehouse: inv.warehouse,
|
|
136
|
+
available: inv.quantity > 0,
|
|
137
|
+
value: product.price * inv.quantity
|
|
138
|
+
}
|
|
139
|
+
store mapped in combined with key: mapped.sku + "-" + mapped.warehouse
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
run [fetchProducts, fetchInventory] then combineData
|
|
144
|
+
`;
|
|
145
|
+
|
|
146
|
+
// Expression-heavy: for evaluator benchmarking
|
|
147
|
+
export const EXPRESSION_HEAVY_DSL = `
|
|
148
|
+
mission "expressions"
|
|
149
|
+
source api from "https://api.example.com"
|
|
150
|
+
store results in memory
|
|
151
|
+
|
|
152
|
+
action calculate
|
|
153
|
+
fetch "/data" from api
|
|
154
|
+
for item in response.items
|
|
155
|
+
map item -> {
|
|
156
|
+
// Arithmetic
|
|
157
|
+
sum: item.a + item.b + item.c,
|
|
158
|
+
product: item.x * item.y * item.z,
|
|
159
|
+
complex: (item.a + item.b) * (item.c - item.d) / (item.e + 1),
|
|
160
|
+
|
|
161
|
+
// String operations
|
|
162
|
+
fullName: item.firstName + " " + item.middleName + " " + item.lastName,
|
|
163
|
+
code: item.prefix + "-" + item.id + "-" + item.suffix,
|
|
164
|
+
|
|
165
|
+
// Boolean logic
|
|
166
|
+
isValid: item.active == true and item.verified == true,
|
|
167
|
+
needsReview: item.score < 50 or item.flagged == true,
|
|
168
|
+
complexCheck: (item.type == "A" or item.type == "B") and item.status != "deleted",
|
|
169
|
+
|
|
170
|
+
// Comparisons
|
|
171
|
+
tier: match item.score
|
|
172
|
+
when score >= 90 then "platinum"
|
|
173
|
+
when score >= 70 then "gold"
|
|
174
|
+
when score >= 50 then "silver"
|
|
175
|
+
else "bronze"
|
|
176
|
+
end,
|
|
177
|
+
|
|
178
|
+
// Nested access
|
|
179
|
+
nested1: item.level1.level2.level3.value,
|
|
180
|
+
nested2: item.data.items[0].nested.field,
|
|
181
|
+
|
|
182
|
+
// Mixed
|
|
183
|
+
final: (item.base * item.multiplier) + item.bonus - item.penalty
|
|
184
|
+
}
|
|
185
|
+
store mapped in results with key: mapped.code
|
|
186
|
+
end
|
|
187
|
+
`;
|
|
188
|
+
|
|
189
|
+
// Large: stress test with many actions and stores
|
|
190
|
+
export function generateLargeDSL(actionCount: number = 20): string {
|
|
191
|
+
const stores = Array.from(
|
|
192
|
+
{ length: actionCount },
|
|
193
|
+
(_, i) => ` store store${i} in memory`
|
|
194
|
+
).join('\n');
|
|
195
|
+
|
|
196
|
+
const actions = Array.from({ length: actionCount }, (_, i) => `
|
|
197
|
+
action action${i}
|
|
198
|
+
fetch "/endpoint${i}" from api with
|
|
199
|
+
pagination: offset
|
|
200
|
+
pageSize: 100
|
|
201
|
+
for item in response.data where item.active == true
|
|
202
|
+
map item -> {
|
|
203
|
+
id: item.id,
|
|
204
|
+
value${i}: item.value * ${i + 1},
|
|
205
|
+
computed: item.a + item.b + ${i}
|
|
206
|
+
}
|
|
207
|
+
validate
|
|
208
|
+
assume id is string
|
|
209
|
+
assume value${i} is number
|
|
210
|
+
store mapped in store${i} with key: mapped.id
|
|
211
|
+
end
|
|
212
|
+
`).join('\n');
|
|
213
|
+
|
|
214
|
+
const runSequence = Array.from(
|
|
215
|
+
{ length: actionCount },
|
|
216
|
+
(_, i) => `action${i}`
|
|
217
|
+
).join(', ');
|
|
218
|
+
|
|
219
|
+
return `
|
|
220
|
+
mission "large-stress-test"
|
|
221
|
+
source api from "https://api.example.com" with
|
|
222
|
+
auth: bearer "token"
|
|
223
|
+
rateLimit: 1000
|
|
224
|
+
|
|
225
|
+
${stores}
|
|
226
|
+
|
|
227
|
+
${actions}
|
|
228
|
+
|
|
229
|
+
run [${runSequence}]
|
|
230
|
+
`;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Deeply nested expressions for evaluator stress testing
|
|
234
|
+
export const DEEPLY_NESTED_EXPRESSIONS = `
|
|
235
|
+
mission "nested-expressions"
|
|
236
|
+
source api from "https://api.example.com"
|
|
237
|
+
store results in memory
|
|
238
|
+
|
|
239
|
+
action process
|
|
240
|
+
fetch "/data" from api
|
|
241
|
+
for item in response
|
|
242
|
+
map item -> {
|
|
243
|
+
result: ((((item.a + item.b) * (item.c + item.d)) + ((item.e - item.f) * (item.g - item.h))) * (((item.i + item.j) / (item.k + 1)) - ((item.l * item.m) + (item.n / (item.o + 1)))))
|
|
244
|
+
}
|
|
245
|
+
store mapped in results
|
|
246
|
+
end
|
|
247
|
+
`;
|
|
248
|
+
|
|
249
|
+
// Match-heavy for pattern matching benchmarks
|
|
250
|
+
export const MATCH_HEAVY_DSL = `
|
|
251
|
+
mission "pattern-matching"
|
|
252
|
+
source api from "https://api.example.com"
|
|
253
|
+
store results in memory
|
|
254
|
+
|
|
255
|
+
action categorize
|
|
256
|
+
fetch "/items" from api
|
|
257
|
+
for item in response
|
|
258
|
+
map item -> {
|
|
259
|
+
id: item.id,
|
|
260
|
+
category: match item.type
|
|
261
|
+
when "A" then "category-a"
|
|
262
|
+
when "B" then "category-b"
|
|
263
|
+
when "C" then "category-c"
|
|
264
|
+
when "D" then "category-d"
|
|
265
|
+
when "E" then "category-e"
|
|
266
|
+
else "other"
|
|
267
|
+
end,
|
|
268
|
+
priority: match item.urgency
|
|
269
|
+
when urgency > 90 then "critical"
|
|
270
|
+
when urgency > 70 then "high"
|
|
271
|
+
when urgency > 50 then "medium"
|
|
272
|
+
when urgency > 30 then "low"
|
|
273
|
+
else "none"
|
|
274
|
+
end,
|
|
275
|
+
status: match item.state
|
|
276
|
+
when "pending" then "awaiting"
|
|
277
|
+
when "processing" then "in-progress"
|
|
278
|
+
when "completed" then "done"
|
|
279
|
+
when "failed" then "error"
|
|
280
|
+
when "cancelled" then "stopped"
|
|
281
|
+
else "unknown"
|
|
282
|
+
end
|
|
283
|
+
}
|
|
284
|
+
store mapped in results with key: mapped.id
|
|
285
|
+
end
|
|
286
|
+
`;
|
|
287
|
+
|
|
288
|
+
export const ALL_FIXTURES = {
|
|
289
|
+
simple: SIMPLE_DSL,
|
|
290
|
+
medium: MEDIUM_DSL,
|
|
291
|
+
complex: COMPLEX_DSL,
|
|
292
|
+
expressionHeavy: EXPRESSION_HEAVY_DSL,
|
|
293
|
+
deeplyNested: DEEPLY_NESTED_EXPRESSIONS,
|
|
294
|
+
matchHeavy: MATCH_HEAVY_DSL,
|
|
295
|
+
};
|