@lovrozagar/oat 0.9.1 → 0.11.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/README.md +26 -1936
- package/dist/cli.js +326 -60
- package/dist/config/define-config.d.ts +15 -1
- package/dist/config/define-config.d.ts.map +1 -1
- package/dist/config/define-config.js.map +1 -1
- package/dist/config/validate.d.ts +12 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +86 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/conformance/effects.d.ts +9 -0
- package/dist/conformance/effects.d.ts.map +1 -0
- package/dist/conformance/effects.js +276 -0
- package/dist/conformance/effects.js.map +1 -0
- package/dist/conformance/expected-failures.d.ts +18 -0
- package/dist/conformance/expected-failures.d.ts.map +1 -0
- package/dist/conformance/expected-failures.js +48 -0
- package/dist/conformance/expected-failures.js.map +1 -0
- package/dist/conformance/feature-gate.d.ts +7 -0
- package/dist/conformance/feature-gate.d.ts.map +1 -0
- package/dist/conformance/feature-gate.js +428 -0
- package/dist/conformance/feature-gate.js.map +1 -0
- package/dist/conformance/fuzz.d.ts +108 -0
- package/dist/conformance/fuzz.d.ts.map +1 -0
- package/dist/conformance/fuzz.js +246 -0
- package/dist/conformance/fuzz.js.map +1 -0
- package/dist/conformance/leaks.d.ts +10 -0
- package/dist/conformance/leaks.d.ts.map +1 -0
- package/dist/conformance/leaks.js +23 -0
- package/dist/conformance/leaks.js.map +1 -0
- package/dist/conformance/pool.d.ts +49 -0
- package/dist/conformance/pool.d.ts.map +1 -0
- package/dist/conformance/pool.js +75 -0
- package/dist/conformance/pool.js.map +1 -0
- package/dist/conformance/rate-limit.d.ts +7 -0
- package/dist/conformance/rate-limit.d.ts.map +1 -0
- package/dist/conformance/rate-limit.js +372 -0
- package/dist/conformance/rate-limit.js.map +1 -0
- package/dist/conformance/scope.d.ts +15 -0
- package/dist/conformance/scope.d.ts.map +1 -0
- package/dist/conformance/scope.js +78 -0
- package/dist/conformance/scope.js.map +1 -0
- package/dist/conformance/seed-contract.d.ts +11 -0
- package/dist/conformance/seed-contract.d.ts.map +1 -0
- package/dist/conformance/seed-contract.js +680 -0
- package/dist/conformance/seed-contract.js.map +1 -0
- package/dist/conformance/shapes.d.ts +35 -0
- package/dist/conformance/shapes.d.ts.map +1 -0
- package/dist/conformance/shapes.js +162 -0
- package/dist/conformance/shapes.js.map +1 -0
- package/dist/conformance/specs.d.ts +21 -0
- package/dist/conformance/specs.d.ts.map +1 -0
- package/dist/conformance/specs.js +306 -0
- package/dist/conformance/specs.js.map +1 -0
- package/dist/conformance/suite.d.ts +209 -0
- package/dist/conformance/suite.d.ts.map +1 -0
- package/dist/conformance/suite.js +1538 -0
- package/dist/conformance/suite.js.map +1 -0
- package/dist/conformance/unique.d.ts +7 -0
- package/dist/conformance/unique.d.ts.map +1 -0
- package/dist/conformance/unique.js +586 -0
- package/dist/conformance/unique.js.map +1 -0
- package/dist/conformance/worker.d.ts +3 -0
- package/dist/conformance/worker.d.ts.map +1 -0
- package/dist/conformance/worker.js +27 -0
- package/dist/conformance/worker.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.js +6 -2
- package/dist/reference/defects.d.ts +71 -1
- package/dist/reference/defects.d.ts.map +1 -1
- package/dist/reference/defects.js +74 -8
- package/dist/reference/defects.js.map +1 -1
- package/dist/reference/dialect.d.ts +6 -4
- package/dist/reference/dialect.d.ts.map +1 -1
- package/dist/reference/dialect.js +1 -0
- package/dist/reference/dialect.js.map +1 -1
- package/dist/reference/http.d.ts +17 -25
- package/dist/reference/http.d.ts.map +1 -1
- package/dist/reference/http.js +574 -224
- package/dist/reference/http.js.map +1 -1
- package/dist/reference/listing.d.ts +51 -0
- package/dist/reference/listing.d.ts.map +1 -0
- package/dist/reference/listing.js +256 -0
- package/dist/reference/listing.js.map +1 -0
- package/dist/reference/model.d.ts +35 -1
- package/dist/reference/model.d.ts.map +1 -1
- package/dist/reference/model.js +42 -0
- package/dist/reference/model.js.map +1 -1
- package/dist/reference/query.d.ts +132 -43
- package/dist/reference/query.d.ts.map +1 -1
- package/dist/reference/query.js +397 -315
- package/dist/reference/query.js.map +1 -1
- package/dist/reference/shapes.d.ts +60 -0
- package/dist/reference/shapes.d.ts.map +1 -0
- package/dist/reference/shapes.js +142 -0
- package/dist/reference/shapes.js.map +1 -0
- package/dist/reference/spec.d.ts +9 -2
- package/dist/reference/spec.d.ts.map +1 -1
- package/dist/reference/spec.js +291 -71
- package/dist/reference/spec.js.map +1 -1
- package/dist/reference/store-api.d.ts +14 -43
- package/dist/reference/store-api.d.ts.map +1 -1
- package/dist/reference/store-api.js +8 -58
- package/dist/reference/store-api.js.map +1 -1
- package/dist/reference/stores/memory.d.ts +12 -15
- package/dist/reference/stores/memory.d.ts.map +1 -1
- package/dist/reference/stores/memory.js +22 -70
- package/dist/reference/stores/memory.js.map +1 -1
- package/dist/reference/stores/postgres.d.ts +11 -23
- package/dist/reference/stores/postgres.d.ts.map +1 -1
- package/dist/reference/stores/postgres.js +53 -334
- package/dist/reference/stores/postgres.js.map +1 -1
- package/dist/reference/stores/sql-compile.d.ts +36 -0
- package/dist/reference/stores/sql-compile.d.ts.map +1 -0
- package/dist/reference/stores/sql-compile.js +95 -0
- package/dist/reference/stores/sql-compile.js.map +1 -0
- package/dist/reference/stores/sqlite.d.ts +12 -27
- package/dist/reference/stores/sqlite.d.ts.map +1 -1
- package/dist/reference/stores/sqlite.js +54 -355
- package/dist/reference/stores/sqlite.js.map +1 -1
- package/dist/report/console.d.ts +2 -1
- package/dist/report/console.d.ts.map +1 -1
- package/dist/report/console.js +56 -10
- package/dist/report/console.js.map +1 -1
- package/dist/report/matrix.d.ts +10 -13
- package/dist/report/matrix.d.ts.map +1 -1
- package/dist/report/matrix.js +82 -18
- package/dist/report/matrix.js.map +1 -1
- package/dist/report/render.d.ts +18 -1
- package/dist/report/render.d.ts.map +1 -1
- package/dist/report/render.js +169 -14
- package/dist/report/render.js.map +1 -1
- package/dist/runtime/async.d.ts +16 -3
- package/dist/runtime/async.d.ts.map +1 -1
- package/dist/runtime/async.js +24 -19
- package/dist/runtime/async.js.map +1 -1
- package/dist/runtime/auth.d.ts +2 -9
- package/dist/runtime/auth.d.ts.map +1 -1
- package/dist/runtime/auth.js +38 -62
- package/dist/runtime/auth.js.map +1 -1
- package/dist/runtime/body.d.ts +15 -3
- package/dist/runtime/body.d.ts.map +1 -1
- package/dist/runtime/body.js +61 -12
- package/dist/runtime/body.js.map +1 -1
- package/dist/runtime/check-costs.d.ts +15 -0
- package/dist/runtime/check-costs.d.ts.map +1 -0
- package/dist/runtime/check-costs.js +114 -0
- package/dist/runtime/check-costs.js.map +1 -0
- package/dist/runtime/check-ids.d.ts +15 -0
- package/dist/runtime/check-ids.d.ts.map +1 -0
- package/dist/runtime/check-ids.js +140 -0
- package/dist/runtime/check-ids.js.map +1 -0
- package/dist/runtime/checks.d.ts +122 -18
- package/dist/runtime/checks.d.ts.map +1 -1
- package/dist/runtime/checks.js +3437 -1933
- package/dist/runtime/checks.js.map +1 -1
- package/dist/runtime/client.d.ts +112 -0
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.js +271 -39
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/cookies.d.ts +16 -2
- package/dist/runtime/cookies.d.ts.map +1 -1
- package/dist/runtime/cookies.js +83 -22
- package/dist/runtime/cookies.js.map +1 -1
- package/dist/runtime/exchanges.d.ts +4 -5
- package/dist/runtime/exchanges.d.ts.map +1 -1
- package/dist/runtime/exchanges.js +33 -55
- package/dist/runtime/exchanges.js.map +1 -1
- package/dist/runtime/exit.d.ts +40 -0
- package/dist/runtime/exit.d.ts.map +1 -0
- package/dist/runtime/exit.js +48 -0
- package/dist/runtime/exit.js.map +1 -0
- package/dist/runtime/feature-gate.d.ts +0 -9
- package/dist/runtime/feature-gate.d.ts.map +1 -1
- package/dist/runtime/feature-gate.js +0 -21
- package/dist/runtime/feature-gate.js.map +1 -1
- package/dist/runtime/finding.d.ts +61 -7
- package/dist/runtime/finding.d.ts.map +1 -1
- package/dist/runtime/finding.js +74 -12
- package/dist/runtime/finding.js.map +1 -1
- package/dist/runtime/fixture.d.ts +35 -28
- package/dist/runtime/fixture.d.ts.map +1 -1
- package/dist/runtime/fixture.js +92 -731
- package/dist/runtime/fixture.js.map +1 -1
- package/dist/runtime/generate.d.ts +63 -0
- package/dist/runtime/generate.d.ts.map +1 -0
- package/dist/runtime/generate.js +635 -0
- package/dist/runtime/generate.js.map +1 -0
- package/dist/runtime/headers.d.ts +6 -0
- package/dist/runtime/headers.d.ts.map +1 -0
- package/dist/runtime/headers.js +16 -0
- package/dist/runtime/headers.js.map +1 -0
- package/dist/runtime/path.d.ts +7 -0
- package/dist/runtime/path.d.ts.map +1 -0
- package/dist/runtime/path.js +44 -0
- package/dist/runtime/path.js.map +1 -0
- package/dist/runtime/payloads.d.ts +2 -0
- package/dist/runtime/payloads.d.ts.map +1 -1
- package/dist/runtime/payloads.js +2 -1
- package/dist/runtime/payloads.js.map +1 -1
- package/dist/runtime/rate-limit.d.ts +6 -4
- package/dist/runtime/rate-limit.d.ts.map +1 -1
- package/dist/runtime/rate-limit.js +22 -33
- package/dist/runtime/rate-limit.js.map +1 -1
- package/dist/runtime/redact.d.ts +24 -0
- package/dist/runtime/redact.d.ts.map +1 -0
- package/dist/runtime/redact.js +98 -0
- package/dist/runtime/redact.js.map +1 -0
- package/dist/runtime/run.d.ts +51 -2
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +463 -195
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runs.d.ts +5 -0
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +7 -1
- package/dist/runtime/runs.js.map +1 -1
- package/dist/runtime/scope.d.ts +163 -0
- package/dist/runtime/scope.d.ts.map +1 -0
- package/dist/runtime/scope.js +423 -0
- package/dist/runtime/scope.js.map +1 -0
- package/dist/runtime/teardown.d.ts +17 -4
- package/dist/runtime/teardown.d.ts.map +1 -1
- package/dist/runtime/teardown.js +49 -16
- package/dist/runtime/teardown.js.map +1 -1
- package/dist/runtime/transcript.d.ts +34 -2
- package/dist/runtime/transcript.d.ts.map +1 -1
- package/dist/runtime/transcript.js +119 -24
- package/dist/runtime/transcript.js.map +1 -1
- package/dist/runtime/unique.d.ts +2 -11
- package/dist/runtime/unique.d.ts.map +1 -1
- package/dist/runtime/unique.js +27 -53
- package/dist/runtime/unique.js.map +1 -1
- package/dist/runtime/validate.d.ts +13 -2
- package/dist/runtime/validate.d.ts.map +1 -1
- package/dist/runtime/validate.js +51 -31
- package/dist/runtime/validate.js.map +1 -1
- package/dist/runtime/wait.d.ts +2 -1
- package/dist/runtime/wait.d.ts.map +1 -1
- package/dist/runtime/wait.js +2 -36
- package/dist/runtime/wait.js.map +1 -1
- package/dist/runtime/world.d.ts +31 -3
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +113 -32
- package/dist/runtime/world.js.map +1 -1
- package/dist/spec/collection.d.ts +8 -2
- package/dist/spec/collection.d.ts.map +1 -1
- package/dist/spec/collection.js +47 -7
- package/dist/spec/collection.js.map +1 -1
- package/dist/spec/extensions.d.ts +5 -1
- package/dist/spec/extensions.d.ts.map +1 -1
- package/dist/spec/extensions.js +9 -2
- package/dist/spec/extensions.js.map +1 -1
- package/dist/spec/graph.d.ts +46 -0
- package/dist/spec/graph.d.ts.map +1 -1
- package/dist/spec/graph.js +175 -11
- package/dist/spec/graph.js.map +1 -1
- package/dist/spec/load.d.ts +25 -5
- package/dist/spec/load.d.ts.map +1 -1
- package/dist/spec/load.js +160 -59
- package/dist/spec/load.js.map +1 -1
- package/dist/spec/query-capabilities.d.ts +4 -0
- package/dist/spec/query-capabilities.d.ts.map +1 -1
- package/dist/spec/query-capabilities.js +6 -0
- package/dist/spec/query-capabilities.js.map +1 -1
- package/dist/spec/schema.d.ts +20 -0
- package/dist/spec/schema.d.ts.map +1 -0
- package/dist/spec/schema.js +118 -0
- package/dist/spec/schema.js.map +1 -0
- package/dist/spec/tag-schema.d.ts +12 -0
- package/dist/spec/tag-schema.d.ts.map +1 -0
- package/dist/spec/tag-schema.js +143 -0
- package/dist/spec/tag-schema.js.map +1 -0
- package/dist/spec/types.js +17 -1
- package/dist/spec/types.js.map +1 -1
- package/docs/api.md +59 -0
- package/docs/assumptions.md +99 -0
- package/docs/checks.md +183 -0
- package/docs/commands.md +214 -0
- package/docs/configuration.md +650 -0
- package/docs/model.md +184 -0
- package/docs/reference-defects.md +94 -0
- package/docs/reports.md +211 -0
- package/docs/tags.md +400 -0
- package/package.json +3 -1
package/dist/cli.js
CHANGED
|
@@ -1,59 +1,106 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import { EXIT, exitCode } from "./runtime/exit.js";
|
|
2
3
|
import { createWriteStream, writeFileSync } from "node:fs";
|
|
3
4
|
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
5
|
import { dirname, resolve } from "node:path";
|
|
5
6
|
import { pathToFileURL } from "node:url";
|
|
6
7
|
import { interpolate, loadConfig } from "./config/load.js";
|
|
8
|
+
import { configProblems } from "./config/validate.js";
|
|
7
9
|
import { report } from "./report/console.js";
|
|
8
10
|
import { renderMatrixGraph, renderMatrixHtml } from "./report/matrix.js";
|
|
9
11
|
import { ISSUE_REPRO_DIR, renderConsole, renderJson, renderMarkdown, renderRepros } from "./report/render.js";
|
|
10
12
|
import { createProgressPump, createStderrProgress, formatProgressJsonl, formatProgressLine, formatProgressTsv, PROGRESS_GLOSSARY, PROGRESS_TSV_HEADER, } from "./runtime/progress.js";
|
|
11
13
|
import { resolveSaveExchanges } from "./runtime/exchanges.js";
|
|
12
|
-
import { allocateRunDir, DEFAULT_RUNS_ROOT } from "./runtime/runs.js";
|
|
14
|
+
import { allocateRunDir, DEFAULT_RUNS_ROOT, publishLatest } from "./runtime/runs.js";
|
|
15
|
+
import { authStepOperationIds, planScope, resolveTargetScope, ScopeError } from "./runtime/scope.js";
|
|
13
16
|
import { renderTeardown } from "./runtime/teardown.js";
|
|
14
17
|
import { buildModel } from "./spec/graph.js";
|
|
15
18
|
import { dereference, loadSpec } from "./spec/load.js";
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
19
|
+
/** Every flag, once: whether it takes a value, and what kind. Parsing and help both read this. */
|
|
20
|
+
export const FLAGS = {
|
|
21
|
+
backend: { kind: "value" },
|
|
22
|
+
"base-url": { kind: "value" },
|
|
23
|
+
config: { kind: "value" },
|
|
24
|
+
defects: { kind: "value" },
|
|
25
|
+
dialect: { kind: "value" },
|
|
26
|
+
fuzz: { kind: "optional-value", number: "positive" },
|
|
27
|
+
"fuzz-seed": { kind: "value", number: "positive" },
|
|
28
|
+
help: { kind: "boolean" },
|
|
29
|
+
jobs: { kind: "value", number: "positive" },
|
|
30
|
+
json: { kind: "boolean" },
|
|
31
|
+
"keep-fixtures": { kind: "boolean" },
|
|
32
|
+
"max-defects": { kind: "value", number: "positive" },
|
|
33
|
+
"max-in-flight": { kind: "value", number: "positive" },
|
|
34
|
+
"no-save-exchanges": { kind: "boolean" },
|
|
35
|
+
only: { kind: "value" },
|
|
36
|
+
ops: { kind: "value" },
|
|
37
|
+
out: { kind: "value" },
|
|
38
|
+
parser: { kind: "boolean" },
|
|
39
|
+
precision: { kind: "optional-value", number: "positive" },
|
|
40
|
+
profile: { kind: "value" },
|
|
41
|
+
quiet: { kind: "boolean" },
|
|
42
|
+
"save-exchanges": { kind: "boolean" },
|
|
43
|
+
seed: { kind: "value", number: "integer" },
|
|
44
|
+
"skip-backend": { kind: "value" },
|
|
45
|
+
spec: { kind: "value" },
|
|
46
|
+
untagged: { kind: "boolean" },
|
|
47
|
+
};
|
|
48
|
+
export const KNOWN_FLAGS = new Set(Object.keys(FLAGS));
|
|
49
|
+
/**
|
|
50
|
+
* `oat <command> [--flag value | --flag=value | --switch] …`. A value flag must have its value;
|
|
51
|
+
* a switch takes none; a numeric value must be one. The first problem is returned as `error`
|
|
52
|
+
* rather than guessed around: `--max-in-flight -1` once hung a run, `--seed abc` seeded strings
|
|
53
|
+
* with `NaN`, and a flag followed by another flag silently became `true`.
|
|
54
|
+
*/
|
|
39
55
|
export function parseArgs(argv) {
|
|
40
|
-
const
|
|
56
|
+
const leadingFlag = argv[0]?.startsWith("--") === true;
|
|
57
|
+
const command = leadingFlag ? "help" : (argv[0] ?? "help");
|
|
58
|
+
const rest = leadingFlag ? argv : argv.slice(1);
|
|
41
59
|
const flags = {};
|
|
60
|
+
let error;
|
|
61
|
+
const fail = (message) => {
|
|
62
|
+
error ??= message;
|
|
63
|
+
};
|
|
42
64
|
for (let i = 0; i < rest.length; i++) {
|
|
43
65
|
const token = rest[i];
|
|
44
66
|
if (token === undefined || !token.startsWith("--"))
|
|
45
67
|
continue;
|
|
46
|
-
const
|
|
68
|
+
const equals = token.indexOf("=");
|
|
69
|
+
const key = equals === -1 ? token.slice(2) : token.slice(2, equals);
|
|
70
|
+
const inline = equals === -1 ? undefined : token.slice(equals + 1);
|
|
71
|
+
const spec = FLAGS[key];
|
|
47
72
|
const next = rest[i + 1];
|
|
48
|
-
|
|
49
|
-
|
|
73
|
+
const nextIsValue = next !== undefined && !next.startsWith("--");
|
|
74
|
+
let value;
|
|
75
|
+
if (spec === undefined || spec.kind === "boolean") {
|
|
76
|
+
if (inline !== undefined && spec !== undefined)
|
|
77
|
+
fail(`--${key} takes no value`);
|
|
78
|
+
value = inline ?? true;
|
|
79
|
+
}
|
|
80
|
+
else if (inline !== undefined) {
|
|
81
|
+
value = inline;
|
|
82
|
+
}
|
|
83
|
+
else if (nextIsValue) {
|
|
84
|
+
value = next;
|
|
50
85
|
i++;
|
|
51
86
|
}
|
|
87
|
+
else if (spec.kind === "optional-value") {
|
|
88
|
+
value = true;
|
|
89
|
+
}
|
|
52
90
|
else {
|
|
53
|
-
|
|
91
|
+
fail(`--${key} needs a value`);
|
|
92
|
+
value = true;
|
|
54
93
|
}
|
|
94
|
+
if (spec?.number !== undefined && typeof value === "string") {
|
|
95
|
+
const parsed = Number(value);
|
|
96
|
+
const integer = value.trim() !== "" && Number.isSafeInteger(parsed);
|
|
97
|
+
if (!integer || (spec.number === "positive" && parsed < 1)) {
|
|
98
|
+
fail(`--${key} must be ${spec.number === "positive" ? "a positive" : "an"} integer, got "${value}"`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
flags[key] = value;
|
|
55
102
|
}
|
|
56
|
-
return { command, flags };
|
|
103
|
+
return error === undefined ? { command, flags } : { command, error, flags };
|
|
57
104
|
}
|
|
58
105
|
export function unknownFlag(flags) {
|
|
59
106
|
for (const key of Object.keys(flags)) {
|
|
@@ -74,7 +121,8 @@ Flags
|
|
|
74
121
|
--config oat config module (.ts/.js/.mjs/.json) with a default export
|
|
75
122
|
--spec OpenAPI document, http(s) URL or filesystem path
|
|
76
123
|
--base-url backend under test, overriding the config
|
|
77
|
-
--
|
|
124
|
+
--ops comma-separated operationIds to grade (row.*, cdn:asset.get); the rest is support
|
|
125
|
+
--only comma-separated entity names; each grades every operation it owns
|
|
78
126
|
--profile named profile gating which operations run (built-in: full, cheap)
|
|
79
127
|
--seed integer seed for fixture generation (default 1)
|
|
80
128
|
--out history root; each run is <out>/<datetime>/ (default ./.oat/runs)
|
|
@@ -91,12 +139,44 @@ Flags
|
|
|
91
139
|
--precision [n] vary cohort data against a correct backend; any finding is a false positive
|
|
92
140
|
--max-defects most defects per combination (default: 4)
|
|
93
141
|
--seed fuzz seed, so a failing combination replays exactly
|
|
142
|
+
--fuzz-seed seed for the combination smoke pass of a full conformance run (default: 1)
|
|
143
|
+
--jobs conformance legs run at once, each on its own thread (default: CPUs − 1, at most 4)
|
|
144
|
+
--skip-backend comma-separated backends a full conformance run may leave out when unreachable
|
|
94
145
|
--json machine-readable output, for plan and doctor
|
|
95
146
|
`;
|
|
96
147
|
function str(flags, key) {
|
|
97
148
|
const value = flags[key];
|
|
98
149
|
return typeof value === "string" ? value : undefined;
|
|
99
150
|
}
|
|
151
|
+
function list(flags, key) {
|
|
152
|
+
return str(flags, key)
|
|
153
|
+
?.split(",")
|
|
154
|
+
.map((s) => s.trim())
|
|
155
|
+
.filter(Boolean);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* A config file, loaded, checked and interpolated — or the first reason it cannot be used. Every
|
|
159
|
+
* one of these is the caller's to fix, so the command exits 2 with nothing sent.
|
|
160
|
+
*/
|
|
161
|
+
async function readConfig(path, forRun) {
|
|
162
|
+
let loaded;
|
|
163
|
+
try {
|
|
164
|
+
loaded = await loadConfig(path);
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return { problem: (error instanceof Error ? error.message : String(error)).replace(/^oat: /, "") };
|
|
168
|
+
}
|
|
169
|
+
const problems = configProblems(loaded, { forRun });
|
|
170
|
+
if (problems.length > 0)
|
|
171
|
+
return { problem: `${path} is not a valid config:\n ${problems.join("\n ")}` };
|
|
172
|
+
try {
|
|
173
|
+
return { config: interpolate(loaded) };
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
return { problem: (error instanceof Error ? error.message : String(error)).replace(/^oat: /, "") };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
export { EXIT, exitCode } from "./runtime/exit.js";
|
|
100
180
|
async function commandRun(flags) {
|
|
101
181
|
const configPath = str(flags, "config");
|
|
102
182
|
if (configPath === undefined) {
|
|
@@ -104,14 +184,16 @@ async function commandRun(flags) {
|
|
|
104
184
|
return 2;
|
|
105
185
|
}
|
|
106
186
|
const { run } = await import("./runtime/run.js");
|
|
107
|
-
const
|
|
187
|
+
const read = await readConfig(configPath, true);
|
|
188
|
+
if ("problem" in read) {
|
|
189
|
+
process.stderr.write(`oat: ${read.problem}\n`);
|
|
190
|
+
return EXIT.usage;
|
|
191
|
+
}
|
|
192
|
+
const config = read.config;
|
|
108
193
|
const baseUrl = str(flags, "base-url") ?? config.baseUrl;
|
|
109
194
|
const seedFlag = str(flags, "seed");
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
.map((s) => s.trim())
|
|
113
|
-
.filter(Boolean);
|
|
114
|
-
const only = onlyFromFlag ?? config.only?.filter((name) => name.trim() !== "");
|
|
195
|
+
const only = list(flags, "only") ?? config.only?.filter((name) => name.trim() !== "");
|
|
196
|
+
const ops = list(flags, "ops") ?? config.ops?.filter((name) => name.trim() !== "");
|
|
115
197
|
const profile = str(flags, "profile") ?? config.profile;
|
|
116
198
|
const saveExchanges = resolveSaveExchanges({
|
|
117
199
|
...(flags["no-save-exchanges"] === true ? { flag: false } : flags["save-exchanges"] === true ? { flag: true } : {}),
|
|
@@ -156,9 +238,23 @@ async function commandRun(flags) {
|
|
|
156
238
|
stderrProgress?.emit(snap);
|
|
157
239
|
fileProgress.emit(snap);
|
|
158
240
|
};
|
|
241
|
+
/* Ctrl-C stops testing, not the run: what oat created is still removed and the partial report
|
|
242
|
+
* is still written. A second signal means "now", and exits without either. */
|
|
243
|
+
const stop = new AbortController();
|
|
244
|
+
const onSignal = (signal) => {
|
|
245
|
+
if (stop.signal.aborted) {
|
|
246
|
+
process.stderr.write(`\noat: ${signal} again — exiting without teardown\n`);
|
|
247
|
+
process.exit(130);
|
|
248
|
+
}
|
|
249
|
+
process.stderr.write(`\noat: ${signal} — stopping, removing what this run created (again to exit now)\n`);
|
|
250
|
+
stop.abort();
|
|
251
|
+
};
|
|
252
|
+
process.on("SIGINT", onSignal);
|
|
253
|
+
process.on("SIGTERM", onSignal);
|
|
159
254
|
let result;
|
|
160
255
|
try {
|
|
161
256
|
result = await run({
|
|
257
|
+
signal: stop.signal,
|
|
162
258
|
baseUrl,
|
|
163
259
|
principals,
|
|
164
260
|
spec: config.spec,
|
|
@@ -169,11 +265,13 @@ async function commandRun(flags) {
|
|
|
169
265
|
...(config.roots === undefined ? {} : { roots: config.roots }),
|
|
170
266
|
...(config.cohortSize === undefined ? {} : { cohortSize: config.cohortSize }),
|
|
171
267
|
...(only === undefined || only.length === 0 ? {} : { only }),
|
|
268
|
+
...(ops === undefined || ops.length === 0 ? {} : { ops }),
|
|
172
269
|
...(profile === undefined ? {} : { profile }),
|
|
173
270
|
...(config.profiles === undefined ? {} : { profiles: config.profiles }),
|
|
174
271
|
...(config.rateLimits === undefined ? {} : { rateLimits: config.rateLimits }),
|
|
175
272
|
...(config.origins === undefined ? {} : { origins: config.origins }),
|
|
176
273
|
...(config.outOfBand === undefined ? {} : { outOfBand: config.outOfBand }),
|
|
274
|
+
...(config.payloads === undefined ? {} : { payloads: config.payloads }),
|
|
177
275
|
...(config.query === undefined ? {} : { query: config.query }),
|
|
178
276
|
...(config.entities === undefined ? {} : { entities: config.entities }),
|
|
179
277
|
keepFixtures: flags["keep-fixtures"] === true || config.keepFixtures === true,
|
|
@@ -184,7 +282,15 @@ async function commandRun(flags) {
|
|
|
184
282
|
...(config.network === undefined ? {} : { network: config.network }),
|
|
185
283
|
});
|
|
186
284
|
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
if (!(error instanceof ScopeError))
|
|
287
|
+
throw error;
|
|
288
|
+
process.stderr.write(`${error.message}\n`);
|
|
289
|
+
return 2;
|
|
290
|
+
}
|
|
187
291
|
finally {
|
|
292
|
+
process.off("SIGINT", onSignal);
|
|
293
|
+
process.off("SIGTERM", onSignal);
|
|
188
294
|
stderrProgress?.stop();
|
|
189
295
|
fileProgress.stop();
|
|
190
296
|
progressLog.end();
|
|
@@ -194,6 +300,9 @@ async function commandRun(flags) {
|
|
|
194
300
|
const durationMs = performance.now() - began;
|
|
195
301
|
const input = {
|
|
196
302
|
baseUrl,
|
|
303
|
+
checkNotes: result.checkNotes,
|
|
304
|
+
checkTimings: result.checkTimings,
|
|
305
|
+
checksOutOfScope: result.checksOutOfScope,
|
|
197
306
|
checksRun: result.checksRun,
|
|
198
307
|
checksSkipped: result.checksSkipped,
|
|
199
308
|
checksSuppressed: result.checksSuppressed,
|
|
@@ -205,6 +314,7 @@ async function commandRun(flags) {
|
|
|
205
314
|
model: result.model,
|
|
206
315
|
profile: result.profile,
|
|
207
316
|
profileExclusions: result.profileExclusions,
|
|
317
|
+
scope: result.scope,
|
|
208
318
|
startedAt,
|
|
209
319
|
...(result.exchanges === undefined ? {} : { exchanges: result.exchanges }),
|
|
210
320
|
...(result.network === undefined ? {} : { network: result.network }),
|
|
@@ -236,26 +346,53 @@ async function commandRun(flags) {
|
|
|
236
346
|
if (result.network?.incomplete === true) {
|
|
237
347
|
process.stdout.write(` network: ${result.network.kind} — run incomplete\n`);
|
|
238
348
|
}
|
|
349
|
+
await publishLatest(allocated);
|
|
239
350
|
process.stdout.write(` latest: ${allocated.latest}\n\n`);
|
|
240
|
-
|
|
241
|
-
* not failures, and a CI gate should react to defects only. */
|
|
242
|
-
if (result.network?.incomplete === true)
|
|
243
|
-
return 1;
|
|
244
|
-
return result.findings.filter((f) => f.verdict !== "COVERAGE_GAP" && f.verdict !== "BLOCKED").length > 0 ? 1 : 0;
|
|
351
|
+
return exitCode(result);
|
|
245
352
|
}
|
|
246
353
|
export async function main() {
|
|
247
|
-
const { command, flags } = parseArgs(process.argv.slice(2));
|
|
354
|
+
const { command, error: flagError, flags } = parseArgs(process.argv.slice(2));
|
|
248
355
|
const unknown = unknownFlag(flags);
|
|
249
356
|
if (unknown !== undefined) {
|
|
250
357
|
process.stderr.write(`oat: unknown flag "--${unknown}"\n\n${USAGE}`);
|
|
251
358
|
return 2;
|
|
252
359
|
}
|
|
360
|
+
if (flagError !== undefined) {
|
|
361
|
+
process.stderr.write(`oat: ${flagError}\n\n${USAGE}`);
|
|
362
|
+
return EXIT.usage;
|
|
363
|
+
}
|
|
253
364
|
if (command === "help" || flags.help === true) {
|
|
254
365
|
process.stdout.write(USAGE);
|
|
255
366
|
return 0;
|
|
256
367
|
}
|
|
257
368
|
if (command === "conformance") {
|
|
258
|
-
const { postgresAvailable, renderParserSuite,
|
|
369
|
+
const { defectsFor, passAnswer, postgresAvailable, renderParserSuite, renderUnproven, runExampleSpecSuite, runTagUnlockSuite, runParserSuite, runPayloadCatalogSuite, runCoverageReportSuite, runSeedContractSuite, runEffectsSuite, runTenantScopeSuite, sqliteAvailable, d1Available, } = await import("./conformance/suite.js");
|
|
370
|
+
/* A typo in a selector must stop the run, not widen it: an unknown backend once ran every
|
|
371
|
+
* backend, and an unknown dialect silently filtered out the defects it could not express. */
|
|
372
|
+
const { DIALECTS } = await import("./reference/dialect.js");
|
|
373
|
+
const { isDefectName } = await import("./reference/defects.js");
|
|
374
|
+
const backendFlag = str(flags, "backend");
|
|
375
|
+
const backendNames = ["memory", "sqlite", "postgres", "d1"];
|
|
376
|
+
if (backendFlag !== undefined && !backendNames.includes(backendFlag)) {
|
|
377
|
+
process.stderr.write(`oat: unknown --backend "${backendFlag}" — expected ${backendNames.join(", ")}\n`);
|
|
378
|
+
return 2;
|
|
379
|
+
}
|
|
380
|
+
const dialectFlag = str(flags, "dialect");
|
|
381
|
+
if (dialectFlag !== undefined && !Object.hasOwn(DIALECTS, dialectFlag)) {
|
|
382
|
+
process.stderr.write(`oat: unknown --dialect "${dialectFlag}" — expected ${Object.keys(DIALECTS).join(", ")}\n`);
|
|
383
|
+
return 2;
|
|
384
|
+
}
|
|
385
|
+
const onlyFlag = str(flags, "only")?.split(",").filter(Boolean);
|
|
386
|
+
const unknownDefects = (onlyFlag ?? []).filter((name) => !isDefectName(name));
|
|
387
|
+
if (flags.only === true || (onlyFlag !== undefined && onlyFlag.length === 0)) {
|
|
388
|
+
process.stderr.write("oat: --only needs a comma-separated list of defect names\n");
|
|
389
|
+
return 2;
|
|
390
|
+
}
|
|
391
|
+
if (unknownDefects.length > 0) {
|
|
392
|
+
process.stderr.write(`oat: --only names no defect: ${unknownDefects.join(", ")}\n`);
|
|
393
|
+
return 2;
|
|
394
|
+
}
|
|
395
|
+
const { createPool, defaultJobs } = await import("./conformance/pool.js");
|
|
259
396
|
const { runFeatureGateSuite } = await import("./conformance/feature-gate.js");
|
|
260
397
|
const { runRateLimitSuite } = await import("./conformance/rate-limit.js");
|
|
261
398
|
const { runUniqueSuite } = await import("./conformance/unique.js");
|
|
@@ -267,9 +404,14 @@ export async function main() {
|
|
|
267
404
|
const example = renderParserSuite(await runExampleSpecSuite());
|
|
268
405
|
process.stdout.write(example.text);
|
|
269
406
|
parser.failures += example.failures;
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
parser.
|
|
407
|
+
/* The defect matrix makes the two runs the tag-unlock claims are judged from; only a run
|
|
408
|
+
* that stops before the matrix makes them here. */
|
|
409
|
+
const beforeMatrix = flags.parser === true || flags.precision !== undefined || flags.fuzz !== undefined;
|
|
410
|
+
if (beforeMatrix) {
|
|
411
|
+
const unlocks = renderParserSuite(await runTagUnlockSuite());
|
|
412
|
+
process.stdout.write(unlocks.text);
|
|
413
|
+
parser.failures += unlocks.failures;
|
|
414
|
+
}
|
|
273
415
|
const coverage = renderParserSuite(runCoverageReportSuite());
|
|
274
416
|
process.stdout.write(coverage.text);
|
|
275
417
|
parser.failures += coverage.failures;
|
|
@@ -361,18 +503,110 @@ export async function main() {
|
|
|
361
503
|
]
|
|
362
504
|
: backends.map((backend) => ({ backend, dialect: dialect ?? "postgrest" }));
|
|
363
505
|
let failures = parser.failures;
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
506
|
+
const proven = new Set();
|
|
507
|
+
const jobsFlag = str(flags, "jobs");
|
|
508
|
+
const jobs = jobsFlag === undefined ? defaultJobs() : Number.parseInt(jobsFlag, 10);
|
|
509
|
+
if (!Number.isSafeInteger(jobs) || jobs < 1) {
|
|
510
|
+
process.stderr.write("oat: --jobs must be a positive integer\n");
|
|
511
|
+
return 2;
|
|
512
|
+
}
|
|
513
|
+
/* Every leg is queued at once and printed in order as its turn comes. */
|
|
514
|
+
const pool = createPool(jobs);
|
|
515
|
+
const withShapes = requested === undefined || requested === "memory";
|
|
516
|
+
/* A leg goes out as its baselines and its defects in chunks, so a long leg spreads across
|
|
517
|
+
* the pool; its results come back in order and are rendered here. */
|
|
518
|
+
const LEG_CHUNK = 6;
|
|
519
|
+
const passAnswers = passes.map(async (pass) => {
|
|
520
|
+
const defects = defectsFor(pass.backend, pass.dialect, only);
|
|
521
|
+
const chunks = Array.from({ length: Math.ceil(defects.length / LEG_CHUNK) }, (_, index) => defects.slice(index * LEG_CHUNK, (index + 1) * LEG_CHUNK));
|
|
522
|
+
const answers = await Promise.all([
|
|
523
|
+
pool.run({ backend: pass.backend, dialect: pass.dialect, kind: "baselines" }),
|
|
524
|
+
...chunks.map((chunk) => pool.run({ backend: pass.backend, dialect: pass.dialect, defects: chunk, kind: "defects" })),
|
|
525
|
+
]);
|
|
526
|
+
const results = answers.flatMap((answer) => (answer.kind === "leg" ? answer.results : []));
|
|
527
|
+
return { kind: "pass", ...passAnswer(results, pass.backend, pass.dialect) };
|
|
528
|
+
});
|
|
529
|
+
const shapeAnswer = withShapes ? pool.run({ kind: "shapes" }) : undefined;
|
|
530
|
+
/* `--ops` recall needs each defect's full run, which the default pass has just made; only
|
|
531
|
+
* the targeted half is sent, spread across the pool. */
|
|
532
|
+
const fullRun = only === undefined && requested === undefined && dialect === undefined;
|
|
533
|
+
const defaultPass = passes.findIndex((pass) => pass.backend === "memory" && pass.dialect === "postgrest");
|
|
534
|
+
const scopeAnswers = !fullRun || defaultPass === -1
|
|
535
|
+
? undefined
|
|
536
|
+
: passAnswers[defaultPass]?.then(async (answer) => {
|
|
537
|
+
const { DEFECTS } = await import("./reference/defects.js");
|
|
538
|
+
const names = Object.keys(DEFECTS);
|
|
539
|
+
const known = answer.kind === "pass" ? answer.primaryOps : {};
|
|
540
|
+
const chunks = Array.from({ length: jobs }, (_, lane) => names.filter((_name, index) => index % jobs === lane)).filter((chunk) => chunk.length > 0);
|
|
541
|
+
return Promise.all(chunks.map((defects) => pool.run({ defects, kind: "scope", known })));
|
|
542
|
+
});
|
|
543
|
+
const recallAnswers = shapeAnswer === undefined || only !== undefined
|
|
544
|
+
? undefined
|
|
545
|
+
: shapeAnswer.then((answer) => Promise.all((answer.kind === "cases" ? answer.cases : []).map((shape) => pool.run({ kind: "recall", shapes: [shape] }))));
|
|
546
|
+
try {
|
|
547
|
+
for (const [index, pass] of passes.entries()) {
|
|
548
|
+
process.stdout.write(`\n ── ${pass.backend} · ${pass.dialect} ${"─".repeat(46)}\n`);
|
|
549
|
+
const result = await passAnswers[index];
|
|
550
|
+
if (result?.kind !== "pass")
|
|
551
|
+
continue;
|
|
552
|
+
process.stdout.write(result.text);
|
|
553
|
+
failures += result.failures;
|
|
554
|
+
for (const id of result.proven)
|
|
555
|
+
proven.add(id);
|
|
556
|
+
}
|
|
557
|
+
/* Only a complete run can say a check was never proven; a filtered one never tried. */
|
|
558
|
+
if (fullRun) {
|
|
559
|
+
const unproven = renderUnproven(proven);
|
|
560
|
+
process.stdout.write(unproven.text);
|
|
561
|
+
failures += unproven.failures;
|
|
562
|
+
}
|
|
563
|
+
const defaultAnswer = defaultPass === -1 ? undefined : await passAnswers[defaultPass];
|
|
564
|
+
const unlocks = renderParserSuite(await runTagUnlockSuite(defaultAnswer?.kind === "pass" ? defaultAnswer.baselines : undefined));
|
|
565
|
+
process.stdout.write(unlocks.text);
|
|
566
|
+
failures += unlocks.failures;
|
|
567
|
+
if (scopeAnswers !== undefined) {
|
|
568
|
+
const scopeResults = (await scopeAnswers).flatMap((answer) => (answer.kind === "results" ? answer.results : []));
|
|
569
|
+
const scope = renderParserSuite(scopeResults);
|
|
570
|
+
process.stdout.write(scope.text);
|
|
571
|
+
failures += scope.failures;
|
|
572
|
+
}
|
|
573
|
+
/* The opposite question to the defect matrix: whether oat stays quiet on a correct backend
|
|
574
|
+
* shaped unlike the one it was written against. One engine is enough — a shape varies the
|
|
575
|
+
* API, not the storage. */
|
|
576
|
+
if (shapeAnswer !== undefined) {
|
|
577
|
+
const { renderShapeSuite } = await import("./conformance/shapes.js");
|
|
578
|
+
process.stdout.write(`\n ── shapes · memory ${"─".repeat(46)}\n`);
|
|
579
|
+
const shapeCases = await shapeAnswer;
|
|
580
|
+
const shapes = renderShapeSuite(shapeCases.kind === "cases" ? shapeCases.cases : []);
|
|
581
|
+
process.stdout.write(shapes.text);
|
|
582
|
+
failures += shapes.failures;
|
|
583
|
+
if (recallAnswers !== undefined) {
|
|
584
|
+
process.stdout.write(`\n ── recall behind shapes · memory ${"─".repeat(32)}\n`);
|
|
585
|
+
const recallCases = (await recallAnswers).flatMap((answer) => (answer.kind === "cases" ? answer.cases : []));
|
|
586
|
+
const recall = renderShapeSuite(recallCases, true);
|
|
587
|
+
process.stdout.write(recall.text);
|
|
588
|
+
failures += recall.failures;
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
finally {
|
|
593
|
+
await pool.close();
|
|
369
594
|
}
|
|
370
595
|
if (requested === undefined && skipped.length > 0) {
|
|
596
|
+
/* An engine that is not there is not a pass: the SQL-only defects and every engine
|
|
597
|
+
* difference go untested. Leaving one out has to be asked for by name. */
|
|
598
|
+
const allowed = new Set(str(flags, "skip-backend")?.split(",") ?? []);
|
|
371
599
|
for (const backend of skipped) {
|
|
372
600
|
const why = backend === "sqlite"
|
|
373
601
|
? "node:sqlite unavailable (Node 22 needs --experimental-sqlite)"
|
|
374
602
|
: "no Postgres server reachable on the default connection";
|
|
375
|
-
|
|
603
|
+
if (allowed.has(backend)) {
|
|
604
|
+
process.stdout.write(` note: ${backend} backend skipped as asked — ${why}\n`);
|
|
605
|
+
}
|
|
606
|
+
else {
|
|
607
|
+
failures += 1;
|
|
608
|
+
process.stdout.write(` ✗ ${backend} backend unavailable — ${why}. Start it, or pass --skip-backend ${backend}\n`);
|
|
609
|
+
}
|
|
376
610
|
}
|
|
377
611
|
process.stdout.write("\n");
|
|
378
612
|
}
|
|
@@ -383,7 +617,15 @@ export async function main() {
|
|
|
383
617
|
* probe writing into a constrained field — was invisible to the one-at-a-time matrix. */
|
|
384
618
|
const { renderFuzz, runFuzz } = await import("./conformance/fuzz.js");
|
|
385
619
|
process.stdout.write(`\n ── combinations ${"─".repeat(46)}\n`);
|
|
386
|
-
|
|
620
|
+
/* A fixed seed tests the same 40 combinations forever. CI passes a fresh one per run and
|
|
621
|
+
* the seed is printed, so any failure it finds replays exactly. */
|
|
622
|
+
const fuzzSeed = Number.parseInt(str(flags, "fuzz-seed") ?? "1", 10);
|
|
623
|
+
if (!Number.isSafeInteger(fuzzSeed) || fuzzSeed < 1) {
|
|
624
|
+
process.stderr.write("oat: --fuzz-seed must be a positive integer\n");
|
|
625
|
+
return 2;
|
|
626
|
+
}
|
|
627
|
+
process.stdout.write(` fuzz seed ${fuzzSeed} — replay with --fuzz 40 --max-defects 6 --seed ${fuzzSeed}\n`);
|
|
628
|
+
const smoke = renderFuzz(await runFuzz({ backend: "memory", cases: 40, maxDefects: 6, seed: fuzzSeed }));
|
|
387
629
|
process.stdout.write(smoke.text);
|
|
388
630
|
failures += smoke.failures;
|
|
389
631
|
}
|
|
@@ -436,12 +678,19 @@ export async function main() {
|
|
|
436
678
|
return commandRun(flags);
|
|
437
679
|
const specFlag = str(flags, "spec");
|
|
438
680
|
const configPath = str(flags, "config");
|
|
439
|
-
const
|
|
681
|
+
const read = configPath === undefined ? undefined : await readConfig(configPath, false);
|
|
682
|
+
if (read !== undefined && "problem" in read) {
|
|
683
|
+
process.stderr.write(`oat: ${read.problem}\n`);
|
|
684
|
+
return EXIT.usage;
|
|
685
|
+
}
|
|
686
|
+
const loaded = read?.config;
|
|
687
|
+
const specSource = specFlag ?? loaded?.spec;
|
|
440
688
|
if (specSource === undefined) {
|
|
441
689
|
process.stderr.write("oat: --spec (or --config) is required\n\n" + USAGE);
|
|
442
690
|
return 2;
|
|
443
691
|
}
|
|
444
|
-
|
|
692
|
+
/* A relative spec resolves against the config's base URL, as it does for `run`. */
|
|
693
|
+
const raw = await loadSpec(specSource, str(flags, "base-url") ?? loaded?.baseUrl);
|
|
445
694
|
const { doc, externalRefs } = dereference(raw);
|
|
446
695
|
const model = buildModel(doc);
|
|
447
696
|
try {
|
|
@@ -454,11 +703,28 @@ export async function main() {
|
|
|
454
703
|
throw error;
|
|
455
704
|
}
|
|
456
705
|
switch (command) {
|
|
457
|
-
case "plan":
|
|
458
|
-
|
|
706
|
+
case "plan": {
|
|
707
|
+
const ops = list(flags, "ops") ?? loaded?.ops;
|
|
708
|
+
const only = list(flags, "only") ?? loaded?.only;
|
|
709
|
+
let scope;
|
|
710
|
+
try {
|
|
711
|
+
scope = planScope(model, resolveTargetScope(model, {
|
|
712
|
+
...(ops === undefined ? {} : { ops }),
|
|
713
|
+
...(only === undefined ? {} : { only }),
|
|
714
|
+
authCreates: authStepOperationIds(loaded?.principals ?? []),
|
|
715
|
+
}));
|
|
716
|
+
}
|
|
717
|
+
catch (error) {
|
|
718
|
+
if (!(error instanceof ScopeError))
|
|
719
|
+
throw error;
|
|
720
|
+
process.stderr.write(`${error.message}\n`);
|
|
721
|
+
return 2;
|
|
722
|
+
}
|
|
723
|
+
process.stdout.write(report.plan(model, flags.json === true, scope.mode === "targeted" ? scope : undefined));
|
|
459
724
|
return 0;
|
|
725
|
+
}
|
|
460
726
|
case "doctor": {
|
|
461
|
-
const config =
|
|
727
|
+
const config = loaded;
|
|
462
728
|
const output = report.doctor(model, externalRefs, flags.json === true, config === undefined
|
|
463
729
|
? undefined
|
|
464
730
|
: {
|
|
@@ -479,7 +745,7 @@ export function start() {
|
|
|
479
745
|
process.exitCode = code;
|
|
480
746
|
}, (error) => {
|
|
481
747
|
process.stderr.write(`oat: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
482
|
-
process.exitCode =
|
|
748
|
+
process.exitCode = EXIT.failed;
|
|
483
749
|
});
|
|
484
750
|
}
|
|
485
751
|
/* `node dist/cli.js …` is the test/CI entry. `bin/oat.js` calls start() itself because
|
|
@@ -361,6 +361,8 @@ export interface RateLimitSpec {
|
|
|
361
361
|
*/
|
|
362
362
|
category?: string;
|
|
363
363
|
}
|
|
364
|
+
/** How much of the string payload catalog a run sends. */
|
|
365
|
+
export type PayloadPolicy = "full" | "per-write-path";
|
|
364
366
|
export interface OatConfig {
|
|
365
367
|
/** OpenAPI document — an http(s) URL or a filesystem path. JSON or YAML. */
|
|
366
368
|
spec: string;
|
|
@@ -387,6 +389,12 @@ export interface OatConfig {
|
|
|
387
389
|
* Defaults: `{ attempts: 6, initialMs: 200, maxMs: 3000 }` (~9s worst case).
|
|
388
390
|
*/
|
|
389
391
|
outOfBand?: OutOfBandConfig;
|
|
392
|
+
/**
|
|
393
|
+
* How much of the 159-case string payload catalog to send. `"per-write-path"` (the default)
|
|
394
|
+
* sends all of it once per distinct write path — request media type and field type — and a
|
|
395
|
+
* representative family of each kind elsewhere; `"full"` sends all of it to every field.
|
|
396
|
+
*/
|
|
397
|
+
payloads?: PayloadPolicy;
|
|
390
398
|
/** Path parameters oat cannot create. Also declarable in-spec via `x-root`. */
|
|
391
399
|
roots?: Record<string, string>;
|
|
392
400
|
/** Fixture generation derives from this, so a failing run is exactly reproducible. */
|
|
@@ -395,8 +403,14 @@ export interface OatConfig {
|
|
|
395
403
|
cohortSize?: number;
|
|
396
404
|
/** Requests allowed in flight at once. Past a server's comfort this makes runs slower. */
|
|
397
405
|
maxInFlight?: number;
|
|
398
|
-
/**
|
|
406
|
+
/** Grade every operation these entities own, and nothing else. Joins `ops` as a union. */
|
|
399
407
|
only?: string[];
|
|
408
|
+
/**
|
|
409
|
+
* Grade only these operationIds; every other operation is support — called to reach or observe
|
|
410
|
+
* a target, never graded. `*` globs within an id (`row.*`); `<originId>:<operationId>` targets a
|
|
411
|
+
* secondary origin. `--ops` on the CLI replaces this list.
|
|
412
|
+
*/
|
|
413
|
+
ops?: string[];
|
|
400
414
|
/**
|
|
401
415
|
* Named profiles this run can select between, keyed by name. `"full"` and `"cheap"` exist
|
|
402
416
|
* implicitly and need no entry here; add one only for a profile a cost band can't express.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"define-config.d.ts","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwIH,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC7C,OAAO,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAA;AACrF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC7C,OAAO,OAAO,IAAI,IAAI,CAAA;AACvB,CAAC;
|
|
1
|
+
{"version":3,"file":"define-config.js","sourceRoot":"","sources":["../../src/config/define-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwIH,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC7C,OAAO,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC,CAAA;AACrF,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAmB;IAC7C,OAAO,OAAO,IAAI,IAAI,CAAA;AACvB,CAAC;AA2WD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAAC,MAAiB;IAC7C,OAAO,MAAM,CAAA;AACd,CAAC"}
|