@rpcbase/test 0.385.0 → 0.387.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 +10 -12
- package/dist/clearDatabase.js.map +1 -1
- package/dist/cli.js +439 -556
- package/dist/cli.js.map +1 -1
- package/dist/coverage/collect.js +63 -101
- package/dist/coverage/collect.js.map +1 -1
- package/dist/coverage/config-loader.js +179 -229
- package/dist/coverage/config-loader.js.map +1 -1
- package/dist/coverage/config.js +76 -100
- package/dist/coverage/config.js.map +1 -1
- package/dist/coverage/console-text-report.js +175 -220
- package/dist/coverage/console-text-report.js.map +1 -1
- package/dist/coverage/files.js +44 -57
- package/dist/coverage/files.js.map +1 -1
- package/dist/coverage/fixtures.js +27 -38
- package/dist/coverage/fixtures.js.map +1 -1
- package/dist/coverage/global-setup.js +15 -18
- package/dist/coverage/global-setup.js.map +1 -1
- package/dist/coverage/index.js +38 -55
- package/dist/coverage/index.js.map +1 -1
- package/dist/coverage/report.js +340 -465
- package/dist/coverage/report.js.map +1 -1
- package/dist/coverage/reporter.js +47 -60
- package/dist/coverage/reporter.js.map +1 -1
- package/dist/coverage/v8-tracker.js +114 -146
- package/dist/coverage/v8-tracker.js.map +1 -1
- package/dist/index.js +46 -75
- package/dist/index.js.map +1 -1
- package/dist/runners/playwright.js +440 -564
- package/dist/runners/playwright.js.map +1 -1
- package/dist/runners/process.js +124 -183
- package/dist/runners/process.js.map +1 -1
- package/dist/runners/vitest.js +123 -170
- package/dist/runners/vitest.js.map +1 -1
- package/dist/serverCoverage.js +28 -42
- package/dist/serverCoverage.js.map +1 -1
- package/dist/vitest.config.js +176 -228
- package/dist/vitest.config.js.map +1 -1
- package/package.json +1 -1
package/dist/vitest.config.js
CHANGED
|
@@ -1,253 +1,201 @@
|
|
|
1
|
+
import fsSync from "node:fs";
|
|
1
2
|
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
|
|
5
6
|
function escapeRegex(str) {
|
|
6
|
-
|
|
7
|
+
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
7
8
|
}
|
|
8
9
|
function findTsconfig(startDir) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
current = parent;
|
|
22
|
-
}
|
|
10
|
+
let current = path.resolve(startDir);
|
|
11
|
+
while (true) {
|
|
12
|
+
for (const name of ["tsconfig.json", "tsconfig.base.json"]) {
|
|
13
|
+
const candidate = path.join(current, name);
|
|
14
|
+
if (fsSync.existsSync(candidate)) return candidate;
|
|
15
|
+
}
|
|
16
|
+
const parent = path.dirname(current);
|
|
17
|
+
if (parent === current) return null;
|
|
18
|
+
current = parent;
|
|
19
|
+
}
|
|
23
20
|
}
|
|
24
21
|
function stripJsonComments(input) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
if (char === '"') {
|
|
71
|
-
inString = true;
|
|
72
|
-
}
|
|
73
|
-
output += char;
|
|
74
|
-
}
|
|
75
|
-
return output;
|
|
22
|
+
let output = "";
|
|
23
|
+
let inString = false;
|
|
24
|
+
let escaped = false;
|
|
25
|
+
let inLineComment = false;
|
|
26
|
+
let inBlockComment = false;
|
|
27
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
28
|
+
const char = input[i];
|
|
29
|
+
const next = input[i + 1];
|
|
30
|
+
if (inLineComment) {
|
|
31
|
+
if (char === "\n" || char === "\r") {
|
|
32
|
+
inLineComment = false;
|
|
33
|
+
output += char;
|
|
34
|
+
}
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (inBlockComment) {
|
|
38
|
+
if (char === "*" && next === "/") {
|
|
39
|
+
inBlockComment = false;
|
|
40
|
+
i += 1;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
output += char === "\n" || char === "\r" ? char : " ";
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (inString) {
|
|
47
|
+
output += char;
|
|
48
|
+
if (escaped) escaped = false;
|
|
49
|
+
else if (char === "\\") escaped = true;
|
|
50
|
+
else if (char === "\"") inString = false;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if (char === "/" && next === "/") {
|
|
54
|
+
inLineComment = true;
|
|
55
|
+
i += 1;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (char === "/" && next === "*") {
|
|
59
|
+
inBlockComment = true;
|
|
60
|
+
i += 1;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (char === "\"") inString = true;
|
|
64
|
+
output += char;
|
|
65
|
+
}
|
|
66
|
+
return output;
|
|
76
67
|
}
|
|
77
68
|
function stripTrailingCommas(input) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
const next = input[nextIndex];
|
|
105
|
-
if (next === "}" || next === "]") {
|
|
106
|
-
continue;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
output += char;
|
|
110
|
-
}
|
|
111
|
-
return output;
|
|
69
|
+
let output = "";
|
|
70
|
+
let inString = false;
|
|
71
|
+
let escaped = false;
|
|
72
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
73
|
+
const char = input[i];
|
|
74
|
+
if (inString) {
|
|
75
|
+
output += char;
|
|
76
|
+
if (escaped) escaped = false;
|
|
77
|
+
else if (char === "\\") escaped = true;
|
|
78
|
+
else if (char === "\"") inString = false;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (char === "\"") {
|
|
82
|
+
inString = true;
|
|
83
|
+
output += char;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (char === ",") {
|
|
87
|
+
let nextIndex = i + 1;
|
|
88
|
+
while (/\s/.test(input[nextIndex] ?? "")) nextIndex += 1;
|
|
89
|
+
const next = input[nextIndex];
|
|
90
|
+
if (next === "}" || next === "]") continue;
|
|
91
|
+
}
|
|
92
|
+
output += char;
|
|
93
|
+
}
|
|
94
|
+
return output;
|
|
112
95
|
}
|
|
113
96
|
function parseJsonc(filePath) {
|
|
114
|
-
|
|
115
|
-
|
|
97
|
+
const raw = fsSync.readFileSync(filePath, "utf8");
|
|
98
|
+
return JSON.parse(stripTrailingCommas(stripJsonComments(raw)));
|
|
116
99
|
}
|
|
117
100
|
function resolveTsconfigPath(candidate) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
const directoryCandidate = path.join(candidate, "tsconfig.json");
|
|
128
|
-
if (fs.existsSync(directoryCandidate) && fs.statSync(directoryCandidate).isFile()) {
|
|
129
|
-
return directoryCandidate;
|
|
130
|
-
}
|
|
131
|
-
return null;
|
|
101
|
+
if (path.extname(candidate) === ".json" && fsSync.existsSync(candidate) && fsSync.statSync(candidate).isFile()) return candidate;
|
|
102
|
+
if (path.extname(candidate) === "") {
|
|
103
|
+
const jsonCandidate = `${candidate}.json`;
|
|
104
|
+
if (fsSync.existsSync(jsonCandidate) && fsSync.statSync(jsonCandidate).isFile()) return jsonCandidate;
|
|
105
|
+
}
|
|
106
|
+
const directoryCandidate = path.join(candidate, "tsconfig.json");
|
|
107
|
+
if (fsSync.existsSync(directoryCandidate) && fsSync.statSync(directoryCandidate).isFile()) return directoryCandidate;
|
|
108
|
+
return null;
|
|
132
109
|
}
|
|
133
110
|
function resolveExtends(specifier, configDir) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
const resolved = resolveTsconfigPath(path.resolve(configDir, specifier));
|
|
152
|
-
if (resolved) {
|
|
153
|
-
return resolved;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
throw new Error(`@rpcbase/test: unable to resolve tsconfig extends "${specifier}" from ${configDir}`);
|
|
111
|
+
if (specifier.startsWith(".") || path.isAbsolute(specifier)) {
|
|
112
|
+
const resolved = resolveTsconfigPath(path.resolve(configDir, specifier));
|
|
113
|
+
if (resolved) return resolved;
|
|
114
|
+
} else {
|
|
115
|
+
const localRequire = createRequire(path.join(configDir, "tsconfig.json"));
|
|
116
|
+
try {
|
|
117
|
+
const resolved = localRequire.resolve(specifier);
|
|
118
|
+
if (path.extname(resolved) === ".json") return resolved;
|
|
119
|
+
} catch (_err) {}
|
|
120
|
+
try {
|
|
121
|
+
return localRequire.resolve(`${specifier}/tsconfig.json`);
|
|
122
|
+
} catch (_err) {
|
|
123
|
+
const resolved = resolveTsconfigPath(path.resolve(configDir, specifier));
|
|
124
|
+
if (resolved) return resolved;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
throw new Error(`@rpcbase/test: unable to resolve tsconfig extends "${specifier}" from ${configDir}`);
|
|
158
128
|
}
|
|
159
129
|
function normalizePaths(paths) {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
for (const [key, value] of Object.entries(paths)) {
|
|
165
|
-
if (Array.isArray(value) && value.every((entry) => typeof entry === "string")) {
|
|
166
|
-
normalized[key] = value;
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
return Object.keys(normalized).length > 0 ? normalized : void 0;
|
|
130
|
+
if (!paths || typeof paths !== "object" || Array.isArray(paths)) return;
|
|
131
|
+
const normalized = {};
|
|
132
|
+
for (const [key, value] of Object.entries(paths)) if (Array.isArray(value) && value.every((entry) => typeof entry === "string")) normalized[key] = value;
|
|
133
|
+
return Object.keys(normalized).length > 0 ? normalized : void 0;
|
|
170
134
|
}
|
|
171
135
|
function loadTsconfigFile(configPath, seen = /* @__PURE__ */ new Set()) {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
path: normalizedPath,
|
|
189
|
-
baseUrl: typeof compilerOptions.baseUrl === "string" ? path.resolve(configDir, compilerOptions.baseUrl) : inherited.baseUrl,
|
|
190
|
-
paths: normalizePaths(compilerOptions.paths) ?? inherited.paths
|
|
191
|
-
};
|
|
192
|
-
seen.delete(normalizedPath);
|
|
193
|
-
return loaded;
|
|
136
|
+
const normalizedPath = path.resolve(configPath);
|
|
137
|
+
if (seen.has(normalizedPath)) throw new Error(`@rpcbase/test: circular tsconfig extends detected at ${normalizedPath}`);
|
|
138
|
+
seen.add(normalizedPath);
|
|
139
|
+
const configDir = path.dirname(normalizedPath);
|
|
140
|
+
const raw = parseJsonc(normalizedPath);
|
|
141
|
+
const extendsEntries = Array.isArray(raw.extends) ? raw.extends : typeof raw.extends === "string" ? [raw.extends] : [];
|
|
142
|
+
let inherited = { baseUrl: configDir };
|
|
143
|
+
for (const entry of extendsEntries) inherited = loadTsconfigFile(resolveExtends(entry, configDir), seen);
|
|
144
|
+
const compilerOptions = raw.compilerOptions ?? {};
|
|
145
|
+
const loaded = {
|
|
146
|
+
path: normalizedPath,
|
|
147
|
+
baseUrl: typeof compilerOptions.baseUrl === "string" ? path.resolve(configDir, compilerOptions.baseUrl) : inherited.baseUrl,
|
|
148
|
+
paths: normalizePaths(compilerOptions.paths) ?? inherited.paths
|
|
149
|
+
};
|
|
150
|
+
seen.delete(normalizedPath);
|
|
151
|
+
return loaded;
|
|
194
152
|
}
|
|
195
153
|
function loadTsconfig() {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
return loadTsconfigFile(configPath);
|
|
154
|
+
const configPath = findTsconfig(process.cwd());
|
|
155
|
+
if (!configPath) throw new Error("@rpcbase/test: no tsconfig found for alias resolution");
|
|
156
|
+
return loadTsconfigFile(configPath);
|
|
201
157
|
}
|
|
202
|
-
function pathsToAlias(
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return alias2;
|
|
158
|
+
function pathsToAlias(tsconfig) {
|
|
159
|
+
const paths = tsconfig?.paths;
|
|
160
|
+
if (!paths) return [];
|
|
161
|
+
const baseUrl = tsconfig.baseUrl || path.dirname(tsconfig.path);
|
|
162
|
+
const alias = [];
|
|
163
|
+
for (const [key, targets] of Object.entries(paths)) {
|
|
164
|
+
if (!Array.isArray(targets)) continue;
|
|
165
|
+
for (const target of targets) {
|
|
166
|
+
if (/\.d\.[cm]?ts$/.test(target)) continue;
|
|
167
|
+
if (key.includes("*") && target.includes("*")) {
|
|
168
|
+
const wildcardPattern = target.endsWith("*") ? "(.+)" : "([^/]+)";
|
|
169
|
+
const find = new RegExp(`^${escapeRegex(key).split("\\*").join(wildcardPattern)}$`);
|
|
170
|
+
let groupIndex = 0;
|
|
171
|
+
const replacedTarget = target.replace(/\*/g, () => `$${++groupIndex}`);
|
|
172
|
+
const replacement = path.resolve(baseUrl, replacedTarget);
|
|
173
|
+
const checkPath = replacement.replace(/\$\\d+/g, "");
|
|
174
|
+
if (checkPath.includes(`${path.sep}node_modules${path.sep}`) && !fsSync.existsSync(checkPath)) continue;
|
|
175
|
+
alias.push({
|
|
176
|
+
find,
|
|
177
|
+
replacement
|
|
178
|
+
});
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const find = key.replace(/\*$/, "");
|
|
182
|
+
const cleanTarget = target.replace(/\*$/, "");
|
|
183
|
+
const replacement = path.resolve(baseUrl, cleanTarget);
|
|
184
|
+
if (replacement.includes(`${path.sep}node_modules${path.sep}`) && !fsSync.existsSync(replacement)) continue;
|
|
185
|
+
alias.push({
|
|
186
|
+
find,
|
|
187
|
+
replacement
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return alias;
|
|
239
192
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
include: ["{src,lib}/**/*.test.{js,ts,tsx}"]
|
|
245
|
-
},
|
|
246
|
-
resolve: alias.length > 0 ? {
|
|
247
|
-
alias
|
|
248
|
-
} : void 0
|
|
193
|
+
var alias = pathsToAlias(loadTsconfig());
|
|
194
|
+
var vitest_config_default = defineConfig({
|
|
195
|
+
test: { include: ["{src,lib}/**/*.test.{js,ts,tsx}"] },
|
|
196
|
+
resolve: alias.length > 0 ? { alias } : void 0
|
|
249
197
|
});
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
//# sourceMappingURL=vitest.config.js.map
|
|
198
|
+
//#endregion
|
|
199
|
+
export { vitest_config_default as default };
|
|
200
|
+
|
|
201
|
+
//# sourceMappingURL=vitest.config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vitest.config.js","sources":["../src/vitest.config.ts"],"sourcesContent":["import path from \"node:path\"\nimport fs from \"node:fs\"\nimport { createRequire } from \"node:module\"\n\nimport { defineConfig } from \"vitest/config\"\n\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n\ntype TsconfigPaths = Record<string, string[]>\ntype RawTsconfig = {\n extends?: string | string[]\n compilerOptions?: {\n baseUrl?: string\n paths?: unknown\n }\n}\n\nfunction findTsconfig(startDir: string): string | null {\n let current = path.resolve(startDir)\n\n while (true) {\n for (const name of [\"tsconfig.json\", \"tsconfig.base.json\"]) {\n const candidate = path.join(current, name)\n if (fs.existsSync(candidate)) {\n return candidate\n }\n }\n\n const parent = path.dirname(current)\n if (parent === current) {\n return null\n }\n current = parent\n }\n}\n\nfunction stripJsonComments(input: string): string {\n let output = \"\"\n let inString = false\n let escaped = false\n let inLineComment = false\n let inBlockComment = false\n\n for (let i = 0; i < input.length; i += 1) {\n const char = input[i]\n const next = input[i + 1]\n\n if (inLineComment) {\n if (char === \"\\n\" || char === \"\\r\") {\n inLineComment = false\n output += char\n }\n continue\n }\n\n if (inBlockComment) {\n if (char === \"*\" && next === \"/\") {\n inBlockComment = false\n i += 1\n continue\n }\n output += char === \"\\n\" || char === \"\\r\" ? char : \" \"\n continue\n }\n\n if (inString) {\n output += char\n if (escaped) {\n escaped = false\n } else if (char === \"\\\\\") {\n escaped = true\n } else if (char === \"\\\"\") {\n inString = false\n }\n continue\n }\n\n if (char === \"/\" && next === \"/\") {\n inLineComment = true\n i += 1\n continue\n }\n\n if (char === \"/\" && next === \"*\") {\n inBlockComment = true\n i += 1\n continue\n }\n\n if (char === \"\\\"\") {\n inString = true\n }\n output += char\n }\n\n return output\n}\n\nfunction stripTrailingCommas(input: string): string {\n let output = \"\"\n let inString = false\n let escaped = false\n\n for (let i = 0; i < input.length; i += 1) {\n const char = input[i]\n\n if (inString) {\n output += char\n if (escaped) {\n escaped = false\n } else if (char === \"\\\\\") {\n escaped = true\n } else if (char === \"\\\"\") {\n inString = false\n }\n continue\n }\n\n if (char === \"\\\"\") {\n inString = true\n output += char\n continue\n }\n\n if (char === \",\") {\n let nextIndex = i + 1\n while (/\\s/.test(input[nextIndex] ?? \"\")) {\n nextIndex += 1\n }\n const next = input[nextIndex]\n if (next === \"}\" || next === \"]\") {\n continue\n }\n }\n\n output += char\n }\n\n return output\n}\n\nfunction parseJsonc(filePath: string): RawTsconfig {\n const raw = fs.readFileSync(filePath, \"utf8\")\n return JSON.parse(stripTrailingCommas(stripJsonComments(raw))) as RawTsconfig\n}\n\nfunction resolveTsconfigPath(candidate: string): string | null {\n if (path.extname(candidate) === \".json\" && fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n return candidate\n }\n\n if (path.extname(candidate) === \"\") {\n const jsonCandidate = `${candidate}.json`\n if (fs.existsSync(jsonCandidate) && fs.statSync(jsonCandidate).isFile()) {\n return jsonCandidate\n }\n }\n\n const directoryCandidate = path.join(candidate, \"tsconfig.json\")\n if (fs.existsSync(directoryCandidate) && fs.statSync(directoryCandidate).isFile()) {\n return directoryCandidate\n }\n\n return null\n}\n\nfunction resolveExtends(specifier: string, configDir: string): string {\n if (specifier.startsWith(\".\") || path.isAbsolute(specifier)) {\n const resolved = resolveTsconfigPath(path.resolve(configDir, specifier))\n if (resolved) {\n return resolved\n }\n } else {\n const localRequire = createRequire(path.join(configDir, \"tsconfig.json\"))\n try {\n const resolved = localRequire.resolve(specifier)\n if (path.extname(resolved) === \".json\") {\n return resolved\n }\n } catch (_err) {\n // Fall through to tsconfig-style package resolution.\n }\n\n try {\n return localRequire.resolve(`${specifier}/tsconfig.json`)\n } catch (_err) {\n const resolved = resolveTsconfigPath(path.resolve(configDir, specifier))\n if (resolved) {\n return resolved\n }\n }\n }\n\n throw new Error(`@rpcbase/test: unable to resolve tsconfig extends \"${specifier}\" from ${configDir}`)\n}\n\nfunction normalizePaths(paths: unknown): TsconfigPaths | undefined {\n if (!paths || typeof paths !== \"object\" || Array.isArray(paths)) {\n return undefined\n }\n\n const normalized: TsconfigPaths = {}\n for (const [key, value] of Object.entries(paths)) {\n if (Array.isArray(value) && value.every((entry) => typeof entry === \"string\")) {\n normalized[key] = value\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\nfunction loadTsconfigFile(configPath: string, seen = new Set<string>()): { path: string; baseUrl: string; paths?: TsconfigPaths } {\n const normalizedPath = path.resolve(configPath)\n if (seen.has(normalizedPath)) {\n throw new Error(`@rpcbase/test: circular tsconfig extends detected at ${normalizedPath}`)\n }\n seen.add(normalizedPath)\n\n const configDir = path.dirname(normalizedPath)\n const raw = parseJsonc(normalizedPath)\n const extendsEntries = Array.isArray(raw.extends)\n ? raw.extends\n : typeof raw.extends === \"string\"\n ? [raw.extends]\n : []\n\n let inherited: { baseUrl: string; paths?: TsconfigPaths } = {\n baseUrl: configDir,\n }\n\n for (const entry of extendsEntries) {\n inherited = loadTsconfigFile(resolveExtends(entry, configDir), seen)\n }\n\n const compilerOptions = raw.compilerOptions ?? {}\n const loaded = {\n path: normalizedPath,\n baseUrl: typeof compilerOptions.baseUrl === \"string\"\n ? path.resolve(configDir, compilerOptions.baseUrl)\n : inherited.baseUrl,\n paths: normalizePaths(compilerOptions.paths) ?? inherited.paths,\n }\n\n seen.delete(normalizedPath)\n return loaded\n}\n\nfunction loadTsconfig(): { path: string; baseUrl: string; paths?: TsconfigPaths } {\n const configPath = findTsconfig(process.cwd())\n if (!configPath) {\n throw new Error(\"@rpcbase/test: no tsconfig found for alias resolution\")\n }\n\n return loadTsconfigFile(configPath)\n}\n\ntype ViteAliasEntry = { find: string | RegExp; replacement: string }\n\nfunction pathsToAlias(tsconfig: { path: string; baseUrl: string; paths?: TsconfigPaths }): ViteAliasEntry[] {\n const paths = tsconfig?.paths\n if (!paths) return []\n\n const baseUrl = tsconfig.baseUrl || path.dirname(tsconfig.path)\n const alias: ViteAliasEntry[] = []\n\n for (const [key, targets] of Object.entries(paths)) {\n if (!Array.isArray(targets)) continue\n\n for (const target of targets) {\n if (key.includes(\"*\") && target.includes(\"*\")) {\n const wildcardPattern = target.endsWith(\"*\") ? \"(.+)\" : \"([^/]+)\"\n const find = new RegExp(\n `^${escapeRegex(key).split(\"\\\\*\").join(wildcardPattern)}$`,\n )\n let groupIndex = 0\n const replacedTarget = target.replace(/\\*/g, () => `$${++groupIndex}`)\n const replacement = path.resolve(baseUrl, replacedTarget)\n const checkPath = replacement.replace(/\\$\\\\d+/g, \"\")\n if (\n checkPath.includes(`${path.sep}node_modules${path.sep}`) &&\n !fs.existsSync(checkPath)\n ) {\n continue\n }\n alias.push({ find, replacement })\n continue\n }\n\n const find = key.replace(/\\*$/, \"\")\n const cleanTarget = target.replace(/\\*$/, \"\")\n const replacement = path.resolve(baseUrl, cleanTarget)\n if (\n replacement.includes(`${path.sep}node_modules${path.sep}`) &&\n !fs.existsSync(replacement)\n ) {\n continue\n }\n alias.push({ find, replacement })\n }\n }\n\n return alias\n}\n\nconst tsconfig = loadTsconfig()\nconst alias = pathsToAlias(tsconfig)\n\nexport default defineConfig({\n test: {\n include: [\"{src,lib}/**/*.test.{js,ts,tsx}\"],\n },\n resolve: alias.length > 0 ? { alias } : undefined,\n})\n"],"names":["escapeRegex","str","replace","findTsconfig","startDir","current","path","resolve","name","candidate","join","fs","existsSync","parent","dirname","stripJsonComments","input","output","inString","escaped","inLineComment","inBlockComment","i","length","char","next","stripTrailingCommas","nextIndex","test","parseJsonc","filePath","raw","readFileSync","JSON","parse","resolveTsconfigPath","extname","statSync","isFile","jsonCandidate","directoryCandidate","resolveExtends","specifier","configDir","startsWith","isAbsolute","resolved","localRequire","createRequire","_err","Error","normalizePaths","paths","Array","isArray","undefined","normalized","key","value","Object","entries","every","entry","keys","loadTsconfigFile","configPath","seen","Set","normalizedPath","has","add","extendsEntries","extends","inherited","baseUrl","compilerOptions","loaded","delete","loadTsconfig","process","cwd","pathsToAlias","tsconfig","alias","targets","target","includes","wildcardPattern","endsWith","find","RegExp","split","groupIndex","replacedTarget","replacement","checkPath","sep","push","cleanTarget","defineConfig","include"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vitest.config.js","names":["path","fs","createRequire","defineConfig","escapeRegex","str","replace","TsconfigPaths","Record","RawTsconfig","extends","compilerOptions","baseUrl","paths","findTsconfig","startDir","current","resolve","name","candidate","join","existsSync","parent","dirname","stripJsonComments","input","output","inString","escaped","inLineComment","inBlockComment","i","length","char","next","stripTrailingCommas","nextIndex","test","parseJsonc","filePath","raw","readFileSync","JSON","parse","resolveTsconfigPath","extname","statSync","isFile","jsonCandidate","directoryCandidate","resolveExtends","specifier","configDir","startsWith","isAbsolute","resolved","localRequire","_err","Error","normalizePaths","Array","isArray","undefined","normalized","key","value","Object","entries","every","entry","keys","loadTsconfigFile","configPath","seen","Set","normalizedPath","has","add","extendsEntries","inherited","loaded","delete","loadTsconfig","process","cwd","ViteAliasEntry","find","RegExp","replacement","pathsToAlias","tsconfig","alias","targets","target","includes","wildcardPattern","endsWith","split","groupIndex","replacedTarget","checkPath","sep","push","cleanTarget","include"],"sources":["../src/vitest.config.ts"],"sourcesContent":["import path from \"node:path\"\nimport fs from \"node:fs\"\nimport { createRequire } from \"node:module\"\n\nimport { defineConfig } from \"vitest/config\"\n\n\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n\ntype TsconfigPaths = Record<string, string[]>\ntype RawTsconfig = {\n extends?: string | string[]\n compilerOptions?: {\n baseUrl?: string\n paths?: unknown\n }\n}\n\nfunction findTsconfig(startDir: string): string | null {\n let current = path.resolve(startDir)\n\n while (true) {\n for (const name of [\"tsconfig.json\", \"tsconfig.base.json\"]) {\n const candidate = path.join(current, name)\n if (fs.existsSync(candidate)) {\n return candidate\n }\n }\n\n const parent = path.dirname(current)\n if (parent === current) {\n return null\n }\n current = parent\n }\n}\n\nfunction stripJsonComments(input: string): string {\n let output = \"\"\n let inString = false\n let escaped = false\n let inLineComment = false\n let inBlockComment = false\n\n for (let i = 0; i < input.length; i += 1) {\n const char = input[i]\n const next = input[i + 1]\n\n if (inLineComment) {\n if (char === \"\\n\" || char === \"\\r\") {\n inLineComment = false\n output += char\n }\n continue\n }\n\n if (inBlockComment) {\n if (char === \"*\" && next === \"/\") {\n inBlockComment = false\n i += 1\n continue\n }\n output += char === \"\\n\" || char === \"\\r\" ? char : \" \"\n continue\n }\n\n if (inString) {\n output += char\n if (escaped) {\n escaped = false\n } else if (char === \"\\\\\") {\n escaped = true\n } else if (char === \"\\\"\") {\n inString = false\n }\n continue\n }\n\n if (char === \"/\" && next === \"/\") {\n inLineComment = true\n i += 1\n continue\n }\n\n if (char === \"/\" && next === \"*\") {\n inBlockComment = true\n i += 1\n continue\n }\n\n if (char === \"\\\"\") {\n inString = true\n }\n output += char\n }\n\n return output\n}\n\nfunction stripTrailingCommas(input: string): string {\n let output = \"\"\n let inString = false\n let escaped = false\n\n for (let i = 0; i < input.length; i += 1) {\n const char = input[i]\n\n if (inString) {\n output += char\n if (escaped) {\n escaped = false\n } else if (char === \"\\\\\") {\n escaped = true\n } else if (char === \"\\\"\") {\n inString = false\n }\n continue\n }\n\n if (char === \"\\\"\") {\n inString = true\n output += char\n continue\n }\n\n if (char === \",\") {\n let nextIndex = i + 1\n while (/\\s/.test(input[nextIndex] ?? \"\")) {\n nextIndex += 1\n }\n const next = input[nextIndex]\n if (next === \"}\" || next === \"]\") {\n continue\n }\n }\n\n output += char\n }\n\n return output\n}\n\nfunction parseJsonc(filePath: string): RawTsconfig {\n const raw = fs.readFileSync(filePath, \"utf8\")\n return JSON.parse(stripTrailingCommas(stripJsonComments(raw))) as RawTsconfig\n}\n\nfunction resolveTsconfigPath(candidate: string): string | null {\n if (path.extname(candidate) === \".json\" && fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {\n return candidate\n }\n\n if (path.extname(candidate) === \"\") {\n const jsonCandidate = `${candidate}.json`\n if (fs.existsSync(jsonCandidate) && fs.statSync(jsonCandidate).isFile()) {\n return jsonCandidate\n }\n }\n\n const directoryCandidate = path.join(candidate, \"tsconfig.json\")\n if (fs.existsSync(directoryCandidate) && fs.statSync(directoryCandidate).isFile()) {\n return directoryCandidate\n }\n\n return null\n}\n\nfunction resolveExtends(specifier: string, configDir: string): string {\n if (specifier.startsWith(\".\") || path.isAbsolute(specifier)) {\n const resolved = resolveTsconfigPath(path.resolve(configDir, specifier))\n if (resolved) {\n return resolved\n }\n } else {\n const localRequire = createRequire(path.join(configDir, \"tsconfig.json\"))\n try {\n const resolved = localRequire.resolve(specifier)\n if (path.extname(resolved) === \".json\") {\n return resolved\n }\n } catch (_err) {\n // Fall through to tsconfig-style package resolution.\n }\n\n try {\n return localRequire.resolve(`${specifier}/tsconfig.json`)\n } catch (_err) {\n const resolved = resolveTsconfigPath(path.resolve(configDir, specifier))\n if (resolved) {\n return resolved\n }\n }\n }\n\n throw new Error(`@rpcbase/test: unable to resolve tsconfig extends \"${specifier}\" from ${configDir}`)\n}\n\nfunction normalizePaths(paths: unknown): TsconfigPaths | undefined {\n if (!paths || typeof paths !== \"object\" || Array.isArray(paths)) {\n return undefined\n }\n\n const normalized: TsconfigPaths = {}\n for (const [key, value] of Object.entries(paths)) {\n if (Array.isArray(value) && value.every((entry) => typeof entry === \"string\")) {\n normalized[key] = value\n }\n }\n\n return Object.keys(normalized).length > 0 ? normalized : undefined\n}\n\nfunction loadTsconfigFile(configPath: string, seen = new Set<string>()): { path: string; baseUrl: string; paths?: TsconfigPaths } {\n const normalizedPath = path.resolve(configPath)\n if (seen.has(normalizedPath)) {\n throw new Error(`@rpcbase/test: circular tsconfig extends detected at ${normalizedPath}`)\n }\n seen.add(normalizedPath)\n\n const configDir = path.dirname(normalizedPath)\n const raw = parseJsonc(normalizedPath)\n const extendsEntries = Array.isArray(raw.extends)\n ? raw.extends\n : typeof raw.extends === \"string\"\n ? [raw.extends]\n : []\n\n let inherited: { baseUrl: string; paths?: TsconfigPaths } = {\n baseUrl: configDir,\n }\n\n for (const entry of extendsEntries) {\n inherited = loadTsconfigFile(resolveExtends(entry, configDir), seen)\n }\n\n const compilerOptions = raw.compilerOptions ?? {}\n const loaded = {\n path: normalizedPath,\n baseUrl: typeof compilerOptions.baseUrl === \"string\"\n ? path.resolve(configDir, compilerOptions.baseUrl)\n : inherited.baseUrl,\n paths: normalizePaths(compilerOptions.paths) ?? inherited.paths,\n }\n\n seen.delete(normalizedPath)\n return loaded\n}\n\nfunction loadTsconfig(): { path: string; baseUrl: string; paths?: TsconfigPaths } {\n const configPath = findTsconfig(process.cwd())\n if (!configPath) {\n throw new Error(\"@rpcbase/test: no tsconfig found for alias resolution\")\n }\n\n return loadTsconfigFile(configPath)\n}\n\ntype ViteAliasEntry = { find: string | RegExp; replacement: string }\n\nfunction pathsToAlias(tsconfig: { path: string; baseUrl: string; paths?: TsconfigPaths }): ViteAliasEntry[] {\n const paths = tsconfig?.paths\n if (!paths) return []\n\n const baseUrl = tsconfig.baseUrl || path.dirname(tsconfig.path)\n const alias: ViteAliasEntry[] = []\n\n for (const [key, targets] of Object.entries(paths)) {\n if (!Array.isArray(targets)) continue\n\n for (const target of targets) {\n if (/\\.d\\.[cm]?ts$/.test(target)) continue\n\n if (key.includes(\"*\") && target.includes(\"*\")) {\n const wildcardPattern = target.endsWith(\"*\") ? \"(.+)\" : \"([^/]+)\"\n const find = new RegExp(\n `^${escapeRegex(key).split(\"\\\\*\").join(wildcardPattern)}$`,\n )\n let groupIndex = 0\n const replacedTarget = target.replace(/\\*/g, () => `$${++groupIndex}`)\n const replacement = path.resolve(baseUrl, replacedTarget)\n const checkPath = replacement.replace(/\\$\\\\d+/g, \"\")\n if (\n checkPath.includes(`${path.sep}node_modules${path.sep}`) &&\n !fs.existsSync(checkPath)\n ) {\n continue\n }\n alias.push({ find, replacement })\n continue\n }\n\n const find = key.replace(/\\*$/, \"\")\n const cleanTarget = target.replace(/\\*$/, \"\")\n const replacement = path.resolve(baseUrl, cleanTarget)\n if (\n replacement.includes(`${path.sep}node_modules${path.sep}`) &&\n !fs.existsSync(replacement)\n ) {\n continue\n }\n alias.push({ find, replacement })\n }\n }\n\n return alias\n}\n\nconst tsconfig = loadTsconfig()\nconst alias = pathsToAlias(tsconfig)\n\nexport default defineConfig({\n test: {\n include: [\"{src,lib}/**/*.test.{js,ts,tsx}\"],\n },\n resolve: alias.length > 0 ? { alias } : undefined,\n})\n"],"mappings":"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"}
|