@rpcbase/test 0.307.0 → 0.309.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/README.md +2 -2
- package/dist/clearDatabase.d.ts +2 -0
- package/dist/clearDatabase.d.ts.map +1 -0
- package/dist/clearDatabase.js +12 -0
- package/dist/clearDatabase.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +785 -0
- package/dist/cli.js.map +1 -0
- package/dist/coverage/collect.d.ts +5 -0
- package/dist/coverage/collect.d.ts.map +1 -0
- package/dist/coverage/collect.js +113 -0
- package/dist/coverage/collect.js.map +1 -0
- package/dist/coverage/config-loader.d.ts +11 -0
- package/dist/coverage/config-loader.d.ts.map +1 -0
- package/dist/coverage/config-loader.js +292 -0
- package/dist/coverage/config-loader.js.map +1 -0
- package/dist/coverage/config.d.ts +3 -0
- package/dist/coverage/config.d.ts.map +1 -0
- package/dist/coverage/config.js +110 -0
- package/dist/coverage/config.js.map +1 -0
- package/dist/coverage/files.d.ts +4 -0
- package/dist/coverage/files.d.ts.map +1 -0
- package/dist/coverage/files.js +52 -0
- package/dist/coverage/files.js.map +1 -0
- package/dist/coverage/fixtures.d.ts +5 -0
- package/dist/coverage/fixtures.d.ts.map +1 -0
- package/dist/coverage/fixtures.js +42 -0
- package/dist/coverage/fixtures.js.map +1 -0
- package/dist/coverage/global-setup.d.ts +3 -0
- package/dist/coverage/global-setup.d.ts.map +1 -0
- package/dist/coverage/global-setup.js +18 -0
- package/dist/coverage/global-setup.js.map +1 -0
- package/dist/coverage/index.d.ts +10 -0
- package/dist/coverage/index.d.ts.map +1 -0
- package/dist/coverage/index.js +62 -0
- package/dist/coverage/index.js.map +1 -0
- package/dist/coverage/report.d.ts +7 -0
- package/dist/coverage/report.d.ts.map +1 -0
- package/dist/coverage/report.js +524 -0
- package/dist/coverage/report.js.map +1 -0
- package/dist/coverage/reporter.d.ts +16 -0
- package/dist/coverage/reporter.d.ts.map +1 -0
- package/dist/coverage/reporter.js +57 -0
- package/dist/coverage/reporter.js.map +1 -0
- package/dist/coverage/types.d.ts +47 -0
- package/dist/coverage/types.d.ts.map +1 -0
- package/dist/coverage/v8-tracker.d.ts +6 -0
- package/dist/coverage/v8-tracker.d.ts.map +1 -0
- package/dist/coverage/v8-tracker.js +166 -0
- package/dist/coverage/v8-tracker.js.map +1 -0
- package/dist/defineConfig.d.ts +3 -0
- package/dist/defineConfig.d.ts.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +61 -0
- package/dist/index.js.map +1 -0
- package/dist/serverCoverage.d.ts +8 -0
- package/dist/serverCoverage.d.ts.map +1 -0
- package/dist/serverCoverage.js +42 -0
- package/dist/serverCoverage.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +83 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +25 -14
- package/index.d.ts +0 -64
- package/src/clearDatabase.js +0 -19
- package/src/cli.js +0 -501
- package/src/coverage/collect.js +0 -134
- package/src/coverage/config-loader.js +0 -206
- package/src/coverage/config.js +0 -134
- package/src/coverage/files.js +0 -55
- package/src/coverage/fixtures.js +0 -37
- package/src/coverage/global-setup.js +0 -19
- package/src/coverage/index.js +0 -30
- package/src/coverage/report.js +0 -600
- package/src/coverage/reporter.js +0 -65
- package/src/coverage/v8-tracker.js +0 -205
- package/src/defineConfig.js +0 -129
- package/src/index.js +0 -49
- package/src/vitest.config.mjs +0 -107
- /package/{src → dist}/register-tty.cjs +0 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
const DEFAULT_THRESHOLDS = {
|
|
3
|
+
branches: 60,
|
|
4
|
+
functions: 75,
|
|
5
|
+
lines: 75,
|
|
6
|
+
statements: 75
|
|
7
|
+
};
|
|
8
|
+
const THRESHOLD_KEYS = Object.keys(DEFAULT_THRESHOLDS);
|
|
9
|
+
const THRESHOLD_KEY_SET = new Set(THRESHOLD_KEYS);
|
|
10
|
+
function resolveDir(root, target, fallback) {
|
|
11
|
+
if (!target) {
|
|
12
|
+
return path.resolve(root, fallback);
|
|
13
|
+
}
|
|
14
|
+
if (path.isAbsolute(target)) {
|
|
15
|
+
return target;
|
|
16
|
+
}
|
|
17
|
+
return path.resolve(root, target);
|
|
18
|
+
}
|
|
19
|
+
function createCoverageConfig(options) {
|
|
20
|
+
const { rootDir } = options;
|
|
21
|
+
if (!rootDir) {
|
|
22
|
+
throw new Error("createCoverageConfig requires a rootDir");
|
|
23
|
+
}
|
|
24
|
+
const resolvedRootDir = path.resolve(rootDir);
|
|
25
|
+
const includeAllFiles = options.includeAllFiles !== false;
|
|
26
|
+
const collectCoverageFrom = Array.isArray(options.collectCoverageFrom) ? options.collectCoverageFrom.map((pattern) => String(pattern ?? "").trim()).filter((pattern) => pattern.length > 0) : [];
|
|
27
|
+
if (collectCoverageFrom.length === 0) {
|
|
28
|
+
throw new Error("createCoverageConfig requires a collectCoverageFrom option");
|
|
29
|
+
}
|
|
30
|
+
const testResultsRoot = resolveDir(resolvedRootDir, options.testResultsDir, "test-results");
|
|
31
|
+
const coverageReportDir = resolveDir(testResultsRoot, options.coverageReportSubdir, "coverage");
|
|
32
|
+
const coverageFileName = options.coverageFileName ?? "v8-coverage.json";
|
|
33
|
+
const disabledEnvVar = options.disabledEnvVar ?? "RB_DISABLE_COVERAGE";
|
|
34
|
+
const coverageEnabled = process.env[disabledEnvVar] !== "1";
|
|
35
|
+
const { global: thresholds, targets: thresholdTargets } = normalizeThresholdOptions(options.thresholds);
|
|
36
|
+
return {
|
|
37
|
+
rootDir: resolvedRootDir,
|
|
38
|
+
collectCoverageFrom,
|
|
39
|
+
testResultsRoot,
|
|
40
|
+
coverageReportDir,
|
|
41
|
+
coverageFileName,
|
|
42
|
+
thresholds,
|
|
43
|
+
thresholdTargets,
|
|
44
|
+
coverageEnabled,
|
|
45
|
+
disabledEnvVar,
|
|
46
|
+
includeAllFiles
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function normalizeThresholdOptions(rawThresholds) {
|
|
50
|
+
const globalThresholds = { ...DEFAULT_THRESHOLDS };
|
|
51
|
+
const targets = [];
|
|
52
|
+
if (!isPlainObject(rawThresholds)) {
|
|
53
|
+
return { global: globalThresholds, targets };
|
|
54
|
+
}
|
|
55
|
+
const thresholdMap = rawThresholds;
|
|
56
|
+
for (const key of THRESHOLD_KEYS) {
|
|
57
|
+
const value = thresholdMap[key];
|
|
58
|
+
if (isThresholdValue(value)) {
|
|
59
|
+
globalThresholds[key] = value;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (Object.prototype.hasOwnProperty.call(thresholdMap, "global")) {
|
|
63
|
+
if (!isPlainObject(thresholdMap.global)) {
|
|
64
|
+
throw new Error("coverage thresholds: the `global` override must be an object of metric values");
|
|
65
|
+
}
|
|
66
|
+
Object.assign(globalThresholds, pickThresholdOverrides(thresholdMap.global));
|
|
67
|
+
}
|
|
68
|
+
for (const [pattern, overrides] of Object.entries(thresholdMap)) {
|
|
69
|
+
if (pattern === "global" || THRESHOLD_KEY_SET.has(pattern)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (!isPlainObject(overrides)) {
|
|
73
|
+
throw new Error(
|
|
74
|
+
`coverage thresholds: override for "${pattern}" must be an object containing coverage metrics`
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
targets.push({
|
|
78
|
+
id: pattern,
|
|
79
|
+
pattern,
|
|
80
|
+
thresholds: {
|
|
81
|
+
...globalThresholds,
|
|
82
|
+
...pickThresholdOverrides(overrides)
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return { global: globalThresholds, targets };
|
|
87
|
+
}
|
|
88
|
+
function pickThresholdOverrides(source) {
|
|
89
|
+
const overrides = {};
|
|
90
|
+
if (!isPlainObject(source)) {
|
|
91
|
+
return overrides;
|
|
92
|
+
}
|
|
93
|
+
for (const key of THRESHOLD_KEYS) {
|
|
94
|
+
const value = source[key];
|
|
95
|
+
if (isThresholdValue(value)) {
|
|
96
|
+
overrides[key] = value;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return overrides;
|
|
100
|
+
}
|
|
101
|
+
function isPlainObject(value) {
|
|
102
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
103
|
+
}
|
|
104
|
+
function isThresholdValue(value) {
|
|
105
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
createCoverageConfig
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../src/coverage/config.ts"],"sourcesContent":["import path from \"node:path\"\n\nimport type { CoverageConfig, CoverageHarnessOptions, CoverageThresholdMap, CoverageThresholdOption, CoverageThresholdTarget, CoverageThresholds } from \"./types\"\n\n\nconst DEFAULT_THRESHOLDS = {\n branches: 60,\n functions: 75,\n lines: 75,\n statements: 75,\n}\n\nconst THRESHOLD_KEYS = Object.keys(DEFAULT_THRESHOLDS) as Array<keyof CoverageThresholds>\nconst THRESHOLD_KEY_SET = new Set<string>(THRESHOLD_KEYS as string[])\n\nfunction resolveDir(root: string, target: string | undefined, fallback: string): string {\n if (!target) {\n return path.resolve(root, fallback)\n }\n\n if (path.isAbsolute(target)) {\n return target\n }\n\n return path.resolve(root, target)\n}\n\nexport function createCoverageConfig(options: CoverageHarnessOptions): CoverageConfig {\n const { rootDir } = options as CoverageHarnessOptions\n if (!rootDir) {\n throw new Error(\"createCoverageConfig requires a rootDir\")\n }\n\n const resolvedRootDir = path.resolve(rootDir)\n const includeAllFiles = options.includeAllFiles !== false\n\n const collectCoverageFrom = Array.isArray(options.collectCoverageFrom)\n ? options.collectCoverageFrom\n .map((pattern) => String(pattern ?? \"\").trim())\n .filter((pattern) => pattern.length > 0)\n : []\n\n if (collectCoverageFrom.length === 0) {\n throw new Error(\"createCoverageConfig requires a collectCoverageFrom option\")\n }\n\n const testResultsRoot = resolveDir(resolvedRootDir, options.testResultsDir, \"test-results\")\n const coverageReportDir = resolveDir(testResultsRoot, options.coverageReportSubdir, \"coverage\")\n const coverageFileName = options.coverageFileName ?? \"v8-coverage.json\"\n const disabledEnvVar = options.disabledEnvVar ?? \"RB_DISABLE_COVERAGE\"\n const coverageEnabled = process.env[disabledEnvVar] !== \"1\"\n\n const { global: thresholds, targets: thresholdTargets } = normalizeThresholdOptions(options.thresholds)\n\n return {\n rootDir: resolvedRootDir,\n collectCoverageFrom,\n testResultsRoot,\n coverageReportDir,\n coverageFileName,\n thresholds,\n thresholdTargets,\n coverageEnabled,\n disabledEnvVar,\n includeAllFiles,\n }\n}\n\nfunction normalizeThresholdOptions(rawThresholds: CoverageThresholdOption | undefined): {\n global: CoverageThresholds\n targets: CoverageThresholdTarget[]\n} {\n const globalThresholds: CoverageThresholds = { ...DEFAULT_THRESHOLDS }\n const targets: CoverageThresholdTarget[] = []\n\n if (!isPlainObject(rawThresholds)) {\n return { global: globalThresholds, targets }\n }\n\n const thresholdMap = rawThresholds as CoverageThresholdMap\n\n for (const key of THRESHOLD_KEYS) {\n const value = thresholdMap[key]\n if (isThresholdValue(value)) {\n globalThresholds[key] = value\n }\n }\n\n if (Object.prototype.hasOwnProperty.call(thresholdMap, \"global\")) {\n if (!isPlainObject(thresholdMap.global)) {\n throw new Error(\"coverage thresholds: the `global` override must be an object of metric values\")\n }\n Object.assign(globalThresholds, pickThresholdOverrides(thresholdMap.global))\n }\n\n for (const [pattern, overrides] of Object.entries(thresholdMap)) {\n if (pattern === \"global\" || THRESHOLD_KEY_SET.has(pattern)) {\n continue\n }\n\n if (!isPlainObject(overrides)) {\n throw new Error(\n `coverage thresholds: override for \"${pattern}\" must be an object containing coverage metrics`,\n )\n }\n\n targets.push({\n id: pattern,\n pattern,\n thresholds: {\n ...globalThresholds,\n ...pickThresholdOverrides(overrides),\n },\n })\n }\n\n return { global: globalThresholds, targets }\n}\n\nfunction pickThresholdOverrides(source: unknown): Partial<CoverageThresholds> {\n const overrides: Partial<CoverageThresholds> = {}\n if (!isPlainObject(source)) {\n return overrides\n }\n\n for (const key of THRESHOLD_KEYS) {\n const value = (source as any)[key]\n if (isThresholdValue(value)) {\n overrides[key] = value\n }\n }\n\n return overrides\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n}\n\nfunction isThresholdValue(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value)\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { CoverageConfig } from './types';
|
|
2
|
+
export declare function findCoverageFiles(config: CoverageConfig, root?: string): Promise<string[]>;
|
|
3
|
+
export declare function removeCoverageFiles(config: CoverageConfig, root?: string): Promise<void>;
|
|
4
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/coverage/files.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAG7C,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,SAAyB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA4BhH;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,SAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9G"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
async function findCoverageFiles(config, root = config.testResultsRoot) {
|
|
4
|
+
const files = [];
|
|
5
|
+
async function walk(current) {
|
|
6
|
+
const entries = await fs.readdir(current, { withFileTypes: true });
|
|
7
|
+
await Promise.all(
|
|
8
|
+
entries.map(async (entry) => {
|
|
9
|
+
const entryPath = path.join(current, entry.name);
|
|
10
|
+
if (entry.isDirectory()) {
|
|
11
|
+
await walk(entryPath);
|
|
12
|
+
} else if (entry.isFile() && entry.name === config.coverageFileName) {
|
|
13
|
+
files.push(entryPath);
|
|
14
|
+
}
|
|
15
|
+
})
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
try {
|
|
19
|
+
const stats = await fs.stat(root);
|
|
20
|
+
if (!stats.isDirectory()) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
} catch {
|
|
24
|
+
return [];
|
|
25
|
+
}
|
|
26
|
+
await walk(root);
|
|
27
|
+
return files.sort();
|
|
28
|
+
}
|
|
29
|
+
async function removeCoverageFiles(config, root = config.testResultsRoot) {
|
|
30
|
+
async function walk(current) {
|
|
31
|
+
const entries = await fs.readdir(current, { withFileTypes: true });
|
|
32
|
+
await Promise.all(
|
|
33
|
+
entries.map(async (entry) => {
|
|
34
|
+
const entryPath = path.join(current, entry.name);
|
|
35
|
+
if (entry.isDirectory()) {
|
|
36
|
+
await walk(entryPath);
|
|
37
|
+
} else if (entry.isFile() && entry.name === config.coverageFileName) {
|
|
38
|
+
await fs.rm(entryPath, { force: true });
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
await walk(root);
|
|
45
|
+
} catch {
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
findCoverageFiles,
|
|
50
|
+
removeCoverageFiles
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sources":["../../src/coverage/files.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\nimport path from \"node:path\"\n\nimport type { CoverageConfig } from \"./types\"\n\n\nexport async function findCoverageFiles(config: CoverageConfig, root = config.testResultsRoot): Promise<string[]> {\n const files: string[] = []\n\n async function walk(current: string): Promise<void> {\n const entries = await fs.readdir(current, { withFileTypes: true })\n await Promise.all(\n entries.map(async (entry) => {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(entryPath)\n } else if (entry.isFile() && entry.name === config.coverageFileName) {\n files.push(entryPath)\n }\n }),\n )\n }\n\n try {\n const stats = await fs.stat(root)\n if (!stats.isDirectory()) {\n return []\n }\n } catch {\n return []\n }\n\n await walk(root)\n return files.sort()\n}\n\nexport async function removeCoverageFiles(config: CoverageConfig, root = config.testResultsRoot): Promise<void> {\n async function walk(current: string): Promise<void> {\n const entries = await fs.readdir(current, { withFileTypes: true })\n await Promise.all(\n entries.map(async (entry) => {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n await walk(entryPath)\n } else if (entry.isFile() && entry.name === config.coverageFileName) {\n await fs.rm(entryPath, { force: true })\n }\n }),\n )\n }\n\n try {\n await walk(root)\n } catch {\n // ignore cleanup errors\n }\n}\n"],"names":[],"mappings":";;AAMA,eAAsB,kBAAkB,QAAwB,OAAO,OAAO,iBAAoC;AAChH,QAAM,QAAkB,CAAA;AAExB,iBAAe,KAAK,SAAgC;AAClD,UAAM,UAAU,MAAM,GAAG,QAAQ,SAAS,EAAE,eAAe,MAAM;AACjE,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,YAAY,KAAK,KAAK,SAAS,MAAM,IAAI;AAC/C,YAAI,MAAM,eAAe;AACvB,gBAAM,KAAK,SAAS;AAAA,QACtB,WAAW,MAAM,OAAA,KAAY,MAAM,SAAS,OAAO,kBAAkB;AACnE,gBAAM,KAAK,SAAS;AAAA,QACtB;AAAA,MACF,CAAC;AAAA,IAAA;AAAA,EAEL;AAEA,MAAI;AACF,UAAM,QAAQ,MAAM,GAAG,KAAK,IAAI;AAChC,QAAI,CAAC,MAAM,eAAe;AACxB,aAAO,CAAA;AAAA,IACT;AAAA,EACF,QAAQ;AACN,WAAO,CAAA;AAAA,EACT;AAEA,QAAM,KAAK,IAAI;AACf,SAAO,MAAM,KAAA;AACf;AAEA,eAAsB,oBAAoB,QAAwB,OAAO,OAAO,iBAAgC;AAC9G,iBAAe,KAAK,SAAgC;AAClD,UAAM,UAAU,MAAM,GAAG,QAAQ,SAAS,EAAE,eAAe,MAAM;AACjE,UAAM,QAAQ;AAAA,MACZ,QAAQ,IAAI,OAAO,UAAU;AAC3B,cAAM,YAAY,KAAK,KAAK,SAAS,MAAM,IAAI;AAC/C,YAAI,MAAM,eAAe;AACvB,gBAAM,KAAK,SAAS;AAAA,QACtB,WAAW,MAAM,OAAA,KAAY,MAAM,SAAS,OAAO,kBAAkB;AACnE,gBAAM,GAAG,GAAG,WAAW,EAAE,OAAO,MAAM;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IAAA;AAAA,EAEL;AAEA,MAAI;AACF,UAAM,KAAK,IAAI;AAAA,EACjB,QAAQ;AAAA,EAER;AACF;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../../src/coverage/fixtures.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAoB7C,wBAAgB,sBAAsB,CAAC,CAAC,SAAS;IAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAA;CAAE,EACrF,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,cAAc,GACrB,CAAC,CAiCH"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createCoverageTracker } from "./v8-tracker.js";
|
|
2
|
+
function shouldSilenceCoverageInitError(error) {
|
|
3
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
4
|
+
return message.includes("Script execution is prohibited");
|
|
5
|
+
}
|
|
6
|
+
function noopTracker() {
|
|
7
|
+
return {
|
|
8
|
+
async stop() {
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function createCoverageFixtures(baseTest, config) {
|
|
13
|
+
return baseTest.extend({
|
|
14
|
+
page: async ({ page }, use, testInfo) => {
|
|
15
|
+
let tracker = noopTracker();
|
|
16
|
+
if (config.coverageEnabled) {
|
|
17
|
+
try {
|
|
18
|
+
tracker = await createCoverageTracker(page, config);
|
|
19
|
+
} catch (error) {
|
|
20
|
+
if (shouldSilenceCoverageInitError(error)) {
|
|
21
|
+
tracker = noopTracker();
|
|
22
|
+
} else {
|
|
23
|
+
console.warn("[coverage] failed to initialize V8 coverage:", error);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
await use(page);
|
|
29
|
+
} finally {
|
|
30
|
+
try {
|
|
31
|
+
await tracker.stop(testInfo);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
console.warn("[coverage] failed to record V8 coverage:", error);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
export {
|
|
40
|
+
createCoverageFixtures
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixtures.js","sources":["../../src/coverage/fixtures.ts"],"sourcesContent":["import type { Page, TestInfo } from \"@playwright/test\"\n\nimport { createCoverageTracker } from \"./v8-tracker\"\nimport type { CoverageConfig } from \"./types\"\n\n\ntype CoverageTracker = {\n stop: (testInfo: TestInfo) => Promise<void>\n}\n\nfunction shouldSilenceCoverageInitError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error)\n return message.includes(\"Script execution is prohibited\")\n}\n\nfunction noopTracker(): CoverageTracker {\n return {\n async stop() {\n // no-op\n },\n }\n}\n\nexport function createCoverageFixtures<T extends { extend: (fixtures: any) => unknown }>(\n baseTest: T,\n config: CoverageConfig,\n): T {\n return baseTest.extend({\n page: async (\n { page }: { page: Page },\n use: (page: Page) => Promise<void>,\n testInfo: TestInfo,\n ) => {\n let tracker: CoverageTracker = noopTracker()\n\n if (config.coverageEnabled) {\n try {\n tracker = await createCoverageTracker(page, config)\n } catch (error) {\n if (shouldSilenceCoverageInitError(error)) {\n tracker = noopTracker()\n } else {\n console.warn(\"[coverage] failed to initialize V8 coverage:\", error)\n }\n }\n }\n\n try {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n await use(page)\n } finally {\n try {\n await tracker.stop(testInfo)\n } catch (error) {\n console.warn(\"[coverage] failed to record V8 coverage:\", error)\n }\n }\n },\n }) as T\n}\n"],"names":[],"mappings":";AAUA,SAAS,+BAA+B,OAAyB;AAC/D,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,QAAQ,SAAS,gCAAgC;AAC1D;AAEA,SAAS,cAA+B;AACtC,SAAO;AAAA,IACL,MAAM,OAAO;AAAA,IAEb;AAAA,EAAA;AAEJ;AAEO,SAAS,uBACd,UACA,QACG;AACH,SAAO,SAAS,OAAO;AAAA,IACrB,MAAM,OACJ,EAAE,QACF,KACA,aACG;AACH,UAAI,UAA2B,YAAA;AAE/B,UAAI,OAAO,iBAAiB;AAC1B,YAAI;AACF,oBAAU,MAAM,sBAAsB,MAAM,MAAM;AAAA,QACpD,SAAS,OAAO;AACd,cAAI,+BAA+B,KAAK,GAAG;AACzC,sBAAU,YAAA;AAAA,UACZ,OAAO;AACL,oBAAQ,KAAK,gDAAgD,KAAK;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAEA,UAAI;AAEF,cAAM,IAAI,IAAI;AAAA,MAChB,UAAA;AACE,YAAI;AACF,gBAAM,QAAQ,KAAK,QAAQ;AAAA,QAC7B,SAAS,OAAO;AACd,kBAAQ,KAAK,4CAA4C,KAAK;AAAA,QAChE;AAAA,MACF;AAAA,IACF;AAAA,EAAA,CACD;AACH;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-setup.d.ts","sourceRoot":"","sources":["../../src/coverage/global-setup.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAG7C,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAarF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import { removeCoverageFiles } from "./files.js";
|
|
3
|
+
function createCoverageGlobalSetup(config) {
|
|
4
|
+
return async function globalSetup() {
|
|
5
|
+
if (process.env.RB_TEST_COMBINED_COVERAGE === "1") {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (!config.coverageEnabled) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
await removeCoverageFiles(config);
|
|
12
|
+
await fs.rm(config.coverageReportDir, { recursive: true, force: true });
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
createCoverageGlobalSetup
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=global-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-setup.js","sources":["../../src/coverage/global-setup.ts"],"sourcesContent":["import fs from \"node:fs/promises\"\n\nimport { removeCoverageFiles } from \"./files\"\nimport type { CoverageConfig } from \"./types\"\n\n\nexport function createCoverageGlobalSetup(config: CoverageConfig): () => Promise<void> {\n return async function globalSetup() {\n if (process.env.RB_TEST_COMBINED_COVERAGE === \"1\") {\n return\n }\n\n if (!config.coverageEnabled) {\n return\n }\n\n await removeCoverageFiles(config)\n await fs.rm(config.coverageReportDir, { recursive: true, force: true })\n }\n}\n"],"names":[],"mappings":";;AAMO,SAAS,0BAA0B,QAA6C;AACrF,SAAO,eAAe,cAAc;AAClC,QAAI,QAAQ,IAAI,8BAA8B,KAAK;AACjD;AAAA,IACF;AAEA,QAAI,CAAC,OAAO,iBAAiB;AAC3B;AAAA,IACF;AAEA,UAAM,oBAAoB,MAAM;AAChC,UAAM,GAAG,GAAG,OAAO,mBAAmB,EAAE,WAAW,MAAM,OAAO,MAAM;AAAA,EACxE;AACF;"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { CoverageHarness, CoverageHarnessOptions } from './types';
|
|
2
|
+
export declare function createCoverageHarness(options: CoverageHarnessOptions): CoverageHarness;
|
|
3
|
+
export { CoverageReporter } from './reporter';
|
|
4
|
+
export { createCoverageConfig } from './config';
|
|
5
|
+
export { generateCoverageReport } from './report';
|
|
6
|
+
export { createCoverageFixtures } from './fixtures';
|
|
7
|
+
export { createCoverageGlobalSetup } from './global-setup';
|
|
8
|
+
export { findCoverageFiles, removeCoverageFiles } from './files';
|
|
9
|
+
export type * from './types';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coverage/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAGtE,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAgBtF;AAkCD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAA;AAChE,mBAAmB,SAAS,CAAA"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createRequire } from "node:module";
|
|
4
|
+
import { createCoverageConfig } from "./config.js";
|
|
5
|
+
import { createCoverageGlobalSetup } from "./global-setup.js";
|
|
6
|
+
import { createCoverageFixtures } from "./fixtures.js";
|
|
7
|
+
import "node:fs/promises";
|
|
8
|
+
import "node:url";
|
|
9
|
+
import "istanbul-lib-coverage";
|
|
10
|
+
import "istanbul-lib-instrument";
|
|
11
|
+
import "fast-glob";
|
|
12
|
+
import "picomatch";
|
|
13
|
+
import "v8-to-istanbul";
|
|
14
|
+
function createCoverageHarness(options) {
|
|
15
|
+
const config = createCoverageConfig(options);
|
|
16
|
+
const globalSetup = createCoverageGlobalSetup(config);
|
|
17
|
+
const reporterPath = resolveReporterPath();
|
|
18
|
+
return {
|
|
19
|
+
config,
|
|
20
|
+
globalSetup,
|
|
21
|
+
extendTest(baseTest) {
|
|
22
|
+
return createCoverageFixtures(baseTest, config);
|
|
23
|
+
},
|
|
24
|
+
reporterEntry() {
|
|
25
|
+
return [reporterPath, { coverageConfig: config }];
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function resolveReporterPath() {
|
|
30
|
+
const require2 = createRequire(path.join(process.cwd(), "package.json"));
|
|
31
|
+
const entryPath = require2.resolve("@rpcbase/test");
|
|
32
|
+
const pkgDir = findPackageRoot(entryPath) ?? path.resolve(path.dirname(entryPath), "..", "..");
|
|
33
|
+
const distReporter = path.join(pkgDir, "dist", "coverage", "reporter.js");
|
|
34
|
+
if (fs.existsSync(distReporter)) {
|
|
35
|
+
return distReporter;
|
|
36
|
+
}
|
|
37
|
+
const srcReporter = path.join(pkgDir, "src", "coverage", "reporter.ts");
|
|
38
|
+
if (fs.existsSync(srcReporter)) {
|
|
39
|
+
return srcReporter;
|
|
40
|
+
}
|
|
41
|
+
return distReporter;
|
|
42
|
+
}
|
|
43
|
+
function findPackageRoot(entryPath) {
|
|
44
|
+
let dir = path.dirname(entryPath);
|
|
45
|
+
while (true) {
|
|
46
|
+
if (fs.existsSync(path.join(dir, "package.json"))) {
|
|
47
|
+
return dir;
|
|
48
|
+
}
|
|
49
|
+
const parent = path.dirname(dir);
|
|
50
|
+
if (parent === dir) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
dir = parent;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
export {
|
|
57
|
+
createCoverageConfig,
|
|
58
|
+
createCoverageFixtures,
|
|
59
|
+
createCoverageGlobalSetup,
|
|
60
|
+
createCoverageHarness
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/coverage/index.ts"],"sourcesContent":["import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { createRequire } from \"node:module\"\n\nimport { createCoverageConfig } from \"./config\"\nimport { createCoverageGlobalSetup } from \"./global-setup\"\nimport { createCoverageFixtures } from \"./fixtures\"\nimport type { CoverageHarness, CoverageHarnessOptions } from \"./types\"\n\n\nexport function createCoverageHarness(options: CoverageHarnessOptions): CoverageHarness {\n const config = createCoverageConfig(options)\n const globalSetup = createCoverageGlobalSetup(config)\n\n const reporterPath = resolveReporterPath()\n\n return {\n config,\n globalSetup,\n extendTest<T extends { extend: (fixtures: any) => unknown }>(baseTest: T): T {\n return createCoverageFixtures(baseTest, config)\n },\n reporterEntry() {\n return [reporterPath, { coverageConfig: config }]\n },\n }\n}\n\nfunction resolveReporterPath(): string {\n const require = createRequire(path.join(process.cwd(), \"package.json\"))\n const entryPath = require.resolve(\"@rpcbase/test\")\n const pkgDir = findPackageRoot(entryPath) ?? path.resolve(path.dirname(entryPath), \"..\", \"..\")\n\n const distReporter = path.join(pkgDir, \"dist\", \"coverage\", \"reporter.js\")\n if (fs.existsSync(distReporter)) {\n return distReporter\n }\n\n const srcReporter = path.join(pkgDir, \"src\", \"coverage\", \"reporter.ts\")\n if (fs.existsSync(srcReporter)) {\n return srcReporter\n }\n\n return distReporter\n}\n\nfunction findPackageRoot(entryPath: string): string | null {\n let dir = path.dirname(entryPath)\n while (true) {\n if (fs.existsSync(path.join(dir, \"package.json\"))) {\n return dir\n }\n const parent = path.dirname(dir)\n if (parent === dir) {\n return null\n }\n dir = parent\n }\n}\n\nexport { CoverageReporter } from \"./reporter\"\nexport { createCoverageConfig } from \"./config\"\nexport { generateCoverageReport } from \"./report\"\nexport { createCoverageFixtures } from \"./fixtures\"\nexport { createCoverageGlobalSetup } from \"./global-setup\"\nexport { findCoverageFiles, removeCoverageFiles } from \"./files\"\nexport type * from \"./types\"\n"],"names":["require"],"mappings":";;;;;;;;;;;;;AAUO,SAAS,sBAAsB,SAAkD;AACtF,QAAM,SAAS,qBAAqB,OAAO;AAC3C,QAAM,cAAc,0BAA0B,MAAM;AAEpD,QAAM,eAAe,oBAAA;AAErB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,WAA6D,UAAgB;AAC3E,aAAO,uBAAuB,UAAU,MAAM;AAAA,IAChD;AAAA,IACA,gBAAgB;AACd,aAAO,CAAC,cAAc,EAAE,gBAAgB,QAAQ;AAAA,IAClD;AAAA,EAAA;AAEJ;AAEA,SAAS,sBAA8B;AACrC,QAAMA,WAAU,cAAc,KAAK,KAAK,QAAQ,IAAA,GAAO,cAAc,CAAC;AACtE,QAAM,YAAYA,SAAQ,QAAQ,eAAe;AACjD,QAAM,SAAS,gBAAgB,SAAS,KAAK,KAAK,QAAQ,KAAK,QAAQ,SAAS,GAAG,MAAM,IAAI;AAE7F,QAAM,eAAe,KAAK,KAAK,QAAQ,QAAQ,YAAY,aAAa;AACxE,MAAI,GAAG,WAAW,YAAY,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc,KAAK,KAAK,QAAQ,OAAO,YAAY,aAAa;AACtE,MAAI,GAAG,WAAW,WAAW,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,gBAAgB,WAAkC;AACzD,MAAI,MAAM,KAAK,QAAQ,SAAS;AAChC,SAAO,MAAM;AACX,QAAI,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AACjD,aAAO;AAAA,IACT;AACA,UAAM,SAAS,KAAK,QAAQ,GAAG;AAC/B,QAAI,WAAW,KAAK;AAClB,aAAO;AAAA,IACT;AACA,UAAM;AAAA,EACR;AACF;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CoverageConfig } from './types';
|
|
2
|
+
export declare class CoverageThresholdError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare function generateCoverageReport(config: CoverageConfig): Promise<void>;
|
|
6
|
+
export declare function collectCoveredFiles(config: CoverageConfig): Promise<string[]>;
|
|
7
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../src/coverage/report.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAA+C,MAAM,SAAS,CAAA;AAK1F,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAmElF;AAED,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsBnF"}
|