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,210 @@
1
+ "use strict";
2
+
3
+ import { execSync, spawnSync } from 'node:child_process';
4
+ import fs from 'node:fs';
5
+ import path from 'node:path';
6
+ import { assertAndroidJacoco } from "./assert-coverage.js";
7
+ import { DEFAULT_COVERAGE_CONFIG } from "./config.js";
8
+ import { EXIT_OK, EXIT_STRICT_EMPTY, StrictEmptyError } from "./exit-codes.js";
9
+ export function getAdbBinary() {
10
+ return process.env.ANDROID_HOME ? `${process.env.ANDROID_HOME}/platform-tools/adb` : 'adb';
11
+ }
12
+ export function resolveAndroidDeviceId(preferredDeviceId) {
13
+ if (preferredDeviceId) {
14
+ return preferredDeviceId;
15
+ }
16
+ if (process.env.ANDROID_SERIAL) {
17
+ return process.env.ANDROID_SERIAL;
18
+ }
19
+ const adb = getAdbBinary();
20
+ const output = execSync(`${adb} devices`, {
21
+ encoding: 'utf8'
22
+ });
23
+ const deviceLine = output.split('\n').slice(1).map(line => line.trim()).find(line => line.endsWith('\tdevice'));
24
+ if (!deviceLine) {
25
+ throw new Error('No online Android device found for native coverage pull');
26
+ }
27
+ return deviceLine.split('\t')[0];
28
+ }
29
+ export function androidCoverageFileExists(deviceId, config = DEFAULT_COVERAGE_CONFIG) {
30
+ const adb = getAdbBinary();
31
+ const serial = deviceId ? `-s ${deviceId}` : '';
32
+ const appId = config.app.androidApplicationId;
33
+ const relative = config.android.coverageRelativePath;
34
+ try {
35
+ execSync(`${adb} ${serial} shell "run-as ${appId} test -f ${relative}"`, {
36
+ stdio: 'pipe'
37
+ });
38
+ return true;
39
+ } catch {
40
+ return false;
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Pull Android Emma/Jacoco `.ec` from the device into `outputDir`.
46
+ * Ported from RNFB tests/scripts/pull-native-coverage.js with config injection.
47
+ */
48
+ export function pullAndroidCoverage(deviceId, options = {}) {
49
+ const config = options.config ?? DEFAULT_COVERAGE_CONFIG;
50
+ const softFail = options.softFail ?? false;
51
+ // Default under app/build so subsequent `jacocoTestReport` finds the .ec
52
+ // (fileTree(project.buildDir)). Artifacts/ dirs alone leave the task SKIPPED.
53
+ const localDestDir = options.outputDir ?? path.resolve(process.cwd(), 'android/app/build/outputs/code_coverage');
54
+ const localDestFile = path.join(localDestDir, 'emulator_coverage.ec');
55
+ const staging = config.android.detoxStagingPath;
56
+ const adb = getAdbBinary();
57
+ const serial = deviceId ? `-s ${deviceId}` : '';
58
+ const appId = config.app.androidApplicationId;
59
+ const relative = config.android.coverageRelativePath;
60
+ try {
61
+ // Staging lives under /data/local/tmp/...; the parent dir is not created by
62
+ // the emulator (unlike Detox's /data/local/tmp/detox). Redirect fails with
63
+ // "No such file or directory" if we skip mkdir.
64
+ const stagingDir = path.posix.dirname(staging);
65
+ execSync(`${adb} ${serial} shell "mkdir -p ${stagingDir}"`);
66
+ execSync(`${adb} ${serial} shell "run-as ${appId} cat ${relative} > ${staging}"`);
67
+ fs.mkdirSync(localDestDir, {
68
+ recursive: true
69
+ });
70
+ execSync(`${adb} ${serial} pull ${staging} ${localDestFile}`);
71
+ console.log(`Coverage data downloaded to: ${localDestFile}`);
72
+ return localDestFile;
73
+ } catch (error) {
74
+ const message = `Android native coverage pull failed: ${error.message}`;
75
+ if (softFail) {
76
+ console.warn(`[rn-coverage] ${message}`);
77
+ return null;
78
+ }
79
+ throw new Error(message);
80
+ }
81
+ }
82
+ export async function pullAndroidCoverageWithRetry(deviceId, options = {}) {
83
+ const config = options.config ?? DEFAULT_COVERAGE_CONFIG;
84
+ const softFail = options.softFail ?? !config.strict;
85
+ const retries = options.retries ?? 15;
86
+ const intervalMs = options.intervalMs ?? 2000;
87
+ for (let attempt = 1; attempt <= retries; attempt++) {
88
+ if (androidCoverageFileExists(deviceId, config)) {
89
+ const pulled = pullAndroidCoverage(deviceId, {
90
+ ...options,
91
+ softFail: true,
92
+ config
93
+ });
94
+ if (pulled) {
95
+ return pulled;
96
+ }
97
+ } else if (attempt === 1 || attempt % 5 === 0) {
98
+ console.log(`[rn-coverage] Waiting for ${config.android.coverageRelativePath} (attempt ${attempt}/${retries})`);
99
+ }
100
+ if (attempt < retries) {
101
+ await new Promise(resolve => setTimeout(resolve, intervalMs));
102
+ }
103
+ }
104
+ const existed = androidCoverageFileExists(deviceId, config);
105
+ const message = existed ? `Android native coverage pull failed after ${retries} attempts (file present but staging/pull failed)` : `Android native coverage file not found after ${retries} attempts`;
106
+ if (softFail) {
107
+ console.warn(`[rn-coverage] ${message}`);
108
+ return null;
109
+ }
110
+ throw new StrictEmptyError(message);
111
+ }
112
+
113
+ /**
114
+ * Pull iOS LLVM `.profraw` files from a simulator app container.
115
+ * Ported from RNFB with config-driven bundle id / output paths.
116
+ */
117
+ export function pullIosCoverage(deviceId, options = {}) {
118
+ const config = options.config ?? DEFAULT_COVERAGE_CONFIG;
119
+ const softFail = options.softFail ?? !config.strict;
120
+ const localDestDir = options.outputDir ?? path.resolve(process.cwd(), 'coverage/ios');
121
+ const bundleId = config.app.iosBundleId;
122
+ try {
123
+ const container = execSync(`xcrun simctl get_app_container ${deviceId} ${bundleId} data`, {
124
+ encoding: 'utf8'
125
+ }).trim();
126
+ fs.mkdirSync(localDestDir, {
127
+ recursive: true
128
+ });
129
+ const profrawList = execSync(`find "${container}" \\( -path "*/Documents/coverage.profraw" -o -path "*/tmp/coverage.profraw" -o -name '*.profraw' \\)`, {
130
+ encoding: 'utf8'
131
+ }).trim().split('\n').filter(Boolean);
132
+ if (profrawList.length === 0) {
133
+ const message = `No iOS coverage profraw files found under ${container}`;
134
+ if (softFail) {
135
+ console.warn(`[rn-coverage] ${message}`);
136
+ return [];
137
+ }
138
+ throw new StrictEmptyError(message);
139
+ }
140
+ const destPaths = profrawList.map((src, index) => {
141
+ const suffix = profrawList.length > 1 ? `_${index}` : '';
142
+ const dest = path.join(localDestDir, `simulator_coverage${suffix}.profraw`);
143
+ execSync(`cp "${src}" "${dest}"`);
144
+ return dest;
145
+ });
146
+ console.log(`Coverage data downloaded to: ${localDestDir} (${profrawList.length} profraw file(s))`);
147
+ return destPaths;
148
+ } catch (error) {
149
+ if (error instanceof StrictEmptyError) {
150
+ throw error;
151
+ }
152
+ const message = `iOS native coverage pull failed: ${error.message}`;
153
+ if (softFail) {
154
+ console.warn(`[rn-coverage] ${message}`);
155
+ return [];
156
+ }
157
+ throw new Error(message);
158
+ }
159
+ }
160
+ /**
161
+ * Run a consumer Jacoco report Gradle task, then optionally assert LINE hits.
162
+ */
163
+ export function runJacocoTestReport(options = {}) {
164
+ const normalized = typeof options === 'string' ? {
165
+ androidDir: options
166
+ } : options;
167
+ const config = normalized.config ?? DEFAULT_COVERAGE_CONFIG;
168
+ const androidDir = normalized.androidDir ?? path.resolve(process.cwd(), 'android');
169
+ const result = spawnSync('./gradlew', ['jacocoTestReport'], {
170
+ cwd: androidDir,
171
+ stdio: 'inherit',
172
+ shell: true
173
+ });
174
+ if (result.status !== 0) {
175
+ console.warn(`[rn-coverage] jacocoTestReport exited with status ${result.status ?? 'unknown'}`);
176
+ return {
177
+ ok: false,
178
+ exitCode: result.status ?? 1
179
+ };
180
+ }
181
+ const shouldAssert = normalized.assertAfterReport ?? true;
182
+ if (!shouldAssert) {
183
+ return {
184
+ ok: true,
185
+ exitCode: EXIT_OK
186
+ };
187
+ }
188
+ const jacocoXml = normalized.jacocoXml ?? path.resolve(process.cwd(), config.android.jacocoReportXml);
189
+ const assertResult = assertAndroidJacoco(jacocoXml, config.strict, config);
190
+ if (assertResult.code === EXIT_OK) {
191
+ console.log(`[rn-coverage] ${assertResult.message}`);
192
+ return {
193
+ ok: true,
194
+ exitCode: EXIT_OK
195
+ };
196
+ }
197
+ if (assertResult.code === EXIT_STRICT_EMPTY) {
198
+ console.error(`[rn-coverage] ${assertResult.message}`);
199
+ return {
200
+ ok: false,
201
+ exitCode: EXIT_STRICT_EMPTY
202
+ };
203
+ }
204
+ console.warn(`[rn-coverage] ${assertResult.message}`);
205
+ return {
206
+ ok: true,
207
+ exitCode: EXIT_OK
208
+ };
209
+ }
210
+ //# sourceMappingURL=pull-native-coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["execSync","spawnSync","fs","path","assertAndroidJacoco","DEFAULT_COVERAGE_CONFIG","EXIT_OK","EXIT_STRICT_EMPTY","StrictEmptyError","getAdbBinary","process","env","ANDROID_HOME","resolveAndroidDeviceId","preferredDeviceId","ANDROID_SERIAL","adb","output","encoding","deviceLine","split","slice","map","line","trim","find","endsWith","Error","androidCoverageFileExists","deviceId","config","serial","appId","app","androidApplicationId","relative","android","coverageRelativePath","stdio","pullAndroidCoverage","options","softFail","localDestDir","outputDir","resolve","cwd","localDestFile","join","staging","detoxStagingPath","stagingDir","posix","dirname","mkdirSync","recursive","console","log","error","message","warn","pullAndroidCoverageWithRetry","strict","retries","intervalMs","attempt","pulled","Promise","setTimeout","existed","pullIosCoverage","bundleId","iosBundleId","container","profrawList","filter","Boolean","length","destPaths","src","index","suffix","dest","runJacocoTestReport","normalized","androidDir","result","shell","status","ok","exitCode","shouldAssert","assertAfterReport","jacocoXml","jacocoReportXml","assertResult","code"],"sourceRoot":"../../src","sources":["pull-native-coverage.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Bare RN dynamic-frameworks harness (Pattern C).
3
+ * On mount: exercise fixture-lib then flush native coverage for Appium.
4
+ */
5
+ export default function App(): import("react").JSX.Element;
6
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../example-dynamic/App.tsx"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,GAAG,gCA8C1B"}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,16 @@
1
+ import { type TurboModule } from 'react-native';
2
+ /**
3
+ * TurboModule surface for native coverage flush (New Architecture only).
4
+ */
5
+ export interface Spec extends TurboModule {
6
+ flush(): void;
7
+ /**
8
+ * Persist Istanbul `global.__coverage__` JSON to the app sandbox
9
+ * (`files/coverage-final.json` on Android, `Documents/coverage-final.json` on iOS)
10
+ * for host-side `rn-coverage js pull` + NYC remap.
11
+ */
12
+ dumpJsCoverage(json: string): void;
13
+ }
14
+ declare const _default: Spec;
15
+ export default _default;
16
+ //# sourceMappingURL=NativeCoverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeCoverage.d.ts","sourceRoot":"","sources":["../../../src/NativeCoverage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAErE;;GAEG;AACH,MAAM,WAAW,IAAK,SAAQ,WAAW;IACvC,KAAK,IAAI,IAAI,CAAC;IACd;;;;OAIG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;;AAED,wBAAkE"}
@@ -0,0 +1,53 @@
1
+ import type { CoverageConfig } from './config.js';
2
+ export type AssertResult = {
3
+ code: number;
4
+ message: string;
5
+ };
6
+ export type LcovAssertStats = {
7
+ sourceFileCount: number;
8
+ matchedPathHits: number;
9
+ linesHit: number;
10
+ };
11
+ /**
12
+ * Parse LCOV and count SF: paths matching configured includes.
13
+ * When `lcovPathIncludes` is empty, any SF: path counts as a match.
14
+ * `linesHit` sums `LH:` only for matched source files.
15
+ */
16
+ export declare function analyzeLcov(lcovPath: string, lcovPathIncludes?: string[]): LcovAssertStats;
17
+ /**
18
+ * Assert iOS (or any) LCOV has expected path hits with actual line coverage.
19
+ * Exit 2 in strict mode when missing/empty/no matched SF: paths/no LH hits.
20
+ */
21
+ export declare function assertIosLcov(lcovPath: string, strict: boolean, config?: CoverageConfig, cwd?: string): AssertResult;
22
+ export type JacocoAssertStats = {
23
+ packageCount: number;
24
+ lineCovered: number;
25
+ lineMissed: number;
26
+ };
27
+ /**
28
+ * Parse Jacoco XML package rollups. Matchers are case-insensitive substrings
29
+ * of `<package name="...">`. Empty matchers → all packages.
30
+ *
31
+ * Jacoco uses `/` separators (`com/coverage/fixture`); configs often use Java
32
+ * dots (`coverage.fixture`). Normalize both so either form matches.
33
+ */
34
+ export declare function analyzeJacocoXml(xmlPath: string, packageIncludes?: string[]): JacocoAssertStats;
35
+ /**
36
+ * Assert Android Jacoco XML has expected package LINE hits.
37
+ * Exit 2 in strict mode when missing/empty/no covered lines in matched packages.
38
+ */
39
+ export declare function assertAndroidJacoco(xmlPath: string, strict: boolean, config?: CoverageConfig, cwd?: string): AssertResult;
40
+ export type AssertCoverageOptions = {
41
+ platform?: 'ios' | 'android' | 'all';
42
+ lcov?: string;
43
+ jacocoXml?: string;
44
+ strict?: boolean;
45
+ config?: CoverageConfig;
46
+ cwd?: string;
47
+ };
48
+ /**
49
+ * Post-pipeline presence check. Returns the highest-priority failure code
50
+ * (prefer EXIT_STRICT_EMPTY over EXIT_OK).
51
+ */
52
+ export declare function assertCoverage(options?: AssertCoverageOptions): AssertResult;
53
+ //# sourceMappingURL=assert-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert-coverage.d.ts","sourceRoot":"","sources":["../../../src/assert-coverage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAU,CAAC;AAI/C,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AASF,MAAM,MAAM,eAAe,GAAG;IAC5B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,gBAAgB,GAAE,MAAM,EAAO,GAC9B,eAAe,CA2BjB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,OAAO,EACf,MAAM,GAAE,cAAwC,EAChD,GAAG,GAAE,MAAsB,GAC1B,YAAY,CA+Bd;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,eAAe,GAAE,MAAM,EAAO,GAC7B,iBAAiB,CA2CnB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,EACf,MAAM,GAAE,cAAwC,EAChD,GAAG,GAAE,MAAsB,GAC1B,YAAY,CAkCd;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,KAAK,CAAC;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,GAAE,qBAA0B,GAClC,YAAY,CAkCd"}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { EXIT_ERROR, EXIT_OK, EXIT_STRICT_EMPTY } from '../exit-codes.js';
3
+ export { EXIT_OK, EXIT_ERROR, EXIT_STRICT_EMPTY };
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/index.ts"],"names":[],"mappings":";AAMA,OAAO,EACL,UAAU,EACV,OAAO,EACP,iBAAiB,EAElB,MAAM,kBAAe,CAAC;AAkBvB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * Neutral defaults — no consumer product names.
3
+ * Pattern C: this package targets dedicated test apps only.
4
+ */
5
+ export type SourcePathRewriteRule = {
6
+ kind: 'after-marker';
7
+ /** Substring to locate (e.g. `/packages/`). */
8
+ marker: string;
9
+ /**
10
+ * When true (default), the returned path starts at `marker` without a
11
+ * leading slash (e.g. `packages/...`). When false, returns the substring
12
+ * after the marker.
13
+ */
14
+ includeMarker?: boolean;
15
+ } | {
16
+ kind: 'regex';
17
+ pattern: string;
18
+ flags?: string;
19
+ replacement: string;
20
+ };
21
+ export type CoverageAssertConfig = {
22
+ /**
23
+ * Substrings that must appear in ≥1 LCOV `SF:` path.
24
+ * Empty → any SF: path counts. Default `packages/` matches common monorepos.
25
+ */
26
+ lcovPathIncludes: string[];
27
+ /**
28
+ * Case-insensitive substrings matching Jacoco `<package name="">`.
29
+ * Empty falls back to `android.libraryProjectMatchers`, then any package.
30
+ */
31
+ jacocoPackageIncludes: string[];
32
+ /** Default relative path for `rn-coverage assert --lcov`. */
33
+ defaultLcovPath: string;
34
+ /** Default relative path for `rn-coverage assert --jacoco-xml`. */
35
+ defaultJacocoXmlPath: string;
36
+ };
37
+ export type CoverageConfig = {
38
+ /** TurboModule / NativeModules name. Default: `Coverage`. */
39
+ nativeModuleName: string;
40
+ app: {
41
+ androidApplicationId: string;
42
+ iosBundleId: string;
43
+ iosProductName: string;
44
+ };
45
+ ios: {
46
+ /** Framework basename prefixes to include as llvm-cov `-object`s. */
47
+ frameworkNamePrefixes: string[];
48
+ };
49
+ android: {
50
+ libraryProjectMatchers: string[];
51
+ /** Optional staging path used by some e2e runners (e.g. Detox). */
52
+ detoxStagingPath: string;
53
+ coverageRelativePath: string;
54
+ /** Relative path to jacocoTestReport.xml after `android report`. */
55
+ jacocoReportXml: string;
56
+ };
57
+ /**
58
+ * Istanbul / NYC (TypeScript via source maps). Written by TurboModule
59
+ * `dumpJsCoverage` during `flush()` when Metro is instrumented.
60
+ */
61
+ js: {
62
+ androidRelativePath: string;
63
+ androidStagingPath: string;
64
+ /** Path under the iOS app data container (usually Documents/…). */
65
+ iosRelativePath: string;
66
+ };
67
+ /** Rules applied left-to-right to LCOV `SF:` paths. */
68
+ sourcePathRewrite: SourcePathRewriteRule[];
69
+ /**
70
+ * When true (recommended in CI), pull/export/report/assert exit 2 if
71
+ * expected hits/artifacts are empty.
72
+ */
73
+ strict: boolean;
74
+ /** Presence-guard matchers and default artifact paths. */
75
+ assert: CoverageAssertConfig;
76
+ };
77
+ export declare const DEFAULT_COVERAGE_CONFIG: CoverageConfig;
78
+ export type CoverageConfigInput = {
79
+ nativeModuleName?: string;
80
+ app?: Partial<CoverageConfig['app']>;
81
+ ios?: Partial<CoverageConfig['ios']>;
82
+ android?: Partial<CoverageConfig['android']>;
83
+ js?: Partial<CoverageConfig['js']>;
84
+ sourcePathRewrite?: SourcePathRewriteRule[];
85
+ strict?: boolean;
86
+ assert?: Partial<CoverageAssertConfig>;
87
+ };
88
+ export declare function resolveCoverageConfig(input?: CoverageConfigInput): CoverageConfig;
89
+ /**
90
+ * Load config from `cwd` (or `configPath`). Missing file → defaults.
91
+ */
92
+ export declare function loadCoverageConfig(cwd?: string, configPath?: string): Promise<CoverageConfig>;
93
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/config.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAEN,MAAM,MAAM,oBAAoB,GAAG;IACjC;;;OAGG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B;;;OAGG;IACH,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,6DAA6D;IAC7D,eAAe,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,6DAA6D;IAC7D,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,EAAE;QACH,oBAAoB,EAAE,MAAM,CAAC;QAC7B,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,GAAG,EAAE;QACH,qEAAqE;QACrE,qBAAqB,EAAE,MAAM,EAAE,CAAC;KACjC,CAAC;IACF,OAAO,EAAE;QACP,sBAAsB,EAAE,MAAM,EAAE,CAAC;QACjC,mEAAmE;QACnE,gBAAgB,EAAE,MAAM,CAAC;QACzB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,oEAAoE;QACpE,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF;;;OAGG;IACH,EAAE,EAAE;QACF,mBAAmB,EAAE,MAAM,CAAC;QAC5B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,mEAAmE;QACnE,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,uDAAuD;IACvD,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC3C;;;OAGG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,0DAA0D;IAC1D,MAAM,EAAE,oBAAoB,CAAC;CAC9B,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,cA+BrC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,GAAG,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC;IAC7C,EAAE,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC5C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACxC,CAAC;AAEF,wBAAgB,qBAAqB,CACnC,KAAK,GAAE,mBAAwB,GAC9B,cAAc,CA4BhB;AAQD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,GAAE,MAAsB,EAC3B,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAezB"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * CLI / library exit codes for presence / silent-fail guards.
3
+ *
4
+ * Aligns with the RNFB interim assert contract (exit 2 = strict empty).
5
+ */
6
+ export declare const EXIT_OK = 0;
7
+ /** Unexpected error / bad invocation / tooling failure. */
8
+ export declare const EXIT_ERROR = 1;
9
+ /** Strict empty-hit / missing artifact (CI guard). */
10
+ export declare const EXIT_STRICT_EMPTY = 2;
11
+ /** Thrown when a strict presence guard fails (map to exit 2 in the CLI). */
12
+ export declare class StrictEmptyError extends Error {
13
+ readonly exitCode = 2;
14
+ constructor(message: string);
15
+ }
16
+ //# sourceMappingURL=exit-codes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.d.ts","sourceRoot":"","sources":["../../../src/exit-codes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,OAAO,IAAI,CAAC;AACzB,2DAA2D;AAC3D,eAAO,MAAM,UAAU,IAAI,CAAC;AAC5B,sDAAsD;AACtD,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC,4EAA4E;AAC5E,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,QAAQ,KAAqB;gBAE1B,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,16 @@
1
+ export { default as Coverage } from './NativeCoverage.js';
2
+ export type { Spec as CoverageSpec } from './NativeCoverage.js';
3
+ /**
4
+ * Flush in-process native coverage buffers to disk.
5
+ * iOS: LLVM multi-image (mode c). Android: Jacoco/Emma RT dump.
6
+ *
7
+ * React Native entry only — Node/CLI APIs live under `react-native-coverage/node`.
8
+ */
9
+ /**
10
+ * Flush Istanbul JS coverage (when Metro instrumented) then native buffers.
11
+ * No-op for JS dump when `global.__coverage__` is absent.
12
+ */
13
+ export declare function flush(): void;
14
+ /** Write `global.__coverage__` only (no native Emma/LLVM flush). */
15
+ export declare function flushJs(): void;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qBAAkB,CAAC;AACvD,YAAY,EAAE,IAAI,IAAI,YAAY,EAAE,MAAM,qBAAkB,CAAC;AAE7D;;;;;GAKG;AACH;;;GAGG;AACH,wBAAgB,KAAK,IAAI,IAAI,CAU5B;AAED,oEAAoE;AACpE,wBAAgB,OAAO,IAAI,IAAI,CAM9B"}
@@ -0,0 +1,36 @@
1
+ import type { CoverageConfig } from './config.js';
2
+ import { resolveAndroidDeviceId } from './pull-native-coverage.js';
3
+ export type JsPullOptions = {
4
+ softFail?: boolean;
5
+ outputDir?: string;
6
+ config?: CoverageConfig;
7
+ };
8
+ /**
9
+ * Pull Android Istanbul JSON written by `dumpJsCoverage` (`files/coverage-final.json`).
10
+ */
11
+ export declare function pullAndroidJsCoverage(deviceId: string, options?: JsPullOptions): string | null;
12
+ /**
13
+ * Pull iOS Istanbul JSON from the simulator data container.
14
+ */
15
+ export declare function pullIosJsCoverage(deviceId: string, options?: JsPullOptions): string | null;
16
+ export type JsReportOptions = {
17
+ /** Istanbul coverage-final.json (or directory of JSON files). */
18
+ input: string;
19
+ /** Directory for lcov.info / HTML (NYC report-dir). */
20
+ outputDir?: string;
21
+ /** Working directory for NYC include globs (usually repo or app root). */
22
+ cwd?: string;
23
+ /** Optional path to nyc.config.js */
24
+ nycConfig?: string;
25
+ softFail?: boolean;
26
+ };
27
+ /**
28
+ * Run NYC report with source-map remap (TypeScript SF: paths).
29
+ * Expects pre-instrumented coverage JSON (`instrument: false` in nyc config).
30
+ */
31
+ export declare function reportJsCoverage(options: JsReportOptions): {
32
+ ok: boolean;
33
+ lcovPath: string | null;
34
+ };
35
+ export { resolveAndroidDeviceId };
36
+ //# sourceMappingURL=js-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js-coverage.d.ts","sourceRoot":"","sources":["../../../src/js-coverage.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAU,CAAC;AAG/C,OAAO,EAAgB,sBAAsB,EAAE,MAAM,2BAAwB,CAAC;AAE9E,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,CAAC;AAMF;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,MAAM,GAAG,IAAI,CA6Bf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,MAAM,GAAG,IAAI,CAsCf;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG;IAC1D,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,CAwFA;AAED,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Node/library surface (CLI helpers, config, assert, pull/export).
3
+ * Do not import from React Native / Metro — use package root `flush()` there.
4
+ */
5
+ export type { CoverageAssertConfig, CoverageConfig, SourcePathRewriteRule, } from './config.js';
6
+ export { DEFAULT_COVERAGE_CONFIG, loadCoverageConfig, resolveCoverageConfig, } from './config.js';
7
+ export { normalizeSourcePath, applySourcePathRewrite } from './path-rewrite.js';
8
+ export { EXIT_OK, EXIT_ERROR, EXIT_STRICT_EMPTY, StrictEmptyError, } from './exit-codes.js';
9
+ export { analyzeLcov, analyzeJacocoXml, assertIosLcov, assertAndroidJacoco, assertCoverage, } from './assert-coverage.js';
10
+ export type { AssertResult, AssertCoverageOptions } from './assert-coverage.js';
11
+ export { walkFiles, collectCoverageObjects, resolveIosCoverageContext, rewriteLcovFile, exportIosLcov, reportIosHtml, summarizeIos, } from './process-ios-native-coverage.js';
12
+ export { resolveAndroidDeviceId, androidCoverageFileExists, pullAndroidCoverage, pullAndroidCoverageWithRetry, pullIosCoverage, runJacocoTestReport, getAdbBinary, } from './pull-native-coverage.js';
13
+ export { pullAndroidJsCoverage, pullIosJsCoverage, reportJsCoverage, } from './js-coverage.js';
14
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/node.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,YAAY,EACV,oBAAoB,EACpB,cAAc,EACd,qBAAqB,GACtB,MAAM,aAAU,CAAC;AAClB,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,aAAU,CAAC;AAClB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,mBAAgB,CAAC;AAC7E,OAAO,EACL,OAAO,EACP,UAAU,EACV,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,iBAAc,CAAC;AACtB,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,cAAc,GACf,MAAM,sBAAmB,CAAC;AAC3B,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,sBAAmB,CAAC;AAC7E,OAAO,EACL,SAAS,EACT,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EACf,aAAa,EACb,aAAa,EACb,YAAY,GACb,MAAM,kCAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,mBAAmB,EACnB,4BAA4B,EAC5B,eAAe,EACf,mBAAmB,EACnB,YAAY,GACb,MAAM,2BAAwB,CAAC;AAChC,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAe,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SourcePathRewriteRule } from './config.js';
2
+ /**
3
+ * Apply a single rewrite rule to a source path (forward slashes).
4
+ * Returns the rewritten path, or the input if the rule did not match.
5
+ */
6
+ export declare function applySourcePathRewrite(sourcePath: string, rule: SourcePathRewriteRule): string;
7
+ /**
8
+ * Normalize an LCOV `SF:` path using ordered rewrite rules.
9
+ * Rules are applied left-to-right; each rule sees the previous result.
10
+ */
11
+ export declare function normalizeSourcePath(sourcePath: string, rules?: SourcePathRewriteRule[]): string;
12
+ //# sourceMappingURL=path-rewrite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"path-rewrite.d.ts","sourceRoot":"","sources":["../../../src/path-rewrite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAU,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,qBAAqB,GAC1B,MAAM,CA2BR;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,qBAAqB,EAAO,GAClC,MAAM,CAMR"}
@@ -0,0 +1,61 @@
1
+ import type { CoverageConfig, SourcePathRewriteRule } from './config.js';
2
+ export type IosExportOptions = {
3
+ derivedData: string;
4
+ configuration: string;
5
+ appName: string;
6
+ output: string;
7
+ config?: CoverageConfig;
8
+ /** When true, delete processed `.profraw` files after a successful export. */
9
+ deleteProfraw?: boolean;
10
+ /**
11
+ * When true (default), run LCOV presence assert after export.
12
+ * Soft mode (`config.strict === false`) warns; strict throws for CLI exit 2.
13
+ */
14
+ assertAfterExport?: boolean;
15
+ };
16
+ export type IosCoverageContext = {
17
+ productsDir: string;
18
+ appBinary: string;
19
+ coverageObjects: string[];
20
+ profrawFiles: string[];
21
+ profileDataDir: string;
22
+ simulatorCoverageDir: string;
23
+ };
24
+ export declare function walkFiles(dir: string, matcher: (filePath: string) => boolean, results?: string[]): string[];
25
+ /**
26
+ * Collect app binary + matching embedded frameworks for llvm-cov `-object`.
27
+ * Framework matching uses `config.ios.frameworkNamePrefixes` (neutral; empty by default).
28
+ */
29
+ export declare function collectCoverageObjects(productsDir: string, appName: string, frameworkNamePrefixes?: string[]): string[];
30
+ export declare function resolveIosCoverageContext(derivedData: string, configuration: string, appName: string, frameworkNamePrefixes?: string[]): IosCoverageContext;
31
+ export declare function rewriteLcovFile(inputPath: string, outputPath: string, rules: SourcePathRewriteRule[]): Promise<{
32
+ sourceFileCount: number;
33
+ }>;
34
+ /**
35
+ * Merge profraw → profdata → LCOV with path rewrite + optional presence assert.
36
+ */
37
+ export declare function exportIosLcov(options: IosExportOptions): Promise<string>;
38
+ export type IosReportOptions = {
39
+ derivedData: string;
40
+ configuration?: string;
41
+ appName?: string;
42
+ profdata?: string;
43
+ outputDir?: string;
44
+ config?: CoverageConfig;
45
+ };
46
+ /**
47
+ * HTML report via `llvm-cov show -format=html`.
48
+ */
49
+ export declare function reportIosHtml(options: IosReportOptions): string;
50
+ export type IosSummaryOptions = {
51
+ derivedData: string;
52
+ configuration?: string;
53
+ appName?: string;
54
+ profdata?: string;
55
+ config?: CoverageConfig;
56
+ };
57
+ /**
58
+ * Terminal summary via `llvm-cov report`.
59
+ */
60
+ export declare function summarizeIos(options: IosSummaryOptions): string;
61
+ //# sourceMappingURL=process-ios-native-coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-ios-native-coverage.d.ts","sourceRoot":"","sources":["../../../src/process-ios-native-coverage.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAU,CAAC;AAKtE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,EACtC,OAAO,GAAE,MAAM,EAAO,GACrB,MAAM,EAAE,CAeV;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,qBAAqB,GAAE,MAAM,EAAO,GACnC,MAAM,EAAE,CAwDV;AAED,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,qBAAqB,GAAE,MAAM,EAAO,GACnC,kBAAkB,CA+BpB;AAED,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,qBAAqB,EAAE,GAC7B,OAAO,CAAC;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBtC;AA4CD;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,CAkFjB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CA0C/D;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAqC/D"}