modality-ts 0.0.16 → 0.0.18

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 (173) hide show
  1. package/README.md +18 -14
  2. package/dist/check/check-model.d.ts +4 -0
  3. package/dist/check/check-model.d.ts.map +1 -0
  4. package/dist/check/check-model.js +159 -0
  5. package/dist/check/check-model.js.map +1 -0
  6. package/dist/check/index.d.ts +2 -2
  7. package/dist/check/index.d.ts.map +1 -1
  8. package/dist/check/index.js +2 -2
  9. package/dist/check/index.js.map +1 -1
  10. package/dist/check/model-api.d.ts.map +1 -0
  11. package/dist/check/model-api.js +8 -0
  12. package/dist/check/model-api.js.map +1 -0
  13. package/dist/check/native.d.ts +16 -0
  14. package/dist/check/native.d.ts.map +1 -0
  15. package/dist/check/native.js +143 -0
  16. package/dist/check/native.js.map +1 -0
  17. package/dist/check/serialize-properties.d.ts +4 -0
  18. package/dist/check/serialize-properties.d.ts.map +1 -0
  19. package/dist/check/serialize-properties.js +4 -0
  20. package/dist/check/serialize-properties.js.map +1 -0
  21. package/dist/cli/features/check/command.d.ts.map +1 -1
  22. package/dist/cli/features/check/command.js +25 -6
  23. package/dist/cli/features/check/command.js.map +1 -1
  24. package/dist/cli/features/extract/command.d.ts.map +1 -1
  25. package/dist/cli/features/extract/command.js +180 -193
  26. package/dist/cli/features/extract/command.js.map +1 -1
  27. package/dist/cli/features/extract/project.d.ts +36 -0
  28. package/dist/cli/features/extract/project.d.ts.map +1 -0
  29. package/dist/cli/features/extract/project.js +783 -0
  30. package/dist/cli/features/extract/project.js.map +1 -0
  31. package/dist/cli/runtime/index.d.ts.map +1 -1
  32. package/dist/cli/runtime/index.js +2 -1
  33. package/dist/cli/runtime/index.js.map +1 -1
  34. package/dist/core/artifacts/index.d.ts +3 -0
  35. package/dist/core/artifacts/index.d.ts.map +1 -1
  36. package/dist/core/artifacts/index.js +238 -0
  37. package/dist/core/artifacts/index.js.map +1 -1
  38. package/dist/core/index.d.ts +1 -0
  39. package/dist/core/index.d.ts.map +1 -1
  40. package/dist/core/index.js +1 -0
  41. package/dist/core/index.js.map +1 -1
  42. package/dist/core/ir/eval.d.ts +6 -0
  43. package/dist/core/ir/eval.d.ts.map +1 -0
  44. package/dist/core/ir/eval.js +104 -0
  45. package/dist/core/ir/eval.js.map +1 -0
  46. package/dist/core/ir/types.d.ts +83 -0
  47. package/dist/core/ir/types.d.ts.map +1 -1
  48. package/dist/core/props/index.d.ts +23 -60
  49. package/dist/core/props/index.d.ts.map +1 -1
  50. package/dist/core/props/index.js +177 -116
  51. package/dist/core/props/index.js.map +1 -1
  52. package/dist/core/report/types.d.ts +7 -0
  53. package/dist/core/report/types.d.ts.map +1 -1
  54. package/dist/extract/engine/pipeline/index.d.ts +4 -0
  55. package/dist/extract/engine/pipeline/index.d.ts.map +1 -1
  56. package/dist/extract/engine/pipeline/index.js +39 -15
  57. package/dist/extract/engine/pipeline/index.js.map +1 -1
  58. package/dist/extract/engine/spi/index.d.ts +32 -0
  59. package/dist/extract/engine/spi/index.d.ts.map +1 -1
  60. package/dist/extract/engine/ts/react-source-transitions.d.ts +3 -0
  61. package/dist/extract/engine/ts/react-source-transitions.d.ts.map +1 -1
  62. package/dist/extract/engine/ts/react-source-transitions.js +18 -0
  63. package/dist/extract/engine/ts/react-source-transitions.js.map +1 -1
  64. package/dist/extract/sources/router/index.d.ts.map +1 -1
  65. package/dist/extract/sources/router/index.js +5 -0
  66. package/dist/extract/sources/router/index.js.map +1 -1
  67. package/dist/extract/sources/router/module-roles.d.ts +7 -0
  68. package/dist/extract/sources/router/module-roles.d.ts.map +1 -0
  69. package/dist/extract/sources/router/module-roles.js +153 -0
  70. package/dist/extract/sources/router/module-roles.js.map +1 -0
  71. package/dist/modality-ts-native.zip +0 -0
  72. package/native/modality-checker.darwin-arm64.node +0 -0
  73. package/native/modality-checker.darwin-x64.node +0 -0
  74. package/native/modality-checker.linux-arm64-gnu.node +0 -0
  75. package/native/modality-checker.linux-x64-gnu.node +0 -0
  76. package/native/modality-checker.win32-x64-msvc.node +0 -0
  77. package/package.json +14 -4
  78. package/dist/check/diagnostics/bounds.d.ts +0 -5
  79. package/dist/check/diagnostics/bounds.d.ts.map +0 -1
  80. package/dist/check/diagnostics/bounds.js +0 -25
  81. package/dist/check/diagnostics/bounds.js.map +0 -1
  82. package/dist/check/diagnostics/vacuity.d.ts +0 -3
  83. package/dist/check/diagnostics/vacuity.d.ts.map +0 -1
  84. package/dist/check/diagnostics/vacuity.js +0 -22
  85. package/dist/check/diagnostics/vacuity.js.map +0 -1
  86. package/dist/check/engine/check-model.d.ts +0 -7
  87. package/dist/check/engine/check-model.d.ts.map +0 -1
  88. package/dist/check/engine/check-model.js +0 -527
  89. package/dist/check/engine/check-model.js.map +0 -1
  90. package/dist/check/engine/initial-states.d.ts +0 -3
  91. package/dist/check/engine/initial-states.d.ts.map +0 -1
  92. package/dist/check/engine/initial-states.js +0 -11
  93. package/dist/check/engine/initial-states.js.map +0 -1
  94. package/dist/check/engine/model-api.d.ts.map +0 -1
  95. package/dist/check/engine/model-api.js +0 -17
  96. package/dist/check/engine/model-api.js.map +0 -1
  97. package/dist/check/engine/mounts.d.ts +0 -3
  98. package/dist/check/engine/mounts.d.ts.map +0 -1
  99. package/dist/check/engine/mounts.js +0 -13
  100. package/dist/check/engine/mounts.js.map +0 -1
  101. package/dist/check/engine/stabilize.d.ts +0 -4
  102. package/dist/check/engine/stabilize.d.ts.map +0 -1
  103. package/dist/check/engine/stabilize.js +0 -104
  104. package/dist/check/engine/stabilize.js.map +0 -1
  105. package/dist/check/engine/state-utils.d.ts +0 -13
  106. package/dist/check/engine/state-utils.d.ts.map +0 -1
  107. package/dist/check/engine/state-utils.js +0 -43
  108. package/dist/check/engine/state-utils.js.map +0 -1
  109. package/dist/check/engine/transitions.d.ts +0 -12
  110. package/dist/check/engine/transitions.d.ts.map +0 -1
  111. package/dist/check/engine/transitions.js +0 -42
  112. package/dist/check/engine/transitions.js.map +0 -1
  113. package/dist/check/properties/checked-state.d.ts +0 -3
  114. package/dist/check/properties/checked-state.d.ts.map +0 -1
  115. package/dist/check/properties/checked-state.js +0 -21
  116. package/dist/check/properties/checked-state.js.map +0 -1
  117. package/dist/check/properties/finalize.d.ts +0 -5
  118. package/dist/check/properties/finalize.d.ts.map +0 -1
  119. package/dist/check/properties/finalize.js +0 -107
  120. package/dist/check/properties/finalize.js.map +0 -1
  121. package/dist/check/properties/leads-to.d.ts +0 -8
  122. package/dist/check/properties/leads-to.d.ts.map +0 -1
  123. package/dist/check/properties/leads-to.js +0 -70
  124. package/dist/check/properties/leads-to.js.map +0 -1
  125. package/dist/check/properties/observe.d.ts +0 -6
  126. package/dist/check/properties/observe.d.ts.map +0 -1
  127. package/dist/check/properties/observe.js +0 -111
  128. package/dist/check/properties/observe.js.map +0 -1
  129. package/dist/check/properties/reachable-from.d.ts +0 -10
  130. package/dist/check/properties/reachable-from.d.ts.map +0 -1
  131. package/dist/check/properties/reachable-from.js +0 -19
  132. package/dist/check/properties/reachable-from.js.map +0 -1
  133. package/dist/check/runtime/domains.d.ts +0 -5
  134. package/dist/check/runtime/domains.d.ts.map +0 -1
  135. package/dist/check/runtime/domains.js +0 -53
  136. package/dist/check/runtime/domains.js.map +0 -1
  137. package/dist/check/runtime/effects.d.ts +0 -9
  138. package/dist/check/runtime/effects.d.ts.map +0 -1
  139. package/dist/check/runtime/effects.js +0 -86
  140. package/dist/check/runtime/effects.js.map +0 -1
  141. package/dist/check/runtime/expr.d.ts +0 -7
  142. package/dist/check/runtime/expr.d.ts.map +0 -1
  143. package/dist/check/runtime/expr.js +0 -49
  144. package/dist/check/runtime/expr.js.map +0 -1
  145. package/dist/check/runtime/navigation.d.ts +0 -7
  146. package/dist/check/runtime/navigation.d.ts.map +0 -1
  147. package/dist/check/runtime/navigation.js +0 -60
  148. package/dist/check/runtime/navigation.js.map +0 -1
  149. package/dist/check/runtime/opaque.d.ts +0 -3
  150. package/dist/check/runtime/opaque.d.ts.map +0 -1
  151. package/dist/check/runtime/opaque.js +0 -72
  152. package/dist/check/runtime/opaque.js.map +0 -1
  153. package/dist/check/runtime/paths.d.ts +0 -4
  154. package/dist/check/runtime/paths.d.ts.map +0 -1
  155. package/dist/check/runtime/paths.js +0 -28
  156. package/dist/check/runtime/paths.js.map +0 -1
  157. package/dist/check/runtime/pending.d.ts +0 -9
  158. package/dist/check/runtime/pending.d.ts.map +0 -1
  159. package/dist/check/runtime/pending.js +0 -5
  160. package/dist/check/runtime/pending.js.map +0 -1
  161. package/dist/check/runtime/tokens.d.ts +0 -7
  162. package/dist/check/runtime/tokens.d.ts.map +0 -1
  163. package/dist/check/runtime/tokens.js +0 -36
  164. package/dist/check/runtime/tokens.js.map +0 -1
  165. package/dist/check/traces/step-facts.d.ts +0 -3
  166. package/dist/check/traces/step-facts.d.ts.map +0 -1
  167. package/dist/check/traces/step-facts.js +0 -35
  168. package/dist/check/traces/step-facts.js.map +0 -1
  169. package/dist/check/traces/trace.d.ts +0 -13
  170. package/dist/check/traces/trace.d.ts.map +0 -1
  171. package/dist/check/traces/trace.js +0 -47
  172. package/dist/check/traces/trace.js.map +0 -1
  173. /package/dist/check/{engine/model-api.d.ts → model-api.d.ts} +0 -0
@@ -0,0 +1,153 @@
1
+ import * as ts from "typescript";
2
+ const SERVER_EXPORT_NAMES = new Set(["loader", "action", "headers"]);
3
+ export function isServerOnlyModulePath(fileName) {
4
+ const normalized = fileName.split("\\").join("/");
5
+ return /\.server\./.test(normalized) || /\/server\//.test(normalized);
6
+ }
7
+ export function parseModuleDirectives(sourceText) {
8
+ const directives = [];
9
+ const lines = sourceText.split(/\r?\n/).slice(0, 5);
10
+ for (const line of lines) {
11
+ const trimmed = line.trim();
12
+ if (trimmed === '"use client";' || trimmed === "'use client';")
13
+ directives.push("use client");
14
+ if (trimmed === '"use server";' || trimmed === "'use server';")
15
+ directives.push("use server");
16
+ }
17
+ return directives;
18
+ }
19
+ function parseSource(sourceText, fileName) {
20
+ return ts.createSourceFile(fileName, sourceText, ts.ScriptTarget.Latest, true, fileName.endsWith(".tsx") ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
21
+ }
22
+ function isPascalCase(name) {
23
+ return /^[A-Z][A-Za-z0-9]*$/.test(name);
24
+ }
25
+ function isHookExport(name) {
26
+ return (name.startsWith("use") && name.length > 3 && /^[A-Z]/.test(name[3] ?? ""));
27
+ }
28
+ function exportNameFromClause(clause) {
29
+ if (!clause.exportClause || !ts.isNamedExports(clause.exportClause))
30
+ return undefined;
31
+ const elements = clause.exportClause.elements;
32
+ if (elements.length !== 1)
33
+ return undefined;
34
+ const element = elements[0];
35
+ if (!element)
36
+ return undefined;
37
+ return (element.name ?? element.propertyName)?.text;
38
+ }
39
+ function declarationExportName(statement) {
40
+ if (ts.isFunctionDeclaration(statement) && statement.name)
41
+ return statement.name.text;
42
+ if (ts.isVariableStatement(statement)) {
43
+ const decl = statement.declarationList.declarations[0];
44
+ if (decl && ts.isIdentifier(decl.name))
45
+ return decl.name.text;
46
+ }
47
+ if (ts.isClassDeclaration(statement) && statement.name)
48
+ return statement.name.text;
49
+ return undefined;
50
+ }
51
+ function isExported(statement) {
52
+ return ((ts.canHaveModifiers(statement) &&
53
+ statement.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.ExportKeyword)) ??
54
+ false);
55
+ }
56
+ function isDefaultExport(statement) {
57
+ return ((ts.canHaveModifiers(statement) &&
58
+ statement.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.DefaultKeyword)) ??
59
+ false);
60
+ }
61
+ export function classifyReactRouterModule(ctx) {
62
+ const directives = parseModuleDirectives(ctx.sourceText);
63
+ if (isServerOnlyModulePath(ctx.fileName)) {
64
+ return {
65
+ defaultContext: "server",
66
+ serverOnly: true,
67
+ directives,
68
+ reason: "server-only module path",
69
+ };
70
+ }
71
+ if (directives.includes("use server")) {
72
+ return {
73
+ defaultContext: "server",
74
+ serverOnly: true,
75
+ directives,
76
+ reason: "use server directive",
77
+ };
78
+ }
79
+ if (directives.includes("use client")) {
80
+ return {
81
+ defaultContext: "client",
82
+ directives,
83
+ reason: "use client directive",
84
+ };
85
+ }
86
+ return {
87
+ defaultContext: "shared",
88
+ directives,
89
+ reason: "route/client module",
90
+ };
91
+ }
92
+ export function reactRouterModuleEntryExports(ctx) {
93
+ const sourceFile = parseSource(ctx.sourceText, ctx.fileName);
94
+ const entries = [];
95
+ const seen = new Set();
96
+ const addEntry = (name, context, reason) => {
97
+ const key = name === "default" ? "default" : name;
98
+ if (seen.has(key))
99
+ return;
100
+ seen.add(key);
101
+ entries.push({ name, context, reason });
102
+ };
103
+ for (const statement of sourceFile.statements) {
104
+ if (ts.isExportAssignment(statement)) {
105
+ addEntry("default", "client", "default export");
106
+ continue;
107
+ }
108
+ if (ts.isExportDeclaration(statement)) {
109
+ const exported = exportNameFromClause(statement);
110
+ if (!exported)
111
+ continue;
112
+ if (SERVER_EXPORT_NAMES.has(exported)) {
113
+ addEntry(exported, "server", `server route export ${exported}`);
114
+ }
115
+ else if (isPascalCase(exported)) {
116
+ addEntry(exported, "client", "exported component");
117
+ }
118
+ else if (isHookExport(exported)) {
119
+ addEntry(exported, "client", "exported hook");
120
+ }
121
+ continue;
122
+ }
123
+ if (!isExported(statement))
124
+ continue;
125
+ if (isDefaultExport(statement)) {
126
+ addEntry("default", "client", "default export");
127
+ continue;
128
+ }
129
+ const name = declarationExportName(statement);
130
+ if (!name)
131
+ continue;
132
+ if (SERVER_EXPORT_NAMES.has(name)) {
133
+ addEntry(name, "server", `server route export ${name}`);
134
+ }
135
+ else if (isPascalCase(name)) {
136
+ addEntry(name, "client", "exported component");
137
+ }
138
+ else if (isHookExport(name)) {
139
+ addEntry(name, "client", "exported hook");
140
+ }
141
+ }
142
+ return entries.sort((left, right) => {
143
+ const leftKey = left.name === "default" ? "" : left.name;
144
+ const rightKey = right.name === "default" ? "" : right.name;
145
+ return leftKey.localeCompare(rightKey);
146
+ });
147
+ }
148
+ export function classifyReactRouterImportEdge(ctx) {
149
+ if (ctx.isTypeOnly)
150
+ return "type";
151
+ return "unknown";
152
+ }
153
+ //# sourceMappingURL=module-roles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-roles.js","sourceRoot":"","sources":["../../../../src/extract/sources/router/module-roles.ts"],"names":[],"mappings":"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"}
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "modality-ts",
3
- "version": "0.0.16",
3
+ "version": "0.0.18",
4
4
  "description": "Model-checking-based testing tools for React state-transition bugs.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -11,6 +11,7 @@
11
11
  "types": "./dist/cli/cli.d.ts",
12
12
  "files": [
13
13
  "dist/**",
14
+ "native/**",
14
15
  "README.md",
15
16
  "LICENSE"
16
17
  ],
@@ -126,14 +127,15 @@
126
127
  "packageManager": "pnpm@10.12.4",
127
128
  "scripts": {
128
129
  "architecture": "depcruise --config tools/depcruise.config.cjs src",
129
- "build": "tsc -b",
130
- "clean": "rm -rf dist tsconfig.tsbuildinfo",
130
+ "build:rust": "napi build --platform --release --cargo-cwd crates/checker native",
131
+ "build": "pnpm build:rust && tsc -b",
132
+ "clean": "rm -rf dist native tsconfig.tsbuildinfo && cargo clean --manifest-path crates/checker/Cargo.toml",
131
133
  "ci:examples": "tsx tools/examples-ci.ts",
132
134
  "demo": "vitest run test/modality/demo-acceptance.test.ts",
133
135
  "fix": "biome lint --write . && biome format --write .",
134
136
  "phase7": "tsx tools/phase7-differential.ts",
135
137
  "publish:npm": "npm publish --access public",
136
- "test": "vitest run",
138
+ "test": "pnpm build:rust && vitest run",
137
139
  "typecheck": "tsc -b"
138
140
  },
139
141
  "dependencies": {
@@ -142,9 +144,17 @@
142
144
  },
143
145
  "devDependencies": {
144
146
  "@biomejs/biome": "2.5.0",
147
+ "@napi-rs/cli": "^2.18.4",
145
148
  "@types/node": "^24.10.1",
146
149
  "dependency-cruiser": "^17.4.3",
147
150
  "tsx": "^4.20.6",
148
151
  "vitest": "^4.0.14"
152
+ },
153
+ "napi": {
154
+ "name": "modality-checker",
155
+ "triples": {
156
+ "defaults": true,
157
+ "additional": []
158
+ }
149
159
  }
150
160
  }
@@ -1,5 +0,0 @@
1
- import type { Model, ModelState, Transition } from "modality-ts/core";
2
- import { type TransitionIndex } from "../engine/transitions.js";
3
- export declare function recordMaxDepthBoundHits(model: Model, frontier: readonly ModelState[], enabledTransitionIds: Set<string>, boundHits: Set<string>, index?: TransitionIndex): void;
4
- export declare function effectContainsEnqueue(effect: Transition["effect"]): boolean;
5
- //# sourceMappingURL=bounds.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bounds.d.ts","sourceRoot":"","sources":["../../../src/check/diagnostics/bounds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,SAAS,UAAU,EAAE,EAC/B,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,EACjC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,EACtB,KAAK,CAAC,EAAE,eAAe,GACtB,IAAI,CAYN;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,GAAG,OAAO,CAQ3E"}
@@ -1,25 +0,0 @@
1
- import { enabledTransitions, } from "../engine/transitions.js";
2
- export function recordMaxDepthBoundHits(model, frontier, enabledTransitionIds, boundHits, index) {
3
- if (frontier.length === 0)
4
- return;
5
- const blockedTransitions = new Set();
6
- for (const state of frontier) {
7
- for (const transition of enabledTransitions(model, state, index)) {
8
- enabledTransitionIds.add(transition.id);
9
- blockedTransitions.add(transition.id);
10
- }
11
- }
12
- for (const id of [...blockedTransitions].sort()) {
13
- boundHits.add(`maxDepth reached before ${id}`);
14
- }
15
- }
16
- export function effectContainsEnqueue(effect) {
17
- if (effect.kind === "enqueue")
18
- return true;
19
- if (effect.kind === "seq")
20
- return effect.effects.some(effectContainsEnqueue);
21
- if (effect.kind === "if")
22
- return (effectContainsEnqueue(effect.then) || effectContainsEnqueue(effect.else));
23
- return false;
24
- }
25
- //# sourceMappingURL=bounds.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bounds.js","sourceRoot":"","sources":["../../../src/check/diagnostics/bounds.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,GAEnB,MAAM,0BAA0B,CAAC;AAElC,MAAM,UAAU,uBAAuB,CACrC,KAAY,EACZ,QAA+B,EAC/B,oBAAiC,EACjC,SAAsB,EACtB,KAAuB;IAEvB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAClC,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7C,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,KAAK,MAAM,UAAU,IAAI,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YACjE,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YACxC,kBAAkB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,CAAC,GAAG,kBAAkB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAChD,SAAS,CAAC,GAAG,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAA4B;IAChE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC7E,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI;QACtB,OAAO,CACL,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,CAAC,MAAM,CAAC,IAAI,CAAC,CACzE,CAAC;IACJ,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Model, ModelState } from "modality-ts/core";
2
- export declare function vacuityWarnings(model: Model, states: Map<string, ModelState>, enabledTransitionIds: Set<string>): string[];
3
- //# sourceMappingURL=vacuity.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vacuity.d.ts","sourceRoot":"","sources":["../../../src/check/diagnostics/vacuity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,wBAAgB,eAAe,CAC7B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC/B,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,GAChC,MAAM,EAAE,CAuBV"}
@@ -1,22 +0,0 @@
1
- export function vacuityWarnings(model, states, enabledTransitionIds) {
2
- const warnings = [];
3
- for (const transition of model.transitions) {
4
- if (transition.cls !== "internal" &&
5
- !enabledTransitionIds.has(transition.id)) {
6
- warnings.push(`transition never enabled: ${transition.id}`);
7
- }
8
- }
9
- for (const decl of model.vars) {
10
- if (decl.domain.kind !== "enum")
11
- continue;
12
- const inhabited = new Set([...states.values()]
13
- .map((state) => state[decl.id])
14
- .filter((value) => typeof value === "string"));
15
- for (const value of decl.domain.values) {
16
- if (!inhabited.has(value))
17
- warnings.push(`enum value never inhabited: ${decl.id}=${value}`);
18
- }
19
- }
20
- return warnings.sort();
21
- }
22
- //# sourceMappingURL=vacuity.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vacuity.js","sourceRoot":"","sources":["../../../src/check/diagnostics/vacuity.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAC7B,KAAY,EACZ,MAA+B,EAC/B,oBAAiC;IAEjC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAC3C,IACE,UAAU,CAAC,GAAG,KAAK,UAAU;YAC7B,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,EACxC,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QAC1C,MAAM,SAAS,GAAG,IAAI,GAAG,CACvB,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;aACjB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aAC9B,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CACjE,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;gBACvB,QAAQ,CAAC,IAAI,CAAC,+BAA+B,IAAI,CAAC,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -1,7 +0,0 @@
1
- import type { Model, Property } from "modality-ts/core";
2
- import type { CheckOptions, CheckResult } from "../types.js";
3
- export declare function needsRecordedEdges(properties: readonly Property[]): boolean;
4
- export declare function needsReverseGraph(properties: readonly Property[]): boolean;
5
- export declare function needsStepMonitoring(properties: readonly Property[]): boolean;
6
- export declare function checkModel(model: Model, properties: readonly Property[], options?: CheckOptions): CheckResult;
7
- //# sourceMappingURL=check-model.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"check-model.d.ts","sourceRoot":"","sources":["../../../src/check/engine/check-model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,KAAK,EAEL,QAAQ,EAGT,MAAM,kBAAkB,CAAC;AAe1B,OAAO,KAAK,EAEV,YAAY,EACZ,WAAW,EAOZ,MAAM,aAAa,CAAC;AAuBrB,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAE3E;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAE1E;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAE5E;AAqFD,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,SAAS,QAAQ,EAAE,EAC/B,OAAO,GAAE,YAAiB,GACzB,WAAW,CAyBb"}