@rpcbase/test 0.357.0 → 0.359.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/clearDatabase.js +12 -10
- package/dist/clearDatabase.js.map +1 -1
- package/dist/cli.js +556 -439
- package/dist/cli.js.map +1 -1
- package/dist/coverage/collect.js +101 -63
- package/dist/coverage/collect.js.map +1 -1
- package/dist/coverage/config-loader.js +230 -180
- package/dist/coverage/config-loader.js.map +1 -1
- package/dist/coverage/config.js +100 -76
- package/dist/coverage/config.js.map +1 -1
- package/dist/coverage/console-text-report.js +220 -175
- package/dist/coverage/console-text-report.js.map +1 -1
- package/dist/coverage/files.js +58 -45
- package/dist/coverage/files.js.map +1 -1
- package/dist/coverage/fixtures.js +38 -27
- package/dist/coverage/fixtures.js.map +1 -1
- package/dist/coverage/global-setup.js +18 -15
- package/dist/coverage/global-setup.js.map +1 -1
- package/dist/coverage/index.js +55 -38
- package/dist/coverage/index.js.map +1 -1
- package/dist/coverage/report.js +466 -341
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/reporter.js +60 -47
- package/dist/coverage/reporter.js.map +1 -1
- package/dist/coverage/v8-tracker.js +147 -115
- package/dist/coverage/v8-tracker.js.map +1 -1
- package/dist/index.js +75 -46
- package/dist/index.js.map +1 -1
- package/dist/runners/playwright.js +563 -438
- package/dist/runners/playwright.js.map +1 -1
- package/dist/runners/process.d.ts.map +1 -1
- package/dist/runners/process.js +183 -125
- package/dist/runners/process.js.map +1 -1
- package/dist/runners/vitest.js +171 -124
- package/dist/runners/vitest.js.map +1 -1
- package/dist/serverCoverage.js +42 -28
- package/dist/serverCoverage.js.map +1 -1
- package/dist/vitest.config.d.ts +1 -1
- package/dist/vitest.config.js +74 -62
- package/dist/vitest.config.js.map +1 -1
- package/package.json +4 -4
package/dist/runners/vitest.js
CHANGED
|
@@ -1,144 +1,191 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import fsPromises from "node:fs/promises";
|
|
4
|
-
import fs from "node:fs";
|
|
1
|
+
import fs$1 from "node:fs";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
5
3
|
import path from "node:path";
|
|
6
4
|
import { createRequire } from "node:module";
|
|
7
5
|
import { fileURLToPath } from "node:url";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
+
}
|
|
40
51
|
}
|
|
41
52
|
function resolveNodeCoverageDir(config) {
|
|
42
|
-
|
|
53
|
+
return path.join(config.rootDir, "build", "vitest", "test-results", "node-coverage");
|
|
43
54
|
}
|
|
44
55
|
function resolveVitestLauncher() {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
+
};
|
|
65
85
|
}
|
|
66
86
|
function resolveVitestConfig() {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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;
|
|
71
93
|
}
|
|
72
94
|
function findVitestConfig(baseDir) {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
return null;
|
|
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;
|
|
82
103
|
}
|
|
83
104
|
async function convertNodeCoverage(coverage) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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");
|
|
115
152
|
}
|
|
116
153
|
async function readJson(filePath) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
154
|
+
try {
|
|
155
|
+
const raw = await fs.readFile(filePath, "utf8");
|
|
156
|
+
return JSON.parse(raw);
|
|
157
|
+
} catch {
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
123
160
|
}
|
|
124
161
|
function normalizeNodeScriptUrl(rawUrl, rootDir) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
+
};
|
|
137
183
|
}
|
|
138
184
|
function isNodeModulesPath(filePath) {
|
|
139
|
-
|
|
185
|
+
return path.normalize(String(filePath ?? "")).split(path.sep).includes("node_modules");
|
|
140
186
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
187
|
+
export {
|
|
188
|
+
resolveNodeCoverageDir,
|
|
189
|
+
runVitest
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=vitest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vitest.js","names":["fs","fsPromises","path","createRequire","fileURLToPath","isInsideAnyRoot","resolveCollectCoverageRoots","CoverageConfig","spawnWithLogs","withRegisterShim","SpawnLauncher","require","import","meta","url","moduleDir","dirname","CoverageState","config","enabled","runVitest","coverage","combinedConfig","userArgs","disableCoverage","Promise","vitestArgs","vitestConfig","resolveVitestConfig","hasCustomConfig","some","arg","startsWith","push","launcher","resolveVitestLauncher","env","process","RB_DISABLE_COVERAGE","nodeCoverageDir","resolveNodeCoverageDir","mkdir","recursive","NODE_V8_COVERAGE","name","args","successMessage","failureMessage","convertNodeCoverage","join","rootDir","searchRoots","cwd","base","pkgPath","resolve","paths","pkgDir","pkgJson","JSON","parse","readFileSync","binPath","bin","vitest","command","execPath","_error","localBin","existsSync","userConfig","findVitestConfig","bundledConfig","baseDir","candidates","file","fullPath","entries","readdir","catch","scripts","scriptRoots","collectCoverageFrom","entry","endsWith","payload","readJson","results","Array","isArray","result","script","normalized","normalizeNodeScriptUrl","isNodeModulesPath","absolutePath","source","readFile","relativePath","functions","length","outDir","outputFile","coverageFileName","writeFile","stringify","testId","filePath","raw","rawUrl","_err","isAbsolute","normalize","relative","String","split","sep","includes"],"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"],"mappings":"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"}
|
|
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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"}
|
package/dist/serverCoverage.js
CHANGED
|
@@ -1,32 +1,46 @@
|
|
|
1
|
-
//#region src/serverCoverage.ts
|
|
2
1
|
async function setupServerCoverage(config, options = {}) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
2
|
+
if (process.env.RB_DISABLE_COVERAGE === "1") {
|
|
3
|
+
return async () => {
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
const strict = options.strict ?? true;
|
|
7
|
+
const baseURL = resolveBaseURL(config, options, strict);
|
|
8
|
+
if (!baseURL) {
|
|
9
|
+
return async () => {
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
const startResponse = await fetch(`${baseURL}/api/dev/coverage/start`, {
|
|
13
|
+
method: "POST"
|
|
14
|
+
});
|
|
15
|
+
if (!startResponse.ok) {
|
|
16
|
+
const body = await startResponse.text().catch(() => "");
|
|
17
|
+
if (!strict) {
|
|
18
|
+
return async () => {
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
throw new Error(`Failed to start server coverage: ${startResponse.status} ${body}`);
|
|
22
|
+
}
|
|
23
|
+
return async function stopCoverage() {
|
|
24
|
+
const stopResponse = await fetch(`${baseURL}/api/dev/coverage/stop`, {
|
|
25
|
+
method: "POST"
|
|
26
|
+
});
|
|
27
|
+
if (!stopResponse.ok) {
|
|
28
|
+
const body = await stopResponse.text().catch(() => "");
|
|
29
|
+
throw new Error(`Failed to stop server coverage: ${stopResponse.status} ${body}`);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
20
32
|
}
|
|
21
33
|
function resolveBaseURL(config, options, strict) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
34
|
+
const raw = options.baseURL ?? config.projects?.[0]?.use?.baseURL ?? (process.env.PORT ? `http://localhost:${process.env.PORT}` : null);
|
|
35
|
+
if (typeof raw !== "string" || !raw.trim()) {
|
|
36
|
+
if (!strict) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
throw new Error("Cannot resolve Playwright baseURL (missing config.projects[0].use.baseURL and PORT)");
|
|
40
|
+
}
|
|
41
|
+
return raw.replace(/\/$/, "");
|
|
28
42
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=serverCoverage.js.map
|
|
43
|
+
export {
|
|
44
|
+
setupServerCoverage
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=serverCoverage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serverCoverage.js","
|
|
1
|
+
{"version":3,"file":"serverCoverage.js","sources":["../src/serverCoverage.ts"],"sourcesContent":["import type { FullConfig } from \"@playwright/test\"\n\n\ntype SetupServerCoverageOptions = {\n baseURL?: string\n strict?: boolean\n}\n\nexport async function setupServerCoverage(\n config: FullConfig,\n options: SetupServerCoverageOptions = {},\n): Promise<() => Promise<void>> {\n if (process.env.RB_DISABLE_COVERAGE === \"1\") {\n return async () => {}\n }\n\n const strict = options.strict ?? true\n const baseURL = resolveBaseURL(config, options, strict)\n if (!baseURL) {\n return async () => {}\n }\n\n const startResponse = await fetch(`${baseURL}/api/dev/coverage/start`, { method: \"POST\" })\n if (!startResponse.ok) {\n const body = await startResponse.text().catch(() => \"\")\n if (!strict) {\n return async () => {}\n }\n throw new Error(`Failed to start server coverage: ${startResponse.status} ${body}`)\n }\n\n return async function stopCoverage(): Promise<void> {\n const stopResponse = await fetch(`${baseURL}/api/dev/coverage/stop`, { method: \"POST\" })\n if (!stopResponse.ok) {\n const body = await stopResponse.text().catch(() => \"\")\n throw new Error(`Failed to stop server coverage: ${stopResponse.status} ${body}`)\n }\n }\n}\n\nfunction resolveBaseURL(config: FullConfig, options: SetupServerCoverageOptions, strict: boolean): string | null {\n const raw = options.baseURL ?? (config.projects?.[0]?.use as any)?.baseURL\n ?? (process.env.PORT ? `http://localhost:${process.env.PORT}` : null)\n\n if (typeof raw !== \"string\" || !raw.trim()) {\n if (!strict) {\n return null\n }\n throw new Error(\"Cannot resolve Playwright baseURL (missing config.projects[0].use.baseURL and PORT)\")\n }\n\n return raw.replace(/\\/$/, \"\")\n}\n"],"names":["setupServerCoverage","config","options","process","env","RB_DISABLE_COVERAGE","strict","baseURL","resolveBaseURL","startResponse","fetch","method","ok","body","text","catch","Error","status","stopCoverage","stopResponse","raw","projects","use","PORT","trim","replace"],"mappings":"AAQA,eAAsBA,oBACpBC,QACAC,UAAsC,IACR;AAC9B,MAAIC,QAAQC,IAAIC,wBAAwB,KAAK;AAC3C,WAAO,YAAY;AAAA,IAAC;AAAA,EACtB;AAEA,QAAMC,SAASJ,QAAQI,UAAU;AACjC,QAAMC,UAAUC,eAAeP,QAAQC,SAASI,MAAM;AACtD,MAAI,CAACC,SAAS;AACZ,WAAO,YAAY;AAAA,IAAC;AAAA,EACtB;AAEA,QAAME,gBAAgB,MAAMC,MAAM,GAAGH,OAAO,2BAA2B;AAAA,IAAEI,QAAQ;AAAA,EAAA,CAAQ;AACzF,MAAI,CAACF,cAAcG,IAAI;AACrB,UAAMC,OAAO,MAAMJ,cAAcK,OAAOC,MAAM,MAAM,EAAE;AACtD,QAAI,CAACT,QAAQ;AACX,aAAO,YAAY;AAAA,MAAC;AAAA,IACtB;AACA,UAAM,IAAIU,MAAM,oCAAoCP,cAAcQ,MAAM,IAAIJ,IAAI,EAAE;AAAA,EACpF;AAEA,SAAO,eAAeK,eAA8B;AAClD,UAAMC,eAAe,MAAMT,MAAM,GAAGH,OAAO,0BAA0B;AAAA,MAAEI,QAAQ;AAAA,IAAA,CAAQ;AACvF,QAAI,CAACQ,aAAaP,IAAI;AACpB,YAAMC,OAAO,MAAMM,aAAaL,OAAOC,MAAM,MAAM,EAAE;AACrD,YAAM,IAAIC,MAAM,mCAAmCG,aAAaF,MAAM,IAAIJ,IAAI,EAAE;AAAA,IAClF;AAAA,EACF;AACF;AAEA,SAASL,eAAeP,QAAoBC,SAAqCI,QAAgC;AAC/G,QAAMc,MAAMlB,QAAQK,WAAYN,OAAOoB,WAAW,CAAC,GAAGC,KAAaf,YAC7DJ,QAAQC,IAAImB,OAAO,oBAAoBpB,QAAQC,IAAImB,IAAI,KAAK;AAElE,MAAI,OAAOH,QAAQ,YAAY,CAACA,IAAII,QAAQ;AAC1C,QAAI,CAAClB,QAAQ;AACX,aAAO;AAAA,IACT;AACA,UAAM,IAAIU,MAAM,qFAAqF;AAAA,EACvG;AAEA,SAAOI,IAAIK,QAAQ,OAAO,EAAE;AAC9B;"}
|
package/dist/vitest.config.d.ts
CHANGED
package/dist/vitest.config.js
CHANGED
|
@@ -1,71 +1,83 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
1
|
import path from "node:path";
|
|
2
|
+
import fs from "node:fs";
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import { defineConfig } from "vitest/config";
|
|
5
|
-
|
|
6
|
-
var require = createRequire(import.meta.url);
|
|
5
|
+
const require$1 = createRequire(import.meta.url);
|
|
7
6
|
function escapeRegex(str) {
|
|
8
|
-
|
|
7
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
9
8
|
}
|
|
10
9
|
function loadTsconfig() {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
10
|
+
let ts;
|
|
11
|
+
try {
|
|
12
|
+
ts = require$1("typescript");
|
|
13
|
+
} catch (_err) {
|
|
14
|
+
throw new Error("@rpcbase/test: TypeScript is required to resolve path aliases. Please add it as a devDependency.");
|
|
15
|
+
}
|
|
16
|
+
const cwd = process.cwd();
|
|
17
|
+
const configPath = ts.findConfigFile(cwd, ts.sys.fileExists, "tsconfig.json") || ts.findConfigFile(cwd, ts.sys.fileExists, "tsconfig.base.json");
|
|
18
|
+
if (!configPath) {
|
|
19
|
+
throw new Error("@rpcbase/test: no tsconfig found for alias resolution");
|
|
20
|
+
}
|
|
21
|
+
const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
|
|
22
|
+
if (configFile.error) {
|
|
23
|
+
throw new Error(`@rpcbase/test: unable to read tsconfig at ${configPath}`);
|
|
24
|
+
}
|
|
25
|
+
const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.dirname(configPath));
|
|
26
|
+
return {
|
|
27
|
+
path: configPath,
|
|
28
|
+
baseUrl: parsed.options?.baseUrl ? path.resolve(path.dirname(configPath), parsed.options.baseUrl) : path.dirname(configPath),
|
|
29
|
+
paths: parsed.options?.paths
|
|
30
|
+
};
|
|
28
31
|
}
|
|
29
|
-
function pathsToAlias(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
32
|
+
function pathsToAlias(tsconfig2) {
|
|
33
|
+
const paths = tsconfig2?.paths;
|
|
34
|
+
if (!paths) return [];
|
|
35
|
+
const baseUrl = tsconfig2.baseUrl || path.dirname(tsconfig2.path);
|
|
36
|
+
const alias2 = [];
|
|
37
|
+
for (const [key, targets] of Object.entries(paths)) {
|
|
38
|
+
if (!Array.isArray(targets)) continue;
|
|
39
|
+
for (const target of targets) {
|
|
40
|
+
if (key.includes("*") && target.includes("*")) {
|
|
41
|
+
const wildcardPattern = target.endsWith("*") ? "(.+)" : "([^/]+)";
|
|
42
|
+
const find2 = new RegExp(`^${escapeRegex(key).split("\\*").join(wildcardPattern)}$`);
|
|
43
|
+
let groupIndex = 0;
|
|
44
|
+
const replacedTarget = target.replace(/\*/g, () => `$${++groupIndex}`);
|
|
45
|
+
const replacement2 = path.resolve(baseUrl, replacedTarget);
|
|
46
|
+
const checkPath = replacement2.replace(/\$\\d+/g, "");
|
|
47
|
+
if (checkPath.includes(`${path.sep}node_modules${path.sep}`) && !fs.existsSync(checkPath)) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
alias2.push({
|
|
51
|
+
find: find2,
|
|
52
|
+
replacement: replacement2
|
|
53
|
+
});
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
const find = key.replace(/\*$/, "");
|
|
57
|
+
const cleanTarget = target.replace(/\*$/, "");
|
|
58
|
+
const replacement = path.resolve(baseUrl, cleanTarget);
|
|
59
|
+
if (replacement.includes(`${path.sep}node_modules${path.sep}`) && !fs.existsSync(replacement)) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
alias2.push({
|
|
63
|
+
find,
|
|
64
|
+
replacement
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return alias2;
|
|
62
69
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
70
|
+
const tsconfig = loadTsconfig();
|
|
71
|
+
const alias = pathsToAlias(tsconfig);
|
|
72
|
+
const vitest_config = defineConfig({
|
|
73
|
+
test: {
|
|
74
|
+
include: ["{src,lib}/**/*.test.{js,ts,tsx}"]
|
|
75
|
+
},
|
|
76
|
+
resolve: alias.length > 0 ? {
|
|
77
|
+
alias
|
|
78
|
+
} : void 0
|
|
67
79
|
});
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
//# sourceMappingURL=vitest.config.js.map
|
|
80
|
+
export {
|
|
81
|
+
vitest_config as default
|
|
82
|
+
};
|
|
83
|
+
//# sourceMappingURL=vitest.config.js.map
|