@descryy/runtime-test-runner 0.4.12 → 0.4.14

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 (278) hide show
  1. package/dist/bounded-file.d.ts +18 -0
  2. package/dist/bounded-file.d.ts.map +1 -0
  3. package/dist/bounded-file.js +77 -0
  4. package/dist/bounded-file.js.map +1 -0
  5. package/dist/child-environment.d.ts +12 -0
  6. package/dist/child-environment.d.ts.map +1 -0
  7. package/dist/child-environment.js +124 -0
  8. package/dist/child-environment.js.map +1 -0
  9. package/dist/coverage-capture.d.ts +23 -0
  10. package/dist/coverage-capture.d.ts.map +1 -0
  11. package/dist/coverage-capture.js +165 -0
  12. package/dist/coverage-capture.js.map +1 -0
  13. package/dist/executed-coverage.d.ts +45 -0
  14. package/dist/executed-coverage.d.ts.map +1 -0
  15. package/dist/executed-coverage.js +143 -0
  16. package/dist/executed-coverage.js.map +1 -0
  17. package/dist/go-cover-profile.d.ts +29 -0
  18. package/dist/go-cover-profile.d.ts.map +1 -0
  19. package/dist/go-cover-profile.js +162 -0
  20. package/dist/go-cover-profile.js.map +1 -0
  21. package/dist/go-test.d.ts +29 -2
  22. package/dist/go-test.d.ts.map +1 -1
  23. package/dist/go-test.js +149 -30
  24. package/dist/go-test.js.map +1 -1
  25. package/dist/graph-mapping.d.ts +1 -0
  26. package/dist/graph-mapping.d.ts.map +1 -1
  27. package/dist/graph-mapping.js +78 -1
  28. package/dist/graph-mapping.js.map +1 -1
  29. package/dist/index.d.ts +21 -3
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +11 -1
  32. package/dist/index.js.map +1 -1
  33. package/dist/lexers/c-family.d.ts +4 -0
  34. package/dist/lexers/c-family.d.ts.map +1 -0
  35. package/dist/lexers/c-family.js +221 -0
  36. package/dist/lexers/c-family.js.map +1 -0
  37. package/dist/lexers/chars.d.ts +7 -0
  38. package/dist/lexers/chars.d.ts.map +1 -0
  39. package/dist/lexers/chars.js +49 -0
  40. package/dist/lexers/chars.js.map +1 -0
  41. package/dist/lexers/index.d.ts +7 -0
  42. package/dist/lexers/index.d.ts.map +1 -0
  43. package/dist/lexers/index.js +5 -0
  44. package/dist/lexers/index.js.map +1 -0
  45. package/dist/lexers/python.d.ts +3 -0
  46. package/dist/lexers/python.d.ts.map +1 -0
  47. package/dist/lexers/python.js +101 -0
  48. package/dist/lexers/python.js.map +1 -0
  49. package/dist/quality/annotations.d.ts +14 -0
  50. package/dist/quality/annotations.d.ts.map +1 -0
  51. package/dist/quality/annotations.js +147 -0
  52. package/dist/quality/annotations.js.map +1 -0
  53. package/dist/quality/assertion-kinds.d.ts +18 -0
  54. package/dist/quality/assertion-kinds.d.ts.map +1 -0
  55. package/dist/quality/assertion-kinds.js +25 -0
  56. package/dist/quality/assertion-kinds.js.map +1 -0
  57. package/dist/quality/chains.d.ts +25 -0
  58. package/dist/quality/chains.d.ts.map +1 -0
  59. package/dist/quality/chains.js +129 -0
  60. package/dist/quality/chains.js.map +1 -0
  61. package/dist/quality/common.d.ts +31 -0
  62. package/dist/quality/common.d.ts.map +1 -0
  63. package/dist/quality/common.js +211 -0
  64. package/dist/quality/common.js.map +1 -0
  65. package/dist/quality/csharp-family.d.ts +9 -0
  66. package/dist/quality/csharp-family.d.ts.map +1 -0
  67. package/dist/quality/csharp-family.js +560 -0
  68. package/dist/quality/csharp-family.js.map +1 -0
  69. package/dist/quality/detect.d.ts +3 -0
  70. package/dist/quality/detect.d.ts.map +1 -0
  71. package/dist/quality/detect.js +348 -0
  72. package/dist/quality/detect.js.map +1 -0
  73. package/dist/quality/durations.d.ts +4 -0
  74. package/dist/quality/durations.d.ts.map +1 -0
  75. package/dist/quality/durations.js +177 -0
  76. package/dist/quality/durations.js.map +1 -0
  77. package/dist/quality/expressions.d.ts +7 -0
  78. package/dist/quality/expressions.d.ts.map +1 -0
  79. package/dist/quality/expressions.js +123 -0
  80. package/dist/quality/expressions.js.map +1 -0
  81. package/dist/quality/facts.d.ts +5 -0
  82. package/dist/quality/facts.d.ts.map +1 -0
  83. package/dist/quality/facts.js +183 -0
  84. package/dist/quality/facts.js.map +1 -0
  85. package/dist/quality/failure-of.d.ts +4 -0
  86. package/dist/quality/failure-of.d.ts.map +1 -0
  87. package/dist/quality/failure-of.js +233 -0
  88. package/dist/quality/failure-of.js.map +1 -0
  89. package/dist/quality/frameworks.d.ts +5 -0
  90. package/dist/quality/frameworks.d.ts.map +1 -0
  91. package/dist/quality/frameworks.js +20 -0
  92. package/dist/quality/frameworks.js.map +1 -0
  93. package/dist/quality/go-family.d.ts +6 -0
  94. package/dist/quality/go-family.d.ts.map +1 -0
  95. package/dist/quality/go-family.js +393 -0
  96. package/dist/quality/go-family.js.map +1 -0
  97. package/dist/quality/index.d.ts +10 -0
  98. package/dist/quality/index.d.ts.map +1 -0
  99. package/dist/quality/index.js +19 -0
  100. package/dist/quality/index.js.map +1 -0
  101. package/dist/quality/java-family.d.ts +12 -0
  102. package/dist/quality/java-family.d.ts.map +1 -0
  103. package/dist/quality/java-family.js +529 -0
  104. package/dist/quality/java-family.js.map +1 -0
  105. package/dist/quality/js-assertions.d.ts +11 -0
  106. package/dist/quality/js-assertions.d.ts.map +1 -0
  107. package/dist/quality/js-assertions.js +297 -0
  108. package/dist/quality/js-assertions.js.map +1 -0
  109. package/dist/quality/js-family.d.ts +3 -0
  110. package/dist/quality/js-family.d.ts.map +1 -0
  111. package/dist/quality/js-family.js +470 -0
  112. package/dist/quality/js-family.js.map +1 -0
  113. package/dist/quality/python-family.d.ts +6 -0
  114. package/dist/quality/python-family.d.ts.map +1 -0
  115. package/dist/quality/python-family.js +786 -0
  116. package/dist/quality/python-family.js.map +1 -0
  117. package/dist/quality/scope.d.ts +26 -0
  118. package/dist/quality/scope.d.ts.map +1 -0
  119. package/dist/quality/scope.js +33 -0
  120. package/dist/quality/scope.js.map +1 -0
  121. package/dist/quality/selectors.d.ts +14 -0
  122. package/dist/quality/selectors.d.ts.map +1 -0
  123. package/dist/quality/selectors.js +137 -0
  124. package/dist/quality/selectors.js.map +1 -0
  125. package/dist/quality/statuses.d.ts +7 -0
  126. package/dist/quality/statuses.d.ts.map +1 -0
  127. package/dist/quality/statuses.js +143 -0
  128. package/dist/quality/statuses.js.map +1 -0
  129. package/dist/quality/stream.d.ts +23 -0
  130. package/dist/quality/stream.d.ts.map +1 -0
  131. package/dist/quality/stream.js +194 -0
  132. package/dist/quality/stream.js.map +1 -0
  133. package/dist/quality/types.d.ts +88 -0
  134. package/dist/quality/types.d.ts.map +1 -0
  135. package/dist/quality/types.js +2 -0
  136. package/dist/quality/types.js.map +1 -0
  137. package/dist/run-timeout.d.ts +25 -0
  138. package/dist/run-timeout.d.ts.map +1 -0
  139. package/dist/run-timeout.js +52 -0
  140. package/dist/run-timeout.js.map +1 -0
  141. package/dist/runner-wrappers.d.ts +74 -0
  142. package/dist/runner-wrappers.d.ts.map +1 -0
  143. package/dist/runner-wrappers.js +604 -0
  144. package/dist/runner-wrappers.js.map +1 -0
  145. package/dist/swift-xctest.d.ts +15 -2
  146. package/dist/swift-xctest.d.ts.map +1 -1
  147. package/dist/swift-xctest.js +143 -20
  148. package/dist/swift-xctest.js.map +1 -1
  149. package/dist/test-runner-collector.d.ts +56 -6
  150. package/dist/test-runner-collector.d.ts.map +1 -1
  151. package/dist/test-runner-collector.js +265 -113
  152. package/dist/test-runner-collector.js.map +1 -1
  153. package/dist/testgen/csharp-facts.d.ts +3 -0
  154. package/dist/testgen/csharp-facts.d.ts.map +1 -0
  155. package/dist/testgen/csharp-facts.js +306 -0
  156. package/dist/testgen/csharp-facts.js.map +1 -0
  157. package/dist/testgen/csharp-profile.d.ts +14 -0
  158. package/dist/testgen/csharp-profile.d.ts.map +1 -0
  159. package/dist/testgen/csharp-profile.js +233 -0
  160. package/dist/testgen/csharp-profile.js.map +1 -0
  161. package/dist/testgen/declarations.d.ts +10 -0
  162. package/dist/testgen/declarations.d.ts.map +1 -0
  163. package/dist/testgen/declarations.js +110 -0
  164. package/dist/testgen/declarations.js.map +1 -0
  165. package/dist/testgen/facts-common.d.ts +33 -0
  166. package/dist/testgen/facts-common.d.ts.map +1 -0
  167. package/dist/testgen/facts-common.js +76 -0
  168. package/dist/testgen/facts-common.js.map +1 -0
  169. package/dist/testgen/failure.d.ts +4 -0
  170. package/dist/testgen/failure.d.ts.map +1 -0
  171. package/dist/testgen/failure.js +106 -0
  172. package/dist/testgen/failure.js.map +1 -0
  173. package/dist/testgen/frameworks.d.ts +6 -0
  174. package/dist/testgen/frameworks.d.ts.map +1 -0
  175. package/dist/testgen/frameworks.js +516 -0
  176. package/dist/testgen/frameworks.js.map +1 -0
  177. package/dist/testgen/go-facts.d.ts +11 -0
  178. package/dist/testgen/go-facts.d.ts.map +1 -0
  179. package/dist/testgen/go-facts.js +237 -0
  180. package/dist/testgen/go-facts.js.map +1 -0
  181. package/dist/testgen/go-profile.d.ts +6 -0
  182. package/dist/testgen/go-profile.d.ts.map +1 -0
  183. package/dist/testgen/go-profile.js +155 -0
  184. package/dist/testgen/go-profile.js.map +1 -0
  185. package/dist/testgen/index.d.ts +28 -0
  186. package/dist/testgen/index.d.ts.map +1 -0
  187. package/dist/testgen/index.js +21 -0
  188. package/dist/testgen/index.js.map +1 -0
  189. package/dist/testgen/java-build.d.ts +13 -0
  190. package/dist/testgen/java-build.d.ts.map +1 -0
  191. package/dist/testgen/java-build.js +250 -0
  192. package/dist/testgen/java-build.js.map +1 -0
  193. package/dist/testgen/java-facts.d.ts +3 -0
  194. package/dist/testgen/java-facts.d.ts.map +1 -0
  195. package/dist/testgen/java-facts.js +349 -0
  196. package/dist/testgen/java-facts.js.map +1 -0
  197. package/dist/testgen/java-profile.d.ts +13 -0
  198. package/dist/testgen/java-profile.d.ts.map +1 -0
  199. package/dist/testgen/java-profile.js +194 -0
  200. package/dist/testgen/java-profile.js.map +1 -0
  201. package/dist/testgen/languages.d.ts +11 -0
  202. package/dist/testgen/languages.d.ts.map +1 -0
  203. package/dist/testgen/languages.js +63 -0
  204. package/dist/testgen/languages.js.map +1 -0
  205. package/dist/testgen/lexer.d.ts +19 -0
  206. package/dist/testgen/lexer.d.ts.map +1 -0
  207. package/dist/testgen/lexer.js +257 -0
  208. package/dist/testgen/lexer.js.map +1 -0
  209. package/dist/testgen/mutant-core.d.ts +19 -0
  210. package/dist/testgen/mutant-core.d.ts.map +1 -0
  211. package/dist/testgen/mutant-core.js +39 -0
  212. package/dist/testgen/mutant-core.js.map +1 -0
  213. package/dist/testgen/mutants-lang.d.ts +6 -0
  214. package/dist/testgen/mutants-lang.d.ts.map +1 -0
  215. package/dist/testgen/mutants-lang.js +291 -0
  216. package/dist/testgen/mutants-lang.js.map +1 -0
  217. package/dist/testgen/mutants.d.ts +9 -0
  218. package/dist/testgen/mutants.d.ts.map +1 -0
  219. package/dist/testgen/mutants.js +148 -0
  220. package/dist/testgen/mutants.js.map +1 -0
  221. package/dist/testgen/paths.d.ts +32 -0
  222. package/dist/testgen/paths.d.ts.map +1 -0
  223. package/dist/testgen/paths.js +211 -0
  224. package/dist/testgen/paths.js.map +1 -0
  225. package/dist/testgen/process.d.ts +19 -0
  226. package/dist/testgen/process.d.ts.map +1 -0
  227. package/dist/testgen/process.js +89 -0
  228. package/dist/testgen/process.js.map +1 -0
  229. package/dist/testgen/profile-failure.d.ts +7 -0
  230. package/dist/testgen/profile-failure.d.ts.map +1 -0
  231. package/dist/testgen/profile-failure.js +29 -0
  232. package/dist/testgen/profile-failure.js.map +1 -0
  233. package/dist/testgen/python-facts.d.ts +11 -0
  234. package/dist/testgen/python-facts.d.ts.map +1 -0
  235. package/dist/testgen/python-facts.js +380 -0
  236. package/dist/testgen/python-facts.js.map +1 -0
  237. package/dist/testgen/python-profile.d.ts +4 -0
  238. package/dist/testgen/python-profile.d.ts.map +1 -0
  239. package/dist/testgen/python-profile.js +344 -0
  240. package/dist/testgen/python-profile.js.map +1 -0
  241. package/dist/testgen/source-facts.d.ts +30 -0
  242. package/dist/testgen/source-facts.d.ts.map +1 -0
  243. package/dist/testgen/source-facts.js +497 -0
  244. package/dist/testgen/source-facts.js.map +1 -0
  245. package/dist/testgen/stubs.d.ts +4 -0
  246. package/dist/testgen/stubs.d.ts.map +1 -0
  247. package/dist/testgen/stubs.js +66 -0
  248. package/dist/testgen/stubs.js.map +1 -0
  249. package/dist/testgen/toolchain.d.ts +23 -0
  250. package/dist/testgen/toolchain.d.ts.map +1 -0
  251. package/dist/testgen/toolchain.js +201 -0
  252. package/dist/testgen/toolchain.js.map +1 -0
  253. package/dist/testgen/types.d.ts +67 -0
  254. package/dist/testgen/types.d.ts.map +1 -0
  255. package/dist/testgen/types.js +2 -0
  256. package/dist/testgen/types.js.map +1 -0
  257. package/dist/v8-coverage.d.ts +21 -0
  258. package/dist/v8-coverage.d.ts.map +1 -0
  259. package/dist/v8-coverage.js +217 -0
  260. package/dist/v8-coverage.js.map +1 -0
  261. package/dist/vitest-reporter.d.ts +46 -13
  262. package/dist/vitest-reporter.d.ts.map +1 -1
  263. package/dist/vitest-reporter.js +119 -26
  264. package/dist/vitest-reporter.js.map +1 -1
  265. package/dist/vitest-version.d.ts +21 -0
  266. package/dist/vitest-version.d.ts.map +1 -0
  267. package/dist/vitest-version.js +98 -0
  268. package/dist/vitest-version.js.map +1 -0
  269. package/package.json +14 -8
  270. package/reporters/junit/classes/DescryJUnitListener.class +0 -0
  271. package/reporters/junit/classes/META-INF/services/org.junit.platform.launcher.TestExecutionListener +1 -0
  272. package/reporters/minitest/descry_minitest_reporter.rb +150 -0
  273. package/reporters/phpunit/DescryPhpUnitExtension.php +209 -0
  274. package/reporters/pytest/descry_pytest_plugin.py +397 -0
  275. package/reporters/rspec/descry_rspec_formatter.rb +175 -0
  276. package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.deps.json +203 -0
  277. package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.dll +0 -0
  278. package/reporters/xunit/bin/Release/netstandard2.0/Descry.TestLogger.pdb +0 -0
@@ -0,0 +1,497 @@
1
+ import { posix } from "node:path";
2
+ import { CSHARP_FACTS } from "./csharp-facts.js";
3
+ import { GO_FACTS } from "./go-facts.js";
4
+ import { JAVA_FACTS } from "./java-facts.js";
5
+ import { hintOf, languageFor, languageForFile, mergeHints } from "./languages.js";
6
+ import { tokenize } from "./lexer.js";
7
+ import { PYTHON_FACTS } from "./python-facts.js";
8
+ function kindsFor(names, kind, required) {
9
+ return names.map((name) => [name, { kind, required }]);
10
+ }
11
+ const MODULE_KINDS = new Map([
12
+ ...kindsFor(["axios", "node-fetch", "got", "undici", "ky", "superagent", "http", "https", "net", "dgram", "ws", "socket.io-client", "graphql-request", "@apollo/client", "needle", "request"], "network", true),
13
+ ...kindsFor([
14
+ "pg",
15
+ "postgres",
16
+ "mysql",
17
+ "mysql2",
18
+ "mysql2/promise",
19
+ "mongodb",
20
+ "mongoose",
21
+ "redis",
22
+ "ioredis",
23
+ "@prisma/client",
24
+ "knex",
25
+ "sequelize",
26
+ "typeorm",
27
+ "drizzle-orm",
28
+ "kysely",
29
+ "@supabase/supabase-js",
30
+ "firebase-admin",
31
+ "@aws-sdk/client-dynamodb",
32
+ "@aws-sdk/lib-dynamodb",
33
+ "cassandra-driver",
34
+ "oracledb",
35
+ "mssql",
36
+ "tedious",
37
+ "@neondatabase/serverless",
38
+ "@planetscale/database",
39
+ ], "database", true),
40
+ ...kindsFor(["sqlite", "sqlite3", "better-sqlite3", "@libsql/client"], "database", false),
41
+ ...kindsFor(["uuid", "nanoid", "crypto", "cuid", "@paralleldrive/cuid2", "ulid", "random-js", "seedrandom"], "randomness", true),
42
+ ...kindsFor(["fs", "fs/promises", "fs-extra", "graceful-fs", "glob", "fast-glob", "chokidar"], "filesystem", false),
43
+ ...kindsFor(["child_process", "execa", "cross-spawn", "worker_threads", "cluster"], "process", false),
44
+ ]);
45
+ const CRYPTO_DETERMINISTIC = new Set(["createHash", "createHmac", "timingSafeEqual", "pbkdf2Sync", "scryptSync", "hash"]);
46
+ const REASON_BY_KIND = {
47
+ time: "reads the clock or schedules timers",
48
+ randomness: "uses randomness",
49
+ network: "calls the network",
50
+ database: "talks to a database",
51
+ environment: "reads the process environment",
52
+ filesystem: "touches the filesystem",
53
+ process: "starts or controls processes",
54
+ };
55
+ const ADVICE_BY_KIND = {
56
+ time: "fake the timers or set the system time in the test",
57
+ randomness: "stub the random source, or mock the module that provides it",
58
+ network: "stub the call or mock the client module; the sandbox denies network access, so a real call fails",
59
+ database: "mock the database client or the module that wraps it; no database server is reachable from the sandbox",
60
+ environment: "set the variable in the test",
61
+ filesystem: "create the file the test needs in a temporary directory",
62
+ process: "mock the module that starts the process",
63
+ };
64
+ const OTHER_LANGUAGE_FACTS = {
65
+ python: PYTHON_FACTS,
66
+ java: JAVA_FACTS,
67
+ go: GO_FACTS,
68
+ csharp: CSHARP_FACTS,
69
+ };
70
+ export function bareModuleName(specifier, hint) {
71
+ const language = languageFor(hint);
72
+ if (language === null)
73
+ return specifier;
74
+ if (language !== "javascript")
75
+ return OTHER_LANGUAGE_FACTS[language].bareModuleName(specifier);
76
+ return javascriptBareModuleName(specifier);
77
+ }
78
+ function javascriptBareModuleName(specifier) {
79
+ const withoutProtocol = specifier.startsWith("node:") ? specifier.slice(5) : specifier;
80
+ if (MODULE_KINDS.has(withoutProtocol))
81
+ return withoutProtocol;
82
+ const parts = withoutProtocol.split("/");
83
+ return withoutProtocol.startsWith("@") ? parts.slice(0, 2).join("/") : parts[0];
84
+ }
85
+ function moduleKind(specifier) {
86
+ const withoutProtocol = specifier.startsWith("node:") ? specifier.slice(5) : specifier;
87
+ return MODULE_KINDS.get(withoutProtocol) ?? MODULE_KINDS.get(javascriptBareModuleName(specifier));
88
+ }
89
+ function code(source) {
90
+ return tokenize(source).filter((t) => t.kind !== "comment");
91
+ }
92
+ function unquote(token) {
93
+ if (token === undefined)
94
+ return null;
95
+ if (token.kind === "string")
96
+ return token.text.slice(1, -1);
97
+ if (token.kind === "template" && token.text.startsWith("`") && token.text.endsWith("`") && !token.text.includes("${"))
98
+ return token.text.slice(1, -1);
99
+ return null;
100
+ }
101
+ const MOCK_CALLEES = new Set(["mock", "doMock", "unstable_mockModule", "module"]);
102
+ const MOCK_OWNERS = new Set(["vi", "jest", "mock"]);
103
+ export function moduleReferences(source, hint) {
104
+ const language = languageFor(hint);
105
+ if (language === null)
106
+ return [];
107
+ if (language !== "javascript")
108
+ return OTHER_LANGUAGE_FACTS[language].moduleReferences(source);
109
+ return javascriptModuleReferences(source);
110
+ }
111
+ function javascriptModuleReferences(source) {
112
+ const tokens = code(source);
113
+ const references = [];
114
+ for (let i = 0; i < tokens.length; i += 1) {
115
+ const token = tokens[i];
116
+ const previous = tokens[i - 1];
117
+ const isStatementStart = previous === undefined || previous.text === ";" || previous.text === "}" || previous.text === "{" || previous.line < token.line;
118
+ if (token.kind === "identifier" && token.text === "import" && previous?.text !== ".") {
119
+ if (tokens[i + 1]?.text === "(") {
120
+ const specifier = unquote(tokens[i + 2]);
121
+ if (specifier !== null)
122
+ references.push({ specifier, line: token.line, form: "dynamic-import" });
123
+ continue;
124
+ }
125
+ if (!isStatementStart)
126
+ continue;
127
+ const direct = unquote(tokens[i + 1]);
128
+ if (direct !== null) {
129
+ references.push({ specifier: direct, line: token.line, form: "import" });
130
+ continue;
131
+ }
132
+ const from = findFrom(tokens, i + 1);
133
+ if (from !== null)
134
+ references.push({ specifier: from.specifier, line: token.line, form: "import" });
135
+ continue;
136
+ }
137
+ if (token.kind === "identifier" && token.text === "export" && isStatementStart) {
138
+ const from = findFrom(tokens, i + 1);
139
+ if (from !== null)
140
+ references.push({ specifier: from.specifier, line: token.line, form: "export-from" });
141
+ continue;
142
+ }
143
+ if (token.kind === "identifier" && token.text === "require" && tokens[i + 1]?.text === "(" && previous?.text !== ".") {
144
+ const specifier = unquote(tokens[i + 2]);
145
+ if (specifier !== null && tokens[i + 3]?.text === ")")
146
+ references.push({ specifier, line: token.line, form: "require" });
147
+ continue;
148
+ }
149
+ if (token.kind === "identifier" &&
150
+ MOCK_OWNERS.has(token.text) &&
151
+ tokens[i + 1]?.text === "." &&
152
+ MOCK_CALLEES.has(tokens[i + 2]?.text ?? "") &&
153
+ tokens[i + 3]?.text === "(") {
154
+ if (token.text === "mock" && tokens[i + 2]?.text !== "module")
155
+ continue;
156
+ const specifier = unquote(tokens[i + 4]);
157
+ if (specifier !== null)
158
+ references.push({ specifier, line: token.line, form: "mock" });
159
+ }
160
+ }
161
+ return references;
162
+ }
163
+ function findFrom(tokens, from) {
164
+ let inBraces = false;
165
+ for (let i = from; i < tokens.length; i += 1) {
166
+ const token = tokens[i];
167
+ if (token.text === "{" && !inBraces) {
168
+ inBraces = true;
169
+ continue;
170
+ }
171
+ if (token.text === "}" && inBraces) {
172
+ inBraces = false;
173
+ continue;
174
+ }
175
+ if (!inBraces && token.kind === "identifier" && token.text === "from") {
176
+ const specifier = unquote(tokens[i + 1]);
177
+ return specifier === null ? null : { specifier, index: i + 1 };
178
+ }
179
+ const clauseToken = token.kind === "identifier" || token.text === "," || token.text === "*" || (inBraces && token.kind === "string");
180
+ if (!clauseToken)
181
+ return null;
182
+ }
183
+ return null;
184
+ }
185
+ function bindings(tokens) {
186
+ const bound = new Map();
187
+ for (let i = 0; i < tokens.length; i += 1) {
188
+ const token = tokens[i];
189
+ if (token.kind === "identifier" && token.text === "import" && tokens[i + 1]?.text !== "(" && tokens[i - 1]?.text !== ".") {
190
+ const from = findFrom(tokens, i + 1);
191
+ if (from === null)
192
+ continue;
193
+ for (const name of importedNames(tokens.slice(i + 1, from.index - 1)))
194
+ bound.set(name, from.specifier);
195
+ continue;
196
+ }
197
+ if (token.kind === "identifier" && token.text === "require" && tokens[i + 1]?.text === "(") {
198
+ const specifier = unquote(tokens[i + 2]);
199
+ if (specifier === null)
200
+ continue;
201
+ for (const name of declaredBefore(tokens, i))
202
+ bound.set(name, specifier);
203
+ }
204
+ }
205
+ const depths = [];
206
+ let depth = 0;
207
+ for (const token of tokens) {
208
+ if (token.text === "}")
209
+ depth = Math.max(0, depth - 1);
210
+ depths.push(depth);
211
+ if (token.text === "{")
212
+ depth += 1;
213
+ }
214
+ for (let pass = 0; pass < 3; pass += 1) {
215
+ for (let i = 0; i < tokens.length; i += 1) {
216
+ const token = tokens[i];
217
+ const specifier = bound.get(token.text);
218
+ if (token.kind !== "identifier" || specifier === undefined || depths[i] !== 0)
219
+ continue;
220
+ let j = i - 1;
221
+ while (tokens[j]?.text === "new" || tokens[j]?.text === "await")
222
+ j -= 1;
223
+ const target = tokens[j - 1];
224
+ if (tokens[j]?.text === "=" && target?.kind === "identifier" && !bound.has(target.text))
225
+ bound.set(target.text, specifier);
226
+ }
227
+ }
228
+ return bound;
229
+ }
230
+ function importedNames(clause) {
231
+ const names = [];
232
+ for (let i = 0; i < clause.length; i += 1) {
233
+ const token = clause[i];
234
+ if (token.kind !== "identifier" || token.text === "type" || token.text === "typeof")
235
+ continue;
236
+ if (token.text === "as") {
237
+ const alias = clause[i + 1];
238
+ if (alias?.kind !== "identifier")
239
+ continue;
240
+ if (clause[i - 1]?.kind === "identifier" || clause[i - 1]?.kind === "string")
241
+ names.pop();
242
+ names.push(alias.text);
243
+ i += 1;
244
+ continue;
245
+ }
246
+ names.push(token.text);
247
+ }
248
+ return names;
249
+ }
250
+ function declaredBefore(tokens, requireIndex) {
251
+ if (tokens[requireIndex - 1]?.text !== "=")
252
+ return [];
253
+ const target = tokens[requireIndex - 2];
254
+ if (target?.kind === "identifier")
255
+ return [target.text];
256
+ if (target?.text !== "}")
257
+ return [];
258
+ const names = [];
259
+ for (let i = requireIndex - 3; i >= 0 && tokens[i].text !== "{"; i -= 1) {
260
+ const token = tokens[i];
261
+ if (token.kind !== "identifier")
262
+ continue;
263
+ if (tokens[i + 1]?.text === ":")
264
+ continue;
265
+ names.push(token.text);
266
+ }
267
+ return names;
268
+ }
269
+ export function hazardsIn(source, range, hint) {
270
+ const language = languageFor(mergeHints(hint, hintOf(range)));
271
+ if (language === null)
272
+ return [];
273
+ if (language !== "javascript")
274
+ return OTHER_LANGUAGE_FACTS[language].hazardsIn(source, range);
275
+ return javascriptHazards(source, range);
276
+ }
277
+ function javascriptHazards(source, range) {
278
+ const tokens = code(source);
279
+ const bound = bindings(tokens);
280
+ const hazards = [];
281
+ const seen = new Set();
282
+ const add = (hazard) => {
283
+ const key = `${hazard.kind}:${hazard.line}:${hazard.text}`;
284
+ if (seen.has(key))
285
+ return;
286
+ seen.add(key);
287
+ hazards.push(hazard);
288
+ };
289
+ for (let i = 0; i < tokens.length; i += 1) {
290
+ const token = tokens[i];
291
+ if (token.line < range.startLine || token.line > range.endLine || token.kind !== "identifier")
292
+ continue;
293
+ const previous = tokens[i - 1];
294
+ const onGlobalObject = previous?.text === "." && /^(globalThis|window|self|global)$/.test(tokens[i - 2]?.text ?? "");
295
+ if ((previous?.text === "." || previous?.text === "?.") && !onGlobalObject) {
296
+ if (token.text === "env" && previous.text === "." && tokens[i - 2]?.text === "meta" && tokens[i - 3]?.text === ".") {
297
+ add({ kind: "environment", line: token.line, text: "import.meta.env", module: null, required: false });
298
+ }
299
+ continue;
300
+ }
301
+ const member = tokens[i + 1]?.text === "." ? tokens[i + 2]?.text : undefined;
302
+ const called = tokens[i + 1]?.text === "(";
303
+ const global = (kind, text, required) => add({ kind, line: token.line, text, module: null, required });
304
+ if (token.text === "Date" && member === "now")
305
+ global("time", "Date.now", true);
306
+ else if (token.text === "Date" && previous?.text === "new" && tokens[i + 1]?.text === "(" && tokens[i + 2]?.text === ")")
307
+ global("time", "new Date()", true);
308
+ else if (token.text === "Date" && called && previous?.text !== "new")
309
+ global("time", "Date()", true);
310
+ else if (token.text === "performance" && member === "now")
311
+ global("time", "performance.now", true);
312
+ else if (token.text === "process" && member === "hrtime")
313
+ global("time", "process.hrtime", true);
314
+ else if ((token.text === "setTimeout" || token.text === "setInterval" || token.text === "setImmediate") && called)
315
+ global("time", token.text, true);
316
+ else if (token.text === "Math" && member === "random")
317
+ global("randomness", "Math.random", true);
318
+ else if (token.text === "crypto" && member !== undefined && !bound.has("crypto") && !CRYPTO_DETERMINISTIC.has(member) && /^(random|getRandom)/.test(member))
319
+ global("randomness", `crypto.${member}`, true);
320
+ else if ((token.text === "fetch" || token.text === "XMLHttpRequest" || token.text === "WebSocket" || token.text === "EventSource") && !bound.has(token.text))
321
+ global("network", token.text, true);
322
+ else if (token.text === "navigator" && member === "sendBeacon")
323
+ global("network", "navigator.sendBeacon", true);
324
+ else if (token.text === "process" && member === "env")
325
+ global("environment", "process.env", false);
326
+ else if ((token.text === "Deno" || token.text === "Bun") && member === "env")
327
+ global("environment", `${token.text}.env`, false);
328
+ else if (token.text === "process" && (member === "exit" || member === "argv" || member === "cwd" || member === "chdir"))
329
+ global("process", `process.${member}`, false);
330
+ const specifier = bound.get(token.text);
331
+ if (specifier === undefined)
332
+ continue;
333
+ const kind = moduleKind(specifier);
334
+ if (kind === undefined)
335
+ continue;
336
+ if (kind.kind === "randomness" && javascriptBareModuleName(specifier) === "crypto") {
337
+ const used = member ?? token.text;
338
+ if (CRYPTO_DETERMINISTIC.has(used) || !/^(random|getRandom)/.test(used))
339
+ continue;
340
+ }
341
+ add({
342
+ kind: kind.kind,
343
+ line: token.line,
344
+ text: member === undefined ? token.text : `${token.text}.${member}`,
345
+ module: javascriptBareModuleName(specifier),
346
+ required: kind.required,
347
+ });
348
+ }
349
+ return hazards.sort((a, b) => a.line - b.line || a.kind.localeCompare(b.kind));
350
+ }
351
+ const GLOBAL_STUBS = {
352
+ time: [
353
+ /\b(useFakeTimers|setSystemTime|advanceTimersByTime|runAllTimers|runOnlyPendingTimers)\s*\(/,
354
+ /\bmock\s*\.\s*timers\s*\.\s*(enable|setTime|tick)\s*\(/,
355
+ /\b(spyOn|method)\s*\(\s*(globalThis\s*\.\s*)?(Date|performance)\b/,
356
+ /\b(globalThis\s*\.\s*)?Date\s*\.\s*now\s*=/,
357
+ ],
358
+ randomness: [/\b(spyOn|method)\s*\(\s*(globalThis\s*\.\s*)?(Math|crypto)\b/, /\bMath\s*\.\s*random\s*=/],
359
+ network: [
360
+ /\bstubGlobal\s*\(\s*['"`](fetch|XMLHttpRequest|WebSocket|EventSource)['"`]/,
361
+ /\b(spyOn|method)\s*\(\s*(globalThis|global|window)\s*,\s*['"`](fetch|XMLHttpRequest|WebSocket)['"`]/,
362
+ /\b(globalThis|global|window)\s*\.\s*(fetch|XMLHttpRequest|WebSocket)\s*=/,
363
+ /\bsetupServer\s*\(/,
364
+ /\bnock\s*\(/,
365
+ ],
366
+ database: [],
367
+ environment: [/\bstubEnv\s*\(/, /\bprocess\s*\.\s*env\s*(\.\s*\w+|\[[^\]]+\])\s*=/, /\bdelete\s+process\s*\.\s*env\b/],
368
+ filesystem: [/\bmkdtemp(Sync)?\s*\(/, /\bmock-fs\b/, /\bmemfs\b/],
369
+ process: [],
370
+ };
371
+ const SOURCE_EXTENSION = /\.(ts|tsx|js|jsx|mjs|cjs|mts|cts)$/;
372
+ function fileKey(path) {
373
+ return posix.normalize(path).replace(SOURCE_EXTENSION, "").replace(/\/index$/, "");
374
+ }
375
+ function moduleKey(fromFile, specifier) {
376
+ if (specifier.startsWith("/"))
377
+ return fileKey(specifier);
378
+ if (specifier.startsWith("."))
379
+ return fileKey(posix.join(posix.dirname(fromFile), specifier));
380
+ return javascriptBareModuleName(specifier);
381
+ }
382
+ export function unstubbedHazards(hazards, testFile, testSource) {
383
+ const language = languageForFile(testFile) ?? "javascript";
384
+ if (language !== "javascript")
385
+ return unstubbedInOtherLanguage(OTHER_LANGUAGE_FACTS[language], hazards, testSource);
386
+ return unstubbedInJavascript(hazards, testFile, testSource);
387
+ }
388
+ function unstubbedInOtherLanguage(facts, hazards, testSource) {
389
+ const mocked = facts
390
+ .moduleReferences(testSource)
391
+ .filter((reference) => reference.form === "mock")
392
+ .map((reference) => reference.specifier);
393
+ const out = [];
394
+ for (const hazard of hazards) {
395
+ if (!hazard.required)
396
+ continue;
397
+ if (facts.stubbedByMock(hazard, mocked))
398
+ continue;
399
+ if (facts.stubPatterns[hazard.kind].some((pattern) => pattern.test(testSource)))
400
+ continue;
401
+ out.push({
402
+ hazard,
403
+ reason: `the code under test ${REASON_BY_KIND[hazard.kind]} (${hazard.text}${hazard.module === null ? "" : ` from ${hazard.module}`} at ` +
404
+ `${hazard.file}:${hazard.line}) and the test does not stub it — ${ADVICE_BY_KIND[hazard.kind]}`,
405
+ });
406
+ }
407
+ return out;
408
+ }
409
+ function unstubbedInJavascript(hazards, testFile, testSource) {
410
+ const mocked = new Set(javascriptModuleReferences(testSource)
411
+ .filter((r) => r.form === "mock")
412
+ .map((r) => moduleKey(testFile, r.specifier)));
413
+ const out = [];
414
+ for (const hazard of hazards) {
415
+ if (!hazard.required)
416
+ continue;
417
+ if (mocked.has(fileKey(hazard.file)))
418
+ continue;
419
+ if (hazard.module !== null) {
420
+ if (mocked.has(javascriptBareModuleName(hazard.module)))
421
+ continue;
422
+ const base = hazard.text.split(".")[0];
423
+ if (new RegExp(`\\b(spyOn|method)\\s*\\(\\s*${escapeRegExp(base)}\\b`).test(testSource))
424
+ continue;
425
+ }
426
+ else if (GLOBAL_STUBS[hazard.kind].some((pattern) => pattern.test(testSource))) {
427
+ continue;
428
+ }
429
+ out.push({
430
+ hazard,
431
+ reason: `the code under test ${REASON_BY_KIND[hazard.kind]} (${hazard.text}${hazard.module === null ? "" : ` from ${hazard.module}`} at ` +
432
+ `${hazard.file}:${hazard.line}) and the test does not stub it — ${ADVICE_BY_KIND[hazard.kind]}`,
433
+ });
434
+ }
435
+ return out;
436
+ }
437
+ export function adviceFor(kind) {
438
+ return ADVICE_BY_KIND[kind];
439
+ }
440
+ function escapeRegExp(text) {
441
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
442
+ }
443
+ const DECLARATION_START = new Set(["function", "class", "const", "let", "var", "async", "export", "interface", "type", "enum", "abstract", "declare"]);
444
+ export function isExported(source, name, startLine, hint) {
445
+ const language = languageFor(hint);
446
+ if (language === null)
447
+ return null;
448
+ if (language !== "javascript")
449
+ return OTHER_LANGUAGE_FACTS[language].isExported(source, name, startLine);
450
+ return javascriptIsExported(source, name, startLine);
451
+ }
452
+ function javascriptIsExported(source, name, startLine) {
453
+ const tokens = code(source);
454
+ const first = tokens.find((t) => t.line === startLine);
455
+ if (first === undefined)
456
+ return null;
457
+ if (first.text === "export")
458
+ return true;
459
+ if (first.text === "@") {
460
+ const declaration = tokens.find((t) => t.line > startLine && t.text !== "@" && t.kind === "identifier" && DECLARATION_START.has(t.text));
461
+ if (declaration?.text === "export")
462
+ return true;
463
+ }
464
+ else if (!DECLARATION_START.has(first.text)) {
465
+ return null;
466
+ }
467
+ for (let i = 0; i < tokens.length; i += 1) {
468
+ const token = tokens[i];
469
+ const next = tokens[i + 1];
470
+ if (token.text === "export" && next?.text === "{") {
471
+ for (let j = i + 2; j < tokens.length && tokens[j].text !== "}"; j += 1) {
472
+ if (tokens[j].text === name && tokens[j - 1]?.text !== "as")
473
+ return true;
474
+ }
475
+ }
476
+ if (token.text === "export" && next?.text === "default" && tokens[i + 2]?.text === name)
477
+ return true;
478
+ if (token.text === "export" && next?.text === "=" && tokens[i + 2]?.text === name)
479
+ return true;
480
+ if (token.text === "exports" && next?.text === "." && tokens[i + 2]?.text === name)
481
+ return true;
482
+ if (token.text === "module" && next?.text === "." && tokens[i + 2]?.text === "exports") {
483
+ if (tokens[i + 3]?.text === "=" && tokens[i + 4]?.text === name)
484
+ return true;
485
+ if (tokens[i + 3]?.text === "." && tokens[i + 4]?.text === name)
486
+ return true;
487
+ if (tokens[i + 3]?.text === "=" && tokens[i + 4]?.text === "{") {
488
+ for (let j = i + 5; j < tokens.length && tokens[j].text !== "}"; j += 1) {
489
+ if (tokens[j].text === name && tokens[j - 1]?.text !== ":")
490
+ return true;
491
+ }
492
+ }
493
+ }
494
+ }
495
+ return false;
496
+ }
497
+ //# sourceMappingURL=source-facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-facts.js","sourceRoot":"","sources":["../../src/testgen/source-facts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { HazardKind } from "./source-facts.ts";
2
+ import type { FrameworkName } from "./types.ts";
3
+ export declare const STUBS: Readonly<Record<FrameworkName, Readonly<Record<HazardKind, string>>>>;
4
+ //# sourceMappingURL=stubs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stubs.d.ts","sourceRoot":"","sources":["../../src/testgen/stubs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,eAAO,MAAM,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,CAgEvF,CAAC"}
@@ -0,0 +1,66 @@
1
+ export const STUBS = {
2
+ "node:test": {
3
+ time: "mock.timers.enable({ apis: ['Date', 'setTimeout', 'setInterval'] }) from node:test, then mock.timers.setTime(…)",
4
+ randomness: "mock.method(Math, 'random', () => 0.25), or mock.module('<module>', …) for a randomness module",
5
+ network: "mock.method(globalThis, 'fetch', async () => …), or mock.module('<client module>', …)",
6
+ database: "mock.module('<database client or the module wrapping it>', …)",
7
+ environment: "set process.env.NAME in the test and restore it afterwards",
8
+ filesystem: "write the file the test reads into a directory from mkdtemp(join(tmpdir(), …))",
9
+ process: "mock.module('<module that starts the process>', …)",
10
+ },
11
+ vitest: {
12
+ time: "vi.useFakeTimers() and vi.setSystemTime(…)",
13
+ randomness: "vi.spyOn(Math, 'random').mockReturnValue(0.25), or vi.mock('<module>')",
14
+ network: "vi.stubGlobal('fetch', vi.fn(…)), or vi.mock('<client module>')",
15
+ database: "vi.mock('<database client or the module wrapping it>')",
16
+ environment: "vi.stubEnv('NAME', 'value')",
17
+ filesystem: "write the file the test reads into a directory from mkdtemp(join(tmpdir(), …))",
18
+ process: "vi.mock('<module that starts the process>')",
19
+ },
20
+ jest: {
21
+ time: "jest.useFakeTimers() and jest.setSystemTime(…)",
22
+ randomness: "jest.spyOn(Math, 'random').mockReturnValue(0.25), or jest.mock('<module>')",
23
+ network: "jest.spyOn(global, 'fetch').mockResolvedValue(…), or jest.mock('<client module>')",
24
+ database: "jest.mock('<database client or the module wrapping it>')",
25
+ environment: "set process.env.NAME in the test and restore it afterwards",
26
+ filesystem: "write the file the test reads into a directory from mkdtemp(join(tmpdir(), …))",
27
+ process: "jest.mock('<module that starts the process>')",
28
+ },
29
+ pytest: {
30
+ time: "freezegun's freeze_time('2024-01-01') or time-machine, or monkeypatch.setattr('<module>.time', …) / mock.patch('<module>.datetime')",
31
+ randomness: "random.seed(0) in the test, monkeypatch.setattr('<module>.uuid.uuid4', lambda: …), or mock.patch('<module>.random')",
32
+ network: "the responses library (@responses.activate), requests-mock, respx or pytest-httpx for the client in use, or monkeypatch.setattr('<module>.requests.get', …)",
33
+ database: "mock.patch('<module>.<client or session factory>'), or point the code at a sqlite3 ':memory:' database through a fixture",
34
+ environment: "monkeypatch.setenv('NAME', 'value') and monkeypatch.delenv('NAME', raising=False)",
35
+ filesystem: "write the file the test reads under the tmp_path fixture and pass that path in",
36
+ process: "monkeypatch.setattr('<module>.subprocess.run', …) or mock.patch('<module>.subprocess')",
37
+ },
38
+ junit: {
39
+ time: "inject a java.time.Clock and use Clock.fixed(Instant.parse(…), ZoneOffset.UTC), or Mockito.mockStatic(Instant.class) in a try-with-resources",
40
+ randomness: "inject a seeded java.util.Random (new Random(42)) or a Supplier<UUID>, or Mockito.mockStatic(UUID.class)",
41
+ network: "Mockito.mock the HttpClient / RestTemplate / WebClient the code is given, or run WireMock / MockWebServer and pass its URL in",
42
+ database: "Mockito.mock the DataSource, JdbcTemplate or EntityManager the code is given, or use an in-memory H2 database wired through the constructor",
43
+ environment: "wrap System.getenv behind an injected Function<String, String> and pass a map-backed lookup, or read the value from a parameter",
44
+ filesystem: "write the file the test reads under a @TempDir Path and pass that path in",
45
+ process: "Mockito.mock the collaborator that starts the process, or pass a stubbed ProcessBuilder factory in",
46
+ },
47
+ go: {
48
+ time: "give the code a clock: a `now func() time.Time` field or package variable the test sets, or run the test inside testing/synctest",
49
+ randomness: "inject a *rand.Rand built from rand.New(rand.NewSource(42)) or an `idGenerator` func the test replaces",
50
+ network: "pass an *http.Client with a custom RoundTripper, or start httptest.NewServer and hand its URL to the code",
51
+ database: "depend on an interface the test fakes, or use go-sqlmock (sqlmock.New()) behind the *sql.DB the code is given",
52
+ environment: "t.Setenv(\"NAME\", \"value\") in the test; it restores the old value itself",
53
+ filesystem: "write the file the test reads under t.TempDir() and pass that path in",
54
+ process: "hide the exec.Command call behind a function variable the test replaces, or use the TestHelperProcess re-exec pattern",
55
+ },
56
+ xunit: {
57
+ time: "inject TimeProvider (new FakeTimeProvider(...)) or an ISystemClock / IClock stub instead of reading DateTime.Now",
58
+ randomness: "inject a seeded new Random(42) or an IGuidGenerator stub; do not call Guid.NewGuid() in the code under test",
59
+ network: "give HttpClient a stub HttpMessageHandler (a Mock<HttpMessageHandler> from Moq, or a hand-written DelegatingHandler)",
60
+ database: "mock the repository or IDbConnection with Moq / NSubstitute, or use the EF Core InMemory or SQLite in-memory provider through the DbContextOptions",
61
+ environment: "pass the setting in through IConfiguration / IOptions, or set Environment.SetEnvironmentVariable in the test and restore it in Dispose",
62
+ filesystem: "write the file the test reads under Path.GetTempPath() / Path.GetRandomFileName(), or inject an IFileSystem (System.IO.Abstractions)",
63
+ process: "hide Process.Start behind an interface the test substitutes with Moq or NSubstitute",
64
+ },
65
+ };
66
+ //# sourceMappingURL=stubs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stubs.js","sourceRoot":"","sources":["../../src/testgen/stubs.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,KAAK,GAA0E;IAC1F,WAAW,EAAE;QACX,IAAI,EAAE,iHAAiH;QACvH,UAAU,EAAE,gGAAgG;QAC5G,OAAO,EAAE,uFAAuF;QAChG,QAAQ,EAAE,+DAA+D;QACzE,WAAW,EAAE,4DAA4D;QACzE,UAAU,EAAE,gFAAgF;QAC5F,OAAO,EAAE,oDAAoD;KAC9D;IACD,MAAM,EAAE;QACN,IAAI,EAAE,4CAA4C;QAClD,UAAU,EAAE,wEAAwE;QACpF,OAAO,EAAE,iEAAiE;QAC1E,QAAQ,EAAE,wDAAwD;QAClE,WAAW,EAAE,6BAA6B;QAC1C,UAAU,EAAE,gFAAgF;QAC5F,OAAO,EAAE,6CAA6C;KACvD;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,gDAAgD;QACtD,UAAU,EAAE,4EAA4E;QACxF,OAAO,EAAE,mFAAmF;QAC5F,QAAQ,EAAE,0DAA0D;QACpE,WAAW,EAAE,4DAA4D;QACzE,UAAU,EAAE,gFAAgF;QAC5F,OAAO,EAAE,+CAA+C;KACzD;IACD,MAAM,EAAE;QACN,IAAI,EAAE,qIAAqI;QAC3I,UAAU,EAAE,qHAAqH;QACjI,OAAO,EAAE,6JAA6J;QACtK,QAAQ,EAAE,0HAA0H;QACpI,WAAW,EAAE,mFAAmF;QAChG,UAAU,EAAE,gFAAgF;QAC5F,OAAO,EAAE,wFAAwF;KAClG;IACD,KAAK,EAAE;QACL,IAAI,EAAE,8IAA8I;QACpJ,UAAU,EAAE,0GAA0G;QACtH,OAAO,EAAE,+HAA+H;QACxI,QAAQ,EAAE,6IAA6I;QACvJ,WAAW,EAAE,iIAAiI;QAC9I,UAAU,EAAE,2EAA2E;QACvF,OAAO,EAAE,oGAAoG;KAC9G;IACD,EAAE,EAAE;QACF,IAAI,EAAE,kIAAkI;QACxI,UAAU,EAAE,wGAAwG;QACpH,OAAO,EAAE,2GAA2G;QACpH,QAAQ,EAAE,+GAA+G;QACzH,WAAW,EAAE,6EAA6E;QAC1F,UAAU,EAAE,uEAAuE;QACnF,OAAO,EAAE,uHAAuH;KACjI;IACD,KAAK,EAAE;QACL,IAAI,EAAE,kHAAkH;QACxH,UAAU,EAAE,6GAA6G;QACzH,OAAO,EAAE,sHAAsH;QAC/H,QAAQ,EAAE,oJAAoJ;QAC9J,WAAW,EAAE,wIAAwI;QACrJ,UAAU,EAAE,sIAAsI;QAClJ,OAAO,EAAE,qFAAqF;KAC/F;CACF,CAAC"}
@@ -0,0 +1,23 @@
1
+ export type Tool = "python" | "java" | "javac" | "go" | "dotnet";
2
+ export interface PytestProbeOptions {
3
+ readonly insideRepository?: boolean;
4
+ }
5
+ export interface Toolchain {
6
+ locate(tool: Tool): string | null;
7
+ pytestImportable(interpreter: string, signal?: AbortSignal, options?: PytestProbeOptions): Promise<boolean>;
8
+ junitLauncher(): string | null;
9
+ }
10
+ export declare function pytestInstalledInVirtualEnvironment(interpreter: string): boolean;
11
+ export declare const hostToolchain: Toolchain;
12
+ export declare function rootsInHome(candidates: readonly (string | null | undefined)[], home?: string | undefined): string[];
13
+ export declare function installationOf(executable: string | null, levelsUp: number): string | null;
14
+ export type GoEnvironmentLoad = {
15
+ readonly ok: true;
16
+ readonly values: Readonly<Record<string, string>>;
17
+ } | {
18
+ readonly ok: false;
19
+ readonly reason: string;
20
+ };
21
+ export declare function loadGoEnvironment(go: string, signal?: AbortSignal): Promise<GoEnvironmentLoad>;
22
+ export declare function goRootsFor(go: string): string[];
23
+ //# sourceMappingURL=toolchain.d.ts.map