react-native-coverage 0.1.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/Coverage.podspec +20 -0
- package/LICENSE +202 -0
- package/README.md +125 -0
- package/android/build.gradle +51 -0
- package/android/rn-coverage-jacoco.gradle +132 -0
- package/android/rn-coverage.gradle +68 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/com/coverage/CoverageModule.kt +53 -0
- package/android/src/main/java/com/coverage/CoveragePackage.kt +35 -0
- package/app.plugin.js +1 -0
- package/bin/rn-coverage.js +11 -0
- package/cocoapods/coverage_post_install.rb +197 -0
- package/docs/cli.md +51 -0
- package/docs/config.md +27 -0
- package/docs/index.md +16 -0
- package/docs/integration/android.md +83 -0
- package/docs/integration/ci-appium.md +41 -0
- package/docs/integration/e2e-timing.md +20 -0
- package/docs/integration/ios.md +77 -0
- package/docs/integration/js.md +38 -0
- package/docs/pattern-c.md +5 -0
- package/docs/releasing.md +88 -0
- package/docs.json +24 -0
- package/ios/Coverage.h +5 -0
- package/ios/Coverage.mm +47 -0
- package/ios/CoverageConfig.h +21 -0
- package/ios/CoverageProfile.h +22 -0
- package/ios/CoverageProfile.mm +358 -0
- package/lib/module/NativeCoverage.js +10 -0
- package/lib/module/NativeCoverage.js.map +1 -0
- package/lib/module/assert-coverage.js +181 -0
- package/lib/module/assert-coverage.js.map +1 -0
- package/lib/module/cli/index.js +229 -0
- package/lib/module/cli/index.js.map +1 -0
- package/lib/module/config.js +83 -0
- package/lib/module/config.js.map +1 -0
- package/lib/module/exit-codes.js +22 -0
- package/lib/module/exit-codes.js.map +1 -0
- package/lib/module/index.js +35 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/js-coverage.js +172 -0
- package/lib/module/js-coverage.js.map +1 -0
- package/lib/module/node.js +15 -0
- package/lib/module/node.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/path-rewrite.js +44 -0
- package/lib/module/path-rewrite.js.map +1 -0
- package/lib/module/process-ios-native-coverage.js +258 -0
- package/lib/module/process-ios-native-coverage.js.map +1 -0
- package/lib/module/pull-native-coverage.js +210 -0
- package/lib/module/pull-native-coverage.js.map +1 -0
- package/lib/typescript/example-dynamic/App.d.ts +6 -0
- package/lib/typescript/example-dynamic/App.d.ts.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/NativeCoverage.d.ts +16 -0
- package/lib/typescript/src/NativeCoverage.d.ts.map +1 -0
- package/lib/typescript/src/assert-coverage.d.ts +53 -0
- package/lib/typescript/src/assert-coverage.d.ts.map +1 -0
- package/lib/typescript/src/cli/index.d.ts +4 -0
- package/lib/typescript/src/cli/index.d.ts.map +1 -0
- package/lib/typescript/src/config.d.ts +93 -0
- package/lib/typescript/src/config.d.ts.map +1 -0
- package/lib/typescript/src/exit-codes.d.ts +16 -0
- package/lib/typescript/src/exit-codes.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +16 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/js-coverage.d.ts +36 -0
- package/lib/typescript/src/js-coverage.d.ts.map +1 -0
- package/lib/typescript/src/node.d.ts +14 -0
- package/lib/typescript/src/node.d.ts.map +1 -0
- package/lib/typescript/src/path-rewrite.d.ts +12 -0
- package/lib/typescript/src/path-rewrite.d.ts.map +1 -0
- package/lib/typescript/src/process-ios-native-coverage.d.ts +61 -0
- package/lib/typescript/src/process-ios-native-coverage.d.ts.map +1 -0
- package/lib/typescript/src/pull-native-coverage.d.ts +38 -0
- package/lib/typescript/src/pull-native-coverage.d.ts.map +1 -0
- package/package.json +184 -0
- package/plugin/build/index.d.ts +21 -0
- package/plugin/build/index.js +153 -0
- package/react-native-coverage.config.js.example +47 -0
- package/react-native.config.js +9 -0
- package/src/NativeCoverage.ts +16 -0
- package/src/assert-coverage.ts +260 -0
- package/src/cli/index.ts +420 -0
- package/src/config.ts +189 -0
- package/src/exit-codes.ts +20 -0
- package/src/index.tsx +35 -0
- package/src/js-coverage.ts +213 -0
- package/src/node.ts +52 -0
- package/src/path-rewrite.ts +52 -0
- package/src/process-ios-native-coverage.ts +425 -0
- package/src/pull-native-coverage.ts +269 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { execFileSync, execSync } from 'node:child_process';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import { createRequire } from 'node:module';
|
|
6
|
+
import path from 'node:path';
|
|
7
|
+
import { DEFAULT_COVERAGE_CONFIG } from "./config.js";
|
|
8
|
+
import { StrictEmptyError } from "./exit-codes.js";
|
|
9
|
+
import { getAdbBinary, resolveAndroidDeviceId } from "./pull-native-coverage.js";
|
|
10
|
+
function ensureDir(dir) {
|
|
11
|
+
fs.mkdirSync(dir, {
|
|
12
|
+
recursive: true
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Pull Android Istanbul JSON written by `dumpJsCoverage` (`files/coverage-final.json`).
|
|
18
|
+
*/
|
|
19
|
+
export function pullAndroidJsCoverage(deviceId, options = {}) {
|
|
20
|
+
const config = options.config ?? DEFAULT_COVERAGE_CONFIG;
|
|
21
|
+
const softFail = options.softFail ?? !config.strict;
|
|
22
|
+
const localDestDir = options.outputDir ?? path.resolve(process.cwd(), 'coverage/js');
|
|
23
|
+
const localDestFile = path.join(localDestDir, 'coverage-final.json');
|
|
24
|
+
const relative = config.js.androidRelativePath;
|
|
25
|
+
const staging = config.js.androidStagingPath;
|
|
26
|
+
const adb = getAdbBinary();
|
|
27
|
+
const serial = deviceId ? `-s ${deviceId}` : '';
|
|
28
|
+
try {
|
|
29
|
+
const stagingDir = path.posix.dirname(staging);
|
|
30
|
+
execSync(`${adb} ${serial} shell "mkdir -p ${stagingDir}"`);
|
|
31
|
+
execSync(`${adb} ${serial} shell "run-as ${config.app.androidApplicationId} cat ${relative} > ${staging}"`);
|
|
32
|
+
ensureDir(localDestDir);
|
|
33
|
+
execSync(`${adb} ${serial} pull ${staging} ${localDestFile}`);
|
|
34
|
+
console.log(`JS coverage downloaded to: ${localDestFile}`);
|
|
35
|
+
return localDestFile;
|
|
36
|
+
} catch (error) {
|
|
37
|
+
const message = `Android JS coverage pull failed: ${error.message}`;
|
|
38
|
+
if (softFail) {
|
|
39
|
+
console.warn(`[rn-coverage] ${message}`);
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(message);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Pull iOS Istanbul JSON from the simulator data container.
|
|
48
|
+
*/
|
|
49
|
+
export function pullIosJsCoverage(deviceId, options = {}) {
|
|
50
|
+
const config = options.config ?? DEFAULT_COVERAGE_CONFIG;
|
|
51
|
+
const softFail = options.softFail ?? !config.strict;
|
|
52
|
+
const localDestDir = options.outputDir ?? path.resolve(process.cwd(), 'coverage/js');
|
|
53
|
+
const localDestFile = path.join(localDestDir, 'coverage-final.json');
|
|
54
|
+
const relative = config.js.iosRelativePath;
|
|
55
|
+
const bundleId = config.app.iosBundleId;
|
|
56
|
+
try {
|
|
57
|
+
const container = execSync(`xcrun simctl get_app_container ${deviceId} ${bundleId} data`, {
|
|
58
|
+
encoding: 'utf8'
|
|
59
|
+
}).trim();
|
|
60
|
+
const src = path.join(container, relative);
|
|
61
|
+
if (!fs.existsSync(src)) {
|
|
62
|
+
const message = `iOS JS coverage missing at ${src}`;
|
|
63
|
+
if (softFail) {
|
|
64
|
+
console.warn(`[rn-coverage] ${message}`);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
throw new StrictEmptyError(message);
|
|
68
|
+
}
|
|
69
|
+
ensureDir(localDestDir);
|
|
70
|
+
fs.copyFileSync(src, localDestFile);
|
|
71
|
+
console.log(`JS coverage downloaded to: ${localDestFile}`);
|
|
72
|
+
return localDestFile;
|
|
73
|
+
} catch (error) {
|
|
74
|
+
if (error instanceof StrictEmptyError) {
|
|
75
|
+
throw error;
|
|
76
|
+
}
|
|
77
|
+
const message = `iOS JS coverage pull failed: ${error.message}`;
|
|
78
|
+
if (softFail) {
|
|
79
|
+
console.warn(`[rn-coverage] ${message}`);
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
throw new Error(message);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Run NYC report with source-map remap (TypeScript SF: paths).
|
|
87
|
+
* Expects pre-instrumented coverage JSON (`instrument: false` in nyc config).
|
|
88
|
+
*/
|
|
89
|
+
export function reportJsCoverage(options) {
|
|
90
|
+
const cwd = options.cwd ?? process.cwd();
|
|
91
|
+
const outputDir = options.outputDir ?? path.resolve(cwd, 'coverage/js');
|
|
92
|
+
const softFail = options.softFail ?? false;
|
|
93
|
+
const nycOutput = path.join(outputDir, '.nyc_output');
|
|
94
|
+
ensureDir(nycOutput);
|
|
95
|
+
ensureDir(outputDir);
|
|
96
|
+
const inputPath = path.resolve(options.input);
|
|
97
|
+
if (!fs.existsSync(inputPath)) {
|
|
98
|
+
const message = `JS coverage input missing: ${inputPath}`;
|
|
99
|
+
if (softFail) {
|
|
100
|
+
console.warn(`[rn-coverage] ${message}`);
|
|
101
|
+
return {
|
|
102
|
+
ok: false,
|
|
103
|
+
lcovPath: null
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
throw new StrictEmptyError(message);
|
|
107
|
+
}
|
|
108
|
+
if (fs.statSync(inputPath).isDirectory()) {
|
|
109
|
+
for (const name of fs.readdirSync(inputPath)) {
|
|
110
|
+
if (name.endsWith('.json')) {
|
|
111
|
+
fs.copyFileSync(path.join(inputPath, name), path.join(nycOutput, name));
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
} else {
|
|
115
|
+
fs.copyFileSync(inputPath, path.join(nycOutput, 'coverage-final.json'));
|
|
116
|
+
}
|
|
117
|
+
const resolveNycBin = () => {
|
|
118
|
+
const bases = [cwd, process.cwd()];
|
|
119
|
+
for (const base of bases) {
|
|
120
|
+
try {
|
|
121
|
+
return createRequire(path.join(base, 'package.json')).resolve('nyc/bin/nyc.js');
|
|
122
|
+
} catch {
|
|
123
|
+
// try next
|
|
124
|
+
}
|
|
125
|
+
const direct = path.join(base, 'node_modules', 'nyc', 'bin', 'nyc.js');
|
|
126
|
+
if (fs.existsSync(direct)) {
|
|
127
|
+
return direct;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
throw new Error('nyc is required for `rn-coverage js report` — yarn add nyc in the package or test app');
|
|
131
|
+
};
|
|
132
|
+
const nycBin = resolveNycBin();
|
|
133
|
+
const args = [nycBin, 'report', '--reporter=lcov', '--reporter=text-summary', `--report-dir=${outputDir}`, `--temp-dir=${nycOutput}`, '--exclude-after-remap'];
|
|
134
|
+
if (options.nycConfig) {
|
|
135
|
+
args.push(`--nycrc-path=${path.resolve(options.nycConfig)}`);
|
|
136
|
+
}
|
|
137
|
+
try {
|
|
138
|
+
execFileSync(process.execPath, args, {
|
|
139
|
+
cwd,
|
|
140
|
+
stdio: 'inherit'
|
|
141
|
+
});
|
|
142
|
+
} catch (error) {
|
|
143
|
+
const message = `NYC report failed: ${error.message}`;
|
|
144
|
+
if (softFail) {
|
|
145
|
+
console.warn(`[rn-coverage] ${message}`);
|
|
146
|
+
return {
|
|
147
|
+
ok: false,
|
|
148
|
+
lcovPath: null
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
throw new Error(message);
|
|
152
|
+
}
|
|
153
|
+
const lcovPath = path.join(outputDir, 'lcov.info');
|
|
154
|
+
if (!fs.existsSync(lcovPath) || fs.statSync(lcovPath).size === 0) {
|
|
155
|
+
const message = `JS LCOV missing or empty after NYC report: ${lcovPath}`;
|
|
156
|
+
if (softFail) {
|
|
157
|
+
console.warn(`[rn-coverage] ${message}`);
|
|
158
|
+
return {
|
|
159
|
+
ok: false,
|
|
160
|
+
lcovPath: null
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
throw new StrictEmptyError(message);
|
|
164
|
+
}
|
|
165
|
+
console.log(`[rn-coverage] JS LCOV written to ${lcovPath}`);
|
|
166
|
+
return {
|
|
167
|
+
ok: true,
|
|
168
|
+
lcovPath
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
export { resolveAndroidDeviceId };
|
|
172
|
+
//# sourceMappingURL=js-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["execFileSync","execSync","fs","createRequire","path","DEFAULT_COVERAGE_CONFIG","StrictEmptyError","getAdbBinary","resolveAndroidDeviceId","ensureDir","dir","mkdirSync","recursive","pullAndroidJsCoverage","deviceId","options","config","softFail","strict","localDestDir","outputDir","resolve","process","cwd","localDestFile","join","relative","js","androidRelativePath","staging","androidStagingPath","adb","serial","stagingDir","posix","dirname","app","androidApplicationId","console","log","error","message","warn","Error","pullIosJsCoverage","iosRelativePath","bundleId","iosBundleId","container","encoding","trim","src","existsSync","copyFileSync","reportJsCoverage","nycOutput","inputPath","input","ok","lcovPath","statSync","isDirectory","name","readdirSync","endsWith","resolveNycBin","bases","base","direct","nycBin","args","nycConfig","push","execPath","stdio","size"],"sourceRoot":"../../src","sources":["js-coverage.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Node/library surface (CLI helpers, config, assert, pull/export).
|
|
5
|
+
* Do not import from React Native / Metro — use package root `flush()` there.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export { DEFAULT_COVERAGE_CONFIG, loadCoverageConfig, resolveCoverageConfig } from "./config.js";
|
|
9
|
+
export { normalizeSourcePath, applySourcePathRewrite } from "./path-rewrite.js";
|
|
10
|
+
export { EXIT_OK, EXIT_ERROR, EXIT_STRICT_EMPTY, StrictEmptyError } from "./exit-codes.js";
|
|
11
|
+
export { analyzeLcov, analyzeJacocoXml, assertIosLcov, assertAndroidJacoco, assertCoverage } from "./assert-coverage.js";
|
|
12
|
+
export { walkFiles, collectCoverageObjects, resolveIosCoverageContext, rewriteLcovFile, exportIosLcov, reportIosHtml, summarizeIos } from "./process-ios-native-coverage.js";
|
|
13
|
+
export { resolveAndroidDeviceId, androidCoverageFileExists, pullAndroidCoverage, pullAndroidCoverageWithRetry, pullIosCoverage, runJacocoTestReport, getAdbBinary } from "./pull-native-coverage.js";
|
|
14
|
+
export { pullAndroidJsCoverage, pullIosJsCoverage, reportJsCoverage } from "./js-coverage.js";
|
|
15
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DEFAULT_COVERAGE_CONFIG","loadCoverageConfig","resolveCoverageConfig","normalizeSourcePath","applySourcePathRewrite","EXIT_OK","EXIT_ERROR","EXIT_STRICT_EMPTY","StrictEmptyError","analyzeLcov","analyzeJacocoXml","assertIosLcov","assertAndroidJacoco","assertCoverage","walkFiles","collectCoverageObjects","resolveIosCoverageContext","rewriteLcovFile","exportIosLcov","reportIosHtml","summarizeIos","resolveAndroidDeviceId","androidCoverageFileExists","pullAndroidCoverage","pullAndroidCoverageWithRetry","pullIosCoverage","runJacocoTestReport","getAdbBinary","pullAndroidJsCoverage","pullIosJsCoverage","reportJsCoverage"],"sourceRoot":"../../src","sources":["node.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAMA,SACEA,uBAAuB,EACvBC,kBAAkB,EAClBC,qBAAqB,QAChB,aAAU;AACjB,SAASC,mBAAmB,EAAEC,sBAAsB,QAAQ,mBAAgB;AAC5E,SACEC,OAAO,EACPC,UAAU,EACVC,iBAAiB,EACjBC,gBAAgB,QACX,iBAAc;AACrB,SACEC,WAAW,EACXC,gBAAgB,EAChBC,aAAa,EACbC,mBAAmB,EACnBC,cAAc,QACT,sBAAmB;AAE1B,SACEC,SAAS,EACTC,sBAAsB,EACtBC,yBAAyB,EACzBC,eAAe,EACfC,aAAa,EACbC,aAAa,EACbC,YAAY,QACP,kCAA+B;AACtC,SACEC,sBAAsB,EACtBC,yBAAyB,EACzBC,mBAAmB,EACnBC,4BAA4B,EAC5BC,eAAe,EACfC,mBAAmB,EACnBC,YAAY,QACP,2BAAwB;AAC/B,SACEC,qBAAqB,EACrBC,iBAAiB,EACjBC,gBAAgB,QACX,kBAAe","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type":"module"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Apply a single rewrite rule to a source path (forward slashes).
|
|
5
|
+
* Returns the rewritten path, or the input if the rule did not match.
|
|
6
|
+
*/
|
|
7
|
+
export function applySourcePathRewrite(sourcePath, rule) {
|
|
8
|
+
const normalized = sourcePath.replace(/\\/g, '/');
|
|
9
|
+
if (rule.kind === 'after-marker') {
|
|
10
|
+
const idx = normalized.indexOf(rule.marker);
|
|
11
|
+
if (idx < 0) {
|
|
12
|
+
return normalized;
|
|
13
|
+
}
|
|
14
|
+
const includeMarker = rule.includeMarker !== false;
|
|
15
|
+
if (includeMarker) {
|
|
16
|
+
const fromMarker = normalized.slice(idx);
|
|
17
|
+
return fromMarker.startsWith('/') ? fromMarker.slice(1) : fromMarker;
|
|
18
|
+
}
|
|
19
|
+
return normalized.slice(idx + rule.marker.length);
|
|
20
|
+
}
|
|
21
|
+
if (rule.kind === 'regex') {
|
|
22
|
+
const re = new RegExp(rule.pattern, rule.flags ?? '');
|
|
23
|
+
if (!re.test(normalized)) {
|
|
24
|
+
return normalized;
|
|
25
|
+
}
|
|
26
|
+
// Reset lastIndex after .test() for global regexes; always rewrite via replace.
|
|
27
|
+
re.lastIndex = 0;
|
|
28
|
+
return normalized.replace(re, rule.replacement);
|
|
29
|
+
}
|
|
30
|
+
return normalized;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Normalize an LCOV `SF:` path using ordered rewrite rules.
|
|
35
|
+
* Rules are applied left-to-right; each rule sees the previous result.
|
|
36
|
+
*/
|
|
37
|
+
export function normalizeSourcePath(sourcePath, rules = []) {
|
|
38
|
+
let current = sourcePath.replace(/\\/g, '/').replace(/^\.\//, '');
|
|
39
|
+
for (const rule of rules) {
|
|
40
|
+
current = applySourcePathRewrite(current, rule);
|
|
41
|
+
}
|
|
42
|
+
return current;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=path-rewrite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["applySourcePathRewrite","sourcePath","rule","normalized","replace","kind","idx","indexOf","marker","includeMarker","fromMarker","slice","startsWith","length","re","RegExp","pattern","flags","test","lastIndex","replacement","normalizeSourcePath","rules","current"],"sourceRoot":"../../src","sources":["path-rewrite.ts"],"mappings":";;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASA,sBAAsBA,CACpCC,UAAkB,EAClBC,IAA2B,EACnB;EACR,MAAMC,UAAU,GAAGF,UAAU,CAACG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;EAEjD,IAAIF,IAAI,CAACG,IAAI,KAAK,cAAc,EAAE;IAChC,MAAMC,GAAG,GAAGH,UAAU,CAACI,OAAO,CAACL,IAAI,CAACM,MAAM,CAAC;IAC3C,IAAIF,GAAG,GAAG,CAAC,EAAE;MACX,OAAOH,UAAU;IACnB;IACA,MAAMM,aAAa,GAAGP,IAAI,CAACO,aAAa,KAAK,KAAK;IAClD,IAAIA,aAAa,EAAE;MACjB,MAAMC,UAAU,GAAGP,UAAU,CAACQ,KAAK,CAACL,GAAG,CAAC;MACxC,OAAOI,UAAU,CAACE,UAAU,CAAC,GAAG,CAAC,GAAGF,UAAU,CAACC,KAAK,CAAC,CAAC,CAAC,GAAGD,UAAU;IACtE;IACA,OAAOP,UAAU,CAACQ,KAAK,CAACL,GAAG,GAAGJ,IAAI,CAACM,MAAM,CAACK,MAAM,CAAC;EACnD;EAEA,IAAIX,IAAI,CAACG,IAAI,KAAK,OAAO,EAAE;IACzB,MAAMS,EAAE,GAAG,IAAIC,MAAM,CAACb,IAAI,CAACc,OAAO,EAAEd,IAAI,CAACe,KAAK,IAAI,EAAE,CAAC;IACrD,IAAI,CAACH,EAAE,CAACI,IAAI,CAACf,UAAU,CAAC,EAAE;MACxB,OAAOA,UAAU;IACnB;IACA;IACAW,EAAE,CAACK,SAAS,GAAG,CAAC;IAChB,OAAOhB,UAAU,CAACC,OAAO,CAACU,EAAE,EAAEZ,IAAI,CAACkB,WAAW,CAAC;EACjD;EAEA,OAAOjB,UAAU;AACnB;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASkB,mBAAmBA,CACjCpB,UAAkB,EAClBqB,KAA8B,GAAG,EAAE,EAC3B;EACR,IAAIC,OAAO,GAAGtB,UAAU,CAACG,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAACA,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;EACjE,KAAK,MAAMF,IAAI,IAAIoB,KAAK,EAAE;IACxBC,OAAO,GAAGvB,sBAAsB,CAACuB,OAAO,EAAErB,IAAI,CAAC;EACjD;EACA,OAAOqB,OAAO;AAChB","ignoreList":[]}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { execFileSync } from 'node:child_process';
|
|
4
|
+
import fs from 'node:fs';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import readline from 'node:readline';
|
|
7
|
+
import { assertIosLcov } from "./assert-coverage.js";
|
|
8
|
+
import { DEFAULT_COVERAGE_CONFIG } from "./config.js";
|
|
9
|
+
import { EXIT_OK, EXIT_STRICT_EMPTY, StrictEmptyError } from "./exit-codes.js";
|
|
10
|
+
import { normalizeSourcePath } from "./path-rewrite.js";
|
|
11
|
+
export function walkFiles(dir, matcher, results = []) {
|
|
12
|
+
if (!fs.existsSync(dir)) {
|
|
13
|
+
return results;
|
|
14
|
+
}
|
|
15
|
+
for (const entry of fs.readdirSync(dir, {
|
|
16
|
+
withFileTypes: true
|
|
17
|
+
})) {
|
|
18
|
+
const fullPath = path.join(dir, entry.name);
|
|
19
|
+
if (entry.isDirectory()) {
|
|
20
|
+
walkFiles(fullPath, matcher, results);
|
|
21
|
+
} else if (matcher(fullPath)) {
|
|
22
|
+
results.push(fullPath);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return results;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Collect app binary + matching embedded frameworks for llvm-cov `-object`.
|
|
30
|
+
* Framework matching uses `config.ios.frameworkNamePrefixes` (neutral; empty by default).
|
|
31
|
+
*/
|
|
32
|
+
export function collectCoverageObjects(productsDir, appName, frameworkNamePrefixes = []) {
|
|
33
|
+
const objects = [];
|
|
34
|
+
const seen = new Set();
|
|
35
|
+
const addObject = candidate => {
|
|
36
|
+
if (!candidate || seen.has(candidate) || !fs.existsSync(candidate)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
seen.add(candidate);
|
|
40
|
+
objects.push(candidate);
|
|
41
|
+
};
|
|
42
|
+
addObject(path.join(productsDir, `${appName}.app`, appName));
|
|
43
|
+
|
|
44
|
+
// Expo / Xcode companion image: LLVM counters for statically merged pods often
|
|
45
|
+
// live in AppName.debug.dylib (MH_DYLIB) rather than the MH_EXECUTE binary.
|
|
46
|
+
addObject(path.join(productsDir, `${appName}.app`, `${appName}.debug.dylib`));
|
|
47
|
+
const matchesPrefix = name => frameworkNamePrefixes.length === 0 ? false : frameworkNamePrefixes.some(prefix => name.startsWith(prefix));
|
|
48
|
+
const embeddedFrameworksDir = path.join(productsDir, `${appName}.app`, 'Frameworks');
|
|
49
|
+
if (fs.existsSync(embeddedFrameworksDir)) {
|
|
50
|
+
for (const entry of fs.readdirSync(embeddedFrameworksDir)) {
|
|
51
|
+
if (!entry.endsWith('.framework') || !matchesPrefix(entry)) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
const frameworkName = entry.slice(0, -'.framework'.length);
|
|
55
|
+
addObject(path.join(embeddedFrameworksDir, entry, frameworkName));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (objects.length <= 1 && fs.existsSync(productsDir)) {
|
|
59
|
+
for (const entry of fs.readdirSync(productsDir, {
|
|
60
|
+
withFileTypes: true
|
|
61
|
+
})) {
|
|
62
|
+
if (!entry.isDirectory() || !matchesPrefix(entry.name)) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const frameworkName = entry.name;
|
|
66
|
+
addObject(path.join(productsDir, frameworkName, `${frameworkName}.framework`, frameworkName));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return objects;
|
|
70
|
+
}
|
|
71
|
+
export function resolveIosCoverageContext(derivedData, configuration, appName, frameworkNamePrefixes = []) {
|
|
72
|
+
const productsDir = path.join(derivedData, 'Build/Products', `${configuration}-iphonesimulator`);
|
|
73
|
+
const appBinary = path.join(productsDir, `${appName}.app`, appName);
|
|
74
|
+
const profileDataDir = path.join(derivedData, 'Build/ProfileData');
|
|
75
|
+
const simulatorCoverageDir = path.join(derivedData, 'output/coverage');
|
|
76
|
+
const profrawFiles = [...walkFiles(simulatorCoverageDir, filePath => filePath.endsWith('.profraw')), ...walkFiles(profileDataDir, filePath => filePath.endsWith('.profraw'))];
|
|
77
|
+
const coverageObjects = collectCoverageObjects(productsDir, appName, frameworkNamePrefixes);
|
|
78
|
+
return {
|
|
79
|
+
productsDir,
|
|
80
|
+
appBinary,
|
|
81
|
+
coverageObjects,
|
|
82
|
+
profrawFiles,
|
|
83
|
+
profileDataDir,
|
|
84
|
+
simulatorCoverageDir
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export async function rewriteLcovFile(inputPath, outputPath, rules) {
|
|
88
|
+
const input = fs.createReadStream(inputPath, {
|
|
89
|
+
encoding: 'utf8'
|
|
90
|
+
});
|
|
91
|
+
const output = fs.createWriteStream(outputPath, {
|
|
92
|
+
encoding: 'utf8'
|
|
93
|
+
});
|
|
94
|
+
const lines = readline.createInterface({
|
|
95
|
+
input,
|
|
96
|
+
crlfDelay: Infinity
|
|
97
|
+
});
|
|
98
|
+
let sourceFileCount = 0;
|
|
99
|
+
for await (const line of lines) {
|
|
100
|
+
if (line.startsWith('SF:')) {
|
|
101
|
+
sourceFileCount += 1;
|
|
102
|
+
const normalizedPath = normalizeSourcePath(line.slice(3), rules);
|
|
103
|
+
output.write(`SF:${normalizedPath}\n`);
|
|
104
|
+
} else {
|
|
105
|
+
output.write(`${line}\n`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
await new Promise((resolve, reject) => {
|
|
109
|
+
output.end(() => resolve());
|
|
110
|
+
output.on('error', reject);
|
|
111
|
+
});
|
|
112
|
+
return {
|
|
113
|
+
sourceFileCount
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
function runOrThrow(command, args) {
|
|
117
|
+
try {
|
|
118
|
+
return execFileSync(command, args, {
|
|
119
|
+
encoding: 'utf8',
|
|
120
|
+
stdio: ['ignore', 'pipe', 'pipe']
|
|
121
|
+
});
|
|
122
|
+
} catch (error) {
|
|
123
|
+
const err = error;
|
|
124
|
+
const stderr = err.stderr ? err.stderr.toString() : '';
|
|
125
|
+
const stdout = err.stdout ? err.stdout.toString() : '';
|
|
126
|
+
throw new Error(`${command} ${args.join(' ')} failed:\n${stderr || stdout || err.message}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
function runToFileOrThrow(command, args, outputPath) {
|
|
130
|
+
try {
|
|
131
|
+
execFileSync(command, args, {
|
|
132
|
+
stdio: ['ignore', fs.openSync(outputPath, 'w'), 'pipe']
|
|
133
|
+
});
|
|
134
|
+
} catch (error) {
|
|
135
|
+
const err = error;
|
|
136
|
+
const stderr = err.stderr ? err.stderr.toString() : '';
|
|
137
|
+
throw new Error(`${command} ${args.join(' ')} failed:\n${stderr || err.message}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function buildObjectArgs(coverageObjects) {
|
|
141
|
+
const args = [];
|
|
142
|
+
for (const objectPath of coverageObjects) {
|
|
143
|
+
args.push('-object', objectPath);
|
|
144
|
+
}
|
|
145
|
+
return args;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Merge profraw → profdata → LCOV with path rewrite + optional presence assert.
|
|
150
|
+
*/
|
|
151
|
+
export async function exportIosLcov(options) {
|
|
152
|
+
const config = options.config ?? DEFAULT_COVERAGE_CONFIG;
|
|
153
|
+
const ctx = resolveIosCoverageContext(options.derivedData, options.configuration, options.appName, config.ios.frameworkNamePrefixes);
|
|
154
|
+
if (ctx.profrawFiles.length === 0) {
|
|
155
|
+
const message = `No .profraw files under ${ctx.simulatorCoverageDir} or ${ctx.profileDataDir}.`;
|
|
156
|
+
if (config.strict) {
|
|
157
|
+
throw new StrictEmptyError(message);
|
|
158
|
+
}
|
|
159
|
+
console.warn(`[rn-coverage] ${message} (soft; continuing)`);
|
|
160
|
+
return options.output;
|
|
161
|
+
}
|
|
162
|
+
if (!fs.existsSync(ctx.appBinary)) {
|
|
163
|
+
throw new Error(`App binary not found at ${ctx.appBinary}`);
|
|
164
|
+
}
|
|
165
|
+
if (ctx.coverageObjects.length === 0) {
|
|
166
|
+
throw new Error(`No coverage objects found under ${ctx.productsDir}`);
|
|
167
|
+
}
|
|
168
|
+
fs.mkdirSync(path.dirname(options.output), {
|
|
169
|
+
recursive: true
|
|
170
|
+
});
|
|
171
|
+
const profdataPath = path.join(path.dirname(options.output), 'profdata');
|
|
172
|
+
runOrThrow('xcrun', ['llvm-profdata', 'merge', '-sparse', ...ctx.profrawFiles, '-o', profdataPath]);
|
|
173
|
+
const rawLcovPath = path.join(path.dirname(options.output), 'lcov.raw');
|
|
174
|
+
try {
|
|
175
|
+
const exportArgs = ['llvm-cov', 'export', '-instr-profile', profdataPath, ...buildObjectArgs(ctx.coverageObjects), '-format=lcov'];
|
|
176
|
+
runToFileOrThrow('xcrun', exportArgs, rawLcovPath);
|
|
177
|
+
const {
|
|
178
|
+
sourceFileCount
|
|
179
|
+
} = await rewriteLcovFile(rawLcovPath, options.output, config.sourcePathRewrite);
|
|
180
|
+
console.log(`[rn-coverage] Wrote ${options.output} (${sourceFileCount} source file(s))`);
|
|
181
|
+
const shouldAssert = options.assertAfterExport ?? true;
|
|
182
|
+
if (shouldAssert) {
|
|
183
|
+
const result = assertIosLcov(options.output, config.strict, config);
|
|
184
|
+
if (result.code === EXIT_OK) {
|
|
185
|
+
console.log(`[rn-coverage] ${result.message}`);
|
|
186
|
+
} else if (result.code === EXIT_STRICT_EMPTY) {
|
|
187
|
+
throw new StrictEmptyError(result.message);
|
|
188
|
+
} else {
|
|
189
|
+
console.warn(`[rn-coverage] ${result.message}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (options.deleteProfraw !== false) {
|
|
193
|
+
ctx.profrawFiles.forEach(profrawPath => {
|
|
194
|
+
fs.rmSync(profrawPath, {
|
|
195
|
+
force: true
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
} finally {
|
|
200
|
+
fs.rmSync(rawLcovPath, {
|
|
201
|
+
force: true
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return options.output;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* HTML report via `llvm-cov show -format=html`.
|
|
208
|
+
*/
|
|
209
|
+
export function reportIosHtml(options) {
|
|
210
|
+
const config = options.config ?? DEFAULT_COVERAGE_CONFIG;
|
|
211
|
+
const configuration = options.configuration ?? 'Debug';
|
|
212
|
+
const appName = options.appName ?? config.app.iosProductName;
|
|
213
|
+
const ctx = resolveIosCoverageContext(options.derivedData, configuration, appName, config.ios.frameworkNamePrefixes);
|
|
214
|
+
const profdataPath = options.profdata ?? path.resolve(process.cwd(), 'coverage/ios/profdata');
|
|
215
|
+
const outputDir = options.outputDir ?? path.resolve(process.cwd(), 'coverage/ios/html');
|
|
216
|
+
if (!fs.existsSync(profdataPath)) {
|
|
217
|
+
const message = `profdata not found at ${profdataPath} (run ios export first)`;
|
|
218
|
+
if (config.strict) {
|
|
219
|
+
throw new StrictEmptyError(message);
|
|
220
|
+
}
|
|
221
|
+
console.warn(`[rn-coverage] ${message}`);
|
|
222
|
+
return outputDir;
|
|
223
|
+
}
|
|
224
|
+
if (ctx.coverageObjects.length === 0) {
|
|
225
|
+
throw new Error(`No coverage objects found under ${ctx.productsDir}`);
|
|
226
|
+
}
|
|
227
|
+
fs.mkdirSync(outputDir, {
|
|
228
|
+
recursive: true
|
|
229
|
+
});
|
|
230
|
+
runOrThrow('xcrun', ['llvm-cov', 'show', '-format=html', `-output-dir=${outputDir}`, '-instr-profile', profdataPath, ...buildObjectArgs(ctx.coverageObjects)]);
|
|
231
|
+
console.log(`[rn-coverage] Wrote HTML report to ${outputDir}`);
|
|
232
|
+
return outputDir;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Terminal summary via `llvm-cov report`.
|
|
236
|
+
*/
|
|
237
|
+
export function summarizeIos(options) {
|
|
238
|
+
const config = options.config ?? DEFAULT_COVERAGE_CONFIG;
|
|
239
|
+
const configuration = options.configuration ?? 'Debug';
|
|
240
|
+
const appName = options.appName ?? config.app.iosProductName;
|
|
241
|
+
const ctx = resolveIosCoverageContext(options.derivedData, configuration, appName, config.ios.frameworkNamePrefixes);
|
|
242
|
+
const profdataPath = options.profdata ?? path.resolve(process.cwd(), 'coverage/ios/profdata');
|
|
243
|
+
if (!fs.existsSync(profdataPath)) {
|
|
244
|
+
const message = `profdata not found at ${profdataPath} (run ios export first)`;
|
|
245
|
+
if (config.strict) {
|
|
246
|
+
throw new StrictEmptyError(message);
|
|
247
|
+
}
|
|
248
|
+
console.warn(`[rn-coverage] ${message}`);
|
|
249
|
+
return '';
|
|
250
|
+
}
|
|
251
|
+
if (ctx.coverageObjects.length === 0) {
|
|
252
|
+
throw new Error(`No coverage objects found under ${ctx.productsDir}`);
|
|
253
|
+
}
|
|
254
|
+
const report = runOrThrow('xcrun', ['llvm-cov', 'report', '-instr-profile', profdataPath, ...buildObjectArgs(ctx.coverageObjects)]);
|
|
255
|
+
console.log(report);
|
|
256
|
+
return report;
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=process-ios-native-coverage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["execFileSync","fs","path","readline","assertIosLcov","DEFAULT_COVERAGE_CONFIG","EXIT_OK","EXIT_STRICT_EMPTY","StrictEmptyError","normalizeSourcePath","walkFiles","dir","matcher","results","existsSync","entry","readdirSync","withFileTypes","fullPath","join","name","isDirectory","push","collectCoverageObjects","productsDir","appName","frameworkNamePrefixes","objects","seen","Set","addObject","candidate","has","add","matchesPrefix","length","some","prefix","startsWith","embeddedFrameworksDir","endsWith","frameworkName","slice","resolveIosCoverageContext","derivedData","configuration","appBinary","profileDataDir","simulatorCoverageDir","profrawFiles","filePath","coverageObjects","rewriteLcovFile","inputPath","outputPath","rules","input","createReadStream","encoding","output","createWriteStream","lines","createInterface","crlfDelay","Infinity","sourceFileCount","line","normalizedPath","write","Promise","resolve","reject","end","on","runOrThrow","command","args","stdio","error","err","stderr","toString","stdout","Error","message","runToFileOrThrow","openSync","buildObjectArgs","objectPath","exportIosLcov","options","config","ctx","ios","strict","console","warn","mkdirSync","dirname","recursive","profdataPath","rawLcovPath","exportArgs","sourcePathRewrite","log","shouldAssert","assertAfterExport","result","code","deleteProfraw","forEach","profrawPath","rmSync","force","reportIosHtml","app","iosProductName","profdata","process","cwd","outputDir","summarizeIos","report"],"sourceRoot":"../../src","sources":["process-ios-native-coverage.ts"],"mappings":"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","ignoreList":[]}
|