modality-ts 0.0.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/LICENSE +21 -0
- package/README.md +84 -0
- package/dist/checker/encode/index.d.ts +2 -0
- package/dist/checker/encode/index.d.ts.map +1 -0
- package/dist/checker/encode/index.js +2 -0
- package/dist/checker/encode/index.js.map +1 -0
- package/dist/checker/index.d.ts +6 -0
- package/dist/checker/index.d.ts.map +1 -0
- package/dist/checker/index.js +6 -0
- package/dist/checker/index.js.map +1 -0
- package/dist/checker/monitors/index.d.ts +2 -0
- package/dist/checker/monitors/index.d.ts.map +1 -0
- package/dist/checker/monitors/index.js +2 -0
- package/dist/checker/monitors/index.js.map +1 -0
- package/dist/checker/search/eval.d.ts +16 -0
- package/dist/checker/search/eval.d.ts.map +1 -0
- package/dist/checker/search/eval.js +254 -0
- package/dist/checker/search/eval.js.map +1 -0
- package/dist/checker/search/index.d.ts +43 -0
- package/dist/checker/search/index.d.ts.map +1 -0
- package/dist/checker/search/index.js +532 -0
- package/dist/checker/search/index.js.map +1 -0
- package/dist/checker/slicing/index.d.ts +2 -0
- package/dist/checker/slicing/index.d.ts.map +1 -0
- package/dist/checker/slicing/index.js +2 -0
- package/dist/checker/slicing/index.js.map +1 -0
- package/dist/checker/traces/index.d.ts +2 -0
- package/dist/checker/traces/index.d.ts.map +1 -0
- package/dist/checker/traces/index.js +2 -0
- package/dist/checker/traces/index.js.map +1 -0
- package/dist/extraction/index.d.ts +31 -0
- package/dist/extraction/index.d.ts.map +1 -0
- package/dist/extraction/index.js +2254 -0
- package/dist/extraction/index.js.map +1 -0
- package/dist/extraction/pipeline/index.d.ts +45 -0
- package/dist/extraction/pipeline/index.d.ts.map +1 -0
- package/dist/extraction/pipeline/index.js +101 -0
- package/dist/extraction/pipeline/index.js.map +1 -0
- package/dist/extraction/spi/index.d.ts +99 -0
- package/dist/extraction/spi/index.d.ts.map +1 -0
- package/dist/extraction/spi/index.js +2 -0
- package/dist/extraction/spi/index.js.map +1 -0
- package/dist/harness/index.d.ts +109 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +377 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/kernel/artifacts/index.d.ts +11 -0
- package/dist/kernel/artifacts/index.d.ts.map +1 -0
- package/dist/kernel/artifacts/index.js +127 -0
- package/dist/kernel/artifacts/index.js.map +1 -0
- package/dist/kernel/index.d.ts +10 -0
- package/dist/kernel/index.d.ts.map +1 -0
- package/dist/kernel/index.js +10 -0
- package/dist/kernel/index.js.map +1 -0
- package/dist/kernel/ir/canonical.d.ts +5 -0
- package/dist/kernel/ir/canonical.d.ts.map +1 -0
- package/dist/kernel/ir/canonical.js +47 -0
- package/dist/kernel/ir/canonical.js.map +1 -0
- package/dist/kernel/ir/domains.d.ts +9 -0
- package/dist/kernel/ir/domains.d.ts.map +1 -0
- package/dist/kernel/ir/domains.js +102 -0
- package/dist/kernel/ir/domains.js.map +1 -0
- package/dist/kernel/ir/types.d.ts +224 -0
- package/dist/kernel/ir/types.d.ts.map +1 -0
- package/dist/kernel/ir/types.js +2 -0
- package/dist/kernel/ir/types.js.map +1 -0
- package/dist/kernel/ir/validator.d.ts +11 -0
- package/dist/kernel/ir/validator.d.ts.map +1 -0
- package/dist/kernel/ir/validator.js +674 -0
- package/dist/kernel/ir/validator.js.map +1 -0
- package/dist/kernel/overlay/index.d.ts +18 -0
- package/dist/kernel/overlay/index.d.ts.map +1 -0
- package/dist/kernel/overlay/index.js +59 -0
- package/dist/kernel/overlay/index.js.map +1 -0
- package/dist/kernel/props/index.d.ts +71 -0
- package/dist/kernel/props/index.d.ts.map +1 -0
- package/dist/kernel/props/index.js +122 -0
- package/dist/kernel/props/index.js.map +1 -0
- package/dist/kernel/report/types.d.ts +115 -0
- package/dist/kernel/report/types.d.ts.map +1 -0
- package/dist/kernel/report/types.js +2 -0
- package/dist/kernel/report/types.js.map +1 -0
- package/dist/kernel/trace/types.d.ts +19 -0
- package/dist/kernel/trace/types.d.ts.map +1 -0
- package/dist/kernel/trace/types.js +2 -0
- package/dist/kernel/trace/types.js.map +1 -0
- package/dist/modality/check.d.ts +3 -0
- package/dist/modality/check.d.ts.map +1 -0
- package/dist/modality/check.js +2 -0
- package/dist/modality/check.js.map +1 -0
- package/dist/modality/ci.d.ts +3 -0
- package/dist/modality/ci.d.ts.map +1 -0
- package/dist/modality/ci.js +2 -0
- package/dist/modality/ci.js.map +1 -0
- package/dist/modality/cli.d.ts +3 -0
- package/dist/modality/cli.d.ts.map +1 -0
- package/dist/modality/cli.js +223 -0
- package/dist/modality/cli.js.map +1 -0
- package/dist/modality/codegen/model.d.ts +3 -0
- package/dist/modality/codegen/model.d.ts.map +1 -0
- package/dist/modality/codegen/model.js +59 -0
- package/dist/modality/codegen/model.js.map +1 -0
- package/dist/modality/codegen/replay-test.d.ts +10 -0
- package/dist/modality/codegen/replay-test.d.ts.map +1 -0
- package/dist/modality/codegen/replay-test.js +104 -0
- package/dist/modality/codegen/replay-test.js.map +1 -0
- package/dist/modality/conform.d.ts +3 -0
- package/dist/modality/conform.d.ts.map +1 -0
- package/dist/modality/conform.js +2 -0
- package/dist/modality/conform.js.map +1 -0
- package/dist/modality/export-tla.d.ts +3 -0
- package/dist/modality/export-tla.d.ts.map +1 -0
- package/dist/modality/export-tla.js +2 -0
- package/dist/modality/export-tla.js.map +1 -0
- package/dist/modality/extract.d.ts +3 -0
- package/dist/modality/extract.d.ts.map +1 -0
- package/dist/modality/extract.js +2 -0
- package/dist/modality/extract.js.map +1 -0
- package/dist/modality/features/check/command.d.ts +23 -0
- package/dist/modality/features/check/command.d.ts.map +1 -0
- package/dist/modality/features/check/command.js +174 -0
- package/dist/modality/features/check/command.js.map +1 -0
- package/dist/modality/features/check/index.d.ts +3 -0
- package/dist/modality/features/check/index.d.ts.map +1 -0
- package/dist/modality/features/check/index.js +2 -0
- package/dist/modality/features/check/index.js.map +1 -0
- package/dist/modality/features/ci/command.d.ts +23 -0
- package/dist/modality/features/ci/command.d.ts.map +1 -0
- package/dist/modality/features/ci/command.js +176 -0
- package/dist/modality/features/ci/command.js.map +1 -0
- package/dist/modality/features/ci/index.d.ts +3 -0
- package/dist/modality/features/ci/index.d.ts.map +1 -0
- package/dist/modality/features/ci/index.js +2 -0
- package/dist/modality/features/ci/index.js.map +1 -0
- package/dist/modality/features/conform/command.d.ts +35 -0
- package/dist/modality/features/conform/command.d.ts.map +1 -0
- package/dist/modality/features/conform/command.js +162 -0
- package/dist/modality/features/conform/command.js.map +1 -0
- package/dist/modality/features/conform/index.d.ts +3 -0
- package/dist/modality/features/conform/index.d.ts.map +1 -0
- package/dist/modality/features/conform/index.js +2 -0
- package/dist/modality/features/conform/index.js.map +1 -0
- package/dist/modality/features/export/command.d.ts +13 -0
- package/dist/modality/features/export/command.d.ts.map +1 -0
- package/dist/modality/features/export/command.js +250 -0
- package/dist/modality/features/export/command.js.map +1 -0
- package/dist/modality/features/export/index.d.ts +3 -0
- package/dist/modality/features/export/index.d.ts.map +1 -0
- package/dist/modality/features/export/index.js +2 -0
- package/dist/modality/features/export/index.js.map +1 -0
- package/dist/modality/features/extract/command.d.ts +37 -0
- package/dist/modality/features/extract/command.d.ts.map +1 -0
- package/dist/modality/features/extract/command.js +443 -0
- package/dist/modality/features/extract/command.js.map +1 -0
- package/dist/modality/features/extract/index.d.ts +3 -0
- package/dist/modality/features/extract/index.d.ts.map +1 -0
- package/dist/modality/features/extract/index.js +2 -0
- package/dist/modality/features/extract/index.js.map +1 -0
- package/dist/modality/features/replay/command.d.ts +16 -0
- package/dist/modality/features/replay/command.d.ts.map +1 -0
- package/dist/modality/features/replay/command.js +50 -0
- package/dist/modality/features/replay/command.js.map +1 -0
- package/dist/modality/features/replay/index.d.ts +3 -0
- package/dist/modality/features/replay/index.d.ts.map +1 -0
- package/dist/modality/features/replay/index.js +2 -0
- package/dist/modality/features/replay/index.js.map +1 -0
- package/dist/modality/overlay.d.ts +3 -0
- package/dist/modality/overlay.d.ts.map +1 -0
- package/dist/modality/overlay.js +9 -0
- package/dist/modality/overlay.js.map +1 -0
- package/dist/modality/registry/index.d.ts +22 -0
- package/dist/modality/registry/index.d.ts.map +1 -0
- package/dist/modality/registry/index.js +89 -0
- package/dist/modality/registry/index.js.map +1 -0
- package/dist/modality/replay.d.ts +3 -0
- package/dist/modality/replay.d.ts.map +1 -0
- package/dist/modality/replay.js +2 -0
- package/dist/modality/replay.js.map +1 -0
- package/dist/runtime/index.d.ts +53 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +83 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/sources/jotai/harness.d.ts +13 -0
- package/dist/sources/jotai/harness.d.ts.map +1 -0
- package/dist/sources/jotai/harness.js +20 -0
- package/dist/sources/jotai/harness.js.map +1 -0
- package/dist/sources/jotai/index.d.ts +11 -0
- package/dist/sources/jotai/index.d.ts.map +1 -0
- package/dist/sources/jotai/index.js +405 -0
- package/dist/sources/jotai/index.js.map +1 -0
- package/dist/sources/router/harness.d.ts +9 -0
- package/dist/sources/router/harness.d.ts.map +1 -0
- package/dist/sources/router/harness.js +32 -0
- package/dist/sources/router/harness.js.map +1 -0
- package/dist/sources/router/index.d.ts +15 -0
- package/dist/sources/router/index.d.ts.map +1 -0
- package/dist/sources/router/index.js +41 -0
- package/dist/sources/router/index.js.map +1 -0
- package/dist/sources/swr/harness.d.ts +12 -0
- package/dist/sources/swr/harness.d.ts.map +1 -0
- package/dist/sources/swr/harness.js +25 -0
- package/dist/sources/swr/harness.js.map +1 -0
- package/dist/sources/swr/index.d.ts +51 -0
- package/dist/sources/swr/index.d.ts.map +1 -0
- package/dist/sources/swr/index.js +428 -0
- package/dist/sources/swr/index.js.map +1 -0
- package/dist/sources/use-state/harness.d.ts +12 -0
- package/dist/sources/use-state/harness.d.ts.map +1 -0
- package/dist/sources/use-state/harness.js +19 -0
- package/dist/sources/use-state/harness.js.map +1 -0
- package/dist/sources/use-state/index.d.ts +9 -0
- package/dist/sources/use-state/index.d.ts.map +1 -0
- package/dist/sources/use-state/index.js +248 -0
- package/dist/sources/use-state/index.js.map +1 -0
- package/package.json +136 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import type { AbstractDomain, Locator, ModelState, Trace, TraceStep, Value } from "modality-ts/kernel";
|
|
2
|
+
export type ReplayVerdict = {
|
|
3
|
+
status: "reproduced";
|
|
4
|
+
stepsRun: number;
|
|
5
|
+
} | {
|
|
6
|
+
status: "not-reproduced";
|
|
7
|
+
stepsRun: number;
|
|
8
|
+
divergenceStep: number;
|
|
9
|
+
reason: string;
|
|
10
|
+
} | {
|
|
11
|
+
status: "inconclusive";
|
|
12
|
+
stepsRun: number;
|
|
13
|
+
reason: string;
|
|
14
|
+
};
|
|
15
|
+
export interface ReplayDriver {
|
|
16
|
+
currentState(): ModelState;
|
|
17
|
+
apply(step: TraceStep): Promise<void> | void;
|
|
18
|
+
assertViolation?(): Promise<boolean> | boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface ReplayOptions {
|
|
21
|
+
compareState?: (expected: ModelState, actual: ModelState) => string | undefined;
|
|
22
|
+
}
|
|
23
|
+
export interface ReplayActor {
|
|
24
|
+
click?(locator: Locator): Promise<void> | void;
|
|
25
|
+
submit?(locator: Locator): Promise<void> | void;
|
|
26
|
+
input?(locator: Locator, value: string, valueClass: string): Promise<void> | void;
|
|
27
|
+
navigate?(mode: "push" | "back", to?: string): Promise<void> | void;
|
|
28
|
+
resolve?(op: string, outcome: string): Promise<void> | void;
|
|
29
|
+
focusRevalidate?(key?: string): Promise<void> | void;
|
|
30
|
+
timer?(key?: string): Promise<void> | void;
|
|
31
|
+
stabilize?(): Promise<void> | void;
|
|
32
|
+
}
|
|
33
|
+
export interface DomReplayActorOptions {
|
|
34
|
+
document?: Document;
|
|
35
|
+
stabilize?: () => Promise<void> | void;
|
|
36
|
+
navigate?: ReplayActor["navigate"];
|
|
37
|
+
resolve?: ReplayActor["resolve"];
|
|
38
|
+
focusRevalidate?: ReplayActor["focusRevalidate"];
|
|
39
|
+
timer?: ReplayActor["timer"];
|
|
40
|
+
}
|
|
41
|
+
export interface ModalityReplayHarness extends DomReplayActorOptions {
|
|
42
|
+
sources?: readonly ObservationSource[];
|
|
43
|
+
}
|
|
44
|
+
export interface ActionReplayDriverOptions {
|
|
45
|
+
inputValues?: Record<string, string>;
|
|
46
|
+
assertViolation?: () => Promise<boolean> | boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface ObservationSource {
|
|
49
|
+
id?: string;
|
|
50
|
+
observe(varId: string): {
|
|
51
|
+
value: Value;
|
|
52
|
+
} | "unobservable";
|
|
53
|
+
}
|
|
54
|
+
export interface ObservedModelState {
|
|
55
|
+
state: ModelState;
|
|
56
|
+
unobservable: readonly string[];
|
|
57
|
+
}
|
|
58
|
+
export interface WitnessOptions {
|
|
59
|
+
tokenWitnesses?: Record<string, Value>;
|
|
60
|
+
elementWitness?: Value;
|
|
61
|
+
}
|
|
62
|
+
export declare function replayTrace(trace: Trace, driver: ReplayDriver, options?: ReplayOptions): Promise<ReplayVerdict>;
|
|
63
|
+
export declare class StateSequenceDriver implements ReplayDriver {
|
|
64
|
+
private readonly states;
|
|
65
|
+
private readonly failAtStep?;
|
|
66
|
+
private index;
|
|
67
|
+
constructor(states: readonly ModelState[], failAtStep?: number | undefined);
|
|
68
|
+
currentState(): ModelState;
|
|
69
|
+
apply(_step: TraceStep): void;
|
|
70
|
+
}
|
|
71
|
+
export declare function statesFromTrace(trace: Trace): ModelState[];
|
|
72
|
+
export declare class ActionReplayDriver implements ReplayDriver {
|
|
73
|
+
private readonly actor;
|
|
74
|
+
private readonly observe;
|
|
75
|
+
private readonly options;
|
|
76
|
+
constructor(actor: ReplayActor, observe: () => ModelState, options?: ActionReplayDriverOptions);
|
|
77
|
+
currentState(): ModelState;
|
|
78
|
+
apply(step: TraceStep): Promise<void>;
|
|
79
|
+
assertViolation(): Promise<boolean>;
|
|
80
|
+
}
|
|
81
|
+
export declare class ObservableActionReplayDriver implements ReplayDriver {
|
|
82
|
+
private readonly actor;
|
|
83
|
+
private readonly varIds;
|
|
84
|
+
private readonly sources;
|
|
85
|
+
private readonly options;
|
|
86
|
+
constructor(actor: ReplayActor, varIds: readonly string[], sources: readonly ObservationSource[], options?: ActionReplayDriverOptions);
|
|
87
|
+
currentState(): ModelState;
|
|
88
|
+
apply(step: TraceStep): Promise<void>;
|
|
89
|
+
assertViolation(): Promise<boolean>;
|
|
90
|
+
}
|
|
91
|
+
export declare class TraceBackedActionReplayDriver implements ReplayDriver {
|
|
92
|
+
private readonly actor;
|
|
93
|
+
private readonly options;
|
|
94
|
+
private readonly states;
|
|
95
|
+
private index;
|
|
96
|
+
constructor(trace: Trace, actor: ReplayActor, options?: ActionReplayDriverOptions);
|
|
97
|
+
currentState(): ModelState;
|
|
98
|
+
apply(step: TraceStep): Promise<void>;
|
|
99
|
+
assertViolation(): Promise<boolean>;
|
|
100
|
+
}
|
|
101
|
+
export declare function observeModelState(varIds: readonly string[], sources: readonly ObservationSource[]): ObservedModelState;
|
|
102
|
+
export declare function observationSource(id: string, observe: (varId: string) => {
|
|
103
|
+
value: Value;
|
|
104
|
+
} | "unobservable"): ObservationSource;
|
|
105
|
+
export declare function createDomReplayActor(options?: DomReplayActorOptions): ReplayActor;
|
|
106
|
+
export declare function dispatchReplayStep(step: TraceStep, actor: ReplayActor, options?: ActionReplayDriverOptions): Promise<void>;
|
|
107
|
+
export declare function witnessValue(domain: AbstractDomain, value?: Value, options?: WitnessOptions): Value;
|
|
108
|
+
export declare function inputWitness(valueClass: string): string;
|
|
109
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
export async function replayTrace(trace, driver, options = {}) {
|
|
2
|
+
const compare = options.compareState ?? defaultCompareState;
|
|
3
|
+
for (let index = 0; index < trace.steps.length; index += 1) {
|
|
4
|
+
const step = trace.steps[index];
|
|
5
|
+
let preState;
|
|
6
|
+
try {
|
|
7
|
+
preState = driver.currentState();
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
return { status: "inconclusive", stepsRun: index, reason: error instanceof Error ? error.message : String(error) };
|
|
11
|
+
}
|
|
12
|
+
const preMismatch = compare(step.pre, preState);
|
|
13
|
+
if (preMismatch)
|
|
14
|
+
return { status: "not-reproduced", stepsRun: index, divergenceStep: index + 1, reason: `precondition mismatch: ${preMismatch}` };
|
|
15
|
+
try {
|
|
16
|
+
await driver.apply(step);
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return { status: "inconclusive", stepsRun: index, reason: error instanceof Error ? error.message : String(error) };
|
|
20
|
+
}
|
|
21
|
+
let postState;
|
|
22
|
+
try {
|
|
23
|
+
postState = driver.currentState();
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return { status: "inconclusive", stepsRun: index + 1, reason: error instanceof Error ? error.message : String(error) };
|
|
27
|
+
}
|
|
28
|
+
const postMismatch = compare(step.post, postState);
|
|
29
|
+
if (postMismatch)
|
|
30
|
+
return { status: "not-reproduced", stepsRun: index + 1, divergenceStep: index + 1, reason: `postcondition mismatch: ${postMismatch}` };
|
|
31
|
+
}
|
|
32
|
+
const violationObserved = driver.assertViolation ? await driver.assertViolation() : true;
|
|
33
|
+
return violationObserved ? { status: "reproduced", stepsRun: trace.steps.length } : { status: "not-reproduced", stepsRun: trace.steps.length, divergenceStep: trace.steps.length, reason: "final violation was not observed" };
|
|
34
|
+
}
|
|
35
|
+
export class StateSequenceDriver {
|
|
36
|
+
states;
|
|
37
|
+
failAtStep;
|
|
38
|
+
index = 0;
|
|
39
|
+
constructor(states, failAtStep) {
|
|
40
|
+
this.states = states;
|
|
41
|
+
this.failAtStep = failAtStep;
|
|
42
|
+
if (states.length === 0)
|
|
43
|
+
throw new Error("StateSequenceDriver requires at least one state");
|
|
44
|
+
}
|
|
45
|
+
currentState() {
|
|
46
|
+
return this.states[Math.min(this.index, this.states.length - 1)];
|
|
47
|
+
}
|
|
48
|
+
apply(_step) {
|
|
49
|
+
if (this.failAtStep !== undefined && this.index + 1 === this.failAtStep) {
|
|
50
|
+
throw new Error(`driver failed at step ${this.failAtStep}`);
|
|
51
|
+
}
|
|
52
|
+
this.index = Math.min(this.index + 1, this.states.length - 1);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export function statesFromTrace(trace) {
|
|
56
|
+
return trace.steps.length === 0 ? [{}] : [trace.steps[0].pre, ...trace.steps.map((step) => step.post)];
|
|
57
|
+
}
|
|
58
|
+
export class ActionReplayDriver {
|
|
59
|
+
actor;
|
|
60
|
+
observe;
|
|
61
|
+
options;
|
|
62
|
+
constructor(actor, observe, options = {}) {
|
|
63
|
+
this.actor = actor;
|
|
64
|
+
this.observe = observe;
|
|
65
|
+
this.options = options;
|
|
66
|
+
}
|
|
67
|
+
currentState() {
|
|
68
|
+
return this.observe();
|
|
69
|
+
}
|
|
70
|
+
async apply(step) {
|
|
71
|
+
await dispatchReplayStep(step, this.actor, this.options);
|
|
72
|
+
}
|
|
73
|
+
async assertViolation() {
|
|
74
|
+
return this.options.assertViolation ? this.options.assertViolation() : true;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export class ObservableActionReplayDriver {
|
|
78
|
+
actor;
|
|
79
|
+
varIds;
|
|
80
|
+
sources;
|
|
81
|
+
options;
|
|
82
|
+
constructor(actor, varIds, sources, options = {}) {
|
|
83
|
+
this.actor = actor;
|
|
84
|
+
this.varIds = varIds;
|
|
85
|
+
this.sources = sources;
|
|
86
|
+
this.options = options;
|
|
87
|
+
}
|
|
88
|
+
currentState() {
|
|
89
|
+
const observed = observeModelState(this.varIds, this.sources);
|
|
90
|
+
if (observed.unobservable.length > 0) {
|
|
91
|
+
throw new Error(`Unobservable model vars: ${observed.unobservable.join(", ")}`);
|
|
92
|
+
}
|
|
93
|
+
return observed.state;
|
|
94
|
+
}
|
|
95
|
+
async apply(step) {
|
|
96
|
+
await dispatchReplayStep(step, this.actor, this.options);
|
|
97
|
+
}
|
|
98
|
+
async assertViolation() {
|
|
99
|
+
return this.options.assertViolation ? this.options.assertViolation() : true;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
export class TraceBackedActionReplayDriver {
|
|
103
|
+
actor;
|
|
104
|
+
options;
|
|
105
|
+
states;
|
|
106
|
+
index = 0;
|
|
107
|
+
constructor(trace, actor, options = {}) {
|
|
108
|
+
this.actor = actor;
|
|
109
|
+
this.options = options;
|
|
110
|
+
this.states = statesFromTrace(trace);
|
|
111
|
+
}
|
|
112
|
+
currentState() {
|
|
113
|
+
return this.states[Math.min(this.index, this.states.length - 1)];
|
|
114
|
+
}
|
|
115
|
+
async apply(step) {
|
|
116
|
+
await dispatchReplayStep(step, this.actor, this.options);
|
|
117
|
+
this.index = Math.min(this.index + 1, this.states.length - 1);
|
|
118
|
+
}
|
|
119
|
+
async assertViolation() {
|
|
120
|
+
return this.options.assertViolation ? this.options.assertViolation() : true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function observeModelState(varIds, sources) {
|
|
124
|
+
const state = {};
|
|
125
|
+
const unobservable = [];
|
|
126
|
+
for (const varId of varIds) {
|
|
127
|
+
const observed = firstObserved(varId, sources);
|
|
128
|
+
if (observed === "unobservable") {
|
|
129
|
+
unobservable.push(varId);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
state[varId] = observed.value;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { state, unobservable };
|
|
136
|
+
}
|
|
137
|
+
export function observationSource(id, observe) {
|
|
138
|
+
return { id, observe };
|
|
139
|
+
}
|
|
140
|
+
export function createDomReplayActor(options = {}) {
|
|
141
|
+
const doc = options.document ?? globalThis.document;
|
|
142
|
+
if (!doc)
|
|
143
|
+
throw new Error("createDomReplayActor requires a document");
|
|
144
|
+
return {
|
|
145
|
+
click: async (locator) => {
|
|
146
|
+
const element = locateOne(doc, locator);
|
|
147
|
+
assertEnabled(element, locator);
|
|
148
|
+
if (typeof element.click === "function")
|
|
149
|
+
element.click();
|
|
150
|
+
else
|
|
151
|
+
dispatchDomEvent(doc, element, "click", { bubbles: true, cancelable: true });
|
|
152
|
+
},
|
|
153
|
+
submit: async (locator) => {
|
|
154
|
+
const element = locateOne(doc, locator);
|
|
155
|
+
assertEnabled(element, locator);
|
|
156
|
+
const submitTarget = formFor(element);
|
|
157
|
+
if (submitTarget && typeof submitTarget.requestSubmit === "function")
|
|
158
|
+
submitTarget.requestSubmit();
|
|
159
|
+
else
|
|
160
|
+
dispatchDomEvent(doc, submitTarget ?? element, "submit", { bubbles: true, cancelable: true });
|
|
161
|
+
},
|
|
162
|
+
input: async (locator, value) => {
|
|
163
|
+
const element = locateOne(doc, locator);
|
|
164
|
+
assertEnabled(element, locator);
|
|
165
|
+
element.value = value;
|
|
166
|
+
dispatchDomEvent(doc, element, "input", { bubbles: true });
|
|
167
|
+
dispatchDomEvent(doc, element, "change", { bubbles: true });
|
|
168
|
+
},
|
|
169
|
+
navigate: options.navigate,
|
|
170
|
+
resolve: options.resolve,
|
|
171
|
+
focusRevalidate: options.focusRevalidate,
|
|
172
|
+
timer: options.timer,
|
|
173
|
+
stabilize: options.stabilize
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
function firstObserved(varId, sources) {
|
|
177
|
+
for (const source of sources) {
|
|
178
|
+
const observed = source.observe(varId);
|
|
179
|
+
if (observed !== "unobservable")
|
|
180
|
+
return observed;
|
|
181
|
+
}
|
|
182
|
+
return "unobservable";
|
|
183
|
+
}
|
|
184
|
+
function locateOne(doc, locator) {
|
|
185
|
+
const matches = locateAll(doc, locator);
|
|
186
|
+
const element = matches[0];
|
|
187
|
+
if (!element)
|
|
188
|
+
throw new Error(`No element found for ${formatLocator(locator)}`);
|
|
189
|
+
return element;
|
|
190
|
+
}
|
|
191
|
+
function locateAll(doc, locator) {
|
|
192
|
+
if (locator.kind === "positional")
|
|
193
|
+
return locateAll(doc, locator.base).slice(locator.index, locator.index + 1);
|
|
194
|
+
if (locator.kind === "testId")
|
|
195
|
+
return [...doc.querySelectorAll(`[data-testid="${cssString(locator.value)}"]`)];
|
|
196
|
+
const candidates = [...doc.querySelectorAll(roleSelector(locator.role))];
|
|
197
|
+
return candidates.filter((element) => elementRole(element) === locator.role && (!locator.name || elementName(element) === locator.name));
|
|
198
|
+
}
|
|
199
|
+
function roleSelector(role) {
|
|
200
|
+
const implicit = role === "button" ? "button,input[type=button],input[type=submit]" :
|
|
201
|
+
role === "textbox" ? "input:not([type]),input[type=text],textarea" :
|
|
202
|
+
role === "combobox" ? "select" :
|
|
203
|
+
role === "radio" ? "input[type=radio]" :
|
|
204
|
+
role === "form" ? "form" :
|
|
205
|
+
"";
|
|
206
|
+
return implicit ? `[role="${cssString(role)}"],${implicit}` : `[role="${cssString(role)}"]`;
|
|
207
|
+
}
|
|
208
|
+
function elementRole(element) {
|
|
209
|
+
const explicit = element.getAttribute("role");
|
|
210
|
+
if (explicit)
|
|
211
|
+
return explicit;
|
|
212
|
+
const tag = element.tagName.toLowerCase();
|
|
213
|
+
if (tag === "button")
|
|
214
|
+
return "button";
|
|
215
|
+
if (tag === "form")
|
|
216
|
+
return "form";
|
|
217
|
+
if (tag === "select")
|
|
218
|
+
return "combobox";
|
|
219
|
+
if (tag === "textarea")
|
|
220
|
+
return "textbox";
|
|
221
|
+
if (tag === "input") {
|
|
222
|
+
const type = (element.getAttribute("type") ?? "text").toLowerCase();
|
|
223
|
+
if (type === "button" || type === "submit")
|
|
224
|
+
return "button";
|
|
225
|
+
if (type === "radio")
|
|
226
|
+
return "radio";
|
|
227
|
+
return "textbox";
|
|
228
|
+
}
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
function elementName(element) {
|
|
232
|
+
return element.getAttribute("aria-label") ?? element.textContent?.trim() ?? "";
|
|
233
|
+
}
|
|
234
|
+
function assertEnabled(element, locator) {
|
|
235
|
+
if (element.disabled || element.getAttribute("aria-disabled") === "true") {
|
|
236
|
+
throw new Error(`Element is disabled for ${formatLocator(locator)}`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
function formFor(element) {
|
|
240
|
+
if (element.tagName.toLowerCase() === "form")
|
|
241
|
+
return element;
|
|
242
|
+
return element.form ?? undefined;
|
|
243
|
+
}
|
|
244
|
+
function dispatchDomEvent(doc, element, type, init) {
|
|
245
|
+
const EventCtor = doc.defaultView?.Event ?? Event;
|
|
246
|
+
element.dispatchEvent(new EventCtor(type, init));
|
|
247
|
+
}
|
|
248
|
+
function cssString(value) {
|
|
249
|
+
return value.replace(/["\\]/g, "\\$&");
|
|
250
|
+
}
|
|
251
|
+
function formatLocator(locator) {
|
|
252
|
+
return JSON.stringify(locator);
|
|
253
|
+
}
|
|
254
|
+
export async function dispatchReplayStep(step, actor, options = {}) {
|
|
255
|
+
const label = step.label;
|
|
256
|
+
switch (label.kind) {
|
|
257
|
+
case "click":
|
|
258
|
+
if (!label.locator)
|
|
259
|
+
throw new Error(`Missing locator for click step ${step.transitionId}`);
|
|
260
|
+
await callActor("click", actor.click, label.locator);
|
|
261
|
+
break;
|
|
262
|
+
case "submit":
|
|
263
|
+
if (!label.locator)
|
|
264
|
+
throw new Error(`Missing locator for submit step ${step.transitionId}`);
|
|
265
|
+
await callActor("submit", actor.submit, label.locator);
|
|
266
|
+
break;
|
|
267
|
+
case "input":
|
|
268
|
+
if (!label.locator)
|
|
269
|
+
throw new Error(`Missing locator for input step ${step.transitionId}`);
|
|
270
|
+
await callActor("input", actor.input, label.locator, options.inputValues?.[label.valueClass] ?? inputWitness(label.valueClass), label.valueClass);
|
|
271
|
+
break;
|
|
272
|
+
case "navigate":
|
|
273
|
+
await callActor("navigate", actor.navigate, label.mode, label.to);
|
|
274
|
+
break;
|
|
275
|
+
case "resolve":
|
|
276
|
+
await callActor("resolve", actor.resolve, label.op, label.outcome);
|
|
277
|
+
break;
|
|
278
|
+
case "focus-revalidate":
|
|
279
|
+
await callActor("focus-revalidate", actor.focusRevalidate, label.key);
|
|
280
|
+
break;
|
|
281
|
+
case "timer":
|
|
282
|
+
await callActor("timer", actor.timer, label.key);
|
|
283
|
+
break;
|
|
284
|
+
case "internal":
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
await actor.stabilize?.();
|
|
288
|
+
}
|
|
289
|
+
async function callActor(name, fn, ...args) {
|
|
290
|
+
if (!fn)
|
|
291
|
+
throw new Error(`Replay actor does not support ${name}`);
|
|
292
|
+
await fn(...args);
|
|
293
|
+
}
|
|
294
|
+
export function witnessValue(domain, value, options = {}) {
|
|
295
|
+
if (value !== undefined && value !== null) {
|
|
296
|
+
if (domain.kind === "lengthCat")
|
|
297
|
+
return witnessLengthCat(value);
|
|
298
|
+
if (domain.kind === "tokens" && typeof value === "string")
|
|
299
|
+
return options.tokenWitnesses?.[value] ?? value;
|
|
300
|
+
if (domain.kind === "option")
|
|
301
|
+
return witnessValue(domain.inner, value, options);
|
|
302
|
+
if (domain.kind === "record" && isRecord(value))
|
|
303
|
+
return witnessRecord(domain.fields, value, options);
|
|
304
|
+
if (domain.kind === "tagged" && isRecord(value) && typeof value[domain.tag] === "string") {
|
|
305
|
+
const variant = domain.variants[value[domain.tag]];
|
|
306
|
+
return variant ? { ...witnessValue(variant, value, options), [domain.tag]: value[domain.tag] } : value;
|
|
307
|
+
}
|
|
308
|
+
if (domain.kind === "boundedList" && Array.isArray(value))
|
|
309
|
+
return value.map((item) => witnessValue(domain.inner, item, options));
|
|
310
|
+
return value;
|
|
311
|
+
}
|
|
312
|
+
switch (domain.kind) {
|
|
313
|
+
case "bool":
|
|
314
|
+
return false;
|
|
315
|
+
case "enum":
|
|
316
|
+
return domain.values[0] ?? "";
|
|
317
|
+
case "boundedInt":
|
|
318
|
+
return domain.min;
|
|
319
|
+
case "option":
|
|
320
|
+
return null;
|
|
321
|
+
case "record":
|
|
322
|
+
return witnessRecord(domain.fields, undefined, options);
|
|
323
|
+
case "tagged": {
|
|
324
|
+
const [tagValue, variant] = Object.entries(domain.variants)[0] ?? ["unknown", { kind: "record", fields: {} }];
|
|
325
|
+
return { ...witnessValue(variant, undefined, options), [domain.tag]: tagValue };
|
|
326
|
+
}
|
|
327
|
+
case "tokens": {
|
|
328
|
+
const token = domain.names?.[0] ?? "tok1";
|
|
329
|
+
return options.tokenWitnesses?.[token] ?? token;
|
|
330
|
+
}
|
|
331
|
+
case "lengthCat":
|
|
332
|
+
return [];
|
|
333
|
+
case "boundedList":
|
|
334
|
+
return [];
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
export function inputWitness(valueClass) {
|
|
338
|
+
switch (valueClass) {
|
|
339
|
+
case "empty":
|
|
340
|
+
case "0":
|
|
341
|
+
return "";
|
|
342
|
+
case "nonEmpty":
|
|
343
|
+
case "1":
|
|
344
|
+
case "many":
|
|
345
|
+
case "valid":
|
|
346
|
+
return "modality";
|
|
347
|
+
case "invalid":
|
|
348
|
+
return "!";
|
|
349
|
+
default:
|
|
350
|
+
return valueClass.includes("|") ? inputWitness(valueClass.split("|").find((part) => part !== "empty") ?? valueClass.split("|")[0]) : valueClass;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function witnessLengthCat(value) {
|
|
354
|
+
if (value === "0")
|
|
355
|
+
return [];
|
|
356
|
+
if (value === "1")
|
|
357
|
+
return ["item1"];
|
|
358
|
+
if (value === "many")
|
|
359
|
+
return ["item1", "item2", "item3"];
|
|
360
|
+
return value;
|
|
361
|
+
}
|
|
362
|
+
function witnessRecord(fields, value, options) {
|
|
363
|
+
return Object.fromEntries(Object.entries(fields).map(([key, field]) => [key, witnessValue(field, value?.[key], options)]));
|
|
364
|
+
}
|
|
365
|
+
function isRecord(value) {
|
|
366
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
367
|
+
}
|
|
368
|
+
function defaultCompareState(expected, actual) {
|
|
369
|
+
const keys = new Set([...Object.keys(expected), ...Object.keys(actual)]);
|
|
370
|
+
for (const key of [...keys].sort()) {
|
|
371
|
+
if (JSON.stringify(expected[key]) !== JSON.stringify(actual[key])) {
|
|
372
|
+
return `${key}: expected ${JSON.stringify(expected[key])}, got ${JSON.stringify(actual[key])}`;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return undefined;
|
|
376
|
+
}
|
|
377
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/harness/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Model } from "../ir/types.js";
|
|
2
|
+
import type { CheckReport, ConformReport, ExtractionReport, ReplayReport } from "../report/types.js";
|
|
3
|
+
import type { Trace, TraceArtifact } from "../trace/types.js";
|
|
4
|
+
export declare function parseModelArtifact(json: string): Model;
|
|
5
|
+
export declare function traceArtifact(trace: Trace): TraceArtifact;
|
|
6
|
+
export declare function parseTraceArtifact(json: string): TraceArtifact;
|
|
7
|
+
export declare function parseCheckReportArtifact(json: string): CheckReport;
|
|
8
|
+
export declare function parseExtractionReportArtifact(json: string): ExtractionReport;
|
|
9
|
+
export declare function parseReplayReportArtifact(json: string): ReplayReport;
|
|
10
|
+
export declare function parseConformReportArtifact(json: string): ConformReport;
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/kernel/artifacts/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrG,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAE9D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAStD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,aAAa,CAEzD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAY9D;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAclE;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAe5E;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAWpE;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAStE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
export function parseModelArtifact(json) {
|
|
2
|
+
const value = JSON.parse(json);
|
|
3
|
+
if (!isRecord(value))
|
|
4
|
+
throw new Error("model artifact must be an object");
|
|
5
|
+
if (value.schemaVersion !== 1)
|
|
6
|
+
throw new Error(`unsupported model schemaVersion ${String(value.schemaVersion)}`);
|
|
7
|
+
if (typeof value.id !== "string")
|
|
8
|
+
throw new Error("model artifact missing id");
|
|
9
|
+
if (!Array.isArray(value.vars))
|
|
10
|
+
throw new Error("model artifact missing vars");
|
|
11
|
+
if (!Array.isArray(value.transitions))
|
|
12
|
+
throw new Error("model artifact missing transitions");
|
|
13
|
+
if (!isRecord(value.bounds))
|
|
14
|
+
throw new Error("model artifact missing bounds");
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
export function traceArtifact(trace) {
|
|
18
|
+
return { schemaVersion: 1, kind: "trace", steps: trace.steps };
|
|
19
|
+
}
|
|
20
|
+
export function parseTraceArtifact(json) {
|
|
21
|
+
const value = JSON.parse(json);
|
|
22
|
+
if (!isRecord(value))
|
|
23
|
+
throw new Error("trace artifact must be an object");
|
|
24
|
+
if (value.schemaVersion !== 1)
|
|
25
|
+
throw new Error(`unsupported trace schemaVersion ${String(value.schemaVersion)}`);
|
|
26
|
+
if (value.kind !== "trace")
|
|
27
|
+
throw new Error("trace artifact kind must be trace");
|
|
28
|
+
if (!Array.isArray(value.steps))
|
|
29
|
+
throw new Error("trace artifact missing steps");
|
|
30
|
+
for (const [index, step] of value.steps.entries()) {
|
|
31
|
+
if (!isRecord(step) || typeof step.transitionId !== "string" || !isRecord(step.pre) || !isRecord(step.post)) {
|
|
32
|
+
throw new Error(`trace step ${index + 1} is malformed`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
export function parseCheckReportArtifact(json) {
|
|
38
|
+
const value = JSON.parse(json);
|
|
39
|
+
if (!isRecord(value))
|
|
40
|
+
throw new Error("check report artifact must be an object");
|
|
41
|
+
if (value.schemaVersion !== 1)
|
|
42
|
+
throw new Error(`unsupported check report schemaVersion ${String(value.schemaVersion)}`);
|
|
43
|
+
if (value.kind !== "check-report")
|
|
44
|
+
throw new Error("check report artifact kind must be check-report");
|
|
45
|
+
if (!isRecord(value.trustLedger))
|
|
46
|
+
throw new Error("check report artifact missing trustLedger");
|
|
47
|
+
if (!Array.isArray(value.trustLedger.globalTaints))
|
|
48
|
+
throw new Error("check report trustLedger missing globalTaints");
|
|
49
|
+
if (!Array.isArray(value.trustLedger.staleReads))
|
|
50
|
+
throw new Error("check report trustLedger missing staleReads");
|
|
51
|
+
if (!Array.isArray(value.trustLedger.unhandledRejections))
|
|
52
|
+
throw new Error("check report trustLedger missing unhandledRejections");
|
|
53
|
+
if (!Array.isArray(value.trustLedger.unextractableHandlers))
|
|
54
|
+
throw new Error("check report trustLedger missing unextractableHandlers");
|
|
55
|
+
if (!Array.isArray(value.verdicts))
|
|
56
|
+
throw new Error("check report artifact missing verdicts");
|
|
57
|
+
if (!isRecord(value.stats))
|
|
58
|
+
throw new Error("check report artifact missing stats");
|
|
59
|
+
if (!Array.isArray(value.vacuityWarnings))
|
|
60
|
+
throw new Error("check report artifact missing vacuityWarnings");
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
export function parseExtractionReportArtifact(json) {
|
|
64
|
+
const value = JSON.parse(json);
|
|
65
|
+
if (!isRecord(value))
|
|
66
|
+
throw new Error("extraction report artifact must be an object");
|
|
67
|
+
if (value.schemaVersion !== 1)
|
|
68
|
+
throw new Error(`unsupported extraction report schemaVersion ${String(value.schemaVersion)}`);
|
|
69
|
+
if (value.kind !== "extraction-report")
|
|
70
|
+
throw new Error("extraction report artifact kind must be extraction-report");
|
|
71
|
+
if (!Array.isArray(value.sourceFiles))
|
|
72
|
+
throw new Error("extraction report artifact missing sourceFiles");
|
|
73
|
+
if (!Array.isArray(value.plugins))
|
|
74
|
+
throw new Error("extraction report artifact missing plugins");
|
|
75
|
+
if (!Array.isArray(value.handlers))
|
|
76
|
+
throw new Error("extraction report artifact missing handlers");
|
|
77
|
+
if (!Array.isArray(value.globalTaints))
|
|
78
|
+
throw new Error("extraction report artifact missing globalTaints");
|
|
79
|
+
if (!Array.isArray(value.staleReads))
|
|
80
|
+
throw new Error("extraction report artifact missing staleReads");
|
|
81
|
+
if (!Array.isArray(value.unhandledRejections))
|
|
82
|
+
throw new Error("extraction report artifact missing unhandledRejections");
|
|
83
|
+
if (!Array.isArray(value.domains))
|
|
84
|
+
throw new Error("extraction report artifact missing domains");
|
|
85
|
+
if (!isRecord(value.coverage))
|
|
86
|
+
throw new Error("extraction report artifact missing coverage");
|
|
87
|
+
if (!Array.isArray(value.warnings))
|
|
88
|
+
throw new Error("extraction report artifact missing warnings");
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
export function parseReplayReportArtifact(json) {
|
|
92
|
+
const value = JSON.parse(json);
|
|
93
|
+
if (!isRecord(value))
|
|
94
|
+
throw new Error("replay report artifact must be an object");
|
|
95
|
+
if (value.schemaVersion !== 1)
|
|
96
|
+
throw new Error(`unsupported replay report schemaVersion ${String(value.schemaVersion)}`);
|
|
97
|
+
if (value.kind !== "replay-report")
|
|
98
|
+
throw new Error("replay report artifact kind must be replay-report");
|
|
99
|
+
if (!isRecord(value.verdict))
|
|
100
|
+
throw new Error("replay report artifact missing verdict");
|
|
101
|
+
if (value.verdict.status !== "reproduced" && value.verdict.status !== "not-reproduced" && value.verdict.status !== "inconclusive") {
|
|
102
|
+
throw new Error("replay report verdict has unsupported status");
|
|
103
|
+
}
|
|
104
|
+
if (typeof value.verdict.stepsRun !== "number")
|
|
105
|
+
throw new Error("replay report verdict missing stepsRun");
|
|
106
|
+
return value;
|
|
107
|
+
}
|
|
108
|
+
export function parseConformReportArtifact(json) {
|
|
109
|
+
const value = JSON.parse(json);
|
|
110
|
+
if (!isRecord(value))
|
|
111
|
+
throw new Error("conform report artifact must be an object");
|
|
112
|
+
if (value.schemaVersion !== 1)
|
|
113
|
+
throw new Error(`unsupported conform report schemaVersion ${String(value.schemaVersion)}`);
|
|
114
|
+
if (value.kind !== "conform-report")
|
|
115
|
+
throw new Error("conform report artifact kind must be conform-report");
|
|
116
|
+
if (!Array.isArray(value.walks))
|
|
117
|
+
throw new Error("conform report artifact missing walks");
|
|
118
|
+
if (!isRecord(value.metrics))
|
|
119
|
+
throw new Error("conform report artifact missing metrics");
|
|
120
|
+
if (!Array.isArray(value.transitionMetrics))
|
|
121
|
+
throw new Error("conform report artifact missing transitionMetrics");
|
|
122
|
+
return value;
|
|
123
|
+
}
|
|
124
|
+
function isRecord(value) {
|
|
125
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=index.js.map
|