assertloom 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +393 -2
  3. package/dist/ai/anthropic.d.ts +11 -0
  4. package/dist/ai/anthropic.js +68 -0
  5. package/dist/ai/anthropic.js.map +1 -0
  6. package/dist/ai/index.d.ts +12 -0
  7. package/dist/ai/index.js +23 -0
  8. package/dist/ai/index.js.map +1 -0
  9. package/dist/ai/openai.d.ts +9 -0
  10. package/dist/ai/openai.js +57 -0
  11. package/dist/ai/openai.js.map +1 -0
  12. package/dist/ai/openaiCompatible.d.ts +13 -0
  13. package/dist/ai/openaiCompatible.js +62 -0
  14. package/dist/ai/openaiCompatible.js.map +1 -0
  15. package/dist/ai/pricing.d.ts +38 -0
  16. package/dist/ai/pricing.js +105 -0
  17. package/dist/ai/pricing.js.map +1 -0
  18. package/dist/ai/prompts.d.ts +27 -0
  19. package/dist/ai/prompts.js +89 -0
  20. package/dist/ai/prompts.js.map +1 -0
  21. package/dist/ai/provider.d.ts +26 -0
  22. package/dist/ai/provider.js +4 -0
  23. package/dist/ai/provider.js.map +1 -0
  24. package/dist/ai/redact.d.ts +5 -0
  25. package/dist/ai/redact.js +31 -0
  26. package/dist/ai/redact.js.map +1 -0
  27. package/dist/analyzer/dependencies.d.ts +16 -0
  28. package/dist/analyzer/dependencies.js +168 -0
  29. package/dist/analyzer/dependencies.js.map +1 -0
  30. package/dist/analyzer/format.d.ts +3 -0
  31. package/dist/analyzer/format.js +14 -0
  32. package/dist/analyzer/format.js.map +1 -0
  33. package/dist/analyzer/functions.d.ts +4 -0
  34. package/dist/analyzer/functions.js +324 -0
  35. package/dist/analyzer/functions.js.map +1 -0
  36. package/dist/analyzer/index.d.ts +5 -0
  37. package/dist/analyzer/index.js +29 -0
  38. package/dist/analyzer/index.js.map +1 -0
  39. package/dist/analyzer/parser.d.ts +11 -0
  40. package/dist/analyzer/parser.js +38 -0
  41. package/dist/analyzer/parser.js.map +1 -0
  42. package/dist/analyzer/usage.d.ts +16 -0
  43. package/dist/analyzer/usage.js +159 -0
  44. package/dist/analyzer/usage.js.map +1 -0
  45. package/dist/ci/report.d.ts +88 -0
  46. package/dist/ci/report.js +139 -0
  47. package/dist/ci/report.js.map +1 -0
  48. package/dist/ci/run.d.ts +70 -0
  49. package/dist/ci/run.js +198 -0
  50. package/dist/ci/run.js.map +1 -0
  51. package/dist/ci/select.d.ts +58 -0
  52. package/dist/ci/select.js +238 -0
  53. package/dist/ci/select.js.map +1 -0
  54. package/dist/cli/commands/analyze.d.ts +2 -0
  55. package/dist/cli/commands/analyze.js +49 -0
  56. package/dist/cli/commands/analyze.js.map +1 -0
  57. package/dist/cli/commands/ci.d.ts +37 -0
  58. package/dist/cli/commands/ci.js +258 -0
  59. package/dist/cli/commands/ci.js.map +1 -0
  60. package/dist/cli/commands/generate.d.ts +3 -0
  61. package/dist/cli/commands/generate.js +201 -0
  62. package/dist/cli/commands/generate.js.map +1 -0
  63. package/dist/cli/commands/run.d.ts +4 -0
  64. package/dist/cli/commands/run.js +53 -0
  65. package/dist/cli/commands/run.js.map +1 -0
  66. package/dist/cli/index.d.ts +2 -0
  67. package/dist/cli/index.js +16 -0
  68. package/dist/cli/index.js.map +1 -0
  69. package/dist/cli/program.d.ts +2 -0
  70. package/dist/cli/program.js +20 -0
  71. package/dist/cli/program.js.map +1 -0
  72. package/dist/cli/report.d.ts +3 -0
  73. package/dist/cli/report.js +36 -0
  74. package/dist/cli/report.js.map +1 -0
  75. package/dist/cli/validateFile.d.ts +5 -0
  76. package/dist/cli/validateFile.js +43 -0
  77. package/dist/cli/validateFile.js.map +1 -0
  78. package/dist/errors.d.ts +4 -0
  79. package/dist/errors.js +8 -0
  80. package/dist/errors.js.map +1 -0
  81. package/dist/generator/diff.d.ts +5 -0
  82. package/dist/generator/diff.js +56 -0
  83. package/dist/generator/diff.js.map +1 -0
  84. package/dist/generator/importPlan.d.ts +15 -0
  85. package/dist/generator/importPlan.js +62 -0
  86. package/dist/generator/importPlan.js.map +1 -0
  87. package/dist/generator/index.d.ts +5 -0
  88. package/dist/generator/index.js +6 -0
  89. package/dist/generator/index.js.map +1 -0
  90. package/dist/generator/mocks.d.ts +48 -0
  91. package/dist/generator/mocks.js +356 -0
  92. package/dist/generator/mocks.js.map +1 -0
  93. package/dist/generator/schema.d.ts +40 -0
  94. package/dist/generator/schema.js +15 -0
  95. package/dist/generator/schema.js.map +1 -0
  96. package/dist/generator/testGenerator.d.ts +36 -0
  97. package/dist/generator/testGenerator.js +85 -0
  98. package/dist/generator/testGenerator.js.map +1 -0
  99. package/dist/generator/testWriter.d.ts +22 -0
  100. package/dist/generator/testWriter.js +93 -0
  101. package/dist/generator/testWriter.js.map +1 -0
  102. package/dist/generator/validate.d.ts +31 -0
  103. package/dist/generator/validate.js +180 -0
  104. package/dist/generator/validate.js.map +1 -0
  105. package/dist/repair/classifyFailure.d.ts +11 -0
  106. package/dist/repair/classifyFailure.js +26 -0
  107. package/dist/repair/classifyFailure.js.map +1 -0
  108. package/dist/repair/index.d.ts +2 -0
  109. package/dist/repair/index.js +3 -0
  110. package/dist/repair/index.js.map +1 -0
  111. package/dist/repair/repairLoop.d.ts +74 -0
  112. package/dist/repair/repairLoop.js +219 -0
  113. package/dist/repair/repairLoop.js.map +1 -0
  114. package/dist/repair/schema.d.ts +17 -0
  115. package/dist/repair/schema.js +14 -0
  116. package/dist/repair/schema.js.map +1 -0
  117. package/dist/runner/coverage.d.ts +5 -0
  118. package/dist/runner/coverage.js +42 -0
  119. package/dist/runner/coverage.js.map +1 -0
  120. package/dist/runner/index.d.ts +5 -0
  121. package/dist/runner/index.js +5 -0
  122. package/dist/runner/index.js.map +1 -0
  123. package/dist/runner/jestConfig.d.ts +11 -0
  124. package/dist/runner/jestConfig.js +103 -0
  125. package/dist/runner/jestConfig.js.map +1 -0
  126. package/dist/runner/jestRunner.d.ts +17 -0
  127. package/dist/runner/jestRunner.js +154 -0
  128. package/dist/runner/jestRunner.js.map +1 -0
  129. package/dist/runner/networkGuard.d.ts +4 -0
  130. package/dist/runner/networkGuard.js +55 -0
  131. package/dist/runner/networkGuard.js.map +1 -0
  132. package/dist/runner/project.d.ts +30 -0
  133. package/dist/runner/project.js +86 -0
  134. package/dist/runner/project.js.map +1 -0
  135. package/dist/runner/results.d.ts +32 -0
  136. package/dist/runner/results.js +58 -0
  137. package/dist/runner/results.js.map +1 -0
  138. package/dist/runner/types.d.ts +39 -0
  139. package/dist/runner/types.js +2 -0
  140. package/dist/runner/types.js.map +1 -0
  141. package/dist/runner/vitest.d.ts +24 -0
  142. package/dist/runner/vitest.js +105 -0
  143. package/dist/runner/vitest.js.map +1 -0
  144. package/dist/types/index.d.ts +96 -0
  145. package/dist/types/index.js +2 -0
  146. package/dist/types/index.js.map +1 -0
  147. package/package.json +67 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jestRunner.js","sourceRoot":"","sources":["../../src/runner/jestRunner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const NETWORK_BLOCKED_CODE = "ASSERTLOOM_NETWORK_BLOCKED";
2
+ export declare const NETWORK_BLOCKED_MESSAGE = "Assertloom blocked a network connection";
3
+ /** Writes the guard into `dir` and returns the NODE_OPTIONS fragment that preloads it. */
4
+ export declare function writeNetworkGuard(dir: string): Promise<string>;
@@ -0,0 +1,55 @@
1
+ import { writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ export const NETWORK_BLOCKED_CODE = "ASSERTLOOM_NETWORK_BLOCKED";
4
+ export const NETWORK_BLOCKED_MESSAGE = "Assertloom blocked a network connection";
5
+ /**
6
+ * Preloaded into Jest (and any Node subprocess it starts) with `--require`. It fails TCP connections
7
+ * and DNS lookups, which covers `net`, `http`, `https`, `tls`, and `fetch`. Local pipes stay usable.
8
+ */
9
+ const GUARD_SOURCE = `"use strict";
10
+ const net = require("node:net");
11
+ const dns = require("node:dns");
12
+
13
+ const blocked = (target) =>
14
+ Object.assign(
15
+ new Error(${JSON.stringify(NETWORK_BLOCKED_MESSAGE)} + " to " + target + ". Generated tests run offline: mock the dependency, or rerun with --allow-network."),
16
+ { code: ${JSON.stringify(NETWORK_BLOCKED_CODE)} },
17
+ );
18
+
19
+ const connect = net.Socket.prototype.connect;
20
+ net.Socket.prototype.connect = function (...args) {
21
+ let options = Array.isArray(args[0]) ? args[0][0] : args[0];
22
+ if (options === null || typeof options !== "object") options = { port: args[0], host: typeof args[1] === "string" ? args[1] : undefined };
23
+ if (options.path) return connect.apply(this, args);
24
+ const error = blocked((options.host || "localhost") + ":" + options.port);
25
+ process.nextTick(() => this.destroy(error));
26
+ return this;
27
+ };
28
+
29
+ // Local servers look up their own host before listening, which needs no DNS server; connections are still blocked above.
30
+ const local = (host) => typeof host === "string" && (net.isIP(host) !== 0 || host === "localhost");
31
+ const guard = (original, allowLocal) =>
32
+ function (...args) {
33
+ if (allowLocal && local(args[0])) return original.apply(this, args);
34
+ const error = blocked(String(args[0]));
35
+ const callback = args[args.length - 1];
36
+ if (typeof callback === "function") return void process.nextTick(callback, error);
37
+ return Promise.reject(error);
38
+ };
39
+ const QUERIES = ["lookupService", "resolve", "resolve4", "resolve6", "resolveAny", "resolveCaa", "resolveCname", "resolveMx", "resolveNaptr", "resolveNs", "resolvePtr", "resolveSoa", "resolveSrv", "resolveTlsa", "resolveTxt", "reverse"];
40
+ for (const target of [dns, dns.promises]) {
41
+ target.lookup = guard(target.lookup, true);
42
+ for (const owner of [target, target.Resolver && target.Resolver.prototype]) {
43
+ if (!owner) continue;
44
+ for (const name of QUERIES) if (typeof owner[name] === "function") owner[name] = guard(owner[name], false);
45
+ }
46
+ }
47
+ `;
48
+ /** Writes the guard into `dir` and returns the NODE_OPTIONS fragment that preloads it. */
49
+ export async function writeNetworkGuard(dir) {
50
+ const file = path.join(dir, "network-guard.cjs");
51
+ await writeFile(file, GUARD_SOURCE);
52
+ // NODE_OPTIONS drops backslashes inside quotes on Windows; Node accepts forward slashes everywhere.
53
+ return `--require "${file.replaceAll("\\", "/")}"`;
54
+ }
55
+ //# sourceMappingURL=networkGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkGuard.js","sourceRoot":"","sources":["../../src/runner/networkGuard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,oBAAoB,GAAG,4BAA4B,CAAC;AACjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,yCAAyC,CAAC;AAEjF;;;GAGG;AACH,MAAM,YAAY,GAAG;;;;;;gBAML,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC;cACzC,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BjD,CAAC;AAEF,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAW;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACjD,MAAM,SAAS,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACpC,oGAAoG;IACpG,OAAO,cAAc,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC;AACrD,CAAC"}
@@ -0,0 +1,30 @@
1
+ export type JestConfigSource = {
2
+ kind: "default";
3
+ } | {
4
+ kind: "file";
5
+ path: string;
6
+ } | {
7
+ kind: "package-json";
8
+ config: Record<string, unknown>;
9
+ };
10
+ export interface JestSetup {
11
+ root: string;
12
+ jestBin: string;
13
+ jestSource: "project" | "bundled";
14
+ config: JestConfigSource;
15
+ /** Things the user should know, such as falling back to the bundled Jest. */
16
+ notes: string[];
17
+ }
18
+ /**
19
+ * Nearest directory with a package.json. The search stops at a git repository root, and stray
20
+ * package.json files in the home directory or at the filesystem root are ignored.
21
+ */
22
+ export declare function findProjectRoot(fromFile: string): string;
23
+ /**
24
+ * Jest 30 also resolves a config from its working directory when `--config` is given, and exits
25
+ * with "Could not find a config file" if no Jest config or package.json exists there or above.
26
+ */
27
+ export declare function jestCanStartIn(dir: string): boolean;
28
+ /** Whether this Node.js can import TypeScript files directly (type stripping), as Jest config wrappers do. */
29
+ export declare function nodeStripsTypes(): boolean;
30
+ export declare function detectJestSetup(sourcePath: string): JestSetup;
@@ -0,0 +1,86 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ const CONFIG_FILES = ["jest.config.js", "jest.config.cjs", "jest.config.mjs", "jest.config.json", "jest.config.ts", "jest.config.mts", "jest.config.cts"];
6
+ /**
7
+ * Nearest directory with a package.json. The search stops at a git repository root, and stray
8
+ * package.json files in the home directory or at the filesystem root are ignored.
9
+ */
10
+ export function findProjectRoot(fromFile) {
11
+ const fileDir = path.dirname(path.resolve(fromFile));
12
+ const home = path.resolve(os.homedir());
13
+ for (let dir = fileDir;; dir = path.dirname(dir)) {
14
+ const parent = path.dirname(dir);
15
+ if (parent === dir || dir === home)
16
+ return fileDir;
17
+ if (existsSync(path.join(dir, "package.json")))
18
+ return dir;
19
+ if (existsSync(path.join(dir, ".git")))
20
+ return fileDir;
21
+ }
22
+ }
23
+ /**
24
+ * Jest 30 also resolves a config from its working directory when `--config` is given, and exits
25
+ * with "Could not find a config file" if no Jest config or package.json exists there or above.
26
+ */
27
+ export function jestCanStartIn(dir) {
28
+ for (let current = path.resolve(dir);; current = path.dirname(current)) {
29
+ if ([...CONFIG_FILES, "package.json"].some((name) => existsSync(path.join(current, name))))
30
+ return true;
31
+ if (path.dirname(current) === current)
32
+ return false;
33
+ }
34
+ }
35
+ function resolveJestBin(require) {
36
+ try {
37
+ return path.join(path.dirname(require.resolve("jest/package.json")), "bin", "jest.js");
38
+ }
39
+ catch {
40
+ return undefined;
41
+ }
42
+ }
43
+ function bundledJestBin() {
44
+ const bin = resolveJestBin(createRequire(import.meta.url));
45
+ if (!bin)
46
+ throw new Error("Assertloom's bundled Jest is missing; reinstall Assertloom.");
47
+ return bin;
48
+ }
49
+ /** Whether this Node.js can import TypeScript files directly (type stripping), as Jest config wrappers do. */
50
+ export function nodeStripsTypes() {
51
+ return !!process.features.typescript;
52
+ }
53
+ export function detectJestSetup(sourcePath) {
54
+ const root = findProjectRoot(sourcePath);
55
+ const notes = [];
56
+ let config = { kind: "default" };
57
+ const configFile = CONFIG_FILES.map((name) => path.join(root, name)).find((file) => existsSync(file));
58
+ if (configFile && /\.[cm]?ts$/.test(configFile) && !nodeStripsTypes()) {
59
+ notes.push(`${path.basename(configFile)} needs Node.js 22.18 or newer to load; using Assertloom's default Jest config.`);
60
+ }
61
+ else if (configFile) {
62
+ config = { kind: "file", path: configFile };
63
+ }
64
+ else {
65
+ try {
66
+ const pkg = JSON.parse(readFileSync(path.join(root, "package.json"), "utf8"));
67
+ if (pkg.jest && typeof pkg.jest === "object")
68
+ config = { kind: "package-json", config: pkg.jest };
69
+ }
70
+ catch {
71
+ // No readable package.json: use the default config.
72
+ }
73
+ }
74
+ if (config.kind !== "default" && (config.kind === "package-json" ? "projects" in config.config : false)) {
75
+ notes.push("Jest `projects` configurations are not supported yet; using Assertloom's default Jest config.");
76
+ config = { kind: "default" };
77
+ }
78
+ const projectJest = config.kind === "default" ? undefined : resolveJestBin(createRequire(path.join(root, "package.json")));
79
+ if (config.kind !== "default" && !projectJest) {
80
+ notes.push("The project has a Jest config but Jest is not installed; using Assertloom's bundled Jest.");
81
+ }
82
+ return projectJest
83
+ ? { root, jestBin: projectJest, jestSource: "project", config, notes }
84
+ : { root, jestBin: bundledJestBin(), jestSource: "bundled", config, notes };
85
+ }
86
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/runner/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,YAAY,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;AAgB1J;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAExC,KAAK,IAAI,GAAG,GAAG,OAAO,GAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,OAAO,CAAC;QACnD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAAE,OAAO,GAAG,CAAC;QAC3D,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,OAAO,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,KAAK,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC,GAAG,YAAY,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACxG,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,OAAO;YAAE,OAAO,KAAK,CAAC;IACtD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAuB;IAC7C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IACzF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,GAAG,GAAG,cAAc,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACzF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,8GAA8G;AAC9G,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,CAAE,OAAO,CAAC,QAAqC,CAAC,UAAU,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,UAAkB;IAChD,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAqB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAEnD,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACtG,IAAI,UAAU,IAAI,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,gFAAgF,CAAC,CAAC;IAC3H,CAAC;SAAM,IAAI,UAAU,EAAE,CAAC;QACtB,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAuC,CAAC;YACpH,IAAI,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;QACpG,CAAC;QAAC,MAAM,CAAC;YACP,oDAAoD;QACtD,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACxG,KAAK,CAAC,IAAI,CAAC,+FAA+F,CAAC,CAAC;QAC5G,MAAM,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC3H,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,WAAW,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,2FAA2F,CAAC,CAAC;IAC1G,CAAC;IAED,OAAO,WAAW;QAChB,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE;QACtE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAChF,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { InfraFailure, TestFailureKind, TestOutcome } from "./types.js";
2
+ interface JestAssertionResult {
3
+ ancestorTitles: string[];
4
+ title: string;
5
+ status: string;
6
+ duration?: number | null;
7
+ failureMessages?: string[];
8
+ }
9
+ interface JestTestFileResult {
10
+ status: string;
11
+ message?: string;
12
+ assertionResults: JestAssertionResult[];
13
+ testExecError?: {
14
+ message?: string;
15
+ } | null;
16
+ }
17
+ export interface JestJsonReport {
18
+ testResults: JestTestFileResult[];
19
+ runExecError?: {
20
+ message?: string;
21
+ } | null;
22
+ }
23
+ export declare function stripAnsi(text: string): string;
24
+ /** Removes colors, keeps the first few stack frames, and caps the length. */
25
+ export declare function cleanMessage(text: string): string;
26
+ export declare function classifyTestFailure(message: string): TestFailureKind;
27
+ export declare function classifySuiteFailure(message: string): InfraFailure;
28
+ export declare function parseJestReport(report: JestJsonReport): {
29
+ tests: TestOutcome[];
30
+ infra?: InfraFailure;
31
+ };
32
+ export {};
@@ -0,0 +1,58 @@
1
+ const MAX_MESSAGE_LENGTH = 2000;
2
+ const MAX_STACK_FRAMES = 3;
3
+ export function stripAnsi(text) {
4
+ return text.replace(/\u001b\[[0-9;]*m/g, "");
5
+ }
6
+ /** Removes colors, keeps the first few stack frames, and caps the length. */
7
+ export function cleanMessage(text) {
8
+ let frames = 0;
9
+ const lines = stripAnsi(text)
10
+ .split(/\r?\n/)
11
+ .filter((line) => !line.includes("node_modules"))
12
+ .filter((line) => !/^\s+at /.test(line) || ++frames <= MAX_STACK_FRAMES);
13
+ const cleaned = lines.join("\n").trim();
14
+ return cleaned.length > MAX_MESSAGE_LENGTH ? `${cleaned.slice(0, MAX_MESSAGE_LENGTH)}\n…(truncated)` : cleaned;
15
+ }
16
+ export function classifyTestFailure(message) {
17
+ const text = stripAnsi(message);
18
+ if (/Exceeded timeout of \d+ ?ms|Test timed out in \d+ ?ms/.test(text))
19
+ return "timeout";
20
+ if (/expect\(.*?\)\.|Expected:|Received:|Expected value|Received value|^AssertionError:/m.test(text))
21
+ return "assertion";
22
+ return "error";
23
+ }
24
+ export function classifySuiteFailure(message) {
25
+ const text = cleanMessage(message);
26
+ if (/Cannot find module|Failed to (?:resolve|load) (?:import|url)|Cannot find package/.test(text))
27
+ return { kind: "module-not-found", message: text };
28
+ if (/Jest encountered an unexpected token|SyntaxError|Must use import to load ES Module|Cannot use import statement/.test(text)) {
29
+ return { kind: "transform", message: text };
30
+ }
31
+ return { kind: "suite-error", message: text };
32
+ }
33
+ export function parseJestReport(report) {
34
+ if (report.runExecError?.message)
35
+ return { tests: [], infra: classifySuiteFailure(report.runExecError.message) };
36
+ const tests = [];
37
+ for (const file of report.testResults) {
38
+ const suiteError = file.testExecError?.message ?? (file.assertionResults.length === 0 && file.status === "failed" ? file.message : undefined);
39
+ if (suiteError)
40
+ return { tests, infra: classifySuiteFailure(suiteError) };
41
+ for (const result of file.assertionResults) {
42
+ const status = result.status === "passed" ? "passed" : result.status === "failed" ? "failed" : "skipped";
43
+ const outcome = {
44
+ suite: result.ancestorTitles.join(" › "),
45
+ name: result.title,
46
+ status,
47
+ durationMs: result.duration ?? undefined,
48
+ };
49
+ if (status === "failed") {
50
+ const message = (result.failureMessages ?? []).join("\n");
51
+ outcome.failure = { kind: classifyTestFailure(message), message: cleanMessage(message) };
52
+ }
53
+ tests.push(outcome);
54
+ }
55
+ }
56
+ return { tests };
57
+ }
58
+ //# sourceMappingURL=results.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"results.js","sourceRoot":"","sources":["../../src/runner/results.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ export type TestFailureKind = "assertion" | "error" | "timeout";
2
+ export interface TestOutcome {
3
+ /** describe() titles joined with " › ". */
4
+ suite: string;
5
+ name: string;
6
+ status: "passed" | "failed" | "skipped";
7
+ durationMs?: number;
8
+ failure?: {
9
+ kind: TestFailureKind;
10
+ message: string;
11
+ };
12
+ }
13
+ /** The run itself failed, as opposed to individual tests failing. */
14
+ export interface InfraFailure {
15
+ kind: "timeout" | "crash" | "module-not-found" | "transform" | "suite-error";
16
+ message: string;
17
+ }
18
+ /** Percentages (0–100), or null when the file has nothing of that kind to cover. */
19
+ export interface CoverageMetrics {
20
+ lines: number | null;
21
+ statements: number | null;
22
+ functions: number | null;
23
+ branches: number | null;
24
+ }
25
+ export interface RunResult {
26
+ status: "passed" | "failed" | "error";
27
+ tests: TestOutcome[];
28
+ passed: number;
29
+ failed: number;
30
+ skipped: number;
31
+ total: number;
32
+ infra?: InfraFailure;
33
+ coverage?: CoverageMetrics;
34
+ durationMs: number;
35
+ /** Where the Jest binary and configuration came from. */
36
+ setup: string;
37
+ /** The run changed the source file under test; it has been restored. */
38
+ sourceRestored?: boolean;
39
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/runner/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import type { TestFramework } from "../types/index.js";
2
+ import type { RunFiles } from "./jestConfig.js";
3
+ export interface VitestSetup {
4
+ root: string;
5
+ vitestBin: string;
6
+ /** `vite` as resolved from the project's Vitest, for loading the project's config. */
7
+ viteEntry: string;
8
+ configFile?: string;
9
+ /** Whether @vitest/coverage-v8 is installed. */
10
+ coverage: boolean;
11
+ }
12
+ /** Vitest when the project uses it and not Jest; Jest otherwise. */
13
+ export declare function detectFramework(sourcePath: string): TestFramework;
14
+ export declare function detectVitestSetup(sourcePath: string): VitestSetup;
15
+ /**
16
+ * Writes a Vitest config that loads the project's own config (if any) and overrides only test selection,
17
+ * reporting, and coverage, so exactly this test file runs.
18
+ */
19
+ export declare function writeVitestRunConfig(setup: VitestSetup, files: RunFiles & {
20
+ resultsPath: string;
21
+ testTimeoutMs: number;
22
+ }, runDir: string): Promise<string>;
23
+ export declare function vitestArgs(setup: VitestSetup, configPath: string): string[];
24
+ export declare function describeVitestSetup(setup: VitestSetup): string;
@@ -0,0 +1,105 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { writeFile } from "node:fs/promises";
3
+ import { createRequire } from "node:module";
4
+ import path from "node:path";
5
+ import { pathToFileURL } from "node:url";
6
+ import { UserError } from "../errors.js";
7
+ import { findProjectRoot } from "./project.js";
8
+ const VITEST_CONFIG_FILES = ["vitest.config", "vite.config"].flatMap((name) => ["ts", "mts", "cts", "js", "mjs", "cjs"].map((ext) => `${name}.${ext}`));
9
+ function readPackageJson(root) {
10
+ try {
11
+ return JSON.parse(readFileSync(path.join(root, "package.json"), "utf8"));
12
+ }
13
+ catch {
14
+ return {};
15
+ }
16
+ }
17
+ /** Vitest when the project uses it and not Jest; Jest otherwise. */
18
+ export function detectFramework(sourcePath) {
19
+ const root = findProjectRoot(sourcePath);
20
+ const pkg = readPackageJson(root);
21
+ const deps = { ...pkg.dependencies, ...pkg.devDependencies };
22
+ const usesVitest = "vitest" in deps || VITEST_CONFIG_FILES.some((name) => name.startsWith("vitest.") && existsSync(path.join(root, name)));
23
+ const usesJest = "jest" in deps || existsSync(path.join(root, "jest.config.js")) || "jest" in pkg;
24
+ return usesVitest && !usesJest ? "vitest" : "jest";
25
+ }
26
+ export function detectVitestSetup(sourcePath) {
27
+ const root = findProjectRoot(sourcePath);
28
+ const require = createRequire(path.join(root, "package.json"));
29
+ let vitestDir;
30
+ try {
31
+ vitestDir = path.dirname(require.resolve("vitest/package.json"));
32
+ }
33
+ catch {
34
+ throw new UserError(`Vitest is not installed in ${root}. Install it (npm install --save-dev vitest) or use --framework jest.`);
35
+ }
36
+ const fromVitest = createRequire(path.join(vitestDir, "package.json"));
37
+ let coverage = true;
38
+ try {
39
+ require.resolve("@vitest/coverage-v8/package.json");
40
+ }
41
+ catch {
42
+ coverage = false;
43
+ }
44
+ return {
45
+ root,
46
+ vitestBin: path.join(vitestDir, "vitest.mjs"),
47
+ viteEntry: fromVitest.resolve("vite"),
48
+ configFile: VITEST_CONFIG_FILES.map((name) => path.join(root, name)).find((file) => existsSync(file)),
49
+ coverage,
50
+ };
51
+ }
52
+ const escapeGlob = (text) => text.replace(/[[\]{}()*?!+@]/g, "\\$&");
53
+ const relativePosix = (from, to) => path.relative(from, to).split(path.sep).join("/");
54
+ /**
55
+ * Writes a Vitest config that loads the project's own config (if any) and overrides only test selection,
56
+ * reporting, and coverage, so exactly this test file runs.
57
+ */
58
+ export async function writeVitestRunConfig(setup, files, runDir) {
59
+ const coverage = setup.coverage
60
+ ? {
61
+ enabled: true,
62
+ provider: "v8",
63
+ reporter: ["json-summary"],
64
+ reportsDirectory: files.coverageDir,
65
+ reportOnFailure: true,
66
+ include: [escapeGlob(relativePosix(setup.root, files.sourcePath))],
67
+ exclude: [],
68
+ }
69
+ : { enabled: false };
70
+ const overrides = {
71
+ dir: setup.root,
72
+ include: [escapeGlob(relativePosix(setup.root, files.testPath))],
73
+ exclude: [],
74
+ watch: false,
75
+ passWithNoTests: false,
76
+ reporters: ["json"],
77
+ outputFile: { json: files.resultsPath },
78
+ testTimeout: files.testTimeoutMs,
79
+ coverage,
80
+ };
81
+ const file = path.join(runDir, "vitest.config.mjs");
82
+ await writeFile(file, `const root = ${JSON.stringify(setup.root)};
83
+ const configFile = ${JSON.stringify(setup.configFile ?? null)};
84
+
85
+ export default async (env) => {
86
+ let config = {};
87
+ if (configFile) {
88
+ const { loadConfigFromFile } = await import(${JSON.stringify(pathToFileURL(setup.viteEntry).href)});
89
+ config = (await loadConfigFromFile(env, configFile, root))?.config ?? {};
90
+ }
91
+ const test = { ...config.test };
92
+ if (test.projects || test.workspace) throw new Error("Assertloom: Vitest projects/workspaces are not supported yet.");
93
+ return { ...config, root, test: { ...test, ...${JSON.stringify(overrides)} } };
94
+ };
95
+ `);
96
+ return file;
97
+ }
98
+ export function vitestArgs(setup, configPath) {
99
+ return [setup.vitestBin, "run", "--config", configPath, "--root", setup.root];
100
+ }
101
+ export function describeVitestSetup(setup) {
102
+ const config = setup.configFile ? path.basename(setup.configFile) : "no Vitest config";
103
+ return `project Vitest, ${config}${setup.coverage ? "" : ", no coverage (install @vitest/coverage-v8)"}`;
104
+ }
105
+ //# sourceMappingURL=vitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/runner/vitest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ export declare const SUPPORTED_EXTENSIONS: readonly [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"];
2
+ export type SupportedExtension = (typeof SUPPORTED_EXTENSIONS)[number];
3
+ export type SourceLanguage = "typescript" | "javascript";
4
+ export type TestFramework = "jest" | "vitest";
5
+ export interface SourceFile {
6
+ /** Path as the user typed it, normalized for display. */
7
+ inputPath: string;
8
+ absolutePath: string;
9
+ extension: SupportedExtension;
10
+ language: SourceLanguage;
11
+ sizeBytes: number;
12
+ }
13
+ export interface ParameterInfo {
14
+ /** Identifier name, or the source text of a destructuring pattern such as `{ id, name }`. */
15
+ name: string;
16
+ type?: string;
17
+ optional: boolean;
18
+ rest: boolean;
19
+ defaultValue?: string;
20
+ }
21
+ export interface FunctionInfo {
22
+ /** Local name, or `"default"` for an anonymous default export. */
23
+ name: string;
24
+ exported: boolean;
25
+ /** Names this function is exported under; `"default"` for a default export. */
26
+ exportedAs: string[];
27
+ kind: "declaration" | "arrow" | "expression";
28
+ async: boolean;
29
+ generator: boolean;
30
+ parameters: ParameterInfo[];
31
+ returnType?: string;
32
+ typeParameters?: string;
33
+ throws: boolean;
34
+ /** Import sources referenced inside the function body. */
35
+ dependencies: string[];
36
+ /** Mockable globals referenced inside the function body, such as `fetch`. */
37
+ globals: string[];
38
+ line: number;
39
+ }
40
+ /** How the source uses an imported value. Assertloom builds mocks from this. */
41
+ export interface UsageShape {
42
+ called: boolean;
43
+ constructed: boolean;
44
+ /** Used on the right-hand side of `instanceof`. */
45
+ instanceOf: boolean;
46
+ /** Properties read from the value. */
47
+ members: Record<string, UsageShape>;
48
+ /** How the value returned by a call or `new` is used, when it is kept. */
49
+ result?: UsageShape;
50
+ /** Variables the result is stored in, e.g. `pool` for `const pool = new Pool()`. */
51
+ resultNames: string[];
52
+ /** The result is stored in a top-level variable, so it is created when the module loads. */
53
+ createdAtLoad: boolean;
54
+ }
55
+ export interface ImportUsage {
56
+ source: string;
57
+ local: string;
58
+ /** `"default"`, `"*"` (namespace or whole CommonJS module), or an export name. */
59
+ imported: string;
60
+ style: "esm" | "commonjs";
61
+ shape: UsageShape;
62
+ }
63
+ export type ImportCategory = "local" | "external" | "builtin";
64
+ export interface ImportSpecifierInfo {
65
+ kind: "default" | "named" | "namespace";
66
+ /** Exported name in the source module; `"default"` or `"*"` for default/namespace imports. */
67
+ imported: string;
68
+ local: string;
69
+ }
70
+ export interface ImportInfo {
71
+ source: string;
72
+ kind: "import" | "require" | "dynamic-import" | "re-export";
73
+ category: ImportCategory;
74
+ /** Package name for external imports, e.g. `@prisma/client` for `@prisma/client/runtime`. */
75
+ packageName?: string;
76
+ typeOnly: boolean;
77
+ specifiers: ImportSpecifierInfo[];
78
+ line: number;
79
+ }
80
+ export interface DependencySummary {
81
+ local: string[];
82
+ external: string[];
83
+ builtin: string[];
84
+ }
85
+ export interface FileAnalysis {
86
+ file: string;
87
+ language: SourceLanguage;
88
+ moduleSystem: "esm" | "commonjs" | "mixed" | "none";
89
+ functions: FunctionInfo[];
90
+ imports: ImportInfo[];
91
+ /** One entry per imported binding, with how the source uses it. */
92
+ importUsage: ImportUsage[];
93
+ /** Mockable globals the file references, such as `fetch`. */
94
+ globals: string[];
95
+ dependencies: DependencySummary;
96
+ }
@@ -0,0 +1,2 @@
1
+ export const SUPPORTED_EXTENSIONS = [".ts", ".tsx", ".mts", ".cts", ".js", ".jsx", ".mjs", ".cjs"];
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC"}