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.
Files changed (215) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/checker/encode/index.d.ts +2 -0
  4. package/dist/checker/encode/index.d.ts.map +1 -0
  5. package/dist/checker/encode/index.js +2 -0
  6. package/dist/checker/encode/index.js.map +1 -0
  7. package/dist/checker/index.d.ts +6 -0
  8. package/dist/checker/index.d.ts.map +1 -0
  9. package/dist/checker/index.js +6 -0
  10. package/dist/checker/index.js.map +1 -0
  11. package/dist/checker/monitors/index.d.ts +2 -0
  12. package/dist/checker/monitors/index.d.ts.map +1 -0
  13. package/dist/checker/monitors/index.js +2 -0
  14. package/dist/checker/monitors/index.js.map +1 -0
  15. package/dist/checker/search/eval.d.ts +16 -0
  16. package/dist/checker/search/eval.d.ts.map +1 -0
  17. package/dist/checker/search/eval.js +254 -0
  18. package/dist/checker/search/eval.js.map +1 -0
  19. package/dist/checker/search/index.d.ts +43 -0
  20. package/dist/checker/search/index.d.ts.map +1 -0
  21. package/dist/checker/search/index.js +532 -0
  22. package/dist/checker/search/index.js.map +1 -0
  23. package/dist/checker/slicing/index.d.ts +2 -0
  24. package/dist/checker/slicing/index.d.ts.map +1 -0
  25. package/dist/checker/slicing/index.js +2 -0
  26. package/dist/checker/slicing/index.js.map +1 -0
  27. package/dist/checker/traces/index.d.ts +2 -0
  28. package/dist/checker/traces/index.d.ts.map +1 -0
  29. package/dist/checker/traces/index.js +2 -0
  30. package/dist/checker/traces/index.js.map +1 -0
  31. package/dist/extraction/index.d.ts +31 -0
  32. package/dist/extraction/index.d.ts.map +1 -0
  33. package/dist/extraction/index.js +2254 -0
  34. package/dist/extraction/index.js.map +1 -0
  35. package/dist/extraction/pipeline/index.d.ts +45 -0
  36. package/dist/extraction/pipeline/index.d.ts.map +1 -0
  37. package/dist/extraction/pipeline/index.js +101 -0
  38. package/dist/extraction/pipeline/index.js.map +1 -0
  39. package/dist/extraction/spi/index.d.ts +99 -0
  40. package/dist/extraction/spi/index.d.ts.map +1 -0
  41. package/dist/extraction/spi/index.js +2 -0
  42. package/dist/extraction/spi/index.js.map +1 -0
  43. package/dist/harness/index.d.ts +109 -0
  44. package/dist/harness/index.d.ts.map +1 -0
  45. package/dist/harness/index.js +377 -0
  46. package/dist/harness/index.js.map +1 -0
  47. package/dist/kernel/artifacts/index.d.ts +11 -0
  48. package/dist/kernel/artifacts/index.d.ts.map +1 -0
  49. package/dist/kernel/artifacts/index.js +127 -0
  50. package/dist/kernel/artifacts/index.js.map +1 -0
  51. package/dist/kernel/index.d.ts +10 -0
  52. package/dist/kernel/index.d.ts.map +1 -0
  53. package/dist/kernel/index.js +10 -0
  54. package/dist/kernel/index.js.map +1 -0
  55. package/dist/kernel/ir/canonical.d.ts +5 -0
  56. package/dist/kernel/ir/canonical.d.ts.map +1 -0
  57. package/dist/kernel/ir/canonical.js +47 -0
  58. package/dist/kernel/ir/canonical.js.map +1 -0
  59. package/dist/kernel/ir/domains.d.ts +9 -0
  60. package/dist/kernel/ir/domains.d.ts.map +1 -0
  61. package/dist/kernel/ir/domains.js +102 -0
  62. package/dist/kernel/ir/domains.js.map +1 -0
  63. package/dist/kernel/ir/types.d.ts +224 -0
  64. package/dist/kernel/ir/types.d.ts.map +1 -0
  65. package/dist/kernel/ir/types.js +2 -0
  66. package/dist/kernel/ir/types.js.map +1 -0
  67. package/dist/kernel/ir/validator.d.ts +11 -0
  68. package/dist/kernel/ir/validator.d.ts.map +1 -0
  69. package/dist/kernel/ir/validator.js +674 -0
  70. package/dist/kernel/ir/validator.js.map +1 -0
  71. package/dist/kernel/overlay/index.d.ts +18 -0
  72. package/dist/kernel/overlay/index.d.ts.map +1 -0
  73. package/dist/kernel/overlay/index.js +59 -0
  74. package/dist/kernel/overlay/index.js.map +1 -0
  75. package/dist/kernel/props/index.d.ts +71 -0
  76. package/dist/kernel/props/index.d.ts.map +1 -0
  77. package/dist/kernel/props/index.js +122 -0
  78. package/dist/kernel/props/index.js.map +1 -0
  79. package/dist/kernel/report/types.d.ts +115 -0
  80. package/dist/kernel/report/types.d.ts.map +1 -0
  81. package/dist/kernel/report/types.js +2 -0
  82. package/dist/kernel/report/types.js.map +1 -0
  83. package/dist/kernel/trace/types.d.ts +19 -0
  84. package/dist/kernel/trace/types.d.ts.map +1 -0
  85. package/dist/kernel/trace/types.js +2 -0
  86. package/dist/kernel/trace/types.js.map +1 -0
  87. package/dist/modality/check.d.ts +3 -0
  88. package/dist/modality/check.d.ts.map +1 -0
  89. package/dist/modality/check.js +2 -0
  90. package/dist/modality/check.js.map +1 -0
  91. package/dist/modality/ci.d.ts +3 -0
  92. package/dist/modality/ci.d.ts.map +1 -0
  93. package/dist/modality/ci.js +2 -0
  94. package/dist/modality/ci.js.map +1 -0
  95. package/dist/modality/cli.d.ts +3 -0
  96. package/dist/modality/cli.d.ts.map +1 -0
  97. package/dist/modality/cli.js +223 -0
  98. package/dist/modality/cli.js.map +1 -0
  99. package/dist/modality/codegen/model.d.ts +3 -0
  100. package/dist/modality/codegen/model.d.ts.map +1 -0
  101. package/dist/modality/codegen/model.js +59 -0
  102. package/dist/modality/codegen/model.js.map +1 -0
  103. package/dist/modality/codegen/replay-test.d.ts +10 -0
  104. package/dist/modality/codegen/replay-test.d.ts.map +1 -0
  105. package/dist/modality/codegen/replay-test.js +104 -0
  106. package/dist/modality/codegen/replay-test.js.map +1 -0
  107. package/dist/modality/conform.d.ts +3 -0
  108. package/dist/modality/conform.d.ts.map +1 -0
  109. package/dist/modality/conform.js +2 -0
  110. package/dist/modality/conform.js.map +1 -0
  111. package/dist/modality/export-tla.d.ts +3 -0
  112. package/dist/modality/export-tla.d.ts.map +1 -0
  113. package/dist/modality/export-tla.js +2 -0
  114. package/dist/modality/export-tla.js.map +1 -0
  115. package/dist/modality/extract.d.ts +3 -0
  116. package/dist/modality/extract.d.ts.map +1 -0
  117. package/dist/modality/extract.js +2 -0
  118. package/dist/modality/extract.js.map +1 -0
  119. package/dist/modality/features/check/command.d.ts +23 -0
  120. package/dist/modality/features/check/command.d.ts.map +1 -0
  121. package/dist/modality/features/check/command.js +174 -0
  122. package/dist/modality/features/check/command.js.map +1 -0
  123. package/dist/modality/features/check/index.d.ts +3 -0
  124. package/dist/modality/features/check/index.d.ts.map +1 -0
  125. package/dist/modality/features/check/index.js +2 -0
  126. package/dist/modality/features/check/index.js.map +1 -0
  127. package/dist/modality/features/ci/command.d.ts +23 -0
  128. package/dist/modality/features/ci/command.d.ts.map +1 -0
  129. package/dist/modality/features/ci/command.js +176 -0
  130. package/dist/modality/features/ci/command.js.map +1 -0
  131. package/dist/modality/features/ci/index.d.ts +3 -0
  132. package/dist/modality/features/ci/index.d.ts.map +1 -0
  133. package/dist/modality/features/ci/index.js +2 -0
  134. package/dist/modality/features/ci/index.js.map +1 -0
  135. package/dist/modality/features/conform/command.d.ts +35 -0
  136. package/dist/modality/features/conform/command.d.ts.map +1 -0
  137. package/dist/modality/features/conform/command.js +162 -0
  138. package/dist/modality/features/conform/command.js.map +1 -0
  139. package/dist/modality/features/conform/index.d.ts +3 -0
  140. package/dist/modality/features/conform/index.d.ts.map +1 -0
  141. package/dist/modality/features/conform/index.js +2 -0
  142. package/dist/modality/features/conform/index.js.map +1 -0
  143. package/dist/modality/features/export/command.d.ts +13 -0
  144. package/dist/modality/features/export/command.d.ts.map +1 -0
  145. package/dist/modality/features/export/command.js +250 -0
  146. package/dist/modality/features/export/command.js.map +1 -0
  147. package/dist/modality/features/export/index.d.ts +3 -0
  148. package/dist/modality/features/export/index.d.ts.map +1 -0
  149. package/dist/modality/features/export/index.js +2 -0
  150. package/dist/modality/features/export/index.js.map +1 -0
  151. package/dist/modality/features/extract/command.d.ts +37 -0
  152. package/dist/modality/features/extract/command.d.ts.map +1 -0
  153. package/dist/modality/features/extract/command.js +443 -0
  154. package/dist/modality/features/extract/command.js.map +1 -0
  155. package/dist/modality/features/extract/index.d.ts +3 -0
  156. package/dist/modality/features/extract/index.d.ts.map +1 -0
  157. package/dist/modality/features/extract/index.js +2 -0
  158. package/dist/modality/features/extract/index.js.map +1 -0
  159. package/dist/modality/features/replay/command.d.ts +16 -0
  160. package/dist/modality/features/replay/command.d.ts.map +1 -0
  161. package/dist/modality/features/replay/command.js +50 -0
  162. package/dist/modality/features/replay/command.js.map +1 -0
  163. package/dist/modality/features/replay/index.d.ts +3 -0
  164. package/dist/modality/features/replay/index.d.ts.map +1 -0
  165. package/dist/modality/features/replay/index.js +2 -0
  166. package/dist/modality/features/replay/index.js.map +1 -0
  167. package/dist/modality/overlay.d.ts +3 -0
  168. package/dist/modality/overlay.d.ts.map +1 -0
  169. package/dist/modality/overlay.js +9 -0
  170. package/dist/modality/overlay.js.map +1 -0
  171. package/dist/modality/registry/index.d.ts +22 -0
  172. package/dist/modality/registry/index.d.ts.map +1 -0
  173. package/dist/modality/registry/index.js +89 -0
  174. package/dist/modality/registry/index.js.map +1 -0
  175. package/dist/modality/replay.d.ts +3 -0
  176. package/dist/modality/replay.d.ts.map +1 -0
  177. package/dist/modality/replay.js +2 -0
  178. package/dist/modality/replay.js.map +1 -0
  179. package/dist/runtime/index.d.ts +53 -0
  180. package/dist/runtime/index.d.ts.map +1 -0
  181. package/dist/runtime/index.js +83 -0
  182. package/dist/runtime/index.js.map +1 -0
  183. package/dist/sources/jotai/harness.d.ts +13 -0
  184. package/dist/sources/jotai/harness.d.ts.map +1 -0
  185. package/dist/sources/jotai/harness.js +20 -0
  186. package/dist/sources/jotai/harness.js.map +1 -0
  187. package/dist/sources/jotai/index.d.ts +11 -0
  188. package/dist/sources/jotai/index.d.ts.map +1 -0
  189. package/dist/sources/jotai/index.js +405 -0
  190. package/dist/sources/jotai/index.js.map +1 -0
  191. package/dist/sources/router/harness.d.ts +9 -0
  192. package/dist/sources/router/harness.d.ts.map +1 -0
  193. package/dist/sources/router/harness.js +32 -0
  194. package/dist/sources/router/harness.js.map +1 -0
  195. package/dist/sources/router/index.d.ts +15 -0
  196. package/dist/sources/router/index.d.ts.map +1 -0
  197. package/dist/sources/router/index.js +41 -0
  198. package/dist/sources/router/index.js.map +1 -0
  199. package/dist/sources/swr/harness.d.ts +12 -0
  200. package/dist/sources/swr/harness.d.ts.map +1 -0
  201. package/dist/sources/swr/harness.js +25 -0
  202. package/dist/sources/swr/harness.js.map +1 -0
  203. package/dist/sources/swr/index.d.ts +51 -0
  204. package/dist/sources/swr/index.d.ts.map +1 -0
  205. package/dist/sources/swr/index.js +428 -0
  206. package/dist/sources/swr/index.js.map +1 -0
  207. package/dist/sources/use-state/harness.d.ts +12 -0
  208. package/dist/sources/use-state/harness.d.ts.map +1 -0
  209. package/dist/sources/use-state/harness.js +19 -0
  210. package/dist/sources/use-state/harness.js.map +1 -0
  211. package/dist/sources/use-state/index.d.ts +9 -0
  212. package/dist/sources/use-state/index.d.ts.map +1 -0
  213. package/dist/sources/use-state/index.js +248 -0
  214. package/dist/sources/use-state/index.js.map +1 -0
  215. 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,3 @@
1
+ export { runReplayCommand } from "./features/replay/index.js";
2
+ export type { ReplayCommandOptions, ReplayCommandResult } from "./features/replay/index.js";
3
+ //# sourceMappingURL=replay.d.ts.map
@@ -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,2 @@
1
+ export { runReplayCommand } from "./features/replay/index.js";
2
+ //# sourceMappingURL=replay.js.map
@@ -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"}