@rpcbase/test 0.357.0 → 0.358.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 (41) hide show
  1. package/dist/clearDatabase.js +12 -10
  2. package/dist/clearDatabase.js.map +1 -1
  3. package/dist/cli.js +556 -439
  4. package/dist/cli.js.map +1 -1
  5. package/dist/coverage/collect.js +101 -63
  6. package/dist/coverage/collect.js.map +1 -1
  7. package/dist/coverage/config-loader.js +230 -180
  8. package/dist/coverage/config-loader.js.map +1 -1
  9. package/dist/coverage/config.js +100 -76
  10. package/dist/coverage/config.js.map +1 -1
  11. package/dist/coverage/console-text-report.js +220 -175
  12. package/dist/coverage/console-text-report.js.map +1 -1
  13. package/dist/coverage/files.js +58 -45
  14. package/dist/coverage/files.js.map +1 -1
  15. package/dist/coverage/fixtures.js +38 -27
  16. package/dist/coverage/fixtures.js.map +1 -1
  17. package/dist/coverage/global-setup.js +18 -15
  18. package/dist/coverage/global-setup.js.map +1 -1
  19. package/dist/coverage/index.js +55 -38
  20. package/dist/coverage/index.js.map +1 -1
  21. package/dist/coverage/report.js +466 -341
  22. package/dist/coverage/report.js.map +1 -1
  23. package/dist/coverage/reporter.js +60 -47
  24. package/dist/coverage/reporter.js.map +1 -1
  25. package/dist/coverage/v8-tracker.js +147 -115
  26. package/dist/coverage/v8-tracker.js.map +1 -1
  27. package/dist/index.js +75 -46
  28. package/dist/index.js.map +1 -1
  29. package/dist/runners/playwright.js +563 -438
  30. package/dist/runners/playwright.js.map +1 -1
  31. package/dist/runners/process.d.ts.map +1 -1
  32. package/dist/runners/process.js +183 -125
  33. package/dist/runners/process.js.map +1 -1
  34. package/dist/runners/vitest.js +171 -124
  35. package/dist/runners/vitest.js.map +1 -1
  36. package/dist/serverCoverage.js +42 -28
  37. package/dist/serverCoverage.js.map +1 -1
  38. package/dist/vitest.config.d.ts +1 -1
  39. package/dist/vitest.config.js +74 -62
  40. package/dist/vitest.config.js.map +1 -1
  41. package/package.json +6 -6
@@ -1,144 +1,191 @@
1
- import { isInsideAnyRoot, resolveCollectCoverageRoots } from "../coverage/collect.js";
2
- import { spawnWithLogs, withRegisterShim } from "./process.js";
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
- //#region src/runners/vitest.ts
9
- var require = createRequire(import.meta.url);
10
- var moduleDir = path.dirname(fileURLToPath(import.meta.url));
11
- async function runVitest(coverage, combinedConfig, userArgs, { disableCoverage = false } = {}) {
12
- const vitestArgs = ["run", "--passWithNoTests"];
13
- const vitestConfig = resolveVitestConfig();
14
- const hasCustomConfig = userArgs.some((arg) => {
15
- if (arg === "--config" || arg === "-c") return true;
16
- return arg.startsWith("--config=");
17
- });
18
- if (vitestConfig && !hasCustomConfig) vitestArgs.push("--config", vitestConfig);
19
- vitestArgs.push(...userArgs);
20
- const launcher = resolveVitestLauncher();
21
- const env = withRegisterShim(process.env);
22
- if (disableCoverage) env.RB_DISABLE_COVERAGE = "1";
23
- if (coverage?.enabled && !disableCoverage) {
24
- const nodeCoverageDir = resolveNodeCoverageDir(combinedConfig ?? coverage.config);
25
- await fsPromises.mkdir(nodeCoverageDir, { recursive: true });
26
- env.NODE_V8_COVERAGE = nodeCoverageDir;
27
- }
28
- await spawnWithLogs({
29
- name: "Vitest",
30
- launcher,
31
- args: vitestArgs,
32
- env,
33
- successMessage: "Vitest suite passed!",
34
- failureMessage: "Vitest failed"
35
- });
36
- if (coverage?.enabled && !disableCoverage) await convertNodeCoverage({
37
- config: combinedConfig ?? coverage.config,
38
- nodeCoverageDir: resolveNodeCoverageDir(combinedConfig ?? coverage.config)
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
- return path.join(config.rootDir, "build", "vitest", "test-results", "node-coverage");
53
+ return path.join(config.rootDir, "build", "vitest", "test-results", "node-coverage");
43
54
  }
44
55
  function resolveVitestLauncher() {
45
- const searchRoots = [process.cwd(), moduleDir];
46
- for (const base of searchRoots) try {
47
- const pkgPath = require.resolve("vitest/package.json", { paths: [base] });
48
- const pkgDir = path.dirname(pkgPath);
49
- const pkgJson = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
50
- const binPath = typeof pkgJson.bin === "string" ? pkgJson.bin : pkgJson.bin?.vitest;
51
- if (binPath) return {
52
- command: process.execPath,
53
- args: [path.join(pkgDir, binPath)]
54
- };
55
- } catch (_error) {}
56
- const localBin = path.resolve(process.cwd(), "node_modules/.bin/vitest");
57
- if (fs.existsSync(localBin)) return {
58
- command: localBin,
59
- args: []
60
- };
61
- return {
62
- command: "vitest",
63
- args: []
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
- const userConfig = findVitestConfig(process.cwd());
68
- if (userConfig) return userConfig;
69
- const bundledConfig = path.join(moduleDir, "..", "vitest.config.js");
70
- return fs.existsSync(bundledConfig) ? bundledConfig : null;
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
- for (const file of [
74
- "vitest.config.ts",
75
- "vitest.config.js",
76
- "vitest.config.mjs"
77
- ]) {
78
- const fullPath = path.join(baseDir, file);
79
- if (fs.existsSync(fullPath)) return fullPath;
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
- const { config, nodeCoverageDir } = coverage;
85
- const entries = await fsPromises.readdir(nodeCoverageDir).catch(() => []);
86
- const scripts = [];
87
- const scriptRoots = resolveCollectCoverageRoots(config.collectCoverageFrom, config.rootDir);
88
- for (const entry of entries) {
89
- if (!entry.endsWith(".json")) continue;
90
- const payload = await readJson(path.join(nodeCoverageDir, entry));
91
- const results = Array.isArray(payload?.result) ? payload.result : [];
92
- for (const script of results) {
93
- const normalized = normalizeNodeScriptUrl(script.url, config.rootDir);
94
- if (!normalized) continue;
95
- if (isNodeModulesPath(normalized.absolutePath)) continue;
96
- if (!isInsideAnyRoot(normalized.absolutePath, scriptRoots)) continue;
97
- const source = await fsPromises.readFile(normalized.absolutePath, "utf8").catch(() => "");
98
- scripts.push({
99
- absolutePath: normalized.absolutePath,
100
- relativePath: normalized.relativePath,
101
- source,
102
- functions: script.functions ?? [],
103
- url: script.url
104
- });
105
- }
106
- }
107
- if (scripts.length === 0) return;
108
- const outDir = path.join(config.rootDir, "build", "vitest", "coverage");
109
- await fsPromises.mkdir(outDir, { recursive: true });
110
- const outputFile = path.join(outDir, config.coverageFileName);
111
- await fsPromises.writeFile(outputFile, JSON.stringify({
112
- testId: "vitest",
113
- scripts
114
- }, null, 2), "utf8");
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
- try {
118
- const raw = await fsPromises.readFile(filePath, "utf8");
119
- return JSON.parse(raw);
120
- } catch {
121
- return null;
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
- if (!rawUrl || rawUrl.startsWith("node:")) return null;
126
- let absolutePath = null;
127
- try {
128
- if (rawUrl.startsWith("file://")) absolutePath = fileURLToPath(rawUrl);
129
- } catch (_err) {}
130
- if (!absolutePath && path.isAbsolute(rawUrl)) absolutePath = rawUrl;
131
- if (!absolutePath) return null;
132
- const normalized = path.normalize(absolutePath);
133
- return {
134
- absolutePath: normalized,
135
- relativePath: path.relative(rootDir, normalized)
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
- return path.normalize(String(filePath ?? "")).split(path.sep).includes("node_modules");
185
+ return path.normalize(String(filePath ?? "")).split(path.sep).includes("node_modules");
140
186
  }
141
- //#endregion
142
- export { resolveNodeCoverageDir, runVitest };
143
-
144
- //# sourceMappingURL=vitest.js.map
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":";;;;;;;AAWA,MAAMA,YAAUC,cAAcC,YAAYC,GAAG;AAC7C,MAAMC,YAAYC,KAAKC,QAAQC,cAAcL,YAAYC,GAAG,CAAC;AAI7D,eAAsBK,UACpBC,UACAC,gBACAC,UACA;AAAA,EAAEC,kBAAkB;AAAqC,IAAI,IAC9C;AACf,QAAMC,aAAa,CAAC,OAAO,mBAAmB;AAC9C,QAAMC,eAAeC,oBAAAA;AAErB,QAAMC,kBAAkBL,SAASM,KAAMC,CAAAA,QAAQ;AAC7C,QAAIA,QAAQ,cAAcA,QAAQ,MAAM;AACtC,aAAO;AAAA,IACT;AACA,WAAOA,IAAIC,WAAW,WAAW;AAAA,EACnC,CAAC;AAED,MAAIL,gBAAgB,CAACE,iBAAiB;AACpCH,eAAWO,KAAK,YAAYN,YAAY;AAAA,EAC1C;AACAD,aAAWO,KAAK,GAAGT,QAAQ;AAE3B,QAAMU,WAAWC,sBAAAA;AACjB,QAAMC,MAAMC,iBAAiBC,QAAQF,GAAG;AAExC,MAAIX,iBAAiB;AACnBW,QAAIG,sBAAsB;AAAA,EAC5B;AAEA,MAAIjB,UAAUkB,WAAW,CAACf,iBAAiB;AACzC,UAAMgB,kBAAkBC,uBAAuBnB,kBAAkBD,SAASqB,MAAM;AAChF,UAAMC,GAAWC,MAAMJ,iBAAiB;AAAA,MAAEK,WAAW;AAAA,IAAA,CAAM;AAC3DV,QAAIW,mBAAmBN;AAAAA,EACzB;AAEA,QAAMO,cAAc;AAAA,IAClBC,MAAM;AAAA,IACNf;AAAAA,IACAgB,MAAMxB;AAAAA,IACNU;AAAAA,IACAe,gBAAgB;AAAA,IAChBC,gBAAgB;AAAA,EAAA,CACjB;AAED,MAAI9B,UAAUkB,WAAW,CAACf,iBAAiB;AACzC,UAAM4B,oBAAoB;AAAA,MACxBV,QAAQpB,kBAAkBD,SAASqB;AAAAA,MACnCF,iBAAiBC,uBAAuBnB,kBAAkBD,SAASqB,MAAM;AAAA,IAAA,CAC1E;AAAA,EACH;AACF;AAEO,SAASD,uBAAuBC,QAAgC;AACrE,SAAOzB,KAAKoC,KAAKX,OAAOY,SAAS,SAAS,UAAU,gBAAgB,eAAe;AACrF;AAEA,SAASpB,wBAAuC;AAC9C,QAAMqB,cAAc,CAAClB,QAAQmB,IAAAA,GAAOxC,SAAS;AAE7C,aAAWyC,QAAQF,aAAa;AAC9B,QAAI;AACF,YAAMG,UAAU9C,UAAQ+C,QAAQ,uBAAuB;AAAA,QAAEC,OAAO,CAACH,IAAI;AAAA,MAAA,CAAG;AACxE,YAAMI,SAAS5C,KAAKC,QAAQwC,OAAO;AACnC,YAAMI,UAAUC,KAAKC,MAAMC,KAAGC,aAAaR,SAAS,MAAM,CAAC;AAC3D,YAAMS,UAAU,OAAOL,QAAQM,QAAQ,WAAWN,QAAQM,MAAMN,QAAQM,KAAKC;AAC7E,UAAIF,SAAS;AACX,eAAO;AAAA,UACLG,SAASjC,QAAQkC;AAAAA,UACjBtB,MAAM,CAAChC,KAAKoC,KAAKQ,QAAQM,OAAO,CAAC;AAAA,QAAA;AAAA,MAErC;AAAA,IACF,SAASK,QAAQ;AAAA,IACf;AAAA,EAEJ;AAEA,QAAMC,WAAWxD,KAAK0C,QAAQtB,QAAQmB,IAAAA,GAAO,0BAA0B;AACvE,MAAIS,KAAGS,WAAWD,QAAQ,GAAG;AAC3B,WAAO;AAAA,MACLH,SAASG;AAAAA,MACTxB,MAAM,CAAA;AAAA,IAAA;AAAA,EAEV;AAEA,SAAO;AAAA,IACLqB,SAAS;AAAA,IACTrB,MAAM,CAAA;AAAA,EAAA;AAEV;AAEA,SAAStB,sBAAqC;AAC5C,QAAMgD,aAAaC,iBAAiBvC,QAAQmB,IAAAA,CAAK;AACjD,MAAImB,YAAY;AACd,WAAOA;AAAAA,EACT;AAEA,QAAME,gBAAgB5D,KAAKoC,KAAKrC,WAAW,MAAM,kBAAkB;AACnE,SAAOiD,KAAGS,WAAWG,aAAa,IAAIA,gBAAgB;AACxD;AAEA,SAASD,iBAAiBE,SAAgC;AACxD,QAAMC,aAAa,CACjB,oBACA,oBACA,mBAAmB;AAGrB,aAAWC,QAAQD,YAAY;AAC7B,UAAME,WAAWhE,KAAKoC,KAAKyB,SAASE,IAAI;AACxC,QAAIf,KAAGS,WAAWO,QAAQ,GAAG;AAC3B,aAAOA;AAAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe7B,oBAAoB/B,UAA8E;AAC/G,QAAM;AAAA,IAAEqB;AAAAA,IAAQF;AAAAA,EAAAA,IAAoBnB;AAEpC,QAAM6D,UAAU,MAAMvC,GAAWwC,QAAQ3C,eAAe,EAAE4C,MAAM,MAAM,EAAE;AACxE,QAAMC,UAAU,CAAA;AAChB,QAAMC,cAAcC,4BAA4B7C,OAAO8C,qBAAqB9C,OAAOY,OAAO;AAE1F,aAAWmC,SAASP,SAAS;AAC3B,QAAI,CAACO,MAAMC,SAAS,OAAO,GAAG;AAC5B;AAAA,IACF;AAEA,UAAMT,WAAWhE,KAAKoC,KAAKb,iBAAiBiD,KAAK;AACjD,UAAME,UAAU,MAAMC,SAASX,QAAQ;AACvC,UAAMY,UAAUC,MAAMC,QAAQJ,SAASK,MAAM,IAAIL,QAAQK,SAAS,CAAA;AAElE,eAAWC,UAAUJ,SAAS;AAC5B,YAAMK,aAAaC,uBAAuBF,OAAOlF,KAAK2B,OAAOY,OAAO;AACpE,UAAI,CAAC4C,YAAY;AACf;AAAA,MACF;AAEA,UAAIE,kBAAkBF,WAAWG,YAAY,GAAG;AAC9C;AAAA,MACF;AAEA,UAAI,CAACC,gBAAgBJ,WAAWG,cAAcf,WAAW,GAAG;AAC1D;AAAA,MACF;AAEA,YAAMiB,SAAS,MAAM5D,GAAW6D,SAASN,WAAWG,cAAc,MAAM,EAAEjB,MAAM,MAAM,EAAE;AAExFC,cAAQrD,KAAK;AAAA,QACXqE,cAAcH,WAAWG;AAAAA,QACzBI,cAAcP,WAAWO;AAAAA,QACzBF;AAAAA,QACAG,WAAWT,OAAOS,aAAa,CAAA;AAAA,QAC/B3F,KAAKkF,OAAOlF;AAAAA,MAAAA,CACb;AAAA,IACH;AAAA,EACF;AAEA,MAAIsE,QAAQsB,WAAW,GAAG;AACxB;AAAA,EACF;AAEA,QAAMC,SAAS3F,KAAKoC,KAAKX,OAAOY,SAAS,SAAS,UAAU,UAAU;AACtE,QAAMX,GAAWC,MAAMgE,QAAQ;AAAA,IAAE/D,WAAW;AAAA,EAAA,CAAM;AAClD,QAAMgE,aAAa5F,KAAKoC,KAAKuD,QAAQlE,OAAOoE,gBAAgB;AAC5D,QAAMnE,GAAWoE,UAAUF,YAAY9C,KAAKiD,UAAU;AAAA,IAAEC,QAAQ;AAAA,IAAU5B;AAAAA,EAAAA,GAAW,MAAM,CAAC,GAAG,MAAM;AACvG;AAEA,eAAeO,SAASsB,UAAuC;AAC7D,MAAI;AACF,UAAMC,MAAM,MAAMxE,GAAW6D,SAASU,UAAU,MAAM;AACtD,WAAOnD,KAAKC,MAAMmD,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAShB,uBACPiB,QACA9D,SACuD;AACvD,MAAI,CAAC8D,UAAUA,OAAOrF,WAAW,OAAO,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,MAAIsE,eAAe;AAEnB,MAAI;AACF,QAAIe,OAAOrF,WAAW,SAAS,GAAG;AAChCsE,qBAAelF,cAAciG,MAAM;AAAA,IACrC;AAAA,EACF,SAASC,MAAM;AAAA,EACb;AAGF,MAAI,CAAChB,gBAAgBpF,KAAKqG,WAAWF,MAAM,GAAG;AAC5Cf,mBAAee;AAAAA,EACjB;AAEA,MAAI,CAACf,cAAc;AACjB,WAAO;AAAA,EACT;AAEA,QAAMH,aAAajF,KAAKsG,UAAUlB,YAAY;AAE9C,SAAO;AAAA,IACLA,cAAcH;AAAAA,IACdO,cAAcxF,KAAKuG,SAASlE,SAAS4C,UAAU;AAAA,EAAA;AAEnD;AAEA,SAASE,kBAAkBc,UAA4B;AACrD,SAAOjG,KACJsG,UAAUE,OAAOP,YAAY,EAAE,CAAC,EAChCQ,MAAMzG,KAAK0G,GAAG,EACdC,SAAS,cAAc;AAC5B;"}
@@ -1,32 +1,46 @@
1
- //#region src/serverCoverage.ts
2
1
  async function setupServerCoverage(config, options = {}) {
3
- if (process.env.RB_DISABLE_COVERAGE === "1") return async () => {};
4
- const strict = options.strict ?? true;
5
- const baseURL = resolveBaseURL(config, options, strict);
6
- if (!baseURL) return async () => {};
7
- const startResponse = await fetch(`${baseURL}/api/dev/coverage/start`, { method: "POST" });
8
- if (!startResponse.ok) {
9
- const body = await startResponse.text().catch(() => "");
10
- if (!strict) return async () => {};
11
- throw new Error(`Failed to start server coverage: ${startResponse.status} ${body}`);
12
- }
13
- return async function stopCoverage() {
14
- const stopResponse = await fetch(`${baseURL}/api/dev/coverage/stop`, { method: "POST" });
15
- if (!stopResponse.ok) {
16
- const body = await stopResponse.text().catch(() => "");
17
- throw new Error(`Failed to stop server coverage: ${stopResponse.status} ${body}`);
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
- const raw = options.baseURL ?? (config.projects?.[0]?.use)?.baseURL ?? (process.env.PORT ? `http://localhost:${process.env.PORT}` : null);
23
- if (typeof raw !== "string" || !raw.trim()) {
24
- if (!strict) return null;
25
- throw new Error("Cannot resolve Playwright baseURL (missing config.projects[0].use.baseURL and PORT)");
26
- }
27
- return raw.replace(/\/$/, "");
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
- //#endregion
30
- export { setupServerCoverage };
31
-
32
- //# sourceMappingURL=serverCoverage.js.map
43
+ export {
44
+ setupServerCoverage
45
+ };
46
+ //# sourceMappingURL=serverCoverage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"serverCoverage.js","names":["FullConfig","SetupServerCoverageOptions","baseURL","strict","setupServerCoverage","config","options","Promise","process","env","RB_DISABLE_COVERAGE","resolveBaseURL","startResponse","fetch","method","ok","body","text","catch","Error","status","stopCoverage","stopResponse","raw","projects","use","PORT","trim","replace"],"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"],"mappings":";AAQA,eAAsBI,oBACpBC,QACAC,UAAsC,EAAE,EACV;AAC9B,KAAIE,QAAQC,IAAIC,wBAAwB,IACtC,QAAO,YAAY;CAGrB,MAAMP,SAASG,QAAQH,UAAU;CACjC,MAAMD,UAAUS,eAAeN,QAAQC,SAASH,OAAO;AACvD,KAAI,CAACD,QACH,QAAO,YAAY;CAGrB,MAAMU,gBAAgB,MAAMC,MAAM,GAAGX,QAAO,0BAA2B,EAAEY,QAAQ,QAAQ,CAAC;AAC1F,KAAI,CAACF,cAAcG,IAAI;EACrB,MAAMC,OAAO,MAAMJ,cAAcK,MAAM,CAACC,YAAY,GAAG;AACvD,MAAI,CAACf,OACH,QAAO,YAAY;AAErB,QAAM,IAAIgB,MAAM,oCAAoCP,cAAcQ,OAAM,GAAIJ,OAAO;;AAGrF,QAAO,eAAeK,eAA8B;EAClD,MAAMC,eAAe,MAAMT,MAAM,GAAGX,QAAO,yBAA0B,EAAEY,QAAQ,QAAQ,CAAC;AACxF,MAAI,CAACQ,aAAaP,IAAI;GACpB,MAAMC,OAAO,MAAMM,aAAaL,MAAM,CAACC,YAAY,GAAG;AACtD,SAAM,IAAIC,MAAM,mCAAmCG,aAAaF,OAAM,GAAIJ,OAAO;;;;AAKvF,SAASL,eAAeN,QAAoBC,SAAqCH,QAAgC;CAC/G,MAAMoB,MAAMjB,QAAQJ,YAAYG,OAAOmB,WAAW,IAAIC,MAAavB,YAC7DM,QAAQC,IAAIiB,OAAO,oBAAoBlB,QAAQC,IAAIiB,SAAS;AAElE,KAAI,OAAOH,QAAQ,YAAY,CAACA,IAAII,MAAM,EAAE;AAC1C,MAAI,CAACxB,OACH,QAAO;AAET,QAAM,IAAIgB,MAAM,sFAAsF;;AAGxG,QAAOI,IAAIK,QAAQ,OAAO,GAAG"}
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;"}
@@ -1,3 +1,3 @@
1
- declare const _default: UserConfig;
1
+ declare const _default: import('vite').UserConfig;
2
2
  export default _default;
3
3
  //# sourceMappingURL=vitest.config.d.ts.map
@@ -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
- //#region src/vitest.config.ts
6
- var require = createRequire(import.meta.url);
5
+ const require$1 = createRequire(import.meta.url);
7
6
  function escapeRegex(str) {
8
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
7
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
9
8
  }
10
9
  function loadTsconfig() {
11
- let ts;
12
- try {
13
- ts = require("typescript");
14
- } catch (_err) {
15
- throw new Error("@rpcbase/test: TypeScript is required to resolve path aliases. Please add it as a devDependency.");
16
- }
17
- const cwd = process.cwd();
18
- const configPath = ts.findConfigFile(cwd, ts.sys.fileExists, "tsconfig.json") || ts.findConfigFile(cwd, ts.sys.fileExists, "tsconfig.base.json");
19
- if (!configPath) throw new Error("@rpcbase/test: no tsconfig found for alias resolution");
20
- const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
21
- if (configFile.error) throw new Error(`@rpcbase/test: unable to read tsconfig at ${configPath}`);
22
- const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, path.dirname(configPath));
23
- return {
24
- path: configPath,
25
- baseUrl: parsed.options?.baseUrl ? path.resolve(path.dirname(configPath), parsed.options.baseUrl) : path.dirname(configPath),
26
- paths: parsed.options?.paths
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(tsconfig) {
30
- const paths = tsconfig?.paths;
31
- if (!paths) return [];
32
- const baseUrl = tsconfig.baseUrl || path.dirname(tsconfig.path);
33
- const alias = [];
34
- for (const [key, targets] of Object.entries(paths)) {
35
- if (!Array.isArray(targets)) continue;
36
- for (const target of targets) {
37
- if (key.includes("*") && target.includes("*")) {
38
- const wildcardPattern = target.endsWith("*") ? "(.+)" : "([^/]+)";
39
- const find = new RegExp(`^${escapeRegex(key).split("\\*").join(wildcardPattern)}$`);
40
- let groupIndex = 0;
41
- const replacedTarget = target.replace(/\*/g, () => `$${++groupIndex}`);
42
- const replacement = path.resolve(baseUrl, replacedTarget);
43
- const checkPath = replacement.replace(/\$\\d+/g, "");
44
- if (checkPath.includes(`${path.sep}node_modules${path.sep}`) && !fs.existsSync(checkPath)) continue;
45
- alias.push({
46
- find,
47
- replacement
48
- });
49
- continue;
50
- }
51
- const find = key.replace(/\*$/, "");
52
- const cleanTarget = target.replace(/\*$/, "");
53
- const replacement = path.resolve(baseUrl, cleanTarget);
54
- if (replacement.includes(`${path.sep}node_modules${path.sep}`) && !fs.existsSync(replacement)) continue;
55
- alias.push({
56
- find,
57
- replacement
58
- });
59
- }
60
- }
61
- return alias;
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
- var alias = pathsToAlias(loadTsconfig());
64
- var vitest_config_default = defineConfig({
65
- test: { include: ["{src,lib}/**/*.test.{js,ts,tsx}"] },
66
- resolve: alias.length > 0 ? { alias } : void 0
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
- //#endregion
69
- export { vitest_config_default as default };
70
-
71
- //# sourceMappingURL=vitest.config.js.map
80
+ export {
81
+ vitest_config as default
82
+ };
83
+ //# sourceMappingURL=vitest.config.js.map