@descryy/runtime-test-runner 0.4.11 → 0.4.13

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,18 @@
1
+ export type BoundedFileRead = {
2
+ readonly ok: true;
3
+ readonly text: string;
4
+ } | {
5
+ readonly ok: false;
6
+ readonly reason: "missing" | "not-a-regular-file" | "too-large" | "unreadable";
7
+ readonly detail: string;
8
+ };
9
+ export declare function readBoundedRegularFile(path: string, maxBytes: number): BoundedFileRead;
10
+ export declare const MAX_COVERAGE_DUMP_FILES = 2000;
11
+ export declare const MAX_COVERAGE_DUMP_BYTES: number;
12
+ export declare const MAX_COVERAGE_TOTAL_BYTES: number;
13
+ export interface CoverageDumpSkips {
14
+ readonly skipped: readonly string[];
15
+ }
16
+ export declare function forEachCoverageDump(directory: string, names: readonly string[], visit: (name: string, text: string) => void): CoverageDumpSkips;
17
+ export declare function describeSkippedDumps(skipped: readonly string[]): string | null;
18
+ //# sourceMappingURL=bounded-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-file.d.ts","sourceRoot":"","sources":["../src/bounded-file.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GACvB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,oBAAoB,GAAG,WAAW,GAAG,YAAY,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAQpI,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CA2BtF;AAED,eAAO,MAAM,uBAAuB,OAAQ,CAAC;AAC7C,eAAO,MAAM,uBAAuB,QAAmB,CAAC;AACxD,eAAO,MAAM,wBAAwB,QAAoB,CAAC;AAE1D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,iBAAiB,CAuB/I;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CAI9E"}
@@ -0,0 +1,77 @@
1
+ import { closeSync, constants, fstatSync, openSync, readSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ const OPEN_FLAGS = constants.O_RDONLY | (constants.O_NONBLOCK ?? 0);
4
+ function errnoCode(error) {
5
+ return typeof error === "object" && error !== null ? error.code : undefined;
6
+ }
7
+ export function readBoundedRegularFile(path, maxBytes) {
8
+ let descriptor;
9
+ try {
10
+ descriptor = openSync(path, OPEN_FLAGS);
11
+ }
12
+ catch (error) {
13
+ const code = errnoCode(error);
14
+ if (code === "ENOENT" || code === "ENOTDIR")
15
+ return { ok: false, reason: "missing", detail: `${path} does not exist` };
16
+ return { ok: false, reason: "unreadable", detail: `${path} could not be opened (${code ?? String(error)})` };
17
+ }
18
+ try {
19
+ const stats = fstatSync(descriptor);
20
+ if (!stats.isFile())
21
+ return { ok: false, reason: "not-a-regular-file", detail: `${path} is not a regular file` };
22
+ if (stats.size > maxBytes)
23
+ return { ok: false, reason: "too-large", detail: `${path} is ${String(stats.size)} bytes, over the ${String(maxBytes)} byte limit` };
24
+ const buffer = Buffer.allocUnsafe(Math.min(stats.size, maxBytes) + 1);
25
+ let filled = 0;
26
+ while (filled < buffer.length) {
27
+ const read = readSync(descriptor, buffer, filled, buffer.length - filled, null);
28
+ if (read === 0)
29
+ break;
30
+ filled += read;
31
+ }
32
+ if (filled > maxBytes)
33
+ return { ok: false, reason: "too-large", detail: `${path} grew past the ${String(maxBytes)} byte limit while being read` };
34
+ return { ok: true, text: buffer.subarray(0, filled).toString("utf8") };
35
+ }
36
+ catch (error) {
37
+ return { ok: false, reason: "unreadable", detail: `${path} could not be read (${errnoCode(error) ?? String(error)})` };
38
+ }
39
+ finally {
40
+ closeSync(descriptor);
41
+ }
42
+ }
43
+ export const MAX_COVERAGE_DUMP_FILES = 2_000;
44
+ export const MAX_COVERAGE_DUMP_BYTES = 64 * 1024 * 1024;
45
+ export const MAX_COVERAGE_TOTAL_BYTES = 512 * 1024 * 1024;
46
+ export function forEachCoverageDump(directory, names, visit) {
47
+ const skipped = [];
48
+ const considered = names.slice(0, MAX_COVERAGE_DUMP_FILES);
49
+ if (names.length > considered.length) {
50
+ skipped.push(`${String(names.length - considered.length)} coverage file(s) beyond the first ${String(MAX_COVERAGE_DUMP_FILES)} were not read`);
51
+ }
52
+ let totalBytes = 0;
53
+ let overBudget = 0;
54
+ for (const name of considered) {
55
+ if (totalBytes >= MAX_COVERAGE_TOTAL_BYTES) {
56
+ overBudget += 1;
57
+ continue;
58
+ }
59
+ const read = readBoundedRegularFile(join(directory, name), MAX_COVERAGE_DUMP_BYTES);
60
+ if (!read.ok) {
61
+ skipped.push(read.detail);
62
+ continue;
63
+ }
64
+ totalBytes += read.text.length;
65
+ visit(name, read.text);
66
+ }
67
+ if (overBudget > 0)
68
+ skipped.push(`${String(overBudget)} coverage file(s) were not read because the ${String(MAX_COVERAGE_TOTAL_BYTES)} byte total budget was used up`);
69
+ return { skipped };
70
+ }
71
+ export function describeSkippedDumps(skipped) {
72
+ if (skipped.length === 0)
73
+ return null;
74
+ const shown = skipped.slice(0, 3).join("; ");
75
+ return `${String(skipped.length)} coverage file problem(s) were skipped and their data is missing from this result: ${shown}${skipped.length > 3 ? "; ..." : ""}`;
76
+ }
77
+ //# sourceMappingURL=bounded-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-file.js","sourceRoot":"","sources":["../src/bounded-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface ChildEnvironmentOptions {
2
+ readonly source?: NodeJS.ProcessEnv;
3
+ readonly inheritHostEnvironment?: boolean;
4
+ readonly passthroughNames?: readonly string[];
5
+ }
6
+ export interface ChildEnvironment {
7
+ readonly env: Readonly<Record<string, string | undefined>>;
8
+ readonly droppedNames: readonly string[];
9
+ readonly disclosure: string | null;
10
+ }
11
+ export declare function buildChildEnvironment(options?: ChildEnvironmentOptions): ChildEnvironment;
12
+ //# sourceMappingURL=child-environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-environment.d.ts","sourceRoot":"","sources":["../src/child-environment.ts"],"names":[],"mappings":"AAkFA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACpC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AASD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,uBAA4B,GAAG,gBAAgB,CAmC7F"}
@@ -0,0 +1,124 @@
1
+ const ALLOWED_NAMES = new Set([
2
+ "PATH",
3
+ "HOME",
4
+ "USER",
5
+ "LOGNAME",
6
+ "SHELL",
7
+ "LANG",
8
+ "LANGUAGE",
9
+ "TZ",
10
+ "TERM",
11
+ "COLORTERM",
12
+ "NO_COLOR",
13
+ "FORCE_COLOR",
14
+ "CI",
15
+ "TMPDIR",
16
+ "TEMP",
17
+ "TMP",
18
+ "SYSTEMROOT",
19
+ "SYSTEMDRIVE",
20
+ "WINDIR",
21
+ "COMSPEC",
22
+ "PATHEXT",
23
+ "USERPROFILE",
24
+ "APPDATA",
25
+ "LOCALAPPDATA",
26
+ "PROGRAMFILES",
27
+ "PROGRAMFILES(X86)",
28
+ "PROGRAMDATA",
29
+ "XDG_CACHE_HOME",
30
+ "XDG_CONFIG_HOME",
31
+ "XDG_DATA_HOME",
32
+ "XDG_RUNTIME_DIR",
33
+ "NODE_PATH",
34
+ "NODE_OPTIONS",
35
+ "NODE_ENV",
36
+ "NODE_EXTRA_CA_CERTS",
37
+ "COREPACK_HOME",
38
+ "PNPM_HOME",
39
+ "PYTHONPATH",
40
+ "PYTHONHOME",
41
+ "PYTHONUTF8",
42
+ "PYTHONIOENCODING",
43
+ "VIRTUAL_ENV",
44
+ "UV_PROJECT_ENVIRONMENT",
45
+ "POETRY_HOME",
46
+ "JAVA_HOME",
47
+ "MAVEN_HOME",
48
+ "M2_HOME",
49
+ "MAVEN_REPO_LOCAL",
50
+ "GRADLE_USER_HOME",
51
+ "GOROOT",
52
+ "GOPATH",
53
+ "GOCACHE",
54
+ "GOMODCACHE",
55
+ "GOENV",
56
+ "GOFLAGS",
57
+ "GOPROXY",
58
+ "GOSUMDB",
59
+ "GOTOOLCHAIN",
60
+ "CGO_ENABLED",
61
+ "DOTNET_ROOT",
62
+ "DOTNET_CLI_HOME",
63
+ "NUGET_PACKAGES",
64
+ "CARGO_HOME",
65
+ "RUSTUP_HOME",
66
+ "RUSTUP_TOOLCHAIN",
67
+ "GEM_HOME",
68
+ "GEM_PATH",
69
+ "BUNDLE_PATH",
70
+ "COMPOSER_HOME",
71
+ "PHPRC",
72
+ "DEVELOPER_DIR",
73
+ "SDKROOT",
74
+ "DESCRY_JUNIT_CONSOLE_JAR",
75
+ ]);
76
+ const ALLOWED_PREFIXES = ["LC_", "XDG_", "PYTHON", "PYTEST_", "DOTNET_", "JAVA_", "GRADLE_", "MAVEN_", "CARGO_", "RUSTUP_", "PNPM_", "PYENV_", "CONDA_", "NVM_", "VOLTA_", "FNM_", "ASDF_", "MISE_", "RBENV_", "SDKMAN_"];
77
+ const CREDENTIAL_LOOKING_NAME = /(KEY|TOKEN|SECRET|PASSWORD|PASSWD|CREDENTIAL|AUTH)/i;
78
+ const LISTED_DROPPED_NAMES = 20;
79
+ function isAllowedName(name, passthrough) {
80
+ const upper = name.toUpperCase();
81
+ if (passthrough.has(upper))
82
+ return true;
83
+ if (CREDENTIAL_LOOKING_NAME.test(name))
84
+ return false;
85
+ return ALLOWED_NAMES.has(upper) || ALLOWED_PREFIXES.some((prefix) => upper.startsWith(prefix));
86
+ }
87
+ export function buildChildEnvironment(options = {}) {
88
+ const source = options.source ?? process.env;
89
+ if (options.inheritHostEnvironment === true) {
90
+ const credentialLooking = Object.keys(source).filter((name) => source[name] !== undefined && CREDENTIAL_LOOKING_NAME.test(name)).length;
91
+ return {
92
+ env: {},
93
+ droppedNames: [],
94
+ disclosure: "the host process environment was passed to the test process whole, at the caller's explicit request" +
95
+ (credentialLooking > 0 ? `, including ${String(credentialLooking)} variable${credentialLooking === 1 ? "" : "s"} whose names look like credentials` : "") +
96
+ "; code under test can read all of it.",
97
+ };
98
+ }
99
+ const passthrough = new Set((options.passthroughNames ?? []).map((name) => name.toUpperCase()));
100
+ const env = {};
101
+ const dropped = [];
102
+ for (const [name, value] of Object.entries(source)) {
103
+ if (value === undefined)
104
+ continue;
105
+ if (isAllowedName(name, passthrough))
106
+ env[name] = value;
107
+ else {
108
+ env[name] = undefined;
109
+ dropped.push(name);
110
+ }
111
+ }
112
+ dropped.sort();
113
+ if (dropped.length === 0)
114
+ return { env, droppedNames: dropped, disclosure: null };
115
+ const listed = dropped.slice(0, LISTED_DROPPED_NAMES).join(", ");
116
+ const rest = dropped.length > LISTED_DROPPED_NAMES ? ` and ${String(dropped.length - LISTED_DROPPED_NAMES)} more` : "";
117
+ return {
118
+ env,
119
+ droppedNames: dropped,
120
+ disclosure: `the test process received an allowlisted subset of Descry's environment; ${String(dropped.length)} inherited variable${dropped.length === 1 ? " was" : "s were"} ` +
121
+ `not passed (${listed}${rest}). Variables the command or profile sets itself are unaffected.`,
122
+ };
123
+ }
124
+ //# sourceMappingURL=child-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-environment.js","sourceRoot":"","sources":["../src/child-environment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type ExecutedCoverage } from "./executed-coverage.ts";
2
+ import type { RunnerKind } from "./test-runner-collector.ts";
3
+ export declare const PYTHON_COVERAGE_DIRECTORY_VARIABLE = "DESCRY_COVERAGE_DIR";
4
+ export declare const PYTHON_COVERAGE_ROOT_VARIABLE = "DESCRY_COVERAGE_ROOT";
5
+ export declare const V8_COVERAGE_VARIABLE = "NODE_V8_COVERAGE";
6
+ export interface CoverageCapture {
7
+ readonly directory: string;
8
+ readonly environment: Readonly<Record<string, string>>;
9
+ observeTestFile(rawPath: string): void;
10
+ collect(): ExecutedCoverage;
11
+ dispose(): void;
12
+ }
13
+ export type CoverageCaptureBegin = {
14
+ readonly ok: true;
15
+ readonly capture: CoverageCapture;
16
+ } | {
17
+ readonly ok: false;
18
+ readonly reason: string;
19
+ };
20
+ export declare function coverageUnavailableReason(kind: RunnerKind): string | null;
21
+ export declare function readPythonCoverageDirectory(directory: string, excludedPaths?: ReadonlySet<string>): ExecutedCoverage;
22
+ export declare function beginCoverageCapture(kind: RunnerKind, cwd: string): CoverageCaptureBegin;
23
+ //# sourceMappingURL=coverage-capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-capture.d.ts","sourceRoot":"","sources":["../src/coverage-capture.ts"],"names":[],"mappings":"AAKA,OAAO,EASL,KAAK,gBAAgB,EAEtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAG7D,eAAO,MAAM,kCAAkC,wBAAwB,CAAC;AACxE,eAAO,MAAM,6BAA6B,yBAAyB,CAAC;AACpE,eAAO,MAAM,oBAAoB,qBAAqB,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,OAAO,IAAI,gBAAgB,CAAC;IAC5B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAcpD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAEzE;AAyBD,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,GAAE,WAAW,CAAC,MAAM,CAAa,GAAG,gBAAgB,CAmD/H;AAsBD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAsCxF"}
@@ -0,0 +1,165 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import { isAbsolute, resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { describeSkippedDumps, forEachCoverageDump } from "./bounded-file.js";
5
+ import { CoverageAccumulator, NoteLog, createCoverageTempDirectory, isRepositoryRelativePosixPath, removeCoverageTempDirectory, repositoryRelativePath, resolveRepositoryRoot, unavailableCoverage, } from "./executed-coverage.js";
6
+ import { readV8CoverageDirectory } from "./v8-coverage.js";
7
+ export const PYTHON_COVERAGE_DIRECTORY_VARIABLE = "DESCRY_COVERAGE_DIR";
8
+ export const PYTHON_COVERAGE_ROOT_VARIABLE = "DESCRY_COVERAGE_ROOT";
9
+ export const V8_COVERAGE_VARIABLE = "NODE_V8_COVERAGE";
10
+ const UNAVAILABLE_REASONS = {
11
+ jest: "jest: coverage needs the framework's own coverage provider; not collected",
12
+ vitest: "vitest: coverage needs the framework's own coverage provider; not collected",
13
+ playwright: "playwright: coverage needs the framework's own coverage provider; not collected",
14
+ junit: "junit: executed lines on the JVM need a coverage agent such as JaCoCo attached to the test JVM, which is not a dependency-free hook; not collected",
15
+ xunit: "xunit: executed lines on .NET need a coverage collector package such as coverlet referenced by the test project, which is not a dependency-free hook; not collected",
16
+ rspec: "rspec: executed lines need Ruby's Coverage module started before the code under test loads or SimpleCov in the project, neither of which is a dependency-free hook; not collected",
17
+ phpunit: "phpunit: executed lines need Xdebug or PCOV loaded into PHP, which is not a dependency-free hook; not collected",
18
+ minitest: "minitest: executed lines need Ruby's Coverage module started before the code under test loads or SimpleCov in the project, neither of which is a dependency-free hook; not collected",
19
+ unittest: "unittest: plain `python -m unittest` has no plugin mechanism to load a line recorder into the run (only pytest's plugin is injected); not collected",
20
+ };
21
+ export function coverageUnavailableReason(kind) {
22
+ return UNAVAILABLE_REASONS[kind] ?? null;
23
+ }
24
+ function isRecord(value) {
25
+ return typeof value === "object" && value !== null && !Array.isArray(value);
26
+ }
27
+ function parsePythonRecording(parsed) {
28
+ if (!isRecord(parsed))
29
+ return null;
30
+ if (typeof parsed["unavailable"] === "string")
31
+ return { unavailable: parsed["unavailable"] };
32
+ const tool = parsed["tool"];
33
+ if ((tool !== "monitoring" && tool !== "settrace") || !isRecord(parsed["files"]))
34
+ return null;
35
+ const files = {};
36
+ for (const [path, lines] of Object.entries(parsed["files"])) {
37
+ if (Array.isArray(lines))
38
+ files[path] = lines.filter((line) => typeof line === "number");
39
+ }
40
+ const notes = Array.isArray(parsed["notes"]) ? parsed["notes"].filter((note) => typeof note === "string") : [];
41
+ return { tool, notes, files };
42
+ }
43
+ export function readPythonCoverageDirectory(directory, excludedPaths = new Set()) {
44
+ if (!existsSync(directory))
45
+ return unavailableCoverage("the Python coverage directory does not exist");
46
+ const dumps = readdirSync(directory)
47
+ .filter((name) => /^coverage-.*\.json$/.test(name))
48
+ .sort();
49
+ if (dumps.length === 0) {
50
+ return unavailableCoverage("the pytest plugin wrote no coverage: the run ended before pytest finished, or the plugin could not record");
51
+ }
52
+ const accumulator = new CoverageAccumulator();
53
+ const notes = new NoteLog();
54
+ const tools = new Set();
55
+ const unavailableReasons = new Set();
56
+ let malformed = 0;
57
+ const { skipped: skippedDumps } = forEachCoverageDump(directory, dumps, (_name, text) => {
58
+ let parsed;
59
+ try {
60
+ parsed = JSON.parse(text);
61
+ }
62
+ catch {
63
+ malformed += 1;
64
+ return;
65
+ }
66
+ const recording = parsePythonRecording(parsed);
67
+ if (recording === null) {
68
+ malformed += 1;
69
+ return;
70
+ }
71
+ if ("unavailable" in recording) {
72
+ unavailableReasons.add(recording.unavailable);
73
+ return;
74
+ }
75
+ tools.add(recording.tool);
76
+ for (const note of recording.notes)
77
+ notes.add(note);
78
+ for (const [path, lines] of Object.entries(recording.files)) {
79
+ if (!isRepositoryRelativePosixPath(path) || excludedPaths.has(path))
80
+ continue;
81
+ accumulator.addFile(path, lines, null);
82
+ }
83
+ });
84
+ const skippedDumpNote = describeSkippedDumps(skippedDumps);
85
+ if (tools.size === 0) {
86
+ const reasons = [...unavailableReasons];
87
+ if (reasons.length > 0)
88
+ return unavailableCoverage(`the pytest plugin could not record: ${reasons.join("; ")}`);
89
+ return unavailableCoverage("every coverage file the pytest plugin wrote was unreadable");
90
+ }
91
+ if (skippedDumpNote !== null)
92
+ notes.add(skippedDumpNote);
93
+ if (malformed > 0)
94
+ notes.add(`${malformed} coverage file(s) written by the pytest plugin could not be parsed and were ignored`);
95
+ for (const reason of unavailableReasons)
96
+ notes.add(`a pytest process could not record: ${reason}`);
97
+ const tool = tools.has("settrace") ? "python-settrace" : "python-monitoring";
98
+ if (tools.size > 1)
99
+ notes.add("pytest processes recorded with different mechanisms; the result reports the slower sys.settrace one");
100
+ return accumulator.build(tool, notes);
101
+ }
102
+ function toAbsoluteTestPath(rawPath, repositoryRoot) {
103
+ if (rawPath === "")
104
+ return null;
105
+ if (rawPath.startsWith("file:")) {
106
+ try {
107
+ return fileURLToPath(rawPath);
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ return isAbsolute(rawPath) ? rawPath : resolve(repositoryRoot, rawPath);
114
+ }
115
+ function beginDirectory() {
116
+ try {
117
+ return { ok: true, directory: createCoverageTempDirectory() };
118
+ }
119
+ catch (error) {
120
+ return { ok: false, reason: `could not create a temporary directory for coverage data: ${error instanceof Error ? error.message : String(error)}` };
121
+ }
122
+ }
123
+ export function beginCoverageCapture(kind, cwd) {
124
+ const unavailable = coverageUnavailableReason(kind);
125
+ if (unavailable !== null)
126
+ return { ok: false, reason: unavailable };
127
+ if (kind !== "pytest" && kind !== "node:test")
128
+ return { ok: false, reason: `${kind}: no executed-line coverage hook is defined; not collected` };
129
+ const repositoryRoot = resolveRepositoryRoot(cwd);
130
+ const begun = beginDirectory();
131
+ if (!begun.ok)
132
+ return begun;
133
+ const { directory } = begun;
134
+ const observedTestFiles = new Set();
135
+ if (kind === "pytest") {
136
+ return {
137
+ ok: true,
138
+ capture: {
139
+ directory,
140
+ environment: { [PYTHON_COVERAGE_DIRECTORY_VARIABLE]: directory, [PYTHON_COVERAGE_ROOT_VARIABLE]: repositoryRoot },
141
+ observeTestFile: () => undefined,
142
+ collect: () => readPythonCoverageDirectory(directory),
143
+ dispose: () => removeCoverageTempDirectory(directory),
144
+ },
145
+ };
146
+ }
147
+ return {
148
+ ok: true,
149
+ capture: {
150
+ directory,
151
+ environment: { [V8_COVERAGE_VARIABLE]: directory },
152
+ observeTestFile(rawPath) {
153
+ const absolute = toAbsoluteTestPath(rawPath, repositoryRoot);
154
+ if (absolute === null)
155
+ return;
156
+ const path = repositoryRelativePath(repositoryRoot, absolute);
157
+ if (path !== null)
158
+ observedTestFiles.add(path);
159
+ },
160
+ collect: () => readV8CoverageDirectory({ directory, repositoryRoot, excludedPaths: observedTestFiles }),
161
+ dispose: () => removeCoverageTempDirectory(directory),
162
+ },
163
+ };
164
+ }
165
+ //# sourceMappingURL=coverage-capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage-capture.js","sourceRoot":"","sources":["../src/coverage-capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EACL,mBAAmB,EACnB,OAAO,EACP,2BAA2B,EAC3B,6BAA6B,EAC7B,2BAA2B,EAC3B,sBAAsB,EACtB,qBAAqB,EACrB,mBAAmB,GAGpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,CAAC,MAAM,kCAAkC,GAAG,qBAAqB,CAAC;AACxE,MAAM,CAAC,MAAM,6BAA6B,GAAG,sBAAsB,CAAC;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAcvD,MAAM,mBAAmB,GAAkD;IACzE,IAAI,EAAE,2EAA2E;IACjF,MAAM,EAAE,6EAA6E;IACrF,UAAU,EAAE,iFAAiF;IAC7F,KAAK,EAAE,oJAAoJ;IAC3J,KAAK,EAAE,qKAAqK;IAC5K,KAAK,EAAE,mLAAmL;IAC1L,OAAO,EAAE,iHAAiH;IAC1H,QAAQ,EAAE,sLAAsL;IAChM,QAAQ,EAAE,qJAAqJ;CAChK,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,IAAgB;IACxD,OAAO,mBAAmB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAQD,SAAS,oBAAoB,CAAC,MAAe;IAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,IAAI,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;IAC7F,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9F,MAAM,KAAK,GAAsC,EAAE,CAAC;IACpD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/H,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,SAAiB,EAAE,gBAAqC,IAAI,GAAG,EAAE;IAC3G,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,mBAAmB,CAAC,8CAA8C,CAAC,CAAC;IACvG,MAAM,KAAK,GAAG,WAAW,CAAC,SAAS,CAAC;SACjC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClD,IAAI,EAAE,CAAC;IACV,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,mBAAmB,CAAC,2GAA2G,CAAC,CAAC;IAC1I,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,OAAO,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,GAAG,EAA6B,CAAC;IACnD,MAAM,kBAAkB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC7C,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,mBAAmB,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACtF,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,IAAI,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YACvB,SAAS,IAAI,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QACD,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAC/B,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC9E,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAE3D,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,CAAC,GAAG,kBAAkB,CAAC,CAAC;QACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,mBAAmB,CAAC,uCAAuC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChH,OAAO,mBAAmB,CAAC,4DAA4D,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,eAAe,KAAK,IAAI;QAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzD,IAAI,SAAS,GAAG,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,qFAAqF,CAAC,CAAC;IAChI,KAAK,MAAM,MAAM,IAAI,kBAAkB;QAAE,KAAK,CAAC,GAAG,CAAC,sCAAsC,MAAM,EAAE,CAAC,CAAC;IACnG,MAAM,IAAI,GAAyB,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,mBAAmB,CAAC;IACnG,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;QAAE,KAAK,CAAC,GAAG,CAAC,qGAAqG,CAAC,CAAC;IACrI,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAe,EAAE,cAAsB;IACjE,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAChC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,2BAA2B,EAAE,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6DAA6D,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IACtJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAgB,EAAE,GAAW;IAChE,MAAM,WAAW,GAAG,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,WAAW,KAAK,IAAI;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACpE,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,4DAA4D,EAAE,CAAC;IACjJ,MAAM,cAAc,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IAC5B,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE5C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EAAE;gBACP,SAAS;gBACT,WAAW,EAAE,EAAE,CAAC,kCAAkC,CAAC,EAAE,SAAS,EAAE,CAAC,6BAA6B,CAAC,EAAE,cAAc,EAAE;gBACjH,eAAe,EAAE,GAAG,EAAE,CAAC,SAAS;gBAChC,OAAO,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,SAAS,CAAC;gBACrD,OAAO,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,SAAS,CAAC;aACtD;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE;YACP,SAAS;YACT,WAAW,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE;YAClD,eAAe,CAAC,OAAe;gBAC7B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;gBAC7D,IAAI,QAAQ,KAAK,IAAI;oBAAE,OAAO;gBAC9B,MAAM,IAAI,GAAG,sBAAsB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;gBAC9D,IAAI,IAAI,KAAK,IAAI;oBAAE,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,EAAE,CAAC;YACvG,OAAO,EAAE,GAAG,EAAE,CAAC,2BAA2B,CAAC,SAAS,CAAC;SACtD;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ export type ExecutedCoverageTool = "python-monitoring" | "python-settrace" | "v8" | "go-cover";
2
+ export interface ExecutedCoverageFile {
3
+ readonly path: string;
4
+ readonly executedLines: readonly number[];
5
+ readonly measuredLines: readonly number[] | null;
6
+ }
7
+ export type ExecutedCoverage = {
8
+ readonly available: true;
9
+ readonly tool: ExecutedCoverageTool;
10
+ readonly scope: "run";
11
+ readonly files: readonly ExecutedCoverageFile[];
12
+ readonly truncated: boolean;
13
+ readonly notes: readonly string[];
14
+ } | {
15
+ readonly available: false;
16
+ readonly reason: string;
17
+ };
18
+ export declare const MAX_COVERAGE_FILES = 20000;
19
+ export declare const MAX_COVERAGE_LINES = 2000000;
20
+ export declare const MAX_COVERAGE_NOTES = 25;
21
+ export declare const EXCLUDED_DIRECTORY_NAMES: ReadonlySet<string>;
22
+ export declare function unavailableCoverage(reason: string): ExecutedCoverage;
23
+ export declare function resolveRepositoryRoot(directory: string): string;
24
+ export declare function hasExcludedSegment(posixRelativePath: string): boolean;
25
+ export declare function repositoryRelativePath(repositoryRoot: string, absolutePath: string): string | null;
26
+ export declare function isRepositoryRelativePosixPath(candidate: string): boolean;
27
+ export declare function createCoverageTempDirectory(): string;
28
+ export declare function removeCoverageTempDirectory(directory: string): void;
29
+ export declare function withCoverageDirectoryAllowed<T extends {
30
+ readonly allowedRoots: readonly string[];
31
+ }>(policy: T, directory: string): T;
32
+ export declare class NoteLog {
33
+ private readonly seen;
34
+ private overflow;
35
+ add(note: string): void;
36
+ toArray(): readonly string[];
37
+ }
38
+ export declare class CoverageAccumulator {
39
+ private readonly files;
40
+ addFile(path: string, executedLines: Iterable<number>, measuredLines: Iterable<number> | null): void;
41
+ paths(): string[];
42
+ get fileCount(): number;
43
+ build(tool: ExecutedCoverageTool, notes: NoteLog): ExecutedCoverage;
44
+ }
45
+ //# sourceMappingURL=executed-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executed-coverage.d.ts","sourceRoot":"","sources":["../src/executed-coverage.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,oBAAoB,GAAG,mBAAmB,GAAG,iBAAiB,GAAG,IAAI,GAAG,UAAU,CAAC;AAE/F,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,gBAAgB,GACxB;IACE,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,GACD;IAAE,QAAQ,CAAC,SAAS,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,eAAO,MAAM,kBAAkB,QAAS,CAAC;AACzC,eAAO,MAAM,kBAAkB,UAAY,CAAC;AAC5C,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAUvD,CAAC;AAEH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAEpE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO/D;AAED,wBAAgB,kBAAkB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,wBAAgB,sBAAsB,CAAC,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAWlG;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAIxE;AAED,wBAAgB,2BAA2B,IAAI,MAAM,CAEpD;AAED,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAMnE;AAED,wBAAgB,4BAA4B,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC,CAEpI;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAK;IAErB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IASvB,OAAO,IAAI,SAAS,MAAM,EAAE;CAI7B;AAWD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IAEtD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,IAAI;IAepG,KAAK,IAAI,MAAM,EAAE;IAIjB,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,KAAK,CAAC,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,OAAO,GAAG,gBAAgB;CA6BpE"}