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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Harineko0
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# modality-ts
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/modality-ts)
|
|
4
|
+
[](https://github.com/Harineko0/modality-ts/actions/workflows/ci.yml)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](https://www.typescriptlang.org/)
|
|
7
|
+
|
|
8
|
+
`modality-ts` is a model-checking-based testing tool for React state-transition bugs.
|
|
9
|
+
|
|
10
|
+
It extracts a finite transition model from React + TypeScript code, checks developer-defined properties against every reachable state within stated bounds, and turns counterexamples into replayable tests.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install -g modality-ts
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
Start by extracting a model from a React component:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
modality extract src/App.tsx --out .modality/model.json
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
If your component calls side-effect APIs that should appear in the model, name them explicitly:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
modality extract src/App.tsx --out .modality/model.json --effect-api api.placeOrder
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Check the extracted model against a property file:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
modality check .modality/model.json src/app.props.mjs --report .modality/report.json --traces .modality/traces
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
When a property fails, replay the generated counterexample trace:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
modality replay .modality/traces/noDoubleSubmit.violated.trace.json
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
For CI, write all verification artifacts into one directory:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
modality ci .modality/model.json src/app.props.mjs --artifacts .modality
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Useful commands:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
modality extract <source.tsx> --out model.json
|
|
54
|
+
modality check <model.json> [props.ts] --report report.json
|
|
55
|
+
modality replay <trace.json>
|
|
56
|
+
modality conform --model model.json --count 8 --depth 4
|
|
57
|
+
modality export <model.json> --format tla --out model.tla
|
|
58
|
+
modality ci <model.json> [props.ts] --artifacts .modality
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Limitation
|
|
62
|
+
|
|
63
|
+
`modality-ts` verifies the model it can extract, not arbitrary browser behavior. It works best for React apps where important behavior is represented as bounded, deterministic state transitions in TypeScript.
|
|
64
|
+
|
|
65
|
+
Good fits include:
|
|
66
|
+
|
|
67
|
+
- Components with local `useState` transitions.
|
|
68
|
+
- Apps that use supported state/data sources such as Jotai, SWR, and router state.
|
|
69
|
+
- Flows with finite domains, bounded collections, and named side effects.
|
|
70
|
+
- Business rules that can be expressed as safety properties over reachable states.
|
|
71
|
+
|
|
72
|
+
Current weak fits include:
|
|
73
|
+
|
|
74
|
+
- Apps whose correctness depends mainly on DOM layout, CSS, animation timing, canvas rendering, or browser quirks.
|
|
75
|
+
- Unbounded or highly numeric behavior without explicit finite bounds.
|
|
76
|
+
- External services that are not modeled as effects or bounded data.
|
|
77
|
+
- Concurrency, timers, and network races that are not represented in the extracted model.
|
|
78
|
+
- Code patterns outside the supported React + TypeScript extraction subset.
|
|
79
|
+
|
|
80
|
+
For those cases, use `modality-ts` alongside regular unit, integration, and end-to-end tests.
|
|
81
|
+
|
|
82
|
+
## License
|
|
83
|
+
|
|
84
|
+
MIT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checker/encode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checker/encode/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/checker/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checker/monitors/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checker/monitors/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EffectIR, ExprIR, Model, ModelState, Transition, Value } from "modality-ts/kernel";
|
|
2
|
+
export interface PendingOp {
|
|
3
|
+
[key: string]: Value;
|
|
4
|
+
opId: string;
|
|
5
|
+
continuation: string;
|
|
6
|
+
args: Record<string, Value>;
|
|
7
|
+
}
|
|
8
|
+
export interface EvalOptions {
|
|
9
|
+
onBoundHit?: (hit: string) => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function evalExpr(model: Model, state: ModelState, expr: ExprIR, options?: EvalOptions): Value;
|
|
12
|
+
export declare function guardHolds(model: Model, transition: Transition, state: ModelState): boolean;
|
|
13
|
+
export declare function applyEffect(model: Model, state: ModelState, effect: EffectIR, options?: EvalOptions): ModelState[];
|
|
14
|
+
export declare function readPending(state: ModelState): PendingOp[];
|
|
15
|
+
export declare function normalizeInitialRouteLocals(model: Model, state: ModelState): ModelState[];
|
|
16
|
+
//# sourceMappingURL=eval.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../../src/checker/search/eval.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAa,UAAU,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE5G,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAaD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,KAAK,CAyCxG;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,GAAG,OAAO,CAE3F;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAE,WAAgB,GAAG,UAAU,EAAE,CAUtH;AAsCD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,EAAE,CAG1D;AAgBD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,CAEzF"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { isAbsolute, resolve } from "node:path";
|
|
3
|
+
import { enumerateDomain, initialValues, UNMOUNTED, validateValue } from "modality-ts/kernel";
|
|
4
|
+
const require = createRequire(import.meta.url);
|
|
5
|
+
const opaqueCache = new Map();
|
|
6
|
+
class TokenExhausted extends Error {
|
|
7
|
+
domainOf;
|
|
8
|
+
constructor(domainOf) {
|
|
9
|
+
super(`token cap exhausted for ${domainOf}`);
|
|
10
|
+
this.domainOf = domainOf;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function evalExpr(model, state, expr, options = {}) {
|
|
14
|
+
switch (expr.kind) {
|
|
15
|
+
case "lit":
|
|
16
|
+
return expr.value;
|
|
17
|
+
case "read":
|
|
18
|
+
return readPath(state[expr.var], expr.path ?? []);
|
|
19
|
+
case "eq":
|
|
20
|
+
return JSON.stringify(evalExpr(model, state, expr.args[0], options)) === JSON.stringify(evalExpr(model, state, expr.args[1], options));
|
|
21
|
+
case "neq":
|
|
22
|
+
return JSON.stringify(evalExpr(model, state, expr.args[0], options)) !== JSON.stringify(evalExpr(model, state, expr.args[1], options));
|
|
23
|
+
case "and":
|
|
24
|
+
return expr.args.every((arg) => Boolean(evalExpr(model, state, arg, options)));
|
|
25
|
+
case "or":
|
|
26
|
+
return expr.args.some((arg) => Boolean(evalExpr(model, state, arg, options)));
|
|
27
|
+
case "not":
|
|
28
|
+
return !Boolean(evalExpr(model, state, expr.args[0], options));
|
|
29
|
+
case "cond":
|
|
30
|
+
return Boolean(evalExpr(model, state, expr.args[0], options)) ? evalExpr(model, state, expr.args[1], options) : evalExpr(model, state, expr.args[2], options);
|
|
31
|
+
case "updateField":
|
|
32
|
+
return writePath(evalExpr(model, state, expr.target, options), expr.path, evalExpr(model, state, expr.value, options));
|
|
33
|
+
case "tagIs": {
|
|
34
|
+
const arg = evalExpr(model, state, expr.arg, options);
|
|
35
|
+
return typeof arg === "object" && arg !== null && !Array.isArray(arg) && Object.values(arg).includes(expr.tag);
|
|
36
|
+
}
|
|
37
|
+
case "lenCat": {
|
|
38
|
+
const arg = evalExpr(model, state, expr.arg, options);
|
|
39
|
+
if (!Array.isArray(arg))
|
|
40
|
+
return "0";
|
|
41
|
+
return arg.length === 0 ? "0" : arg.length === 1 ? "1" : "many";
|
|
42
|
+
}
|
|
43
|
+
case "freshToken": {
|
|
44
|
+
const decl = model.vars.find((candidate) => candidate.id === expr.domainOf);
|
|
45
|
+
if (!decl || decl.domain.kind !== "tokens")
|
|
46
|
+
throw new Error(`freshToken domainOf must reference token var: ${expr.domainOf}`);
|
|
47
|
+
const names = enumerateDomain(decl.domain);
|
|
48
|
+
const tokenSet = new Set(names);
|
|
49
|
+
const used = new Set();
|
|
50
|
+
for (const value of Object.values(state))
|
|
51
|
+
collectTokens(value, used, tokenSet);
|
|
52
|
+
const fresh = names.find((name) => !used.has(name));
|
|
53
|
+
if (!fresh)
|
|
54
|
+
throw new TokenExhausted(expr.domainOf);
|
|
55
|
+
return fresh;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function guardHolds(model, transition, state) {
|
|
60
|
+
return Boolean(evalExpr(model, state, transition.guard));
|
|
61
|
+
}
|
|
62
|
+
export function applyEffect(model, state, effect, options = {}) {
|
|
63
|
+
try {
|
|
64
|
+
return applyEffectUnsafe(model, state, effect, options);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
if (error instanceof TokenExhausted) {
|
|
68
|
+
options.onBoundHit?.(`token cap exhausted for ${error.domainOf}`);
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function applyEffectUnsafe(model, state, effect, options) {
|
|
75
|
+
switch (effect.kind) {
|
|
76
|
+
case "assign":
|
|
77
|
+
return [{ ...state, [effect.var]: evalExpr(model, state, effect.expr, options) }];
|
|
78
|
+
case "havoc": {
|
|
79
|
+
const decl = mustVar(model, effect.var);
|
|
80
|
+
return enumerateDomain(decl.domain).map((value) => ({ ...state, [effect.var]: value }));
|
|
81
|
+
}
|
|
82
|
+
case "choose":
|
|
83
|
+
return effect.among.map((expr) => ({ ...state, [effect.var]: evalExpr(model, state, expr, options) }));
|
|
84
|
+
case "if":
|
|
85
|
+
return applyEffect(model, state, Boolean(evalExpr(model, state, effect.cond, options)) ? effect.then : effect.else, options);
|
|
86
|
+
case "seq":
|
|
87
|
+
return effect.effects.reduce((states, next) => states.flatMap((candidate) => applyEffect(model, candidate, next, options)), [state]);
|
|
88
|
+
case "enqueue": {
|
|
89
|
+
const pending = readPending(state);
|
|
90
|
+
if (pending.length >= model.bounds.maxPending)
|
|
91
|
+
return [];
|
|
92
|
+
const op = {
|
|
93
|
+
opId: effect.op,
|
|
94
|
+
continuation: effect.continuation,
|
|
95
|
+
args: Object.fromEntries(Object.entries(effect.args).map(([k, expr]) => [k, evalExpr(model, state, expr, options)]))
|
|
96
|
+
};
|
|
97
|
+
return [{ ...state, "sys:pending": [...pending, op] }];
|
|
98
|
+
}
|
|
99
|
+
case "dequeue": {
|
|
100
|
+
const pending = readPending(state);
|
|
101
|
+
if (effect.index < 0 || effect.index >= pending.length)
|
|
102
|
+
return [state];
|
|
103
|
+
return [{ ...state, "sys:pending": pending.filter((_, i) => i !== effect.index) }];
|
|
104
|
+
}
|
|
105
|
+
case "navigate":
|
|
106
|
+
return navigate(model, state, effect);
|
|
107
|
+
case "opaque":
|
|
108
|
+
return applyOpaqueEffect(model, state, effect.ref);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export function readPending(state) {
|
|
112
|
+
const pending = state["sys:pending"];
|
|
113
|
+
return Array.isArray(pending) ? pending : [];
|
|
114
|
+
}
|
|
115
|
+
function navigate(model, state, effect) {
|
|
116
|
+
const route = state["sys:route"];
|
|
117
|
+
const history = Array.isArray(state["sys:history"]) ? state["sys:history"] : [];
|
|
118
|
+
if (effect.mode === "back") {
|
|
119
|
+
const previous = history[history.length - 1];
|
|
120
|
+
if (typeof previous !== "string")
|
|
121
|
+
return [state];
|
|
122
|
+
return resetRouteLocals(model, { ...state, "sys:route": previous, "sys:history": history.slice(0, -1) }, route);
|
|
123
|
+
}
|
|
124
|
+
const to = effect.to ? evalExpr(model, state, effect.to) : undefined;
|
|
125
|
+
if (typeof to !== "string")
|
|
126
|
+
return [state];
|
|
127
|
+
const nextHistory = effect.mode === "push" && typeof route === "string" ? [...history, route] : history;
|
|
128
|
+
return resetRouteLocals(model, { ...state, "sys:route": to, "sys:history": nextHistory }, route);
|
|
129
|
+
}
|
|
130
|
+
export function normalizeInitialRouteLocals(model, state) {
|
|
131
|
+
return resetRouteLocals(model, state, undefined, { preserveMounted: true });
|
|
132
|
+
}
|
|
133
|
+
function resetRouteLocals(model, state, previousRoute, options = {}) {
|
|
134
|
+
const currentRoute = state["sys:route"];
|
|
135
|
+
if (previousRoute === currentRoute)
|
|
136
|
+
return [state];
|
|
137
|
+
let states = [state];
|
|
138
|
+
for (const decl of model.vars) {
|
|
139
|
+
if (decl.scope.kind !== "route-local")
|
|
140
|
+
continue;
|
|
141
|
+
if (decl.scope.route === currentRoute) {
|
|
142
|
+
if (options.preserveMounted)
|
|
143
|
+
continue;
|
|
144
|
+
states = states.flatMap((candidate) => initialValues(decl.domain, decl.initial).map((value) => ({ ...candidate, [decl.id]: value })));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
states = states.map((candidate) => ({ ...candidate, [decl.id]: UNMOUNTED }));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return states;
|
|
151
|
+
}
|
|
152
|
+
function readPath(value, path) {
|
|
153
|
+
let current = value;
|
|
154
|
+
for (const segment of path) {
|
|
155
|
+
if (Array.isArray(current))
|
|
156
|
+
current = current[Number(segment)];
|
|
157
|
+
else if (current && typeof current === "object")
|
|
158
|
+
current = current[segment];
|
|
159
|
+
else
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
return current;
|
|
163
|
+
}
|
|
164
|
+
function writePath(target, path, value) {
|
|
165
|
+
if (path.length === 0)
|
|
166
|
+
return value;
|
|
167
|
+
const [head, ...tail] = path;
|
|
168
|
+
if (Array.isArray(target)) {
|
|
169
|
+
const copy = [...target];
|
|
170
|
+
copy[Number(head)] = writePath(copy[Number(head)], tail, value);
|
|
171
|
+
return copy;
|
|
172
|
+
}
|
|
173
|
+
const base = target && typeof target === "object" ? target : {};
|
|
174
|
+
return { ...base, [head]: writePath(base[head], tail, value) };
|
|
175
|
+
}
|
|
176
|
+
function collectTokens(value, out, tokenSet) {
|
|
177
|
+
if (typeof value === "string" && tokenSet.has(value))
|
|
178
|
+
out.add(value);
|
|
179
|
+
else if (Array.isArray(value))
|
|
180
|
+
value.forEach((item) => collectTokens(item, out, tokenSet));
|
|
181
|
+
else if (value && typeof value === "object")
|
|
182
|
+
Object.values(value).forEach((item) => collectTokens(item, out, tokenSet));
|
|
183
|
+
}
|
|
184
|
+
function applyOpaqueEffect(model, state, ref) {
|
|
185
|
+
const fn = loadOpaqueEffect(ref);
|
|
186
|
+
const first = normalizeOpaqueResults(fn(deepFreeze(cloneValue(state))));
|
|
187
|
+
const second = normalizeOpaqueResults(fn(deepFreeze(cloneValue(state))));
|
|
188
|
+
if (JSON.stringify(first) !== JSON.stringify(second)) {
|
|
189
|
+
throw new Error(`Opaque effect ${ref.module}#${ref.export} returned nondeterministic results for identical input`);
|
|
190
|
+
}
|
|
191
|
+
const states = first;
|
|
192
|
+
return states.map((candidate, index) => validateOpaqueState(model, state, candidate, ref, index));
|
|
193
|
+
}
|
|
194
|
+
function normalizeOpaqueResults(results) {
|
|
195
|
+
return Array.isArray(results) ? results : [results];
|
|
196
|
+
}
|
|
197
|
+
function loadOpaqueEffect(ref) {
|
|
198
|
+
const key = `${ref.module}#${ref.export}`;
|
|
199
|
+
const cached = opaqueCache.get(key);
|
|
200
|
+
if (cached)
|
|
201
|
+
return cached;
|
|
202
|
+
const modulePath = isAbsolute(ref.module) ? ref.module : resolve(process.cwd(), ref.module);
|
|
203
|
+
const moduleValue = require(modulePath);
|
|
204
|
+
const fn = moduleValue[ref.export];
|
|
205
|
+
if (typeof fn !== "function")
|
|
206
|
+
throw new Error(`Opaque effect ${key} does not export a function`);
|
|
207
|
+
opaqueCache.set(key, fn);
|
|
208
|
+
return fn;
|
|
209
|
+
}
|
|
210
|
+
function validateOpaqueState(model, pre, post, ref, index) {
|
|
211
|
+
if (!post || typeof post !== "object" || Array.isArray(post)) {
|
|
212
|
+
throw new Error(`Opaque effect ${ref.module}#${ref.export} result ${index} must be a state object`);
|
|
213
|
+
}
|
|
214
|
+
const declaredWrites = new Set(ref.declaredWrites);
|
|
215
|
+
const varIds = new Set(model.vars.map((decl) => decl.id));
|
|
216
|
+
for (const key of Object.keys(post)) {
|
|
217
|
+
if (!varIds.has(key))
|
|
218
|
+
throw new Error(`Opaque effect ${ref.module}#${ref.export} wrote unknown var ${key}`);
|
|
219
|
+
}
|
|
220
|
+
for (const decl of model.vars) {
|
|
221
|
+
if (!Object.hasOwn(post, decl.id))
|
|
222
|
+
throw new Error(`Opaque effect ${ref.module}#${ref.export} result ${index} omitted var ${decl.id}`);
|
|
223
|
+
if (!validateValue(decl.domain, post[decl.id])) {
|
|
224
|
+
throw new Error(`Opaque effect ${ref.module}#${ref.export} produced invalid value for ${decl.id}: ${JSON.stringify(post[decl.id])}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
for (const id of changedKeys(pre, post)) {
|
|
228
|
+
if (!declaredWrites.has(id))
|
|
229
|
+
throw new Error(`Opaque effect ${ref.module}#${ref.export} wrote undeclared var ${id}`);
|
|
230
|
+
}
|
|
231
|
+
return post;
|
|
232
|
+
}
|
|
233
|
+
function changedKeys(left, right) {
|
|
234
|
+
const ids = new Set([...Object.keys(left), ...Object.keys(right)]);
|
|
235
|
+
return [...ids].filter((id) => JSON.stringify(left[id]) !== JSON.stringify(right[id]));
|
|
236
|
+
}
|
|
237
|
+
function cloneValue(value) {
|
|
238
|
+
return JSON.parse(JSON.stringify(value));
|
|
239
|
+
}
|
|
240
|
+
function deepFreeze(value) {
|
|
241
|
+
if (value && typeof value === "object") {
|
|
242
|
+
Object.freeze(value);
|
|
243
|
+
for (const child of Object.values(value))
|
|
244
|
+
deepFreeze(child);
|
|
245
|
+
}
|
|
246
|
+
return value;
|
|
247
|
+
}
|
|
248
|
+
function mustVar(model, id) {
|
|
249
|
+
const decl = model.vars.find((candidate) => candidate.id === id);
|
|
250
|
+
if (!decl)
|
|
251
|
+
throw new Error(`Unknown var ${id}`);
|
|
252
|
+
return decl;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=eval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eval.js","sourceRoot":"","sources":["../../../src/checker/search/eval.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Model, ModelState, Property, Trace, TraceStep } from "modality-ts/kernel";
|
|
2
|
+
export type PropertyVerdict = {
|
|
3
|
+
status: "verified-within-bounds";
|
|
4
|
+
property: string;
|
|
5
|
+
} | {
|
|
6
|
+
status: "violated";
|
|
7
|
+
property: string;
|
|
8
|
+
trace: Trace;
|
|
9
|
+
replayable?: boolean;
|
|
10
|
+
replayBlockedReason?: string;
|
|
11
|
+
} | {
|
|
12
|
+
status: "reachable";
|
|
13
|
+
property: string;
|
|
14
|
+
trace: Trace;
|
|
15
|
+
replayable?: boolean;
|
|
16
|
+
replayBlockedReason?: string;
|
|
17
|
+
} | {
|
|
18
|
+
status: "vacuous-warning";
|
|
19
|
+
property: string;
|
|
20
|
+
message: string;
|
|
21
|
+
} | {
|
|
22
|
+
status: "error";
|
|
23
|
+
property: string;
|
|
24
|
+
message: string;
|
|
25
|
+
};
|
|
26
|
+
export interface CheckResult {
|
|
27
|
+
verdicts: PropertyVerdict[];
|
|
28
|
+
stats: {
|
|
29
|
+
states: number;
|
|
30
|
+
edges: number;
|
|
31
|
+
depth: number;
|
|
32
|
+
};
|
|
33
|
+
vacuityWarnings: string[];
|
|
34
|
+
boundHits: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface CheckOptions {
|
|
37
|
+
slicing?: boolean;
|
|
38
|
+
}
|
|
39
|
+
export declare function checkModel(model: Model, properties: readonly Property[], options?: CheckOptions): CheckResult;
|
|
40
|
+
export declare function sliceModel(model: Model, propertyReads: readonly string[]): Model;
|
|
41
|
+
export declare function modelInitialStates(model: Model): ModelState[];
|
|
42
|
+
export declare function modelSuccessors(model: Model, pre: ModelState): TraceStep[];
|
|
43
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/checker/search/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAc,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAa,KAAK,EAAE,SAAS,EAAqB,MAAM,oBAAoB,CAAC;AAIlI,MAAM,MAAM,eAAe,GACvB;IAAE,MAAM,EAAE,wBAAwB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1G;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,KAAK,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3G;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAkBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,QAAQ,EAAE,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,CAKjH;AAgID,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,KAAK,CAEhF;AAoCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,EAAE,CAE7D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,GAAG,SAAS,EAAE,CAM1E"}
|