modality-ts 0.0.16 → 0.0.17

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 (169) hide show
  1. package/dist/check/check-model.d.ts +4 -0
  2. package/dist/check/check-model.d.ts.map +1 -0
  3. package/dist/check/check-model.js +159 -0
  4. package/dist/check/check-model.js.map +1 -0
  5. package/dist/check/index.d.ts +2 -2
  6. package/dist/check/index.d.ts.map +1 -1
  7. package/dist/check/index.js +2 -2
  8. package/dist/check/index.js.map +1 -1
  9. package/dist/check/model-api.d.ts.map +1 -0
  10. package/dist/check/model-api.js +8 -0
  11. package/dist/check/model-api.js.map +1 -0
  12. package/dist/check/native.d.ts +6 -0
  13. package/dist/check/native.d.ts.map +1 -0
  14. package/dist/check/native.js +69 -0
  15. package/dist/check/native.js.map +1 -0
  16. package/dist/check/serialize-properties.d.ts +4 -0
  17. package/dist/check/serialize-properties.d.ts.map +1 -0
  18. package/dist/check/serialize-properties.js +4 -0
  19. package/dist/check/serialize-properties.js.map +1 -0
  20. package/dist/cli/features/check/command.d.ts.map +1 -1
  21. package/dist/cli/features/check/command.js +25 -6
  22. package/dist/cli/features/check/command.js.map +1 -1
  23. package/dist/cli/features/extract/command.d.ts.map +1 -1
  24. package/dist/cli/features/extract/command.js +180 -193
  25. package/dist/cli/features/extract/command.js.map +1 -1
  26. package/dist/cli/features/extract/project.d.ts +36 -0
  27. package/dist/cli/features/extract/project.d.ts.map +1 -0
  28. package/dist/cli/features/extract/project.js +783 -0
  29. package/dist/cli/features/extract/project.js.map +1 -0
  30. package/dist/cli/runtime/index.d.ts.map +1 -1
  31. package/dist/cli/runtime/index.js +2 -1
  32. package/dist/cli/runtime/index.js.map +1 -1
  33. package/dist/core/artifacts/index.d.ts +3 -0
  34. package/dist/core/artifacts/index.d.ts.map +1 -1
  35. package/dist/core/artifacts/index.js +238 -0
  36. package/dist/core/artifacts/index.js.map +1 -1
  37. package/dist/core/index.d.ts +1 -0
  38. package/dist/core/index.d.ts.map +1 -1
  39. package/dist/core/index.js +1 -0
  40. package/dist/core/index.js.map +1 -1
  41. package/dist/core/ir/eval.d.ts +6 -0
  42. package/dist/core/ir/eval.d.ts.map +1 -0
  43. package/dist/core/ir/eval.js +104 -0
  44. package/dist/core/ir/eval.js.map +1 -0
  45. package/dist/core/ir/types.d.ts +83 -0
  46. package/dist/core/ir/types.d.ts.map +1 -1
  47. package/dist/core/props/index.d.ts +23 -60
  48. package/dist/core/props/index.d.ts.map +1 -1
  49. package/dist/core/props/index.js +177 -116
  50. package/dist/core/props/index.js.map +1 -1
  51. package/dist/core/report/types.d.ts +7 -0
  52. package/dist/core/report/types.d.ts.map +1 -1
  53. package/dist/extract/engine/pipeline/index.d.ts +4 -0
  54. package/dist/extract/engine/pipeline/index.d.ts.map +1 -1
  55. package/dist/extract/engine/pipeline/index.js +39 -15
  56. package/dist/extract/engine/pipeline/index.js.map +1 -1
  57. package/dist/extract/engine/spi/index.d.ts +32 -0
  58. package/dist/extract/engine/spi/index.d.ts.map +1 -1
  59. package/dist/extract/engine/ts/react-source-transitions.d.ts +3 -0
  60. package/dist/extract/engine/ts/react-source-transitions.d.ts.map +1 -1
  61. package/dist/extract/engine/ts/react-source-transitions.js +18 -0
  62. package/dist/extract/engine/ts/react-source-transitions.js.map +1 -1
  63. package/dist/extract/sources/router/index.d.ts.map +1 -1
  64. package/dist/extract/sources/router/index.js +5 -0
  65. package/dist/extract/sources/router/index.js.map +1 -1
  66. package/dist/extract/sources/router/module-roles.d.ts +7 -0
  67. package/dist/extract/sources/router/module-roles.d.ts.map +1 -0
  68. package/dist/extract/sources/router/module-roles.js +153 -0
  69. package/dist/extract/sources/router/module-roles.js.map +1 -0
  70. package/native/index.d.ts +8 -0
  71. package/native/index.js +317 -0
  72. package/native/modality-checker.linux-x64-gnu.node +0 -0
  73. package/package.json +14 -4
  74. package/dist/check/diagnostics/bounds.d.ts +0 -5
  75. package/dist/check/diagnostics/bounds.d.ts.map +0 -1
  76. package/dist/check/diagnostics/bounds.js +0 -25
  77. package/dist/check/diagnostics/bounds.js.map +0 -1
  78. package/dist/check/diagnostics/vacuity.d.ts +0 -3
  79. package/dist/check/diagnostics/vacuity.d.ts.map +0 -1
  80. package/dist/check/diagnostics/vacuity.js +0 -22
  81. package/dist/check/diagnostics/vacuity.js.map +0 -1
  82. package/dist/check/engine/check-model.d.ts +0 -7
  83. package/dist/check/engine/check-model.d.ts.map +0 -1
  84. package/dist/check/engine/check-model.js +0 -527
  85. package/dist/check/engine/check-model.js.map +0 -1
  86. package/dist/check/engine/initial-states.d.ts +0 -3
  87. package/dist/check/engine/initial-states.d.ts.map +0 -1
  88. package/dist/check/engine/initial-states.js +0 -11
  89. package/dist/check/engine/initial-states.js.map +0 -1
  90. package/dist/check/engine/model-api.d.ts.map +0 -1
  91. package/dist/check/engine/model-api.js +0 -17
  92. package/dist/check/engine/model-api.js.map +0 -1
  93. package/dist/check/engine/mounts.d.ts +0 -3
  94. package/dist/check/engine/mounts.d.ts.map +0 -1
  95. package/dist/check/engine/mounts.js +0 -13
  96. package/dist/check/engine/mounts.js.map +0 -1
  97. package/dist/check/engine/stabilize.d.ts +0 -4
  98. package/dist/check/engine/stabilize.d.ts.map +0 -1
  99. package/dist/check/engine/stabilize.js +0 -104
  100. package/dist/check/engine/stabilize.js.map +0 -1
  101. package/dist/check/engine/state-utils.d.ts +0 -13
  102. package/dist/check/engine/state-utils.d.ts.map +0 -1
  103. package/dist/check/engine/state-utils.js +0 -43
  104. package/dist/check/engine/state-utils.js.map +0 -1
  105. package/dist/check/engine/transitions.d.ts +0 -12
  106. package/dist/check/engine/transitions.d.ts.map +0 -1
  107. package/dist/check/engine/transitions.js +0 -42
  108. package/dist/check/engine/transitions.js.map +0 -1
  109. package/dist/check/properties/checked-state.d.ts +0 -3
  110. package/dist/check/properties/checked-state.d.ts.map +0 -1
  111. package/dist/check/properties/checked-state.js +0 -21
  112. package/dist/check/properties/checked-state.js.map +0 -1
  113. package/dist/check/properties/finalize.d.ts +0 -5
  114. package/dist/check/properties/finalize.d.ts.map +0 -1
  115. package/dist/check/properties/finalize.js +0 -107
  116. package/dist/check/properties/finalize.js.map +0 -1
  117. package/dist/check/properties/leads-to.d.ts +0 -8
  118. package/dist/check/properties/leads-to.d.ts.map +0 -1
  119. package/dist/check/properties/leads-to.js +0 -70
  120. package/dist/check/properties/leads-to.js.map +0 -1
  121. package/dist/check/properties/observe.d.ts +0 -6
  122. package/dist/check/properties/observe.d.ts.map +0 -1
  123. package/dist/check/properties/observe.js +0 -111
  124. package/dist/check/properties/observe.js.map +0 -1
  125. package/dist/check/properties/reachable-from.d.ts +0 -10
  126. package/dist/check/properties/reachable-from.d.ts.map +0 -1
  127. package/dist/check/properties/reachable-from.js +0 -19
  128. package/dist/check/properties/reachable-from.js.map +0 -1
  129. package/dist/check/runtime/domains.d.ts +0 -5
  130. package/dist/check/runtime/domains.d.ts.map +0 -1
  131. package/dist/check/runtime/domains.js +0 -53
  132. package/dist/check/runtime/domains.js.map +0 -1
  133. package/dist/check/runtime/effects.d.ts +0 -9
  134. package/dist/check/runtime/effects.d.ts.map +0 -1
  135. package/dist/check/runtime/effects.js +0 -86
  136. package/dist/check/runtime/effects.js.map +0 -1
  137. package/dist/check/runtime/expr.d.ts +0 -7
  138. package/dist/check/runtime/expr.d.ts.map +0 -1
  139. package/dist/check/runtime/expr.js +0 -49
  140. package/dist/check/runtime/expr.js.map +0 -1
  141. package/dist/check/runtime/navigation.d.ts +0 -7
  142. package/dist/check/runtime/navigation.d.ts.map +0 -1
  143. package/dist/check/runtime/navigation.js +0 -60
  144. package/dist/check/runtime/navigation.js.map +0 -1
  145. package/dist/check/runtime/opaque.d.ts +0 -3
  146. package/dist/check/runtime/opaque.d.ts.map +0 -1
  147. package/dist/check/runtime/opaque.js +0 -72
  148. package/dist/check/runtime/opaque.js.map +0 -1
  149. package/dist/check/runtime/paths.d.ts +0 -4
  150. package/dist/check/runtime/paths.d.ts.map +0 -1
  151. package/dist/check/runtime/paths.js +0 -28
  152. package/dist/check/runtime/paths.js.map +0 -1
  153. package/dist/check/runtime/pending.d.ts +0 -9
  154. package/dist/check/runtime/pending.d.ts.map +0 -1
  155. package/dist/check/runtime/pending.js +0 -5
  156. package/dist/check/runtime/pending.js.map +0 -1
  157. package/dist/check/runtime/tokens.d.ts +0 -7
  158. package/dist/check/runtime/tokens.d.ts.map +0 -1
  159. package/dist/check/runtime/tokens.js +0 -36
  160. package/dist/check/runtime/tokens.js.map +0 -1
  161. package/dist/check/traces/step-facts.d.ts +0 -3
  162. package/dist/check/traces/step-facts.d.ts.map +0 -1
  163. package/dist/check/traces/step-facts.js +0 -35
  164. package/dist/check/traces/step-facts.js.map +0 -1
  165. package/dist/check/traces/trace.d.ts +0 -13
  166. package/dist/check/traces/trace.d.ts.map +0 -1
  167. package/dist/check/traces/trace.js +0 -47
  168. package/dist/check/traces/trace.js.map +0 -1
  169. /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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"}
@@ -0,0 +1,8 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ export declare function checkModel(serializedRequest: string): string
7
+ export declare function modelInitialStates(modelJson: string): string
8
+ export declare function modelSuccessors(modelJson: string, stateJson: string): string
@@ -0,0 +1,317 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ /* prettier-ignore */
4
+
5
+ /* auto-generated by NAPI-RS */
6
+
7
+ const { existsSync, readFileSync } = require('fs')
8
+ const { join } = require('path')
9
+
10
+ const { platform, arch } = process
11
+
12
+ let nativeBinding = null
13
+ let localFileExisted = false
14
+ let loadError = null
15
+
16
+ function isMusl() {
17
+ // For Node 10
18
+ if (!process.report || typeof process.report.getReport !== 'function') {
19
+ try {
20
+ const lddPath = require('child_process').execSync('which ldd').toString().trim()
21
+ return readFileSync(lddPath, 'utf8').includes('musl')
22
+ } catch (e) {
23
+ return true
24
+ }
25
+ } else {
26
+ const { glibcVersionRuntime } = process.report.getReport().header
27
+ return !glibcVersionRuntime
28
+ }
29
+ }
30
+
31
+ switch (platform) {
32
+ case 'android':
33
+ switch (arch) {
34
+ case 'arm64':
35
+ localFileExisted = existsSync(join(__dirname, 'modality-checker.android-arm64.node'))
36
+ try {
37
+ if (localFileExisted) {
38
+ nativeBinding = require('./modality-checker.android-arm64.node')
39
+ } else {
40
+ nativeBinding = require('modality-ts-android-arm64')
41
+ }
42
+ } catch (e) {
43
+ loadError = e
44
+ }
45
+ break
46
+ case 'arm':
47
+ localFileExisted = existsSync(join(__dirname, 'modality-checker.android-arm-eabi.node'))
48
+ try {
49
+ if (localFileExisted) {
50
+ nativeBinding = require('./modality-checker.android-arm-eabi.node')
51
+ } else {
52
+ nativeBinding = require('modality-ts-android-arm-eabi')
53
+ }
54
+ } catch (e) {
55
+ loadError = e
56
+ }
57
+ break
58
+ default:
59
+ throw new Error(`Unsupported architecture on Android ${arch}`)
60
+ }
61
+ break
62
+ case 'win32':
63
+ switch (arch) {
64
+ case 'x64':
65
+ localFileExisted = existsSync(
66
+ join(__dirname, 'modality-checker.win32-x64-msvc.node')
67
+ )
68
+ try {
69
+ if (localFileExisted) {
70
+ nativeBinding = require('./modality-checker.win32-x64-msvc.node')
71
+ } else {
72
+ nativeBinding = require('modality-ts-win32-x64-msvc')
73
+ }
74
+ } catch (e) {
75
+ loadError = e
76
+ }
77
+ break
78
+ case 'ia32':
79
+ localFileExisted = existsSync(
80
+ join(__dirname, 'modality-checker.win32-ia32-msvc.node')
81
+ )
82
+ try {
83
+ if (localFileExisted) {
84
+ nativeBinding = require('./modality-checker.win32-ia32-msvc.node')
85
+ } else {
86
+ nativeBinding = require('modality-ts-win32-ia32-msvc')
87
+ }
88
+ } catch (e) {
89
+ loadError = e
90
+ }
91
+ break
92
+ case 'arm64':
93
+ localFileExisted = existsSync(
94
+ join(__dirname, 'modality-checker.win32-arm64-msvc.node')
95
+ )
96
+ try {
97
+ if (localFileExisted) {
98
+ nativeBinding = require('./modality-checker.win32-arm64-msvc.node')
99
+ } else {
100
+ nativeBinding = require('modality-ts-win32-arm64-msvc')
101
+ }
102
+ } catch (e) {
103
+ loadError = e
104
+ }
105
+ break
106
+ default:
107
+ throw new Error(`Unsupported architecture on Windows: ${arch}`)
108
+ }
109
+ break
110
+ case 'darwin':
111
+ localFileExisted = existsSync(join(__dirname, 'modality-checker.darwin-universal.node'))
112
+ try {
113
+ if (localFileExisted) {
114
+ nativeBinding = require('./modality-checker.darwin-universal.node')
115
+ } else {
116
+ nativeBinding = require('modality-ts-darwin-universal')
117
+ }
118
+ break
119
+ } catch {}
120
+ switch (arch) {
121
+ case 'x64':
122
+ localFileExisted = existsSync(join(__dirname, 'modality-checker.darwin-x64.node'))
123
+ try {
124
+ if (localFileExisted) {
125
+ nativeBinding = require('./modality-checker.darwin-x64.node')
126
+ } else {
127
+ nativeBinding = require('modality-ts-darwin-x64')
128
+ }
129
+ } catch (e) {
130
+ loadError = e
131
+ }
132
+ break
133
+ case 'arm64':
134
+ localFileExisted = existsSync(
135
+ join(__dirname, 'modality-checker.darwin-arm64.node')
136
+ )
137
+ try {
138
+ if (localFileExisted) {
139
+ nativeBinding = require('./modality-checker.darwin-arm64.node')
140
+ } else {
141
+ nativeBinding = require('modality-ts-darwin-arm64')
142
+ }
143
+ } catch (e) {
144
+ loadError = e
145
+ }
146
+ break
147
+ default:
148
+ throw new Error(`Unsupported architecture on macOS: ${arch}`)
149
+ }
150
+ break
151
+ case 'freebsd':
152
+ if (arch !== 'x64') {
153
+ throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
154
+ }
155
+ localFileExisted = existsSync(join(__dirname, 'modality-checker.freebsd-x64.node'))
156
+ try {
157
+ if (localFileExisted) {
158
+ nativeBinding = require('./modality-checker.freebsd-x64.node')
159
+ } else {
160
+ nativeBinding = require('modality-ts-freebsd-x64')
161
+ }
162
+ } catch (e) {
163
+ loadError = e
164
+ }
165
+ break
166
+ case 'linux':
167
+ switch (arch) {
168
+ case 'x64':
169
+ if (isMusl()) {
170
+ localFileExisted = existsSync(
171
+ join(__dirname, 'modality-checker.linux-x64-musl.node')
172
+ )
173
+ try {
174
+ if (localFileExisted) {
175
+ nativeBinding = require('./modality-checker.linux-x64-musl.node')
176
+ } else {
177
+ nativeBinding = require('modality-ts-linux-x64-musl')
178
+ }
179
+ } catch (e) {
180
+ loadError = e
181
+ }
182
+ } else {
183
+ localFileExisted = existsSync(
184
+ join(__dirname, 'modality-checker.linux-x64-gnu.node')
185
+ )
186
+ try {
187
+ if (localFileExisted) {
188
+ nativeBinding = require('./modality-checker.linux-x64-gnu.node')
189
+ } else {
190
+ nativeBinding = require('modality-ts-linux-x64-gnu')
191
+ }
192
+ } catch (e) {
193
+ loadError = e
194
+ }
195
+ }
196
+ break
197
+ case 'arm64':
198
+ if (isMusl()) {
199
+ localFileExisted = existsSync(
200
+ join(__dirname, 'modality-checker.linux-arm64-musl.node')
201
+ )
202
+ try {
203
+ if (localFileExisted) {
204
+ nativeBinding = require('./modality-checker.linux-arm64-musl.node')
205
+ } else {
206
+ nativeBinding = require('modality-ts-linux-arm64-musl')
207
+ }
208
+ } catch (e) {
209
+ loadError = e
210
+ }
211
+ } else {
212
+ localFileExisted = existsSync(
213
+ join(__dirname, 'modality-checker.linux-arm64-gnu.node')
214
+ )
215
+ try {
216
+ if (localFileExisted) {
217
+ nativeBinding = require('./modality-checker.linux-arm64-gnu.node')
218
+ } else {
219
+ nativeBinding = require('modality-ts-linux-arm64-gnu')
220
+ }
221
+ } catch (e) {
222
+ loadError = e
223
+ }
224
+ }
225
+ break
226
+ case 'arm':
227
+ if (isMusl()) {
228
+ localFileExisted = existsSync(
229
+ join(__dirname, 'modality-checker.linux-arm-musleabihf.node')
230
+ )
231
+ try {
232
+ if (localFileExisted) {
233
+ nativeBinding = require('./modality-checker.linux-arm-musleabihf.node')
234
+ } else {
235
+ nativeBinding = require('modality-ts-linux-arm-musleabihf')
236
+ }
237
+ } catch (e) {
238
+ loadError = e
239
+ }
240
+ } else {
241
+ localFileExisted = existsSync(
242
+ join(__dirname, 'modality-checker.linux-arm-gnueabihf.node')
243
+ )
244
+ try {
245
+ if (localFileExisted) {
246
+ nativeBinding = require('./modality-checker.linux-arm-gnueabihf.node')
247
+ } else {
248
+ nativeBinding = require('modality-ts-linux-arm-gnueabihf')
249
+ }
250
+ } catch (e) {
251
+ loadError = e
252
+ }
253
+ }
254
+ break
255
+ case 'riscv64':
256
+ if (isMusl()) {
257
+ localFileExisted = existsSync(
258
+ join(__dirname, 'modality-checker.linux-riscv64-musl.node')
259
+ )
260
+ try {
261
+ if (localFileExisted) {
262
+ nativeBinding = require('./modality-checker.linux-riscv64-musl.node')
263
+ } else {
264
+ nativeBinding = require('modality-ts-linux-riscv64-musl')
265
+ }
266
+ } catch (e) {
267
+ loadError = e
268
+ }
269
+ } else {
270
+ localFileExisted = existsSync(
271
+ join(__dirname, 'modality-checker.linux-riscv64-gnu.node')
272
+ )
273
+ try {
274
+ if (localFileExisted) {
275
+ nativeBinding = require('./modality-checker.linux-riscv64-gnu.node')
276
+ } else {
277
+ nativeBinding = require('modality-ts-linux-riscv64-gnu')
278
+ }
279
+ } catch (e) {
280
+ loadError = e
281
+ }
282
+ }
283
+ break
284
+ case 's390x':
285
+ localFileExisted = existsSync(
286
+ join(__dirname, 'modality-checker.linux-s390x-gnu.node')
287
+ )
288
+ try {
289
+ if (localFileExisted) {
290
+ nativeBinding = require('./modality-checker.linux-s390x-gnu.node')
291
+ } else {
292
+ nativeBinding = require('modality-ts-linux-s390x-gnu')
293
+ }
294
+ } catch (e) {
295
+ loadError = e
296
+ }
297
+ break
298
+ default:
299
+ throw new Error(`Unsupported architecture on Linux: ${arch}`)
300
+ }
301
+ break
302
+ default:
303
+ throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
304
+ }
305
+
306
+ if (!nativeBinding) {
307
+ if (loadError) {
308
+ throw loadError
309
+ }
310
+ throw new Error(`Failed to load native binding`)
311
+ }
312
+
313
+ const { checkModel, modelInitialStates, modelSuccessors } = nativeBinding
314
+
315
+ module.exports.checkModel = checkModel
316
+ module.exports.modelInitialStates = modelInitialStates
317
+ module.exports.modelSuccessors = modelSuccessors
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "modality-ts",
3
- "version": "0.0.16",
3
+ "version": "0.0.17",
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"}