@driftfence/core 0.1.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 +81 -0
- package/README.md +36 -0
- package/dist/draft/scenario.d.ts +3 -0
- package/dist/draft/scenario.d.ts.map +1 -0
- package/dist/draft/scenario.js +207 -0
- package/dist/draft/scenario.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/io/config.d.ts +10 -0
- package/dist/io/config.d.ts.map +1 -0
- package/dist/io/config.js +165 -0
- package/dist/io/config.js.map +1 -0
- package/dist/io/contracts.d.ts +7 -0
- package/dist/io/contracts.d.ts.map +1 -0
- package/dist/io/contracts.js +562 -0
- package/dist/io/contracts.js.map +1 -0
- package/dist/io/files.d.ts +6 -0
- package/dist/io/files.d.ts.map +1 -0
- package/dist/io/files.js +49 -0
- package/dist/io/files.js.map +1 -0
- package/dist/io/suppressions.d.ts +16 -0
- package/dist/io/suppressions.d.ts.map +1 -0
- package/dist/io/suppressions.js +108 -0
- package/dist/io/suppressions.js.map +1 -0
- package/dist/io/traces.d.ts +3 -0
- package/dist/io/traces.d.ts.map +1 -0
- package/dist/io/traces.js +40 -0
- package/dist/io/traces.js.map +1 -0
- package/dist/match/expr.d.ts +3 -0
- package/dist/match/expr.d.ts.map +1 -0
- package/dist/match/expr.js +43 -0
- package/dist/match/expr.js.map +1 -0
- package/dist/match/value.d.ts +5 -0
- package/dist/match/value.d.ts.map +1 -0
- package/dist/match/value.js +127 -0
- package/dist/match/value.js.map +1 -0
- package/dist/normalize/trace.d.ts +12 -0
- package/dist/normalize/trace.d.ts.map +1 -0
- package/dist/normalize/trace.js +215 -0
- package/dist/normalize/trace.js.map +1 -0
- package/dist/query/index.d.ts +4 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +96 -0
- package/dist/query/index.js.map +1 -0
- package/dist/report/check.d.ts +3 -0
- package/dist/report/check.d.ts.map +1 -0
- package/dist/report/check.js +347 -0
- package/dist/report/check.js.map +1 -0
- package/dist/report/render.d.ts +11 -0
- package/dist/report/render.d.ts.map +1 -0
- package/dist/report/render.js +99 -0
- package/dist/report/render.js.map +1 -0
- package/dist/schemas/index.d.ts +578 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +492 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types.d.ts +402 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/errors.d.ts +18 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +34 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/json.d.ts +10 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +98 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/order.d.ts +8 -0
- package/dist/utils/order.d.ts.map +1 -0
- package/dist/utils/order.js +42 -0
- package/dist/utils/order.js.map +1 -0
- package/dist/utils/path.d.ts +8 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +168 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/verify/invariants.d.ts +3 -0
- package/dist/verify/invariants.d.ts.map +1 -0
- package/dist/verify/invariants.js +38 -0
- package/dist/verify/invariants.js.map +1 -0
- package/dist/verify/sequence.d.ts +3 -0
- package/dist/verify/sequence.d.ts.map +1 -0
- package/dist/verify/sequence.js +151 -0
- package/dist/verify/sequence.js.map +1 -0
- package/dist/verify/summary.d.ts +8 -0
- package/dist/verify/summary.d.ts.map +1 -0
- package/dist/verify/summary.js +132 -0
- package/dist/verify/summary.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const EXIT_CODES: {
|
|
2
|
+
readonly SUCCESS: 0;
|
|
3
|
+
readonly POLICY_FAILURE: 1;
|
|
4
|
+
readonly INVALID_USAGE: 2;
|
|
5
|
+
readonly CONFIG_ERROR: 3;
|
|
6
|
+
readonly CONTRACT_ERROR: 4;
|
|
7
|
+
readonly TRACE_ERROR: 5;
|
|
8
|
+
readonly INTERNAL_ERROR: 6;
|
|
9
|
+
};
|
|
10
|
+
export type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];
|
|
11
|
+
export declare class DriftFenceError extends Error {
|
|
12
|
+
readonly exitCode: ExitCode;
|
|
13
|
+
constructor(message: string, exitCode: ExitCode, options?: {
|
|
14
|
+
cause?: unknown;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export declare function asDriftFenceError(error: unknown): DriftFenceError;
|
|
18
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU;;;;;;;;CAQb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEpE,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAG1B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,EAClB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAMhC;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe,CAYjE"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DriftFenceError = exports.EXIT_CODES = void 0;
|
|
4
|
+
exports.asDriftFenceError = asDriftFenceError;
|
|
5
|
+
exports.EXIT_CODES = {
|
|
6
|
+
SUCCESS: 0,
|
|
7
|
+
POLICY_FAILURE: 1,
|
|
8
|
+
INVALID_USAGE: 2,
|
|
9
|
+
CONFIG_ERROR: 3,
|
|
10
|
+
CONTRACT_ERROR: 4,
|
|
11
|
+
TRACE_ERROR: 5,
|
|
12
|
+
INTERNAL_ERROR: 6
|
|
13
|
+
};
|
|
14
|
+
class DriftFenceError extends Error {
|
|
15
|
+
exitCode;
|
|
16
|
+
constructor(message, exitCode, options) {
|
|
17
|
+
super(message, options);
|
|
18
|
+
this.name = "DriftFenceError";
|
|
19
|
+
this.exitCode = exitCode;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.DriftFenceError = DriftFenceError;
|
|
23
|
+
function asDriftFenceError(error) {
|
|
24
|
+
if (error instanceof DriftFenceError) {
|
|
25
|
+
return error;
|
|
26
|
+
}
|
|
27
|
+
if (error instanceof Error) {
|
|
28
|
+
return new DriftFenceError(error.message, exports.EXIT_CODES.INTERNAL_ERROR, {
|
|
29
|
+
cause: error
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return new DriftFenceError(String(error), exports.EXIT_CODES.INTERNAL_ERROR);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":";;;AA0BA,8CAYC;AAtCY,QAAA,UAAU,GAAG;IACxB,OAAO,EAAE,CAAC;IACV,cAAc,EAAE,CAAC;IACjB,aAAa,EAAE,CAAC;IAChB,YAAY,EAAE,CAAC;IACf,cAAc,EAAE,CAAC;IACjB,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,CAAC;CACT,CAAC;AAIX,MAAa,eAAgB,SAAQ,KAAK;IAC/B,QAAQ,CAAW;IAE5B,YACE,OAAe,EACf,QAAkB,EAClB,OAA6B;QAE7B,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAZD,0CAYC;AAED,SAAgB,iBAAiB,CAAC,KAAc;IAC9C,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,OAAO,EAAE,kBAAU,CAAC,cAAc,EAAE;YACnE,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,kBAAU,CAAC,cAAc,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Primitive } from "../types";
|
|
2
|
+
export declare function isPlainObject(value: unknown): value is Record<string, unknown>;
|
|
3
|
+
export declare function deepEqual(left: unknown, right: unknown): boolean;
|
|
4
|
+
export declare function stableStringify(value: unknown): string;
|
|
5
|
+
export declare function sanitizeFilename(input: string, fallback?: string): string;
|
|
6
|
+
export declare function sortUniqueStrings(values: string[] | undefined): string[] | undefined;
|
|
7
|
+
export declare function jsonClone<T>(value: T): T;
|
|
8
|
+
export declare function isNumericString(value: unknown): value is string;
|
|
9
|
+
export declare function isPrimitive(value: unknown): value is Primitive;
|
|
10
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAI1C,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOlC;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAwChE;AAgCD,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAEtD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,SAAU,GAAG,MAAM,CAG1E;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAC3B,MAAM,EAAE,GAAG,SAAS,CAQtB;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAExC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAM/D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAI9D"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isPlainObject = isPlainObject;
|
|
4
|
+
exports.deepEqual = deepEqual;
|
|
5
|
+
exports.stableStringify = stableStringify;
|
|
6
|
+
exports.sanitizeFilename = sanitizeFilename;
|
|
7
|
+
exports.sortUniqueStrings = sortUniqueStrings;
|
|
8
|
+
exports.jsonClone = jsonClone;
|
|
9
|
+
exports.isNumericString = isNumericString;
|
|
10
|
+
exports.isPrimitive = isPrimitive;
|
|
11
|
+
const UNSAFE_FILENAME = /[^A-Za-z0-9._-]/g;
|
|
12
|
+
function isPlainObject(value) {
|
|
13
|
+
if (value === null || typeof value !== "object") {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const prototype = Object.getPrototypeOf(value);
|
|
17
|
+
return prototype === Object.prototype || prototype === null;
|
|
18
|
+
}
|
|
19
|
+
function deepEqual(left, right) {
|
|
20
|
+
if (Object.is(left, right)) {
|
|
21
|
+
return true;
|
|
22
|
+
}
|
|
23
|
+
if (typeof left !== typeof right) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
if (Array.isArray(left)) {
|
|
27
|
+
if (!Array.isArray(right) || left.length !== right.length) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return left.every((value, index) => deepEqual(value, right[index]));
|
|
31
|
+
}
|
|
32
|
+
if (isPlainObject(left)) {
|
|
33
|
+
if (!isPlainObject(right)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
const leftKeys = Object.keys(left);
|
|
37
|
+
const rightKeys = Object.keys(right);
|
|
38
|
+
if (leftKeys.length !== rightKeys.length) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
leftKeys.sort();
|
|
42
|
+
rightKeys.sort();
|
|
43
|
+
for (let index = 0; index < leftKeys.length; index += 1) {
|
|
44
|
+
if (leftKeys[index] !== rightKeys[index]) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return leftKeys.every((key) => deepEqual(left[key], right[key]));
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
function stableSerialize(value) {
|
|
53
|
+
if (value === undefined) {
|
|
54
|
+
return "null";
|
|
55
|
+
}
|
|
56
|
+
if (value === null || typeof value !== "object") {
|
|
57
|
+
return JSON.stringify(value);
|
|
58
|
+
}
|
|
59
|
+
if (Array.isArray(value)) {
|
|
60
|
+
return `[${value.map((item) => stableSerialize(item)).join(",")}]`;
|
|
61
|
+
}
|
|
62
|
+
const keys = Object.keys(value).sort();
|
|
63
|
+
return `{${keys
|
|
64
|
+
.flatMap((key) => {
|
|
65
|
+
const serialized = stableSerialize(value[key]);
|
|
66
|
+
if (serialized === "null" &&
|
|
67
|
+
value[key] === undefined) {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
return `${JSON.stringify(key)}:${serialized}`;
|
|
71
|
+
})
|
|
72
|
+
.join(",")}}`;
|
|
73
|
+
}
|
|
74
|
+
function stableStringify(value) {
|
|
75
|
+
return JSON.stringify(JSON.parse(stableSerialize(value)), null, 2);
|
|
76
|
+
}
|
|
77
|
+
function sanitizeFilename(input, fallback = "value") {
|
|
78
|
+
const sanitized = input.replace(UNSAFE_FILENAME, "_");
|
|
79
|
+
return sanitized.length > 0 ? sanitized : fallback;
|
|
80
|
+
}
|
|
81
|
+
function sortUniqueStrings(values) {
|
|
82
|
+
if (values === undefined) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
return Array.from(new Set(values)).sort((left, right) => left.localeCompare(right));
|
|
86
|
+
}
|
|
87
|
+
function jsonClone(value) {
|
|
88
|
+
return structuredClone(value);
|
|
89
|
+
}
|
|
90
|
+
function isNumericString(value) {
|
|
91
|
+
return (typeof value === "string" &&
|
|
92
|
+
value.trim() !== "" &&
|
|
93
|
+
Number.isFinite(Number(value)));
|
|
94
|
+
}
|
|
95
|
+
function isPrimitive(value) {
|
|
96
|
+
return (value === null || ["string", "number", "boolean"].includes(typeof value));
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ComponentName, ComponentStatus, ScenarioStatus } from "../types";
|
|
2
|
+
export declare const COMPONENT_ORDER: ComponentName[];
|
|
3
|
+
export declare const SCENARIO_STATUS_ORDER: ScenarioStatus[];
|
|
4
|
+
export declare const COMPONENT_STATUS_ORDER: ComponentStatus[];
|
|
5
|
+
export declare function compareComponentName(left: ComponentName, right: ComponentName): number;
|
|
6
|
+
export declare function compareScenarioStatus(left: ScenarioStatus, right: ScenarioStatus): number;
|
|
7
|
+
export declare function compareComponentStatus(left: ComponentStatus, right: ComponentStatus): number;
|
|
8
|
+
//# sourceMappingURL=order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../../src/utils/order.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/E,eAAO,MAAM,eAAe,EAAE,aAAa,EAQ1C,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,cAAc,EAQjD,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAAE,eAAe,EAOnD,CAAC;AAEF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,aAAa,EACnB,KAAK,EAAE,aAAa,GACnB,MAAM,CAER;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,cAAc,GACpB,MAAM,CAIR;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,eAAe,EACrB,KAAK,EAAE,eAAe,GACrB,MAAM,CAIR"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COMPONENT_STATUS_ORDER = exports.SCENARIO_STATUS_ORDER = exports.COMPONENT_ORDER = void 0;
|
|
4
|
+
exports.compareComponentName = compareComponentName;
|
|
5
|
+
exports.compareScenarioStatus = compareScenarioStatus;
|
|
6
|
+
exports.compareComponentStatus = compareComponentStatus;
|
|
7
|
+
exports.COMPONENT_ORDER = [
|
|
8
|
+
"summary.effects",
|
|
9
|
+
"summary.emits",
|
|
10
|
+
"sequence",
|
|
11
|
+
"output",
|
|
12
|
+
"error",
|
|
13
|
+
"stateAfter",
|
|
14
|
+
"invariant"
|
|
15
|
+
];
|
|
16
|
+
exports.SCENARIO_STATUS_ORDER = [
|
|
17
|
+
"VIOLATING",
|
|
18
|
+
"WIDENING_REQUEST",
|
|
19
|
+
"MISSING_TRACE",
|
|
20
|
+
"NARROWING",
|
|
21
|
+
"SUPPRESSED",
|
|
22
|
+
"CONFORMING",
|
|
23
|
+
"ORPHAN_TRACE"
|
|
24
|
+
];
|
|
25
|
+
exports.COMPONENT_STATUS_ORDER = [
|
|
26
|
+
"VIOLATING",
|
|
27
|
+
"WIDENING_REQUEST",
|
|
28
|
+
"NARROWING",
|
|
29
|
+
"SUPPRESSED",
|
|
30
|
+
"WARN",
|
|
31
|
+
"CONFORMING"
|
|
32
|
+
];
|
|
33
|
+
function compareComponentName(left, right) {
|
|
34
|
+
return exports.COMPONENT_ORDER.indexOf(left) - exports.COMPONENT_ORDER.indexOf(right);
|
|
35
|
+
}
|
|
36
|
+
function compareScenarioStatus(left, right) {
|
|
37
|
+
return (exports.SCENARIO_STATUS_ORDER.indexOf(left) - exports.SCENARIO_STATUS_ORDER.indexOf(right));
|
|
38
|
+
}
|
|
39
|
+
function compareComponentStatus(left, right) {
|
|
40
|
+
return (exports.COMPONENT_STATUS_ORDER.indexOf(left) - exports.COMPONENT_STATUS_ORDER.indexOf(right));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order.js","sourceRoot":"","sources":["../../src/utils/order.ts"],"names":[],"mappings":";;;AA+BA,oDAKC;AAED,sDAOC;AAED,wDAOC;AApDY,QAAA,eAAe,GAAoB;IAC9C,iBAAiB;IACjB,eAAe;IACf,UAAU;IACV,QAAQ;IACR,OAAO;IACP,YAAY;IACZ,WAAW;CACZ,CAAC;AAEW,QAAA,qBAAqB,GAAqB;IACrD,WAAW;IACX,kBAAkB;IAClB,eAAe;IACf,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,cAAc;CACf,CAAC;AAEW,QAAA,sBAAsB,GAAsB;IACvD,WAAW;IACX,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,MAAM;IACN,YAAY;CACb,CAAC;AAEF,SAAgB,oBAAoB,CAClC,IAAmB,EACnB,KAAoB;IAEpB,OAAO,uBAAe,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,uBAAe,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,SAAgB,qBAAqB,CACnC,IAAoB,EACpB,KAAqB;IAErB,OAAO,CACL,6BAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,6BAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED,SAAgB,sBAAsB,CACpC,IAAqB,EACrB,KAAsB;IAEtB,OAAO,CACL,8BAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,8BAAsB,CAAC,OAAO,CAAC,KAAK,CAAC,CAC7E,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type PathToken = string | number;
|
|
2
|
+
export declare function parseDotPath(path: string): PathToken[];
|
|
3
|
+
export declare function resolvePath(root: unknown, path: string): unknown;
|
|
4
|
+
export declare function hasPath(root: unknown, path: string): boolean;
|
|
5
|
+
export declare function setPath(root: unknown, path: string, value: unknown): void;
|
|
6
|
+
export declare function deletePath(root: unknown, path: string): void;
|
|
7
|
+
export declare function collectValuePaths(root: unknown, basePath?: string): string[];
|
|
8
|
+
//# sourceMappingURL=path.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAIxC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CA8BtD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAoBhE;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAqB5D;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAiDzE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA6C5D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,SAAK,GAAG,MAAM,EAAE,CAmBxE"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseDotPath = parseDotPath;
|
|
4
|
+
exports.resolvePath = resolvePath;
|
|
5
|
+
exports.hasPath = hasPath;
|
|
6
|
+
exports.setPath = setPath;
|
|
7
|
+
exports.deletePath = deletePath;
|
|
8
|
+
exports.collectValuePaths = collectValuePaths;
|
|
9
|
+
const errors_1 = require("./errors");
|
|
10
|
+
const json_1 = require("./json");
|
|
11
|
+
const PATH_TOKEN = /([^[.\]]+)|\[(\d+)\]/g;
|
|
12
|
+
function parseDotPath(path) {
|
|
13
|
+
if (path.trim() === "") {
|
|
14
|
+
throw new errors_1.DriftFenceError("Path must not be empty.", errors_1.EXIT_CODES.CONFIG_ERROR);
|
|
15
|
+
}
|
|
16
|
+
const tokens = [];
|
|
17
|
+
const matches = path.matchAll(PATH_TOKEN);
|
|
18
|
+
let consumed = "";
|
|
19
|
+
for (const match of matches) {
|
|
20
|
+
consumed += match[0];
|
|
21
|
+
if (match[1] !== undefined) {
|
|
22
|
+
tokens.push(match[1]);
|
|
23
|
+
}
|
|
24
|
+
else if (match[2] !== undefined) {
|
|
25
|
+
tokens.push(Number(match[2]));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const normalized = consumed.replace(/\]\[/g, "][");
|
|
29
|
+
const inputNormalized = path.replace(/\.\[/g, "[").replace(/\]\./g, "]");
|
|
30
|
+
if (normalized !== inputNormalized.replace(/\./g, "")) {
|
|
31
|
+
throw new errors_1.DriftFenceError(`Invalid path syntax: ${path}`, errors_1.EXIT_CODES.CONFIG_ERROR);
|
|
32
|
+
}
|
|
33
|
+
return tokens;
|
|
34
|
+
}
|
|
35
|
+
function resolvePath(root, path) {
|
|
36
|
+
const tokens = parseDotPath(path);
|
|
37
|
+
let current = root;
|
|
38
|
+
for (const token of tokens) {
|
|
39
|
+
if (typeof token === "number") {
|
|
40
|
+
if (!Array.isArray(current)) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
current = current[token];
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (!(0, json_1.isPlainObject)(current) && !Array.isArray(current)) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
current = current[token];
|
|
50
|
+
}
|
|
51
|
+
return current;
|
|
52
|
+
}
|
|
53
|
+
function hasPath(root, path) {
|
|
54
|
+
const tokens = parseDotPath(path);
|
|
55
|
+
let current = root;
|
|
56
|
+
for (const token of tokens) {
|
|
57
|
+
if (typeof token === "number") {
|
|
58
|
+
if (!Array.isArray(current) || !(token in current)) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
current = current[token];
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (!(0, json_1.isPlainObject)(current) && !Array.isArray(current)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (!(token in current)) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
current = current[token];
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
function setPath(root, path, value) {
|
|
75
|
+
const tokens = parseDotPath(path);
|
|
76
|
+
if (tokens.length === 0) {
|
|
77
|
+
throw new errors_1.DriftFenceError(`Invalid path: ${path}`, errors_1.EXIT_CODES.CONFIG_ERROR);
|
|
78
|
+
}
|
|
79
|
+
let current = root;
|
|
80
|
+
for (let index = 0; index < tokens.length - 1; index += 1) {
|
|
81
|
+
const token = tokens[index];
|
|
82
|
+
const nextToken = tokens[index + 1];
|
|
83
|
+
if (token === undefined || nextToken === undefined) {
|
|
84
|
+
throw new errors_1.DriftFenceError(`Invalid path: ${path}`, errors_1.EXIT_CODES.CONFIG_ERROR);
|
|
85
|
+
}
|
|
86
|
+
if (typeof token === "number") {
|
|
87
|
+
if (!Array.isArray(current)) {
|
|
88
|
+
throw new errors_1.DriftFenceError(`Cannot set numeric path segment on non-array: ${path}`, errors_1.EXIT_CODES.CONFIG_ERROR);
|
|
89
|
+
}
|
|
90
|
+
current[token] ??= typeof nextToken === "number" ? [] : {};
|
|
91
|
+
current = current[token];
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const target = current;
|
|
95
|
+
target[token] ??= typeof nextToken === "number" ? [] : {};
|
|
96
|
+
current = target[token];
|
|
97
|
+
}
|
|
98
|
+
const last = tokens[tokens.length - 1];
|
|
99
|
+
if (last === undefined) {
|
|
100
|
+
throw new errors_1.DriftFenceError(`Invalid path: ${path}`, errors_1.EXIT_CODES.CONFIG_ERROR);
|
|
101
|
+
}
|
|
102
|
+
if (typeof last === "number") {
|
|
103
|
+
if (!Array.isArray(current)) {
|
|
104
|
+
throw new errors_1.DriftFenceError(`Cannot set numeric path segment on non-array: ${path}`, errors_1.EXIT_CODES.CONFIG_ERROR);
|
|
105
|
+
}
|
|
106
|
+
current[last] = value;
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
current[last] = value;
|
|
110
|
+
}
|
|
111
|
+
function deletePath(root, path) {
|
|
112
|
+
const tokens = parseDotPath(path);
|
|
113
|
+
if (tokens.length === 0) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
let current = root;
|
|
117
|
+
for (let index = 0; index < tokens.length - 1; index += 1) {
|
|
118
|
+
const token = tokens[index];
|
|
119
|
+
if (token === undefined) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (typeof token === "number") {
|
|
123
|
+
if (!Array.isArray(current) || current[token] === undefined) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
current = current[token];
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (!(0, json_1.isPlainObject)(current) && !Array.isArray(current)) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const next = current[token];
|
|
133
|
+
if (next === undefined) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
current = next;
|
|
137
|
+
}
|
|
138
|
+
const last = tokens[tokens.length - 1];
|
|
139
|
+
if (last === undefined) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (typeof last === "number") {
|
|
143
|
+
if (Array.isArray(current) && last < current.length) {
|
|
144
|
+
current.splice(last, 1);
|
|
145
|
+
}
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
if ((0, json_1.isPlainObject)(current) || Array.isArray(current)) {
|
|
149
|
+
delete current[last];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function collectValuePaths(root, basePath = "") {
|
|
153
|
+
if (!(0, json_1.isPlainObject)(root) && !Array.isArray(root)) {
|
|
154
|
+
return basePath ? [basePath] : [];
|
|
155
|
+
}
|
|
156
|
+
if (Array.isArray(root)) {
|
|
157
|
+
return root.flatMap((value, index) => collectValuePaths(value, `${basePath}[${index}]`));
|
|
158
|
+
}
|
|
159
|
+
return Object.entries(root).flatMap(([key, value]) => {
|
|
160
|
+
const nextPath = basePath ? `${basePath}.${key}` : key;
|
|
161
|
+
if ((0, json_1.isPlainObject)(value) || Array.isArray(value)) {
|
|
162
|
+
const childPaths = collectValuePaths(value, nextPath);
|
|
163
|
+
return childPaths.length > 0 ? childPaths : [nextPath];
|
|
164
|
+
}
|
|
165
|
+
return [nextPath];
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../src/utils/path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../../src/verify/invariants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,YAAY,EACb,MAAM,UAAU,CAAC;AAGlB,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,oBAAoB,EAAE,GAAG,SAAS,EAC9C,OAAO,EAAE,YAAY,GACpB,eAAe,EAAE,CAmCnB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.evaluateInvariants = evaluateInvariants;
|
|
4
|
+
const expr_1 = require("../match/expr");
|
|
5
|
+
function evaluateInvariants(invariants, context) {
|
|
6
|
+
if (invariants === undefined || invariants.length === 0) {
|
|
7
|
+
return [];
|
|
8
|
+
}
|
|
9
|
+
return invariants.map((invariant) => {
|
|
10
|
+
const ok = (0, expr_1.evaluateExpr)(invariant.expr, context) === true;
|
|
11
|
+
if (ok) {
|
|
12
|
+
return {
|
|
13
|
+
component: "invariant",
|
|
14
|
+
status: "CONFORMING",
|
|
15
|
+
code: "PASS",
|
|
16
|
+
message: invariant.message,
|
|
17
|
+
name: invariant.id
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
if (invariant.severity === "warn") {
|
|
21
|
+
return {
|
|
22
|
+
component: "invariant",
|
|
23
|
+
status: "WARN",
|
|
24
|
+
code: "WARN",
|
|
25
|
+
message: invariant.message,
|
|
26
|
+
name: invariant.id
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
component: "invariant",
|
|
31
|
+
status: "VIOLATING",
|
|
32
|
+
code: "INVARIANT_FAILURE",
|
|
33
|
+
message: invariant.message,
|
|
34
|
+
name: invariant.id
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=invariants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invariants.js","sourceRoot":"","sources":["../../src/verify/invariants.ts"],"names":[],"mappings":";;AAOA,gDAsCC;AAxCD,wCAA6C;AAE7C,SAAgB,kBAAkB,CAChC,UAA8C,EAC9C,OAAqB;IAErB,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QAClC,MAAM,EAAE,GAAG,IAAA,mBAAY,EAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;QAC1D,IAAI,EAAE,EAAE,CAAC;YACP,OAAO;gBACL,SAAS,EAAE,WAAW;gBACtB,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,IAAI,EAAE,SAAS,CAAC,EAAE;aACnB,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;YAClC,OAAO;gBACL,SAAS,EAAE,WAAW;gBACtB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,IAAI,EAAE,SAAS,CAAC,EAAE;aACnB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,SAAS,EAAE,WAAW;YACtB,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,IAAI,EAAE,SAAS,CAAC,EAAE;SACnB,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { MatchContext, MatchOptions, SequenceExpectation, SequenceVerificationResult, TraceFile } from "../types";
|
|
2
|
+
export declare function verifySequence(sequence: SequenceExpectation, trace: TraceFile, context: MatchContext, options: MatchOptions, allowExtraEffects: string[], allowExtraEmits: string[]): SequenceVerificationResult;
|
|
3
|
+
//# sourceMappingURL=sequence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../src/verify/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EACZ,YAAY,EACZ,mBAAmB,EAEnB,0BAA0B,EAC1B,SAAS,EACV,MAAM,UAAU,CAAC;AAoElB,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,SAAS,EAChB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,EACrB,iBAAiB,EAAE,MAAM,EAAE,EAC3B,eAAe,EAAE,MAAM,EAAE,GACxB,0BAA0B,CAmL5B"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.verifySequence = verifySequence;
|
|
4
|
+
const expr_1 = require("../match/expr");
|
|
5
|
+
const value_1 = require("../match/value");
|
|
6
|
+
const path_1 = require("../utils/path");
|
|
7
|
+
function isAllowedExtra(trace, index, allowExtraEffects, allowExtraEmits) {
|
|
8
|
+
const call = trace.calls[index];
|
|
9
|
+
if (call === undefined) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
return call.kind === "effect"
|
|
13
|
+
? allowExtraEffects.includes(call.name)
|
|
14
|
+
: allowExtraEmits.includes(call.event);
|
|
15
|
+
}
|
|
16
|
+
function mismatchResult(step, code, message, actualCallIndex, details) {
|
|
17
|
+
return {
|
|
18
|
+
component: {
|
|
19
|
+
component: "sequence",
|
|
20
|
+
status: "VIOLATING",
|
|
21
|
+
code,
|
|
22
|
+
message
|
|
23
|
+
},
|
|
24
|
+
firstDifference: {
|
|
25
|
+
component: "sequence",
|
|
26
|
+
code,
|
|
27
|
+
expectedStepId: step.stepId,
|
|
28
|
+
actualCallIndex,
|
|
29
|
+
...(details?.path ? { path: details.path } : {}),
|
|
30
|
+
...(details && "expected" in details
|
|
31
|
+
? { expected: details.expected }
|
|
32
|
+
: {}),
|
|
33
|
+
...(details && "actual" in details ? { actual: details.actual } : {})
|
|
34
|
+
},
|
|
35
|
+
vars: {}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
function applyBindings(step, call, vars) {
|
|
39
|
+
if (step.bind === undefined) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const root = step.kind === "effect" && call.kind === "effect"
|
|
43
|
+
? { args: call.args, result: call.result, error: call.error }
|
|
44
|
+
: { payload: call.kind === "emit" ? call.payload : undefined };
|
|
45
|
+
for (const [name, sourcePath] of Object.entries(step.bind)) {
|
|
46
|
+
vars[name] = (0, path_1.resolvePath)(root, sourcePath);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function verifySequence(sequence, trace, context, options, allowExtraEffects, allowExtraEmits) {
|
|
50
|
+
let cursor = 0;
|
|
51
|
+
const vars = {};
|
|
52
|
+
const mutableContext = {
|
|
53
|
+
...context,
|
|
54
|
+
vars
|
|
55
|
+
};
|
|
56
|
+
for (const step of sequence.steps) {
|
|
57
|
+
if (step.when !== undefined && step.when !== null) {
|
|
58
|
+
const whenResult = Boolean((0, expr_1.evaluateExpr)(step.when, mutableContext));
|
|
59
|
+
if (!whenResult) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
while (cursor < trace.calls.length &&
|
|
64
|
+
isAllowedExtra(trace, cursor, allowExtraEffects, allowExtraEmits)) {
|
|
65
|
+
cursor += 1;
|
|
66
|
+
}
|
|
67
|
+
if (cursor >= trace.calls.length) {
|
|
68
|
+
if (step.optional) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
return mismatchResult(step, "SEQUENCE_MISSING_STEP", `Expected step ${step.stepId} was not observed.`, cursor);
|
|
72
|
+
}
|
|
73
|
+
const actual = trace.calls[cursor];
|
|
74
|
+
if (actual === undefined) {
|
|
75
|
+
return mismatchResult(step, "SEQUENCE_MISSING_STEP", `Expected step ${step.stepId} was not observed.`, cursor);
|
|
76
|
+
}
|
|
77
|
+
if (step.kind !== actual.kind) {
|
|
78
|
+
if (step.optional) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
return mismatchResult(step, "SEQUENCE_KIND_MISMATCH", `First divergence at step ${step.stepId}: kind mismatch.`, cursor, {
|
|
82
|
+
expected: step.kind,
|
|
83
|
+
actual: actual.kind
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (step.kind === "effect" && actual.kind === "effect") {
|
|
87
|
+
if (step.name !== actual.name) {
|
|
88
|
+
if (step.optional) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
return mismatchResult(step, "SEQUENCE_NAME_MISMATCH", `First divergence at step ${step.stepId}: effect name mismatch.`, cursor, {
|
|
92
|
+
expected: step.name,
|
|
93
|
+
actual: actual.name
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (step.args !== undefined) {
|
|
97
|
+
const argsMatch = (0, value_1.matchValue)(step.args, actual.args, mutableContext, options, "args");
|
|
98
|
+
if (!argsMatch.ok) {
|
|
99
|
+
return mismatchResult(step, "SEQUENCE_ARG_MISMATCH", `First divergence at step ${step.stepId}.`, cursor, {
|
|
100
|
+
path: argsMatch.failure?.path,
|
|
101
|
+
expected: argsMatch.failure?.expected,
|
|
102
|
+
actual: argsMatch.failure?.actual
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (step.result !== undefined) {
|
|
107
|
+
const resultMatch = (0, value_1.matchValue)(step.result, actual.result, mutableContext, options, "result");
|
|
108
|
+
if (!resultMatch.ok) {
|
|
109
|
+
return mismatchResult(step, "SEQUENCE_RESULT_MISMATCH", `First divergence at step ${step.stepId}.`, cursor, {
|
|
110
|
+
path: resultMatch.failure?.path,
|
|
111
|
+
expected: resultMatch.failure?.expected,
|
|
112
|
+
actual: resultMatch.failure?.actual
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (step.kind === "emit" && actual.kind === "emit") {
|
|
118
|
+
if (step.event !== actual.event) {
|
|
119
|
+
if (step.optional) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
return mismatchResult(step, "SEQUENCE_NAME_MISMATCH", `First divergence at step ${step.stepId}: event name mismatch.`, cursor, {
|
|
123
|
+
expected: step.event,
|
|
124
|
+
actual: actual.event
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (step.payload !== undefined) {
|
|
128
|
+
const payloadMatch = (0, value_1.matchValue)(step.payload, actual.payload, mutableContext, options, "payload");
|
|
129
|
+
if (!payloadMatch.ok) {
|
|
130
|
+
return mismatchResult(step, "SEQUENCE_ARG_MISMATCH", `First divergence at step ${step.stepId}.`, cursor, {
|
|
131
|
+
path: payloadMatch.failure?.path,
|
|
132
|
+
expected: payloadMatch.failure?.expected,
|
|
133
|
+
actual: payloadMatch.failure?.actual
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
applyBindings(step, actual, vars);
|
|
139
|
+
cursor += 1;
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
component: {
|
|
143
|
+
component: "sequence",
|
|
144
|
+
status: "CONFORMING",
|
|
145
|
+
code: "PASS",
|
|
146
|
+
message: "Sequence matches the approved contract."
|
|
147
|
+
},
|
|
148
|
+
vars
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=sequence.js.map
|