@rpcbase/test 0.338.0 → 0.339.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.
- package/dist/cli.js +4 -333
- package/dist/cli.js.map +1 -1
- package/dist/runners/playwright.d.ts +4 -0
- package/dist/runners/playwright.d.ts.map +1 -0
- package/dist/runners/playwright.js +494 -0
- package/dist/runners/playwright.js.map +1 -0
- package/dist/runners/process.d.ts +20 -0
- package/dist/runners/process.d.ts.map +1 -0
- package/dist/runners/process.js +109 -0
- package/dist/runners/process.js.map +1 -0
- package/dist/runners/vitest.d.ts +11 -0
- package/dist/runners/vitest.d.ts.map +1 -0
- package/dist/runners/vitest.js +191 -0
- package/dist/runners/vitest.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const isAider = process.env.IS_AIDER === "yes";
|
|
6
|
+
function spawnWithLogs({
|
|
7
|
+
name,
|
|
8
|
+
launcher,
|
|
9
|
+
args,
|
|
10
|
+
env,
|
|
11
|
+
successMessage,
|
|
12
|
+
failureMessage
|
|
13
|
+
}) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const stdoutBuffer = [];
|
|
16
|
+
const stderrBuffer = [];
|
|
17
|
+
const child = spawn(launcher.command, [...launcher.args || [], ...args], {
|
|
18
|
+
shell: false,
|
|
19
|
+
env
|
|
20
|
+
});
|
|
21
|
+
child.stdout?.on("data", (data) => {
|
|
22
|
+
if (!isAider) {
|
|
23
|
+
process.stdout.write(data);
|
|
24
|
+
}
|
|
25
|
+
stdoutBuffer.push(data.toString());
|
|
26
|
+
});
|
|
27
|
+
child.stderr?.on("data", (data) => {
|
|
28
|
+
if (!isAider) {
|
|
29
|
+
process.stderr.write(data);
|
|
30
|
+
}
|
|
31
|
+
stderrBuffer.push(data.toString());
|
|
32
|
+
});
|
|
33
|
+
child.on("close", (code) => {
|
|
34
|
+
if (code === 0) {
|
|
35
|
+
if (successMessage) {
|
|
36
|
+
console.log(successMessage);
|
|
37
|
+
}
|
|
38
|
+
resolve();
|
|
39
|
+
} else {
|
|
40
|
+
console.error(failureMessage || `${name} failed:`);
|
|
41
|
+
if (isAider) {
|
|
42
|
+
if (stdoutBuffer.length > 0) {
|
|
43
|
+
console.error(stdoutBuffer.join(""));
|
|
44
|
+
}
|
|
45
|
+
if (stderrBuffer.length > 0) {
|
|
46
|
+
console.error(stderrBuffer.join(""));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
reject(new Error(`${name} failed with exit code: ${code}`));
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
child.on("error", (error) => {
|
|
53
|
+
console.error(`Error spawning ${name}:`, error);
|
|
54
|
+
reject(error);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
function spawnAndCaptureStdout({
|
|
59
|
+
name,
|
|
60
|
+
launcher,
|
|
61
|
+
args,
|
|
62
|
+
env
|
|
63
|
+
}) {
|
|
64
|
+
return new Promise((resolve, reject) => {
|
|
65
|
+
const stdoutBuffer = [];
|
|
66
|
+
const stderrBuffer = [];
|
|
67
|
+
const child = spawn(launcher.command, [...launcher.args || [], ...args], {
|
|
68
|
+
shell: false,
|
|
69
|
+
env
|
|
70
|
+
});
|
|
71
|
+
child.stdout?.on("data", (data) => {
|
|
72
|
+
stdoutBuffer.push(data.toString());
|
|
73
|
+
});
|
|
74
|
+
child.stderr?.on("data", (data) => {
|
|
75
|
+
stderrBuffer.push(data.toString());
|
|
76
|
+
});
|
|
77
|
+
child.on("close", (code) => {
|
|
78
|
+
if (code === 0) {
|
|
79
|
+
resolve(stdoutBuffer.join(""));
|
|
80
|
+
} else {
|
|
81
|
+
reject(new Error(`${name} failed with exit code: ${code}
|
|
82
|
+
${stderrBuffer.join("")}`));
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
child.on("error", (error) => {
|
|
86
|
+
reject(error);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function withRegisterShim(baseEnv) {
|
|
91
|
+
const nodeOptions = appendNodeRequire(baseEnv.NODE_OPTIONS, path.join(moduleDir, "..", "register-tty.cjs"));
|
|
92
|
+
return {
|
|
93
|
+
...baseEnv,
|
|
94
|
+
NODE_OPTIONS: nodeOptions
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function appendNodeRequire(existing, modulePath) {
|
|
98
|
+
const flag = `--require=${modulePath}`;
|
|
99
|
+
if (!existing || existing.length === 0) {
|
|
100
|
+
return flag;
|
|
101
|
+
}
|
|
102
|
+
return `${existing} ${flag}`;
|
|
103
|
+
}
|
|
104
|
+
export {
|
|
105
|
+
spawnAndCaptureStdout,
|
|
106
|
+
spawnWithLogs,
|
|
107
|
+
withRegisterShim
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sources":["../../src/runners/process.ts"],"sourcesContent":["import { spawn } from \"node:child_process\"\nimport path from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\n\n\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url))\nconst isAider = process.env.IS_AIDER === \"yes\"\n\nexport type SpawnLauncher = {\n command: string\n args?: string[]\n}\n\nexport function spawnWithLogs({\n name,\n launcher,\n args,\n env,\n successMessage,\n failureMessage,\n}: {\n name: string\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n successMessage?: string\n failureMessage?: string\n}): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const stdoutBuffer: string[] = []\n const stderrBuffer: string[] = []\n\n const child = spawn(\n launcher.command,\n [...(launcher.args || []), ...args],\n {\n shell: false,\n env,\n },\n )\n\n child.stdout?.on(\"data\", (data) => {\n if (!isAider) {\n process.stdout.write(data)\n }\n stdoutBuffer.push(data.toString())\n })\n\n child.stderr?.on(\"data\", (data) => {\n if (!isAider) {\n process.stderr.write(data)\n }\n stderrBuffer.push(data.toString())\n })\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n if (successMessage) {\n console.log(successMessage)\n }\n resolve()\n } else {\n console.error(failureMessage || `${name} failed:`)\n\n if (isAider) {\n if (stdoutBuffer.length > 0) {\n console.error(stdoutBuffer.join(\"\"))\n }\n\n if (stderrBuffer.length > 0) {\n console.error(stderrBuffer.join(\"\"))\n }\n }\n\n reject(new Error(`${name} failed with exit code: ${code}`))\n }\n })\n\n child.on(\"error\", (error) => {\n console.error(`Error spawning ${name}:`, error)\n reject(error)\n })\n })\n}\n\nexport function spawnAndCaptureStdout({\n name,\n launcher,\n args,\n env,\n}: {\n name: string\n launcher: SpawnLauncher\n args: string[]\n env: NodeJS.ProcessEnv\n}): Promise<string> {\n return new Promise<string>((resolve, reject) => {\n const stdoutBuffer: string[] = []\n const stderrBuffer: string[] = []\n\n const child = spawn(\n launcher.command,\n [...(launcher.args || []), ...args],\n {\n shell: false,\n env,\n },\n )\n\n child.stdout?.on(\"data\", (data) => {\n stdoutBuffer.push(data.toString())\n })\n\n child.stderr?.on(\"data\", (data) => {\n stderrBuffer.push(data.toString())\n })\n\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve(stdoutBuffer.join(\"\"))\n } else {\n reject(new Error(`${name} failed with exit code: ${code}\\n${stderrBuffer.join(\"\")}`))\n }\n })\n\n child.on(\"error\", (error) => {\n reject(error)\n })\n })\n}\n\nexport function withRegisterShim(baseEnv: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const nodeOptions = appendNodeRequire(baseEnv.NODE_OPTIONS, path.join(moduleDir, \"..\", \"register-tty.cjs\"))\n return {\n ...baseEnv,\n NODE_OPTIONS: nodeOptions,\n }\n}\n\nfunction appendNodeRequire(existing: string | undefined, modulePath: string): string {\n const flag = `--require=${modulePath}`\n if (!existing || existing.length === 0) {\n return flag\n }\n return `${existing} ${flag}`\n}\n"],"names":["moduleDir","path","dirname","fileURLToPath","import","url","isAider","process","env","IS_AIDER","spawnWithLogs","name","launcher","args","successMessage","failureMessage","Promise","resolve","reject","stdoutBuffer","stderrBuffer","child","spawn","command","shell","stdout","on","data","write","push","toString","stderr","code","console","log","error","length","join","Error","spawnAndCaptureStdout","withRegisterShim","baseEnv","nodeOptions","appendNodeRequire","NODE_OPTIONS","existing","modulePath","flag"],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { CoverageConfig } from '../coverage/types';
|
|
2
|
+
type CoverageState = {
|
|
3
|
+
config: CoverageConfig;
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
} | null;
|
|
6
|
+
export declare function runVitest(coverage: CoverageState, combinedConfig: CoverageConfig | null, userArgs: string[], { disableCoverage }?: {
|
|
7
|
+
disableCoverage?: boolean;
|
|
8
|
+
}): Promise<void>;
|
|
9
|
+
export declare function resolveNodeCoverageDir(config: CoverageConfig): string;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=vitest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/runners/vitest.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAOvD,KAAK,aAAa,GAAG;IAAE,MAAM,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAA;AAExE,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,aAAa,EACvB,cAAc,EAAE,cAAc,GAAG,IAAI,EACrC,QAAQ,EAAE,MAAM,EAAE,EAClB,EAAE,eAAuB,EAAE,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9D,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAErE"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import fs$1 from "node:fs";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { createRequire } from "node:module";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { resolveCollectCoverageRoots, isInsideAnyRoot } from "../coverage/collect.js";
|
|
7
|
+
import { withRegisterShim, spawnWithLogs } from "./process.js";
|
|
8
|
+
const require$1 = createRequire(import.meta.url);
|
|
9
|
+
const moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
10
|
+
async function runVitest(coverage, combinedConfig, userArgs, {
|
|
11
|
+
disableCoverage = false
|
|
12
|
+
} = {}) {
|
|
13
|
+
const vitestArgs = ["run", "--passWithNoTests"];
|
|
14
|
+
const vitestConfig = resolveVitestConfig();
|
|
15
|
+
const hasCustomConfig = userArgs.some((arg) => {
|
|
16
|
+
if (arg === "--config" || arg === "-c") {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return arg.startsWith("--config=");
|
|
20
|
+
});
|
|
21
|
+
if (vitestConfig && !hasCustomConfig) {
|
|
22
|
+
vitestArgs.push("--config", vitestConfig);
|
|
23
|
+
}
|
|
24
|
+
vitestArgs.push(...userArgs);
|
|
25
|
+
const launcher = resolveVitestLauncher();
|
|
26
|
+
const env = withRegisterShim(process.env);
|
|
27
|
+
if (disableCoverage) {
|
|
28
|
+
env.RB_DISABLE_COVERAGE = "1";
|
|
29
|
+
}
|
|
30
|
+
if (coverage?.enabled && !disableCoverage) {
|
|
31
|
+
const nodeCoverageDir = resolveNodeCoverageDir(combinedConfig ?? coverage.config);
|
|
32
|
+
await fs.mkdir(nodeCoverageDir, {
|
|
33
|
+
recursive: true
|
|
34
|
+
});
|
|
35
|
+
env.NODE_V8_COVERAGE = nodeCoverageDir;
|
|
36
|
+
}
|
|
37
|
+
await spawnWithLogs({
|
|
38
|
+
name: "Vitest",
|
|
39
|
+
launcher,
|
|
40
|
+
args: vitestArgs,
|
|
41
|
+
env,
|
|
42
|
+
successMessage: "Vitest suite passed!",
|
|
43
|
+
failureMessage: "Vitest failed"
|
|
44
|
+
});
|
|
45
|
+
if (coverage?.enabled && !disableCoverage) {
|
|
46
|
+
await convertNodeCoverage({
|
|
47
|
+
config: combinedConfig ?? coverage.config,
|
|
48
|
+
nodeCoverageDir: resolveNodeCoverageDir(combinedConfig ?? coverage.config)
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function resolveNodeCoverageDir(config) {
|
|
53
|
+
return path.join(config.rootDir, "build", "vitest", "test-results", "node-coverage");
|
|
54
|
+
}
|
|
55
|
+
function resolveVitestLauncher() {
|
|
56
|
+
const searchRoots = [process.cwd(), moduleDir];
|
|
57
|
+
for (const base of searchRoots) {
|
|
58
|
+
try {
|
|
59
|
+
const pkgPath = require$1.resolve("vitest/package.json", {
|
|
60
|
+
paths: [base]
|
|
61
|
+
});
|
|
62
|
+
const pkgDir = path.dirname(pkgPath);
|
|
63
|
+
const pkgJson = JSON.parse(fs$1.readFileSync(pkgPath, "utf8"));
|
|
64
|
+
const binPath = typeof pkgJson.bin === "string" ? pkgJson.bin : pkgJson.bin?.vitest;
|
|
65
|
+
if (binPath) {
|
|
66
|
+
return {
|
|
67
|
+
command: process.execPath,
|
|
68
|
+
args: [path.join(pkgDir, binPath)]
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
} catch (_error) {
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const localBin = path.resolve(process.cwd(), "node_modules/.bin/vitest");
|
|
75
|
+
if (fs$1.existsSync(localBin)) {
|
|
76
|
+
return {
|
|
77
|
+
command: localBin,
|
|
78
|
+
args: []
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
command: "vitest",
|
|
83
|
+
args: []
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function resolveVitestConfig() {
|
|
87
|
+
const userConfig = findVitestConfig(process.cwd());
|
|
88
|
+
if (userConfig) {
|
|
89
|
+
return userConfig;
|
|
90
|
+
}
|
|
91
|
+
const bundledConfig = path.join(moduleDir, "..", "vitest.config.js");
|
|
92
|
+
return fs$1.existsSync(bundledConfig) ? bundledConfig : null;
|
|
93
|
+
}
|
|
94
|
+
function findVitestConfig(baseDir) {
|
|
95
|
+
const candidates = ["vitest.config.ts", "vitest.config.js", "vitest.config.mjs"];
|
|
96
|
+
for (const file of candidates) {
|
|
97
|
+
const fullPath = path.join(baseDir, file);
|
|
98
|
+
if (fs$1.existsSync(fullPath)) {
|
|
99
|
+
return fullPath;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return null;
|
|
103
|
+
}
|
|
104
|
+
async function convertNodeCoverage(coverage) {
|
|
105
|
+
const {
|
|
106
|
+
config,
|
|
107
|
+
nodeCoverageDir
|
|
108
|
+
} = coverage;
|
|
109
|
+
const entries = await fs.readdir(nodeCoverageDir).catch(() => []);
|
|
110
|
+
const scripts = [];
|
|
111
|
+
const scriptRoots = resolveCollectCoverageRoots(config.collectCoverageFrom, config.rootDir);
|
|
112
|
+
for (const entry of entries) {
|
|
113
|
+
if (!entry.endsWith(".json")) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
const fullPath = path.join(nodeCoverageDir, entry);
|
|
117
|
+
const payload = await readJson(fullPath);
|
|
118
|
+
const results = Array.isArray(payload?.result) ? payload.result : [];
|
|
119
|
+
for (const script of results) {
|
|
120
|
+
const normalized = normalizeNodeScriptUrl(script.url, config.rootDir);
|
|
121
|
+
if (!normalized) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (isNodeModulesPath(normalized.absolutePath)) {
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
if (!isInsideAnyRoot(normalized.absolutePath, scriptRoots)) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
const source = await fs.readFile(normalized.absolutePath, "utf8").catch(() => "");
|
|
131
|
+
scripts.push({
|
|
132
|
+
absolutePath: normalized.absolutePath,
|
|
133
|
+
relativePath: normalized.relativePath,
|
|
134
|
+
source,
|
|
135
|
+
functions: script.functions ?? [],
|
|
136
|
+
url: script.url
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (scripts.length === 0) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const outDir = path.join(config.rootDir, "build", "vitest", "coverage");
|
|
144
|
+
await fs.mkdir(outDir, {
|
|
145
|
+
recursive: true
|
|
146
|
+
});
|
|
147
|
+
const outputFile = path.join(outDir, config.coverageFileName);
|
|
148
|
+
await fs.writeFile(outputFile, JSON.stringify({
|
|
149
|
+
testId: "vitest",
|
|
150
|
+
scripts
|
|
151
|
+
}, null, 2), "utf8");
|
|
152
|
+
}
|
|
153
|
+
async function readJson(filePath) {
|
|
154
|
+
try {
|
|
155
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
156
|
+
return JSON.parse(raw);
|
|
157
|
+
} catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function normalizeNodeScriptUrl(rawUrl, rootDir) {
|
|
162
|
+
if (!rawUrl || rawUrl.startsWith("node:")) {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
let absolutePath = null;
|
|
166
|
+
try {
|
|
167
|
+
if (rawUrl.startsWith("file://")) {
|
|
168
|
+
absolutePath = fileURLToPath(rawUrl);
|
|
169
|
+
}
|
|
170
|
+
} catch (_err) {
|
|
171
|
+
}
|
|
172
|
+
if (!absolutePath && path.isAbsolute(rawUrl)) {
|
|
173
|
+
absolutePath = rawUrl;
|
|
174
|
+
}
|
|
175
|
+
if (!absolutePath) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const normalized = path.normalize(absolutePath);
|
|
179
|
+
return {
|
|
180
|
+
absolutePath: normalized,
|
|
181
|
+
relativePath: path.relative(rootDir, normalized)
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
function isNodeModulesPath(filePath) {
|
|
185
|
+
return path.normalize(String(filePath ?? "")).split(path.sep).includes("node_modules");
|
|
186
|
+
}
|
|
187
|
+
export {
|
|
188
|
+
resolveNodeCoverageDir,
|
|
189
|
+
runVitest
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=vitest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vitest.js","sources":["../../src/runners/vitest.ts"],"sourcesContent":["import fs from \"node:fs\"\nimport fsPromises from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\nimport { fileURLToPath } from \"node:url\"\n\nimport { isInsideAnyRoot, resolveCollectCoverageRoots } from \"../coverage/collect\"\nimport type { CoverageConfig } from \"../coverage/types\"\nimport { spawnWithLogs, withRegisterShim, type SpawnLauncher } from \"./process\"\n\n\nconst require = createRequire(import.meta.url)\nconst moduleDir = path.dirname(fileURLToPath(import.meta.url))\n\ntype CoverageState = { config: CoverageConfig; enabled: boolean } | null\n\nexport async function runVitest(\n coverage: CoverageState,\n combinedConfig: CoverageConfig | null,\n userArgs: string[],\n { disableCoverage = false }: { disableCoverage?: boolean } = {},\n): Promise<void> {\n const vitestArgs = [\"run\", \"--passWithNoTests\"]\n const vitestConfig = resolveVitestConfig()\n\n const hasCustomConfig = userArgs.some((arg) => {\n if (arg === \"--config\" || arg === \"-c\") {\n return true\n }\n return arg.startsWith(\"--config=\")\n })\n\n if (vitestConfig && !hasCustomConfig) {\n vitestArgs.push(\"--config\", vitestConfig)\n }\n vitestArgs.push(...userArgs)\n\n const launcher = resolveVitestLauncher()\n const env = withRegisterShim(process.env)\n\n if (disableCoverage) {\n env.RB_DISABLE_COVERAGE = \"1\"\n }\n\n if (coverage?.enabled && !disableCoverage) {\n const nodeCoverageDir = resolveNodeCoverageDir(combinedConfig ?? coverage.config)\n await fsPromises.mkdir(nodeCoverageDir, { recursive: true })\n env.NODE_V8_COVERAGE = nodeCoverageDir\n }\n\n await spawnWithLogs({\n name: \"Vitest\",\n launcher,\n args: vitestArgs,\n env,\n successMessage: \"Vitest suite passed!\",\n failureMessage: \"Vitest failed\",\n })\n\n if (coverage?.enabled && !disableCoverage) {\n await convertNodeCoverage({\n config: combinedConfig ?? coverage.config,\n nodeCoverageDir: resolveNodeCoverageDir(combinedConfig ?? coverage.config),\n })\n }\n}\n\nexport function resolveNodeCoverageDir(config: CoverageConfig): string {\n return path.join(config.rootDir, \"build\", \"vitest\", \"test-results\", \"node-coverage\")\n}\n\nfunction resolveVitestLauncher(): SpawnLauncher {\n const searchRoots = [process.cwd(), moduleDir]\n\n for (const base of searchRoots) {\n try {\n const pkgPath = require.resolve(\"vitest/package.json\", { paths: [base] })\n const pkgDir = path.dirname(pkgPath)\n const pkgJson = JSON.parse(fs.readFileSync(pkgPath, \"utf8\"))\n const binPath = typeof pkgJson.bin === \"string\" ? pkgJson.bin : pkgJson.bin?.vitest\n if (binPath) {\n return {\n command: process.execPath,\n args: [path.join(pkgDir, binPath)],\n }\n }\n } catch (_error) {\n // Continue searching for a usable vitest launcher.\n }\n }\n\n const localBin = path.resolve(process.cwd(), \"node_modules/.bin/vitest\")\n if (fs.existsSync(localBin)) {\n return {\n command: localBin,\n args: [],\n }\n }\n\n return {\n command: \"vitest\",\n args: [],\n }\n}\n\nfunction resolveVitestConfig(): string | null {\n const userConfig = findVitestConfig(process.cwd())\n if (userConfig) {\n return userConfig\n }\n\n const bundledConfig = path.join(moduleDir, \"..\", \"vitest.config.js\")\n return fs.existsSync(bundledConfig) ? bundledConfig : null\n}\n\nfunction findVitestConfig(baseDir: string): string | null {\n const candidates = [\n \"vitest.config.ts\",\n \"vitest.config.js\",\n \"vitest.config.mjs\",\n ]\n\n for (const file of candidates) {\n const fullPath = path.join(baseDir, file)\n if (fs.existsSync(fullPath)) {\n return fullPath\n }\n }\n\n return null\n}\n\nasync function convertNodeCoverage(coverage: { config: CoverageConfig; nodeCoverageDir: string }): Promise<void> {\n const { config, nodeCoverageDir } = coverage\n\n const entries = await fsPromises.readdir(nodeCoverageDir).catch(() => [])\n const scripts = []\n const scriptRoots = resolveCollectCoverageRoots(config.collectCoverageFrom, config.rootDir)\n\n for (const entry of entries) {\n if (!entry.endsWith(\".json\")) {\n continue\n }\n\n const fullPath = path.join(nodeCoverageDir, entry)\n const payload = await readJson(fullPath)\n const results = Array.isArray(payload?.result) ? payload.result : []\n\n for (const script of results) {\n const normalized = normalizeNodeScriptUrl(script.url, config.rootDir)\n if (!normalized) {\n continue\n }\n\n if (isNodeModulesPath(normalized.absolutePath)) {\n continue\n }\n\n if (!isInsideAnyRoot(normalized.absolutePath, scriptRoots)) {\n continue\n }\n\n const source = await fsPromises.readFile(normalized.absolutePath, \"utf8\").catch(() => \"\")\n\n scripts.push({\n absolutePath: normalized.absolutePath,\n relativePath: normalized.relativePath,\n source,\n functions: script.functions ?? [],\n url: script.url,\n })\n }\n }\n\n if (scripts.length === 0) {\n return\n }\n\n const outDir = path.join(config.rootDir, \"build\", \"vitest\", \"coverage\")\n await fsPromises.mkdir(outDir, { recursive: true })\n const outputFile = path.join(outDir, config.coverageFileName)\n await fsPromises.writeFile(outputFile, JSON.stringify({ testId: \"vitest\", scripts }, null, 2), \"utf8\")\n}\n\nasync function readJson(filePath: string): Promise<any | null> {\n try {\n const raw = await fsPromises.readFile(filePath, \"utf8\")\n return JSON.parse(raw)\n } catch {\n return null\n }\n}\n\nfunction normalizeNodeScriptUrl(\n rawUrl: string,\n rootDir: string,\n): { absolutePath: string; relativePath: string } | null {\n if (!rawUrl || rawUrl.startsWith(\"node:\")) {\n return null\n }\n\n let absolutePath = null\n\n try {\n if (rawUrl.startsWith(\"file://\")) {\n absolutePath = fileURLToPath(rawUrl)\n }\n } catch (_err) {\n // Ignore invalid file URLs in raw coverage payloads.\n }\n\n if (!absolutePath && path.isAbsolute(rawUrl)) {\n absolutePath = rawUrl\n }\n\n if (!absolutePath) {\n return null\n }\n\n const normalized = path.normalize(absolutePath)\n\n return {\n absolutePath: normalized,\n relativePath: path.relative(rootDir, normalized),\n }\n}\n\nfunction isNodeModulesPath(filePath: unknown): boolean {\n return path\n .normalize(String(filePath ?? \"\"))\n .split(path.sep)\n .includes(\"node_modules\")\n}\n"],"names":["require","createRequire","import","url","moduleDir","path","dirname","fileURLToPath","runVitest","coverage","combinedConfig","userArgs","disableCoverage","vitestArgs","vitestConfig","resolveVitestConfig","hasCustomConfig","some","arg","startsWith","push","launcher","resolveVitestLauncher","env","withRegisterShim","process","RB_DISABLE_COVERAGE","enabled","nodeCoverageDir","resolveNodeCoverageDir","config","fsPromises","mkdir","recursive","NODE_V8_COVERAGE","spawnWithLogs","name","args","successMessage","failureMessage","convertNodeCoverage","join","rootDir","searchRoots","cwd","base","pkgPath","resolve","paths","pkgDir","pkgJson","JSON","parse","fs","readFileSync","binPath","bin","vitest","command","execPath","_error","localBin","existsSync","userConfig","findVitestConfig","bundledConfig","baseDir","candidates","file","fullPath","entries","readdir","catch","scripts","scriptRoots","resolveCollectCoverageRoots","collectCoverageFrom","entry","endsWith","payload","readJson","results","Array","isArray","result","script","normalized","normalizeNodeScriptUrl","isNodeModulesPath","absolutePath","isInsideAnyRoot","source","readFile","relativePath","functions","length","outDir","outputFile","coverageFileName","writeFile","stringify","testId","filePath","raw","rawUrl","_err","isAbsolute","normalize","relative","String","split","sep","includes"],"mappings":"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"}
|