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.
Files changed (92) hide show
  1. package/Coverage.podspec +20 -0
  2. package/LICENSE +202 -0
  3. package/README.md +125 -0
  4. package/android/build.gradle +51 -0
  5. package/android/rn-coverage-jacoco.gradle +132 -0
  6. package/android/rn-coverage.gradle +68 -0
  7. package/android/src/main/AndroidManifest.xml +2 -0
  8. package/android/src/main/java/com/coverage/CoverageModule.kt +53 -0
  9. package/android/src/main/java/com/coverage/CoveragePackage.kt +35 -0
  10. package/app.plugin.js +1 -0
  11. package/bin/rn-coverage.js +11 -0
  12. package/cocoapods/coverage_post_install.rb +197 -0
  13. package/docs/cli.md +51 -0
  14. package/docs/config.md +27 -0
  15. package/docs/index.md +16 -0
  16. package/docs/integration/android.md +83 -0
  17. package/docs/integration/ci-appium.md +41 -0
  18. package/docs/integration/e2e-timing.md +20 -0
  19. package/docs/integration/ios.md +77 -0
  20. package/docs/integration/js.md +38 -0
  21. package/docs/pattern-c.md +5 -0
  22. package/docs/releasing.md +88 -0
  23. package/docs.json +24 -0
  24. package/ios/Coverage.h +5 -0
  25. package/ios/Coverage.mm +47 -0
  26. package/ios/CoverageConfig.h +21 -0
  27. package/ios/CoverageProfile.h +22 -0
  28. package/ios/CoverageProfile.mm +358 -0
  29. package/lib/module/NativeCoverage.js +10 -0
  30. package/lib/module/NativeCoverage.js.map +1 -0
  31. package/lib/module/assert-coverage.js +181 -0
  32. package/lib/module/assert-coverage.js.map +1 -0
  33. package/lib/module/cli/index.js +229 -0
  34. package/lib/module/cli/index.js.map +1 -0
  35. package/lib/module/config.js +83 -0
  36. package/lib/module/config.js.map +1 -0
  37. package/lib/module/exit-codes.js +22 -0
  38. package/lib/module/exit-codes.js.map +1 -0
  39. package/lib/module/index.js +35 -0
  40. package/lib/module/index.js.map +1 -0
  41. package/lib/module/js-coverage.js +172 -0
  42. package/lib/module/js-coverage.js.map +1 -0
  43. package/lib/module/node.js +15 -0
  44. package/lib/module/node.js.map +1 -0
  45. package/lib/module/package.json +1 -0
  46. package/lib/module/path-rewrite.js +44 -0
  47. package/lib/module/path-rewrite.js.map +1 -0
  48. package/lib/module/process-ios-native-coverage.js +258 -0
  49. package/lib/module/process-ios-native-coverage.js.map +1 -0
  50. package/lib/module/pull-native-coverage.js +210 -0
  51. package/lib/module/pull-native-coverage.js.map +1 -0
  52. package/lib/typescript/example-dynamic/App.d.ts +6 -0
  53. package/lib/typescript/example-dynamic/App.d.ts.map +1 -0
  54. package/lib/typescript/package.json +1 -0
  55. package/lib/typescript/src/NativeCoverage.d.ts +16 -0
  56. package/lib/typescript/src/NativeCoverage.d.ts.map +1 -0
  57. package/lib/typescript/src/assert-coverage.d.ts +53 -0
  58. package/lib/typescript/src/assert-coverage.d.ts.map +1 -0
  59. package/lib/typescript/src/cli/index.d.ts +4 -0
  60. package/lib/typescript/src/cli/index.d.ts.map +1 -0
  61. package/lib/typescript/src/config.d.ts +93 -0
  62. package/lib/typescript/src/config.d.ts.map +1 -0
  63. package/lib/typescript/src/exit-codes.d.ts +16 -0
  64. package/lib/typescript/src/exit-codes.d.ts.map +1 -0
  65. package/lib/typescript/src/index.d.ts +16 -0
  66. package/lib/typescript/src/index.d.ts.map +1 -0
  67. package/lib/typescript/src/js-coverage.d.ts +36 -0
  68. package/lib/typescript/src/js-coverage.d.ts.map +1 -0
  69. package/lib/typescript/src/node.d.ts +14 -0
  70. package/lib/typescript/src/node.d.ts.map +1 -0
  71. package/lib/typescript/src/path-rewrite.d.ts +12 -0
  72. package/lib/typescript/src/path-rewrite.d.ts.map +1 -0
  73. package/lib/typescript/src/process-ios-native-coverage.d.ts +61 -0
  74. package/lib/typescript/src/process-ios-native-coverage.d.ts.map +1 -0
  75. package/lib/typescript/src/pull-native-coverage.d.ts +38 -0
  76. package/lib/typescript/src/pull-native-coverage.d.ts.map +1 -0
  77. package/package.json +184 -0
  78. package/plugin/build/index.d.ts +21 -0
  79. package/plugin/build/index.js +153 -0
  80. package/react-native-coverage.config.js.example +47 -0
  81. package/react-native.config.js +9 -0
  82. package/src/NativeCoverage.ts +16 -0
  83. package/src/assert-coverage.ts +260 -0
  84. package/src/cli/index.ts +420 -0
  85. package/src/config.ts +189 -0
  86. package/src/exit-codes.ts +20 -0
  87. package/src/index.tsx +35 -0
  88. package/src/js-coverage.ts +213 -0
  89. package/src/node.ts +52 -0
  90. package/src/path-rewrite.ts +52 -0
  91. package/src/process-ios-native-coverage.ts +425 -0
  92. 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":[]}