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,89 @@
|
|
|
1
|
+
import { jotaiSource } from "modality-ts/source-jotai";
|
|
2
|
+
import { routerSource } from "modality-ts/source-router";
|
|
3
|
+
import { swrSource } from "modality-ts/source-swr";
|
|
4
|
+
import { useStateSource } from "modality-ts/source-use-state";
|
|
5
|
+
export function createBuiltinModalityRegistry(options = {}) {
|
|
6
|
+
const dependencies = options.dependencies;
|
|
7
|
+
const disabled = new Set(options.disabledPlugins ?? []);
|
|
8
|
+
const builtins = [useStateSource(), jotaiSource(), swrSource()];
|
|
9
|
+
const sourcePlugins = [
|
|
10
|
+
...builtins.filter((plugin) => !disabled.has(plugin.id) && shouldEnableBuiltin(plugin, dependencies)),
|
|
11
|
+
...(options.extraSourcePlugins ?? [])
|
|
12
|
+
];
|
|
13
|
+
const defaultRouter = routerSource();
|
|
14
|
+
const routerPlugin = options.routerPlugin === false || disabled.has(defaultRouter.id)
|
|
15
|
+
? undefined
|
|
16
|
+
: options.routerPlugin ?? (shouldEnableBuiltin(defaultRouter, dependencies) ? defaultRouter : undefined);
|
|
17
|
+
return createModalityRegistry({ sourcePlugins, routerPlugin });
|
|
18
|
+
}
|
|
19
|
+
export function createModalityRegistry(options = { sourcePlugins: [] }) {
|
|
20
|
+
for (const plugin of options.sourcePlugins)
|
|
21
|
+
validateStateSourcePlugin(plugin);
|
|
22
|
+
if (options.routerPlugin)
|
|
23
|
+
validateRouterPlugin(options.routerPlugin);
|
|
24
|
+
const sourcePluginIds = sortedUnique(options.sourcePlugins.map((plugin) => plugin.id), "source plugin");
|
|
25
|
+
return {
|
|
26
|
+
sourcePluginIds,
|
|
27
|
+
sourcePlugins: options.sourcePlugins,
|
|
28
|
+
...(options.routerPlugin ? { routerPlugin: options.routerPlugin } : {}),
|
|
29
|
+
plugins: [
|
|
30
|
+
...options.sourcePlugins.map((plugin) => ({
|
|
31
|
+
id: plugin.id,
|
|
32
|
+
version: plugin.version ?? "unknown",
|
|
33
|
+
kind: "state-source",
|
|
34
|
+
packageNames: [...plugin.packageNames].sort()
|
|
35
|
+
})),
|
|
36
|
+
...(options.routerPlugin ? [{
|
|
37
|
+
id: options.routerPlugin.id,
|
|
38
|
+
version: options.routerPlugin.version ?? "unknown",
|
|
39
|
+
kind: "router",
|
|
40
|
+
packageNames: [...options.routerPlugin.packageNames].sort()
|
|
41
|
+
}] : [])
|
|
42
|
+
].sort((left, right) => left.kind.localeCompare(right.kind) || left.id.localeCompare(right.id)),
|
|
43
|
+
...(options.routerPlugin ? { routerPluginId: options.routerPlugin.id } : {})
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
function shouldEnableBuiltin(plugin, dependencies) {
|
|
47
|
+
if (!dependencies)
|
|
48
|
+
return true;
|
|
49
|
+
return plugin.packageNames.some((packageName) => dependencies[packageName] !== undefined);
|
|
50
|
+
}
|
|
51
|
+
function validateStateSourcePlugin(plugin) {
|
|
52
|
+
validateCommonPluginShape(plugin, "source plugin");
|
|
53
|
+
if (typeof plugin.discover !== "function")
|
|
54
|
+
throw new Error(`Invalid source plugin ${plugin.id}: discover must be a function`);
|
|
55
|
+
if (typeof plugin.writeChannels !== "function")
|
|
56
|
+
throw new Error(`Invalid source plugin ${plugin.id}: writeChannels must be a function`);
|
|
57
|
+
if (!plugin.harness || typeof plugin.harness.setup !== "function" || typeof plugin.harness.observe !== "function") {
|
|
58
|
+
throw new Error(`Invalid source plugin ${plugin.id}: harness.setup and harness.observe are required`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function validateRouterPlugin(plugin) {
|
|
62
|
+
validateCommonPluginShape(plugin, "router plugin");
|
|
63
|
+
if (typeof plugin.routeVars !== "function")
|
|
64
|
+
throw new Error(`Invalid router plugin ${plugin.id}: routeVars must be a function`);
|
|
65
|
+
if (typeof plugin.navigationCall !== "function")
|
|
66
|
+
throw new Error(`Invalid router plugin ${plugin.id}: navigationCall must be a function`);
|
|
67
|
+
if (!plugin.harness || typeof plugin.harness.setup !== "function" || typeof plugin.harness.observe !== "function" || typeof plugin.harness.navigate !== "function") {
|
|
68
|
+
throw new Error(`Invalid router plugin ${plugin.id}: harness.setup, harness.observe, and harness.navigate are required`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function validateCommonPluginShape(plugin, kind) {
|
|
72
|
+
if (typeof plugin.id !== "string" || plugin.id.length === 0)
|
|
73
|
+
throw new Error(`Invalid ${kind}: id must be a non-empty string`);
|
|
74
|
+
if (!Array.isArray(plugin.packageNames) || !plugin.packageNames.every((name) => typeof name === "string" && name.length > 0)) {
|
|
75
|
+
throw new Error(`Invalid ${kind} ${plugin.id}: packageNames must be non-empty strings`);
|
|
76
|
+
}
|
|
77
|
+
if (plugin.version !== undefined && typeof plugin.version !== "string")
|
|
78
|
+
throw new Error(`Invalid ${kind} ${plugin.id}: version must be a string`);
|
|
79
|
+
}
|
|
80
|
+
function sortedUnique(values, kind) {
|
|
81
|
+
const seen = new Set();
|
|
82
|
+
for (const value of values) {
|
|
83
|
+
if (seen.has(value))
|
|
84
|
+
throw new Error(`Duplicate ${kind} ${value}`);
|
|
85
|
+
seen.add(value);
|
|
86
|
+
}
|
|
87
|
+
return [...values].sort();
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modality/registry/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../src/modality/replay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/modality/replay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { ModelState, Property, Value } from "modality-ts/kernel/props";
|
|
2
|
+
export interface Observable<TContext = unknown> {
|
|
3
|
+
var: string;
|
|
4
|
+
read(context: TContext): Value;
|
|
5
|
+
}
|
|
6
|
+
export interface ObservableMismatch {
|
|
7
|
+
var: string;
|
|
8
|
+
expected: Value | undefined;
|
|
9
|
+
actual: Value | undefined;
|
|
10
|
+
}
|
|
11
|
+
export interface ObservableAssertion {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
mismatches: ObservableMismatch[];
|
|
14
|
+
}
|
|
15
|
+
export interface ObservableInvariantViolation {
|
|
16
|
+
property: string;
|
|
17
|
+
message: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ObservableInvariantSkip {
|
|
20
|
+
property: string;
|
|
21
|
+
reason: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ObservableInvariantResult {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
state: ModelState;
|
|
26
|
+
violations: ObservableInvariantViolation[];
|
|
27
|
+
skipped: ObservableInvariantSkip[];
|
|
28
|
+
}
|
|
29
|
+
export interface ModalityAssertionStore<TContext> {
|
|
30
|
+
getSnapshot(): TContext;
|
|
31
|
+
subscribe(listener: () => void): () => void;
|
|
32
|
+
}
|
|
33
|
+
export interface ModalityAssertionEvent<TContext = unknown> {
|
|
34
|
+
result: ObservableInvariantResult;
|
|
35
|
+
context: TContext;
|
|
36
|
+
}
|
|
37
|
+
export interface ModalityAssertionOptions<TContext = unknown> {
|
|
38
|
+
onResult?: (event: ModalityAssertionEvent<TContext>) => void;
|
|
39
|
+
onViolation?: (event: ModalityAssertionEvent<TContext>) => void;
|
|
40
|
+
throwOnViolation?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface ModalityAssertionController {
|
|
43
|
+
check(): ObservableInvariantResult;
|
|
44
|
+
start(): () => void;
|
|
45
|
+
}
|
|
46
|
+
export declare function observable<TContext>(varId: string, read: (context: TContext) => Value): Observable<TContext>;
|
|
47
|
+
export declare function assertObservableState<TContext>(expected: ModelState, observables: readonly Observable<TContext>[], context: TContext): ObservableAssertion;
|
|
48
|
+
export declare function assertObservableStateOrThrow<TContext>(expected: ModelState, observables: readonly Observable<TContext>[], context: TContext): void;
|
|
49
|
+
export declare function readObservableState<TContext>(observables: readonly Observable<TContext>[], context: TContext): ModelState;
|
|
50
|
+
export declare function evaluateObservableInvariants<TContext>(properties: readonly Property[], observables: readonly Observable<TContext>[], context: TContext): ObservableInvariantResult;
|
|
51
|
+
export declare function assertObservableInvariantsOrThrow<TContext>(properties: readonly Property[], observables: readonly Observable<TContext>[], context: TContext): void;
|
|
52
|
+
export declare function createModalityAssertions<TContext>(properties: readonly Property[], observables: readonly Observable<TContext>[], store: ModalityAssertionStore<TContext>, options?: ModalityAssertionOptions<TContext>): ModalityAssertionController;
|
|
53
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export function observable(varId, read) {
|
|
2
|
+
return { var: varId, read };
|
|
3
|
+
}
|
|
4
|
+
export function assertObservableState(expected, observables, context) {
|
|
5
|
+
const mismatches = observables
|
|
6
|
+
.map((probe) => ({ var: probe.var, expected: expected[probe.var], actual: probe.read(context) }))
|
|
7
|
+
.filter((mismatch) => stableJson(mismatch.expected) !== stableJson(mismatch.actual));
|
|
8
|
+
return { ok: mismatches.length === 0, mismatches };
|
|
9
|
+
}
|
|
10
|
+
export function assertObservableStateOrThrow(expected, observables, context) {
|
|
11
|
+
const assertion = assertObservableState(expected, observables, context);
|
|
12
|
+
if (!assertion.ok) {
|
|
13
|
+
throw new Error(`Observable state mismatch: ${assertion.mismatches.map((mismatch) => `${mismatch.var} expected=${stableJson(mismatch.expected)} actual=${stableJson(mismatch.actual)}`).join("; ")}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function readObservableState(observables, context) {
|
|
17
|
+
return Object.fromEntries(observables.map((probe) => [probe.var, probe.read(context)]));
|
|
18
|
+
}
|
|
19
|
+
function stableJson(value) {
|
|
20
|
+
if (Array.isArray(value))
|
|
21
|
+
return `[${value.map(stableJson).join(",")}]`;
|
|
22
|
+
if (value && typeof value === "object") {
|
|
23
|
+
return `{${Object.entries(value).sort(([left], [right]) => left.localeCompare(right)).map(([key, child]) => `${JSON.stringify(key)}:${stableJson(child)}`).join(",")}}`;
|
|
24
|
+
}
|
|
25
|
+
return JSON.stringify(value);
|
|
26
|
+
}
|
|
27
|
+
export function evaluateObservableInvariants(properties, observables, context) {
|
|
28
|
+
const state = readObservableState(observables, context);
|
|
29
|
+
const observableIds = new Set(observables.map((probe) => probe.var));
|
|
30
|
+
const violations = [];
|
|
31
|
+
const skipped = [];
|
|
32
|
+
for (const property of properties) {
|
|
33
|
+
if (property.kind !== "always") {
|
|
34
|
+
skipped.push({ property: property.name, reason: `unsupported property kind: ${property.kind}` });
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
const missingReads = (property.reads ?? []).filter((read) => !observableIds.has(read));
|
|
38
|
+
if (missingReads.length > 0) {
|
|
39
|
+
skipped.push({ property: property.name, reason: `unobservable reads: ${missingReads.join(",")}` });
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
try {
|
|
43
|
+
if (!property.predicate(state)) {
|
|
44
|
+
violations.push({ property: property.name, message: "observable invariant failed" });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
violations.push({ property: property.name, message: error instanceof Error ? error.message : String(error) });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { ok: violations.length === 0, state, violations, skipped };
|
|
52
|
+
}
|
|
53
|
+
export function assertObservableInvariantsOrThrow(properties, observables, context) {
|
|
54
|
+
const result = evaluateObservableInvariants(properties, observables, context);
|
|
55
|
+
if (!result.ok) {
|
|
56
|
+
throw new Error(`Observable invariant violation: ${result.violations.map((violation) => `${violation.property}: ${violation.message}`).join("; ")}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export function createModalityAssertions(properties, observables, store, options = {}) {
|
|
60
|
+
const check = () => {
|
|
61
|
+
const context = store.getSnapshot();
|
|
62
|
+
const result = evaluateObservableInvariants(properties, observables, context);
|
|
63
|
+
const event = { result, context };
|
|
64
|
+
options.onResult?.(event);
|
|
65
|
+
if (!result.ok) {
|
|
66
|
+
options.onViolation?.(event);
|
|
67
|
+
if (options.throwOnViolation) {
|
|
68
|
+
throw new Error(`Observable invariant violation: ${result.violations.map((violation) => `${violation.property}: ${violation.message}`).join("; ")}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
check,
|
|
75
|
+
start() {
|
|
76
|
+
check();
|
|
77
|
+
return store.subscribe(() => {
|
|
78
|
+
check();
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { HarnessCtx, HarnessHooks, ObservedRead, WitnessFactory } from "modality-ts/extraction/spi";
|
|
2
|
+
import type { AbstractDomain, ModelState, Value } from "modality-ts/kernel";
|
|
3
|
+
export interface JotaiHarnessHooks extends HarnessHooks {
|
|
4
|
+
initialState: ModelState;
|
|
5
|
+
atoms?: Record<string, unknown>;
|
|
6
|
+
store?: {
|
|
7
|
+
get(atom: unknown): Value;
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
export declare function setup(ctx: HarnessCtx & Partial<Pick<JotaiHarnessHooks, "atoms" | "store">>): JotaiHarnessHooks;
|
|
11
|
+
export declare function observe(varId: string, handles: HarnessHooks): ObservedRead | "unobservable";
|
|
12
|
+
export declare function witness(_domain: AbstractDomain, _varId: string): WitnessFactory | undefined;
|
|
13
|
+
//# sourceMappingURL=harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.d.ts","sourceRoot":"","sources":["../../../src/sources/jotai/harness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACzG,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE5E,MAAM,WAAW,iBAAkB,SAAQ,YAAY;IACrD,YAAY,EAAE,UAAU,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE;QACN,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC;KAC3B,CAAC;CACH;AAED,wBAAgB,KAAK,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAM9G;AAED,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,YAAY,GAAG,cAAc,CAM3F;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAE3F"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function setup(ctx) {
|
|
2
|
+
return {
|
|
3
|
+
initialState: ctx.initialState ?? {},
|
|
4
|
+
...(ctx.atoms ? { atoms: ctx.atoms } : {}),
|
|
5
|
+
...(ctx.store ? { store: ctx.store } : {})
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function observe(varId, handles) {
|
|
9
|
+
const jotai = handles;
|
|
10
|
+
const atom = jotai.atoms?.[varId] ?? jotai.atoms?.[varId.replace(/^atom:/, "")];
|
|
11
|
+
if (atom !== undefined && jotai.store)
|
|
12
|
+
return { value: jotai.store.get(atom) };
|
|
13
|
+
if (varId in jotai.initialState)
|
|
14
|
+
return { value: jotai.initialState[varId] };
|
|
15
|
+
return "unobservable";
|
|
16
|
+
}
|
|
17
|
+
export function witness(_domain, _varId) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../src/sources/jotai/harness.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,KAAK,CAAC,GAAqE;IACzF,OAAO;QACL,YAAY,EAAE,GAAG,CAAC,YAAY,IAAI,EAAE;QACpC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAa,EAAE,OAAqB;IAC1D,MAAM,KAAK,GAAG,OAA4B,CAAC;IAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;IAChF,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/E,IAAI,KAAK,IAAI,KAAK,CAAC,YAAY;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAE,EAAE,CAAC;IAC9E,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAuB,EAAE,MAAc;IAC7D,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { SourceDecl, StateSourcePlugin, WriteChannel } from "modality-ts/extraction/spi";
|
|
2
|
+
import type { SourceAnchor } from "modality-ts/kernel";
|
|
3
|
+
export declare function jotaiSource(): StateSourcePlugin;
|
|
4
|
+
export default jotaiSource;
|
|
5
|
+
export declare function discoverJotaiSafetyWarnings(sourceText: string, fileName?: string): {
|
|
6
|
+
message: string;
|
|
7
|
+
source?: SourceAnchor;
|
|
8
|
+
}[];
|
|
9
|
+
export declare function discoverJotaiAtoms(sourceText: string, fileName?: string): SourceDecl[];
|
|
10
|
+
export declare function discoverJotaiWriteChannels(sourceText: string, fileName?: string): WriteChannel[];
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/sources/jotai/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,KAAK,EAAkB,YAAY,EAAuB,MAAM,oBAAoB,CAAC;AAG5F,wBAAgB,WAAW,IAAI,iBAAiB,CAa/C;AAED,eAAe,WAAW,CAAC;AAE3B,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,SAAa,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAA;CAAE,EAAE,CAiBnI;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,SAAa,GAAG,UAAU,EAAE,CA6B1F;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,SAAa,GAAG,YAAY,EAAE,CAkDpG"}
|