@rpcbase/test 0.385.0 → 0.386.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 (39) hide show
  1. package/dist/clearDatabase.js +10 -12
  2. package/dist/clearDatabase.js.map +1 -1
  3. package/dist/cli.js +439 -556
  4. package/dist/cli.js.map +1 -1
  5. package/dist/coverage/collect.js +63 -101
  6. package/dist/coverage/collect.js.map +1 -1
  7. package/dist/coverage/config-loader.js +179 -229
  8. package/dist/coverage/config-loader.js.map +1 -1
  9. package/dist/coverage/config.js +76 -100
  10. package/dist/coverage/config.js.map +1 -1
  11. package/dist/coverage/console-text-report.js +175 -220
  12. package/dist/coverage/console-text-report.js.map +1 -1
  13. package/dist/coverage/files.js +44 -57
  14. package/dist/coverage/files.js.map +1 -1
  15. package/dist/coverage/fixtures.js +27 -38
  16. package/dist/coverage/fixtures.js.map +1 -1
  17. package/dist/coverage/global-setup.js +15 -18
  18. package/dist/coverage/global-setup.js.map +1 -1
  19. package/dist/coverage/index.js +38 -55
  20. package/dist/coverage/index.js.map +1 -1
  21. package/dist/coverage/report.js +340 -465
  22. package/dist/coverage/report.js.map +1 -1
  23. package/dist/coverage/reporter.js +47 -60
  24. package/dist/coverage/reporter.js.map +1 -1
  25. package/dist/coverage/v8-tracker.js +114 -146
  26. package/dist/coverage/v8-tracker.js.map +1 -1
  27. package/dist/index.js +46 -75
  28. package/dist/index.js.map +1 -1
  29. package/dist/runners/playwright.js +440 -564
  30. package/dist/runners/playwright.js.map +1 -1
  31. package/dist/runners/process.js +124 -183
  32. package/dist/runners/process.js.map +1 -1
  33. package/dist/runners/vitest.js +123 -170
  34. package/dist/runners/vitest.js.map +1 -1
  35. package/dist/serverCoverage.js +28 -42
  36. package/dist/serverCoverage.js.map +1 -1
  37. package/dist/vitest.config.js +176 -228
  38. package/dist/vitest.config.js.map +1 -1
  39. package/package.json +1 -1
@@ -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
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
7
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
7
8
  }
8
9
  function findTsconfig(startDir) {
9
- let current = path.resolve(startDir);
10
- while (true) {
11
- for (const name of ["tsconfig.json", "tsconfig.base.json"]) {
12
- const candidate = path.join(current, name);
13
- if (fs.existsSync(candidate)) {
14
- return candidate;
15
- }
16
- }
17
- const parent = path.dirname(current);
18
- if (parent === current) {
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
- let output = "";
26
- let inString = false;
27
- let escaped = false;
28
- let inLineComment = false;
29
- let inBlockComment = false;
30
- for (let i = 0; i < input.length; i += 1) {
31
- const char = input[i];
32
- const next = input[i + 1];
33
- if (inLineComment) {
34
- if (char === "\n" || char === "\r") {
35
- inLineComment = false;
36
- output += char;
37
- }
38
- continue;
39
- }
40
- if (inBlockComment) {
41
- if (char === "*" && next === "/") {
42
- inBlockComment = false;
43
- i += 1;
44
- continue;
45
- }
46
- output += char === "\n" || char === "\r" ? char : " ";
47
- continue;
48
- }
49
- if (inString) {
50
- output += char;
51
- if (escaped) {
52
- escaped = false;
53
- } else if (char === "\\") {
54
- escaped = true;
55
- } else if (char === '"') {
56
- inString = false;
57
- }
58
- continue;
59
- }
60
- if (char === "/" && next === "/") {
61
- inLineComment = true;
62
- i += 1;
63
- continue;
64
- }
65
- if (char === "/" && next === "*") {
66
- inBlockComment = true;
67
- i += 1;
68
- continue;
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
- let output = "";
79
- let inString = false;
80
- let escaped = false;
81
- for (let i = 0; i < input.length; i += 1) {
82
- const char = input[i];
83
- if (inString) {
84
- output += char;
85
- if (escaped) {
86
- escaped = false;
87
- } else if (char === "\\") {
88
- escaped = true;
89
- } else if (char === '"') {
90
- inString = false;
91
- }
92
- continue;
93
- }
94
- if (char === '"') {
95
- inString = true;
96
- output += char;
97
- continue;
98
- }
99
- if (char === ",") {
100
- let nextIndex = i + 1;
101
- while (/\s/.test(input[nextIndex] ?? "")) {
102
- nextIndex += 1;
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
- const raw = fs.readFileSync(filePath, "utf8");
115
- return JSON.parse(stripTrailingCommas(stripJsonComments(raw)));
97
+ const raw = fsSync.readFileSync(filePath, "utf8");
98
+ return JSON.parse(stripTrailingCommas(stripJsonComments(raw)));
116
99
  }
117
100
  function resolveTsconfigPath(candidate) {
118
- if (path.extname(candidate) === ".json" && fs.existsSync(candidate) && fs.statSync(candidate).isFile()) {
119
- return candidate;
120
- }
121
- if (path.extname(candidate) === "") {
122
- const jsonCandidate = `${candidate}.json`;
123
- if (fs.existsSync(jsonCandidate) && fs.statSync(jsonCandidate).isFile()) {
124
- return jsonCandidate;
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
- if (specifier.startsWith(".") || path.isAbsolute(specifier)) {
135
- const resolved = resolveTsconfigPath(path.resolve(configDir, specifier));
136
- if (resolved) {
137
- return resolved;
138
- }
139
- } else {
140
- const localRequire = createRequire(path.join(configDir, "tsconfig.json"));
141
- try {
142
- const resolved = localRequire.resolve(specifier);
143
- if (path.extname(resolved) === ".json") {
144
- return resolved;
145
- }
146
- } catch (_err) {
147
- }
148
- try {
149
- return localRequire.resolve(`${specifier}/tsconfig.json`);
150
- } catch (_err) {
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
- if (!paths || typeof paths !== "object" || Array.isArray(paths)) {
161
- return void 0;
162
- }
163
- const normalized = {};
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
- const normalizedPath = path.resolve(configPath);
173
- if (seen.has(normalizedPath)) {
174
- throw new Error(`@rpcbase/test: circular tsconfig extends detected at ${normalizedPath}`);
175
- }
176
- seen.add(normalizedPath);
177
- const configDir = path.dirname(normalizedPath);
178
- const raw = parseJsonc(normalizedPath);
179
- const extendsEntries = Array.isArray(raw.extends) ? raw.extends : typeof raw.extends === "string" ? [raw.extends] : [];
180
- let inherited = {
181
- baseUrl: configDir
182
- };
183
- for (const entry of extendsEntries) {
184
- inherited = loadTsconfigFile(resolveExtends(entry, configDir), seen);
185
- }
186
- const compilerOptions = raw.compilerOptions ?? {};
187
- const loaded = {
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
- const configPath = findTsconfig(process.cwd());
197
- if (!configPath) {
198
- throw new Error("@rpcbase/test: no tsconfig found for alias resolution");
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(tsconfig2) {
203
- const paths = tsconfig2?.paths;
204
- if (!paths) return [];
205
- const baseUrl = tsconfig2.baseUrl || path.dirname(tsconfig2.path);
206
- const alias2 = [];
207
- for (const [key, targets] of Object.entries(paths)) {
208
- if (!Array.isArray(targets)) continue;
209
- for (const target of targets) {
210
- if (key.includes("*") && target.includes("*")) {
211
- const wildcardPattern = target.endsWith("*") ? "(.+)" : "([^/]+)";
212
- const find2 = new RegExp(`^${escapeRegex(key).split("\\*").join(wildcardPattern)}$`);
213
- let groupIndex = 0;
214
- const replacedTarget = target.replace(/\*/g, () => `$${++groupIndex}`);
215
- const replacement2 = path.resolve(baseUrl, replacedTarget);
216
- const checkPath = replacement2.replace(/\$\\d+/g, "");
217
- if (checkPath.includes(`${path.sep}node_modules${path.sep}`) && !fs.existsSync(checkPath)) {
218
- continue;
219
- }
220
- alias2.push({
221
- find: find2,
222
- replacement: replacement2
223
- });
224
- continue;
225
- }
226
- const find = key.replace(/\*$/, "");
227
- const cleanTarget = target.replace(/\*$/, "");
228
- const replacement = path.resolve(baseUrl, cleanTarget);
229
- if (replacement.includes(`${path.sep}node_modules${path.sep}`) && !fs.existsSync(replacement)) {
230
- continue;
231
- }
232
- alias2.push({
233
- find,
234
- replacement
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
- const tsconfig = loadTsconfig();
241
- const alias = pathsToAlias(tsconfig);
242
- const vitest_config = defineConfig({
243
- test: {
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
- export {
251
- vitest_config as default
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":";;;;;AAOA,SAASI,YAAYC,KAAqB;CACxC,OAAOA,IAAIC,QAAQ,uBAAuB,MAAM;AAClD;AAWA,SAASQ,aAAaC,UAAiC;CACrD,IAAIC,UAAUhB,KAAKiB,QAAQF,QAAQ;CAEnC,OAAO,MAAM;EACX,KAAK,MAAMG,QAAQ,CAAC,iBAAiB,oBAAoB,GAAG;GAC1D,MAAMC,YAAYnB,KAAKoB,KAAKJ,SAASE,IAAI;GACzC,IAAIjB,OAAGoB,WAAWF,SAAS,GACzB,OAAOA;EAEX;EAEA,MAAMG,SAAStB,KAAKuB,QAAQP,OAAO;EACnC,IAAIM,WAAWN,SACb,OAAO;EAETA,UAAUM;CACZ;AACF;AAEA,SAASE,kBAAkBC,OAAuB;CAChD,IAAIC,SAAS;CACb,IAAIC,WAAW;CACf,IAAIC,UAAU;CACd,IAAIC,gBAAgB;CACpB,IAAIC,iBAAiB;CAErB,KAAK,IAAIC,IAAI,GAAGA,IAAIN,MAAMO,QAAQD,KAAK,GAAG;EACxC,MAAME,OAAOR,MAAMM;EACnB,MAAMG,OAAOT,MAAMM,IAAI;EAEvB,IAAIF,eAAe;GACjB,IAAII,SAAS,QAAQA,SAAS,MAAM;IAClCJ,gBAAgB;IAChBH,UAAUO;GACZ;GACA;EACF;EAEA,IAAIH,gBAAgB;GAClB,IAAIG,SAAS,OAAOC,SAAS,KAAK;IAChCJ,iBAAiB;IACjBC,KAAK;IACL;GACF;GACAL,UAAUO,SAAS,QAAQA,SAAS,OAAOA,OAAO;GAClD;EACF;EAEA,IAAIN,UAAU;GACZD,UAAUO;GACV,IAAIL,SACFA,UAAU;QACL,IAAIK,SAAS,MAClBL,UAAU;QACL,IAAIK,SAAS,MAClBN,WAAW;GAEb;EACF;EAEA,IAAIM,SAAS,OAAOC,SAAS,KAAK;GAChCL,gBAAgB;GAChBE,KAAK;GACL;EACF;EAEA,IAAIE,SAAS,OAAOC,SAAS,KAAK;GAChCJ,iBAAiB;GACjBC,KAAK;GACL;EACF;EAEA,IAAIE,SAAS,MACXN,WAAW;EAEbD,UAAUO;CACZ;CAEA,OAAOP;AACT;AAEA,SAASS,oBAAoBV,OAAuB;CAClD,IAAIC,SAAS;CACb,IAAIC,WAAW;CACf,IAAIC,UAAU;CAEd,KAAK,IAAIG,IAAI,GAAGA,IAAIN,MAAMO,QAAQD,KAAK,GAAG;EACxC,MAAME,OAAOR,MAAMM;EAEnB,IAAIJ,UAAU;GACZD,UAAUO;GACV,IAAIL,SACFA,UAAU;QACL,IAAIK,SAAS,MAClBL,UAAU;QACL,IAAIK,SAAS,MAClBN,WAAW;GAEb;EACF;EAEA,IAAIM,SAAS,MAAM;GACjBN,WAAW;GACXD,UAAUO;GACV;EACF;EAEA,IAAIA,SAAS,KAAK;GAChB,IAAIG,YAAYL,IAAI;GACpB,OAAO,KAAKM,KAAKZ,MAAMW,cAAc,EAAE,GACrCA,aAAa;GAEf,MAAMF,OAAOT,MAAMW;GACnB,IAAIF,SAAS,OAAOA,SAAS,KAC3B;EAEJ;EAEAR,UAAUO;CACZ;CAEA,OAAOP;AACT;AAEA,SAASY,WAAWC,UAA+B;CACjD,MAAMC,MAAMvC,OAAGwC,aAAaF,UAAU,MAAM;CAC5C,OAAOG,KAAKC,MAAMR,oBAAoBX,kBAAkBgB,GAAG,CAAC,CAAC;AAC/D;AAEA,SAASI,oBAAoBzB,WAAkC;CAC7D,IAAInB,KAAK6C,QAAQ1B,SAAS,MAAM,WAAWlB,OAAGoB,WAAWF,SAAS,KAAKlB,OAAG6C,SAAS3B,SAAS,CAAC,CAAC4B,OAAO,GACnG,OAAO5B;CAGT,IAAInB,KAAK6C,QAAQ1B,SAAS,MAAM,IAAI;EAClC,MAAM6B,gBAAgB,GAAG7B,UAAS;EAClC,IAAIlB,OAAGoB,WAAW2B,aAAa,KAAK/C,OAAG6C,SAASE,aAAa,CAAC,CAACD,OAAO,GACpE,OAAOC;CAEX;CAEA,MAAMC,qBAAqBjD,KAAKoB,KAAKD,WAAW,eAAe;CAC/D,IAAIlB,OAAGoB,WAAW4B,kBAAkB,KAAKhD,OAAG6C,SAASG,kBAAkB,CAAC,CAACF,OAAO,GAC9E,OAAOE;CAGT,OAAO;AACT;AAEA,SAASC,eAAeC,WAAmBC,WAA2B;CACpE,IAAID,UAAUE,WAAW,GAAG,KAAKrD,KAAKsD,WAAWH,SAAS,GAAG;EAC3D,MAAMI,WAAWX,oBAAoB5C,KAAKiB,QAAQmC,WAAWD,SAAS,CAAC;EACvE,IAAII,UACF,OAAOA;CAEX,OAAO;EACL,MAAMC,eAAetD,cAAcF,KAAKoB,KAAKgC,WAAW,eAAe,CAAC;EACxE,IAAI;GACF,MAAMG,WAAWC,aAAavC,QAAQkC,SAAS;GAC/C,IAAInD,KAAK6C,QAAQU,QAAQ,MAAM,SAC7B,OAAOA;EAEX,SAASE,MAAM,CACb;EAGF,IAAI;GACF,OAAOD,aAAavC,QAAQ,GAAGkC,UAAS,eAAgB;EAC1D,SAASM,MAAM;GACb,MAAMF,WAAWX,oBAAoB5C,KAAKiB,QAAQmC,WAAWD,SAAS,CAAC;GACvE,IAAII,UACF,OAAOA;EAEX;CACF;CAEA,MAAM,IAAIG,MAAM,sDAAsDP,UAAS,SAAUC,WAAW;AACtG;AAEA,SAASO,eAAe9C,OAA2C;CACjE,IAAI,CAACA,SAAS,OAAOA,UAAU,YAAY+C,MAAMC,QAAQhD,KAAK,GAC5D;CAGF,MAAMkD,aAA4B,CAAC;CACnC,KAAK,MAAM,CAACC,KAAKC,UAAUC,OAAOC,QAAQtD,KAAK,GAC7C,IAAI+C,MAAMC,QAAQI,KAAK,KAAKA,MAAMG,OAAOC,UAAU,OAAOA,UAAU,QAAQ,GAC1EN,WAAWC,OAAOC;CAItB,OAAOC,OAAOI,KAAKP,UAAU,CAAC,CAAC/B,SAAS,IAAI+B,aAAaD,KAAAA;AAC3D;AAEA,SAASS,iBAAiBC,YAAoBC,uBAAO,IAAIC,IAAY,GAA6D;CAChI,MAAMC,iBAAiB3E,KAAKiB,QAAQuD,UAAU;CAC9C,IAAIC,KAAKG,IAAID,cAAc,GACzB,MAAM,IAAIjB,MAAM,wDAAwDiB,gBAAgB;CAE1FF,KAAKI,IAAIF,cAAc;CAEvB,MAAMvB,YAAYpD,KAAKuB,QAAQoD,cAAc;CAC7C,MAAMnC,MAAMF,WAAWqC,cAAc;CACrC,MAAMG,iBAAiBlB,MAAMC,QAAQrB,IAAI9B,OAAO,IAC5C8B,IAAI9B,UACJ,OAAO8B,IAAI9B,YAAY,WACrB,CAAC8B,IAAI9B,OAAO,IACZ,CAAA;CAEN,IAAIqE,YAAwD,EAC1DnE,SAASwC,UACX;CAEA,KAAK,MAAMiB,SAASS,gBAClBC,YAAYR,iBAAiBrB,eAAemB,OAAOjB,SAAS,GAAGqB,IAAI;CAGrE,MAAM9D,kBAAkB6B,IAAI7B,mBAAmB,CAAC;CAChD,MAAMqE,SAAS;EACbhF,MAAM2E;EACN/D,SAAS,OAAOD,gBAAgBC,YAAY,WACxCZ,KAAKiB,QAAQmC,WAAWzC,gBAAgBC,OAAO,IAC/CmE,UAAUnE;EACdC,OAAO8C,eAAehD,gBAAgBE,KAAK,KAAKkE,UAAUlE;CAC5D;CAEA4D,KAAKQ,OAAON,cAAc;CAC1B,OAAOK;AACT;AAEA,SAASE,eAAyE;CAChF,MAAMV,aAAa1D,aAAaqE,QAAQC,IAAI,CAAC;CAC7C,IAAI,CAACZ,YACH,MAAM,IAAId,MAAM,uDAAuD;CAGzE,OAAOa,iBAAiBC,UAAU;AACpC;AAIA,SAASiB,aAAaC,UAAsF;CAC1G,MAAM7E,QAAQ6E,UAAU7E;CACxB,IAAI,CAACA,OAAO,OAAO,CAAA;CAEnB,MAAMD,UAAU8E,SAAS9E,WAAWZ,KAAKuB,QAAQmE,SAAS1F,IAAI;CAC9D,MAAM2F,QAA0B,CAAA;CAEhC,KAAK,MAAM,CAAC3B,KAAK4B,YAAY1B,OAAOC,QAAQtD,KAAK,GAAG;EAClD,IAAI,CAAC+C,MAAMC,QAAQ+B,OAAO,GAAG;EAE7B,KAAK,MAAMC,UAAUD,SAAS;GAC5B,IAAI,gBAAgBvD,KAAKwD,MAAM,GAAG;GAElC,IAAI7B,IAAI8B,SAAS,GAAG,KAAKD,OAAOC,SAAS,GAAG,GAAG;IAC7C,MAAMC,kBAAkBF,OAAOG,SAAS,GAAG,IAAI,SAAS;IACxD,MAAMV,OAAO,IAAIC,OACf,IAAInF,YAAY4D,GAAG,CAAC,CAACiC,MAAM,KAAK,CAAC,CAAC7E,KAAK2E,eAAe,EAAC,EACzD;IACA,IAAIG,aAAa;IACjB,MAAMC,iBAAiBN,OAAOvF,QAAQ,aAAa,IAAI,EAAE4F,YAAY;IACrE,MAAMV,cAAcxF,KAAKiB,QAAQL,SAASuF,cAAc;IACxD,MAAMC,YAAYZ,YAAYlF,QAAQ,WAAW,EAAE;IACnD,IACE8F,UAAUN,SAAS,GAAG9F,KAAKqG,IAAG,cAAerG,KAAKqG,KAAK,KACvD,CAACpG,OAAGoB,WAAW+E,SAAS,GAExB;IAEFT,MAAMW,KAAK;KAAEhB;KAAME;IAAY,CAAC;IAChC;GACF;GAEA,MAAMF,OAAOtB,IAAI1D,QAAQ,OAAO,EAAE;GAClC,MAAMiG,cAAcV,OAAOvF,QAAQ,OAAO,EAAE;GAC5C,MAAMkF,cAAcxF,KAAKiB,QAAQL,SAAS2F,WAAW;GACrD,IACEf,YAAYM,SAAS,GAAG9F,KAAKqG,IAAG,cAAerG,KAAKqG,KAAK,KACzD,CAACpG,OAAGoB,WAAWmE,WAAW,GAE1B;GAEFG,MAAMW,KAAK;IAAEhB;IAAME;GAAY,CAAC;EAClC;CACF;CAEA,OAAOG;AACT;AAGA,IAAMA,QAAQF,aADGP,aACUQ,CAAQ;AAEnC,IAAA,wBAAevF,aAAa;CAC1BkC,MAAM,EACJmE,SAAS,CAAC,iCAAiC,EAC7C;CACAvF,SAAS0E,MAAM3D,SAAS,IAAI,EAAE2D,MAAM,IAAI7B,KAAAA;AAC1C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rpcbase/test",
3
- "version": "0.385.0",
3
+ "version": "0.386.0",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"