@tamagui/native-ci 2.0.0-rc.9 → 2.0.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.
@@ -43,6 +43,7 @@ const exitCode = await withMetro('android', async () => {
43
43
  recordLogs: options.recordLogs,
44
44
  retries: options.retries,
45
45
  headless: options.headless,
46
+ testFiles: options.testFiles,
46
47
  })
47
48
  })
48
49
 
@@ -38,6 +38,7 @@ const exitCode = await withMetro('ios', async () => {
38
38
  recordLogs: options.recordLogs,
39
39
  retries: options.retries,
40
40
  workers: options.workers,
41
+ testFiles: options.testFiles,
41
42
  })
42
43
  })
43
44
 
package/types/detox.d.ts CHANGED
@@ -17,6 +17,8 @@ export interface DetoxRunnerOptions {
17
17
  headless?: boolean;
18
18
  /** Number of parallel workers (default: 1) */
19
19
  workers?: number;
20
+ /** Specific test files to run (passed as positional args to detox) */
21
+ testFiles?: string[];
20
22
  }
21
23
  /**
22
24
  * Parse common CLI arguments for Detox runners
@@ -28,6 +30,7 @@ export declare function parseDetoxArgs(platform: Platform): {
28
30
  recordLogs: string;
29
31
  retries: number;
30
32
  workers: number;
33
+ testFiles: string[] | undefined;
31
34
  };
32
35
  /**
33
36
  * Build Detox CLI command arguments
@@ -1 +1 @@
1
- {"version":3,"file":"detox.d.ts","sourceRoot":"","sources":["../src/detox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ;;;;;;;EAoChD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAwBpE;AAKD;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOxD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwChF"}
1
+ {"version":3,"file":"detox.d.ts","sourceRoot":"","sources":["../src/detox.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAG3C,MAAM,WAAW,kBAAkB;IACjC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAA;IACnB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;EAsChD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE,CA6BpE;AAOD;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAOxD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAwChF"}
package/types/ios.d.ts CHANGED
@@ -1,6 +1,34 @@
1
1
  /**
2
2
  * iOS-specific utilities for Detox test runners
3
3
  */
4
+ /**
5
+ * Check if any iOS simulator is booted and available for testing.
6
+ * Returns true if at least one simulator is booted.
7
+ */
8
+ export declare function hasBootedSimulator(): boolean;
9
+ /**
10
+ * Get the UDID of the first booted iOS simulator, or null if none.
11
+ */
12
+ export declare function getBootedSimulatorUDID(): string | null;
13
+ /**
14
+ * Boot an iOS simulator. Picks the first available iPhone device.
15
+ */
16
+ export declare function ensureBootedSimulator(): void;
17
+ /**
18
+ * Ensure the app is installed on a specific simulator.
19
+ * For dev client apps, builds if needed then installs.
20
+ * For Expo Go apps, ensures Expo Go is present.
21
+ */
22
+ export declare function ensureAppInstalled(opts: {
23
+ projectRoot: string;
24
+ bundleId: string;
25
+ udid?: string;
26
+ }): Promise<void>;
27
+ /**
28
+ * Get the bundle ID needed for maestro tests.
29
+ * Checks flow files first (they declare appId), falls back to app.json.
30
+ */
31
+ export declare function getMaestroBundleId(projectRoot: string): string;
4
32
  /**
5
33
  * Shutdown all simulators and clean up zombie simulator processes.
6
34
  * macOS doesn't properly clean up simulators between test runs, leading to
@@ -1 +1 @@
1
- {"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../src/ios.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBrD;AAkCD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAE,MAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyElF"}
1
+ {"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../src/ios.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,GAAG,IAAI,CAWtD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAuB5C;AAgBD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE;IAC7C,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BhB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAsB9D;AA+CD;;;;GAIG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAoBvD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAgBrD;AAkCD;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,MAAM,GAAE,MAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyElF"}
@@ -1 +1 @@
1
- {"version":3,"file":"metro.d.ts","sourceRoot":"","sources":["../src/metro.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAErC,OAAO,EAKL,KAAK,QAAQ,EAEd,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,CAAA;IAClB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,IAAI,EAAE,UAAU,CAAA;IAChB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CA0B1E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBrE;AAED;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAsCzC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAS7D;AAkCD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA4BvF"}
1
+ {"version":3,"file":"metro.d.ts","sourceRoot":"","sources":["../src/metro.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAErC,OAAO,EAKL,KAAK,QAAQ,EAEd,MAAM,aAAa,CAAA;AAEpB,MAAM,WAAW,YAAY;IAC3B,wCAAwC;IACxC,QAAQ,EAAE,QAAQ,CAAA;IAClB,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gDAAgD;IAChD,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,IAAI,EAAE,UAAU,CAAA;IAChB,8CAA8C;IAC9C,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CA0B1E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAwBrE;AAsBD;;;;GAIG;AACH,wBAAgB,UAAU,IAAI,YAAY,CA2CzC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAS7D;AAkCD;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA4BvF"}
package/dist/cache.js DELETED
@@ -1,71 +0,0 @@
1
- import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
2
- import { dirname, join } from "node:path";
3
- import { DEFAULT_KV_TTL_SECONDS } from "./constants";
4
- function createCacheKey(options) {
5
- const { platform, fingerprint, prefix = "native-build" } = options;
6
- return `${prefix}-${platform}-${fingerprint}`;
7
- }
8
- async function saveFingerprintToKV(kv, key, fingerprint, ttlSeconds = DEFAULT_KV_TTL_SECONDS) {
9
- try {
10
- const response = await fetch(`${kv.url}/SETEX/${key}/${ttlSeconds}/${fingerprint}`, {
11
- method: "POST",
12
- headers: {
13
- Authorization: `Bearer ${kv.token}`
14
- }
15
- });
16
- if (!response.ok)
17
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
18
- } catch (error) {
19
- throw error instanceof TypeError ? new Error(`Network error connecting to KV store: ${error.message}`) : new Error(`Failed to save fingerprint to KV: ${error.message}`);
20
- }
21
- }
22
- async function getFingerprintFromKV(kv, key) {
23
- try {
24
- const response = await fetch(`${kv.url}/get/${key}`, {
25
- headers: {
26
- Authorization: `Bearer ${kv.token}`
27
- }
28
- });
29
- if (!response.ok)
30
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
31
- const data = await response.json();
32
- return data.result === "null" ? null : data.result;
33
- } catch (error) {
34
- throw error instanceof TypeError ? new Error(`Network error connecting to KV store: ${error.message}`) : new Error(`Failed to get fingerprint from KV: ${error.message}`);
35
- }
36
- }
37
- async function extendKVTTL(kv, key, ttlSeconds = DEFAULT_KV_TTL_SECONDS) {
38
- try {
39
- await fetch(`${kv.url}/EXPIRE/${key}/${ttlSeconds}`, {
40
- method: "POST",
41
- headers: {
42
- Authorization: `Bearer ${kv.token}`
43
- }
44
- });
45
- } catch (error) {
46
- console.warn(`Failed to extend KV TTL: ${error.message}`);
47
- }
48
- }
49
- function saveCache(filePath, data, options = {}) {
50
- const { cacheDir } = options, cachePath = cacheDir ? join(process.cwd(), cacheDir, filePath) : join(process.cwd(), filePath);
51
- mkdirSync(dirname(cachePath), { recursive: !0 }), writeFileSync(cachePath, JSON.stringify(data, null, 2));
52
- }
53
- function loadCache(filePath, options = {}) {
54
- const { cacheDir } = options, cachePath = cacheDir ? join(process.cwd(), cacheDir, filePath) : join(process.cwd(), filePath);
55
- if (!existsSync(cachePath))
56
- return null;
57
- try {
58
- return JSON.parse(readFileSync(cachePath, "utf-8"));
59
- } catch {
60
- return null;
61
- }
62
- }
63
- export {
64
- createCacheKey,
65
- extendKVTTL,
66
- getFingerprintFromKV,
67
- loadCache,
68
- saveCache,
69
- saveFingerprintToKV
70
- };
71
- //# sourceMappingURL=cache.js.map
package/dist/cache.js.map DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cache.ts"],
4
- "mappings": "AAAA,SAAS,YAAY,cAAc,eAAe,iBAAiB;AACnE,SAAS,SAAS,YAAY;AAC9B,SAAS,8BAA6C;AAgB/C,SAAS,eAAe,SAA+B;AAC5D,QAAM,EAAE,UAAU,aAAa,SAAS,eAAe,IAAI;AAC3D,SAAO,GAAG,MAAM,IAAI,QAAQ,IAAI,WAAW;AAC7C;AAMA,eAAsB,oBACpB,IACA,KACA,aACA,aAAa,wBACE;AACf,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,GAAG,GAAG,UAAU,GAAG,IAAI,UAAU,IAAI,WAAW,IAAI;AAAA,MAClF,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,GAAG,KAAK;AAAA,MACnC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAAA,EAErE,SAAS,OAAO;AACd,UAAI,iBAAiB,YACb,IAAI,MAAM,yCAA0C,MAAgB,OAAO,EAAE,IAE/E,IAAI,MAAM,qCAAsC,MAAgB,OAAO,EAAE;AAAA,EACjF;AACF;AAKA,eAAsB,qBACpB,IACA,KACwB;AACxB,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,GAAG,GAAG,QAAQ,GAAG,IAAI;AAAA,MACnD,SAAS;AAAA,QACP,eAAe,UAAU,GAAG,KAAK;AAAA,MACnC;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU,EAAE;AAGnE,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,WAAO,KAAK,WAAW,SAAS,OAAO,KAAK;AAAA,EAC9C,SAAS,OAAO;AACd,UAAI,iBAAiB,YACb,IAAI,MAAM,yCAA0C,MAAgB,OAAO,EAAE,IAE/E,IAAI,MAAM,sCAAuC,MAAgB,OAAO,EAAE;AAAA,EAClF;AACF;AAKA,eAAsB,YACpB,IACA,KACA,aAAa,wBACE;AACf,MAAI;AACF,UAAM,MAAM,GAAG,GAAG,GAAG,WAAW,GAAG,IAAI,UAAU,IAAI;AAAA,MACnD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,eAAe,UAAU,GAAG,KAAK;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AAEd,YAAQ,KAAK,4BAA6B,MAAgB,OAAO,EAAE;AAAA,EACrE;AACF;AAYO,SAAS,UACd,UACA,MACA,UAA6B,CAAC,GACxB;AACN,QAAM,EAAE,SAAS,IAAI,SACf,YAAY,WACd,KAAK,QAAQ,IAAI,GAAG,UAAU,QAAQ,IACtC,KAAK,QAAQ,IAAI,GAAG,QAAQ;AAEhC,YAAU,QAAQ,SAAS,GAAG,EAAE,WAAW,GAAK,CAAC,GACjD,cAAc,WAAW,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AACxD;AAMO,SAAS,UACd,UACA,UAA6B,CAAC,GACpB;AACV,QAAM,EAAE,SAAS,IAAI,SACf,YAAY,WACd,KAAK,QAAQ,IAAI,GAAG,UAAU,QAAQ,IACtC,KAAK,QAAQ,IAAI,GAAG,QAAQ;AAEhC,MAAI,CAAC,WAAW,SAAS;AACvB,WAAO;AAGT,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,WAAW,OAAO,CAAC;AAAA,EACpD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;",
5
- "names": []
6
- }
package/dist/cli.js DELETED
@@ -1,298 +0,0 @@
1
- #!/usr/bin/env node
2
- import { generateFingerprint, generatePreFingerprintHash } from "./fingerprint";
3
- import {
4
- createCacheKey,
5
- saveFingerprintToKV,
6
- getFingerprintFromKV,
7
- saveCache,
8
- loadCache
9
- } from "./cache";
10
- import { setGitHubOutput, isGitHubActions, isCI } from "./runner";
11
- import {
12
- ensureIosDeps,
13
- ensureAndroidDeps,
14
- ensureMaestro,
15
- printDepsStatus
16
- } from "./deps";
17
- import { withMetro } from "./metro";
18
- import { runDetoxTests } from "./detox";
19
- import { ensureIOSFolder, ensureIOSApp } from "./ios";
20
- import { setupAndroidDevice, ensureAndroidFolder } from "./android";
21
- const HELP = `
22
- native-ci - Native CI/CD helpers for Expo apps
23
-
24
- COMMANDS:
25
-
26
- Test Commands:
27
- test ios [options] Run iOS Detox tests
28
- test android [options] Run Android Detox tests
29
- test maestro [flow] Run Maestro tests
30
- test all Run all tests (iOS + Android)
31
-
32
- Dependency Commands:
33
- deps Show dependency status
34
- deps install Install missing dependencies
35
- deps install-ios Install iOS dependencies (macOS only)
36
- deps install-android Install Android dependencies
37
- deps install-maestro Install Maestro
38
-
39
- Fingerprint Commands:
40
- fingerprint <platform> Generate native build fingerprint
41
- fingerprint-test Test fingerprint caching locally
42
- pre-hash <files...> Generate quick pre-fingerprint hash
43
- cache-key <platform> <fp> Generate cache key from fingerprint
44
-
45
- KV Store Commands:
46
- kv-get <key> Get value from KV store
47
- kv-set <key> <value> Set value in KV store
48
-
49
- OPTIONS:
50
- --project-root <path> Project root directory (default: cwd)
51
- --config <name> Detox configuration name
52
- --record-logs <mode> Record logs: none, failing, all (default: all)
53
- --retries <n> Number of retries for flaky tests (default: 0)
54
- --headless Run in headless mode (Android only)
55
- --prefix <prefix> Cache key prefix (default: native-build)
56
- --github-output Output results for GitHub Actions
57
- --json Output as JSON
58
- --help Show this help message
59
-
60
- ENVIRONMENT:
61
- KV_STORE_REDIS_REST_URL Redis REST API URL for fingerprint caching
62
- KV_STORE_REDIS_REST_TOKEN Redis REST API token
63
-
64
- EXAMPLES:
65
- native-ci test ios
66
- native-ci test android --headless
67
- native-ci test maestro
68
- native-ci deps
69
- native-ci deps install
70
- native-ci fingerprint ios
71
- native-ci fingerprint-test
72
- `;
73
- function parseArgs(argv) {
74
- const args2 = [], options2 = {
75
- projectRoot: process.cwd(),
76
- config: "",
77
- recordLogs: "all",
78
- retries: 0,
79
- headless: !1,
80
- prefix: "native-build",
81
- githubOutput: !1,
82
- json: !1,
83
- help: !1
84
- };
85
- let i = 0;
86
- for (; i < argv.length; ) {
87
- const arg = argv[i];
88
- if (arg === "--project-root" && argv[i + 1])
89
- options2.projectRoot = argv[++i];
90
- else if (arg === "--config" && argv[i + 1])
91
- options2.config = argv[++i];
92
- else if (arg === "--record-logs" && argv[i + 1])
93
- options2.recordLogs = argv[++i];
94
- else if (arg === "--retries" && argv[i + 1]) {
95
- const val = Number.parseInt(argv[++i], 10);
96
- !Number.isNaN(val) && val >= 0 && (options2.retries = val);
97
- } else arg === "--prefix" && argv[i + 1] ? options2.prefix = argv[++i] : arg === "--github-output" ? options2.githubOutput = !0 : arg === "--json" ? options2.json = !0 : arg === "--help" || arg === "-h" ? options2.help = !0 : arg.startsWith("-") || args2.push(arg);
98
- i++;
99
- }
100
- return {
101
- command: args2[0] || "",
102
- subcommand: args2[1] || "",
103
- args: args2.slice(2),
104
- options: options2
105
- };
106
- }
107
- function validatePlatform(value) {
108
- return value !== "ios" && value !== "android" && (console.error('Error: platform must be "ios" or "android"'), process.exit(1)), value;
109
- }
110
- function getKVCredentials() {
111
- const url = process.env.KV_STORE_REDIS_REST_URL, token = process.env.KV_STORE_REDIS_REST_TOKEN;
112
- return (!url || !token) && (console.error("Error: KV_STORE_REDIS_REST_URL and KV_STORE_REDIS_REST_TOKEN required"), process.exit(1)), { url, token };
113
- }
114
- const { command, subcommand, args, options } = parseArgs(process.argv.slice(2));
115
- (options.help || !command) && (console.info(HELP), process.exit(options.help ? 0 : 1));
116
- try {
117
- switch (command) {
118
- // ========================================
119
- // Test Commands
120
- // ========================================
121
- case "test": {
122
- isCI() && !process.env.NATIVE_CI_FORCE_RUN && (console.info("Skipping native tests in CI (handled by separate workflow)"), console.info("Set NATIVE_CI_FORCE_RUN=1 to force run"), process.exit(0));
123
- const platform = subcommand || "ios";
124
- if (platform === "ios") {
125
- await ensureIosDeps();
126
- const config = options.config || "ios.sim.debug";
127
- console.info("=== iOS Detox Test Runner ==="), console.info(`Config: ${config}`), console.info(`Project root: ${options.projectRoot}`), process.chdir(options.projectRoot), await ensureIOSFolder(), await ensureIOSApp(config);
128
- const exitCode = await withMetro("ios", async () => runDetoxTests({
129
- config,
130
- projectRoot: options.projectRoot,
131
- recordLogs: options.recordLogs,
132
- retries: options.retries
133
- }));
134
- process.exit(exitCode);
135
- } else if (platform === "android") {
136
- await ensureAndroidDeps();
137
- const config = options.config || "android.emu.debug";
138
- console.info("=== Android Detox Test Runner ==="), console.info(`Config: ${config}`), console.info(`Project root: ${options.projectRoot}`), console.info(`Headless: ${options.headless}`), process.chdir(options.projectRoot), await ensureAndroidFolder(), await setupAndroidDevice();
139
- const exitCode = await withMetro("android", async () => runDetoxTests({
140
- config,
141
- projectRoot: options.projectRoot,
142
- recordLogs: options.recordLogs,
143
- retries: options.retries,
144
- headless: options.headless
145
- }));
146
- process.exit(exitCode);
147
- } else if (platform === "maestro") {
148
- await ensureMaestro();
149
- const flow = args[0] || "";
150
- console.info("=== Maestro Test Runner ==="), console.info(`Flow: ${flow || "all"}`), console.info(`Project root: ${options.projectRoot}`), process.chdir(options.projectRoot);
151
- const exitCode = await withMetro("ios", async () => {
152
- const { $ } = await import("bun"), flowArg = flow ? `./flows/${flow}` : "./flows";
153
- return (await $`maestro test ${flowArg} --exclude-tags=util --no-ansi`.nothrow()).exitCode;
154
- });
155
- process.exit(exitCode);
156
- } else if (platform === "all") {
157
- console.info(`=== Running All Native Tests ===
158
- `), await ensureIosDeps(), console.info(`
159
- --- iOS Tests ---
160
- `), process.chdir(options.projectRoot), await ensureIOSFolder(), await ensureIOSApp(options.config || "ios.sim.debug");
161
- let iosExit = 0;
162
- try {
163
- iosExit = await withMetro("ios", async () => runDetoxTests({
164
- config: options.config || "ios.sim.debug",
165
- projectRoot: options.projectRoot,
166
- recordLogs: options.recordLogs,
167
- retries: options.retries
168
- }));
169
- } catch (err) {
170
- console.error("iOS tests failed:", err), iosExit = 1;
171
- }
172
- await ensureAndroidDeps(), console.info(`
173
- --- Android Tests ---
174
- `), await ensureAndroidFolder(), await setupAndroidDevice();
175
- let androidExit = 0;
176
- try {
177
- androidExit = await withMetro("android", async () => runDetoxTests({
178
- config: options.config || "android.emu.debug",
179
- projectRoot: options.projectRoot,
180
- recordLogs: options.recordLogs,
181
- retries: options.retries,
182
- headless: options.headless
183
- }));
184
- } catch (err) {
185
- console.error("Android tests failed:", err), androidExit = 1;
186
- }
187
- const success = iosExit === 0 && androidExit === 0;
188
- console.info(`
189
- === Test Results ===`), console.info(`iOS: ${iosExit === 0 ? "PASSED" : "FAILED"}`), console.info(`Android: ${androidExit === 0 ? "PASSED" : "FAILED"}`), process.exit(success ? 0 : 1);
190
- } else
191
- console.error(`Unknown test platform: ${platform}`), console.info("Usage: native-ci test [ios|android|maestro|all]"), process.exit(1);
192
- break;
193
- }
194
- // ========================================
195
- // Dependency Commands
196
- // ========================================
197
- case "deps": {
198
- !subcommand || subcommand === "status" ? printDepsStatus() : subcommand === "install" ? (console.info(`Installing all dependencies...
199
- `), await ensureIosDeps(), await ensureMaestro(), console.info(`
200
- All dependencies installed!`)) : subcommand === "install-ios" ? await ensureIosDeps() : subcommand === "install-android" ? await ensureAndroidDeps() : subcommand === "install-maestro" ? await ensureMaestro() : (console.error(`Unknown deps subcommand: ${subcommand}`), process.exit(1));
201
- break;
202
- }
203
- // ========================================
204
- // Fingerprint Commands
205
- // ========================================
206
- case "fingerprint": {
207
- const platform = validatePlatform(subcommand), result = await generateFingerprint({
208
- platform,
209
- projectRoot: options.projectRoot
210
- });
211
- (options.githubOutput || isGitHubActions()) && (setGitHubOutput("fingerprint", result.hash), setGitHubOutput(
212
- "cache-key",
213
- createCacheKey({
214
- platform,
215
- fingerprint: result.hash,
216
- prefix: options.prefix
217
- })
218
- )), options.json ? console.info(JSON.stringify(result, null, 2)) : console.info(result.hash);
219
- break;
220
- }
221
- case "fingerprint-test": {
222
- const CACHE_FILE = ".fingerprint-cache.json";
223
- console.info(`Generating fingerprints...
224
- `);
225
- const iosResult = await generateFingerprint({
226
- platform: "ios",
227
- projectRoot: options.projectRoot
228
- }), androidResult = await generateFingerprint({
229
- platform: "android",
230
- projectRoot: options.projectRoot
231
- }), iosFingerprint = iosResult.hash, androidFingerprint = androidResult.hash;
232
- console.info("Current fingerprints:"), console.info(` iOS: ${iosFingerprint}`), console.info(` Android: ${androidFingerprint}`), console.info("");
233
- const cache = loadCache(CACHE_FILE);
234
- if (cache?.ios && cache?.android) {
235
- console.info("Previous fingerprints (from cache):"), console.info(` iOS: ${cache.ios}`), console.info(` Android: ${cache.android}`), console.info("");
236
- const iosChanged = cache.ios !== iosFingerprint, androidChanged = cache.android !== androidFingerprint;
237
- iosChanged || androidChanged ? (console.info("Fingerprints changed!"), iosChanged && console.info(" - iOS fingerprint changed (would trigger iOS rebuild)"), androidChanged && console.info(
238
- " - Android fingerprint changed (would trigger Android rebuild)"
239
- )) : console.info("Fingerprints match - no rebuild needed");
240
- } else
241
- console.info("No previous fingerprints cached.");
242
- saveCache(CACHE_FILE, {
243
- ios: iosFingerprint,
244
- android: androidFingerprint,
245
- timestamp: (/* @__PURE__ */ new Date()).toISOString()
246
- }), console.info(`
247
- Saved fingerprints to ${CACHE_FILE}`), console.info(`
248
- To test cache invalidation:
249
- 1. Add a native dependency: yarn add react-native-mmkv
250
- 2. Run this script again: native-ci fingerprint-test
251
- 3. Fingerprints should change!
252
- 4. Remove the dependency: yarn remove react-native-mmkv
253
- 5. Run this script again - fingerprints should match original
254
- `);
255
- break;
256
- }
257
- case "pre-hash": {
258
- const files = [subcommand, ...args].filter(Boolean);
259
- files.length === 0 && (console.error("Error: at least one file required"), process.exit(1));
260
- const hash = generatePreFingerprintHash(files, options.projectRoot);
261
- (options.githubOutput || isGitHubActions()) && setGitHubOutput("pre-fingerprint-hash", hash), options.json ? console.info(JSON.stringify({ hash, files }, null, 2)) : console.info(hash);
262
- break;
263
- }
264
- case "cache-key": {
265
- const platform = validatePlatform(subcommand), fingerprint = args[0];
266
- fingerprint || (console.error("Error: fingerprint is required"), process.exit(1));
267
- const cacheKey = createCacheKey({
268
- platform,
269
- fingerprint,
270
- prefix: options.prefix
271
- });
272
- (options.githubOutput || isGitHubActions()) && setGitHubOutput("cache-key", cacheKey), console.info(cacheKey);
273
- break;
274
- }
275
- // ========================================
276
- // KV Store Commands
277
- // ========================================
278
- case "kv-get": {
279
- const key = subcommand;
280
- key || (console.error("Error: key is required"), process.exit(1));
281
- const kv = getKVCredentials(), value = await getFingerprintFromKV(kv, key);
282
- (options.githubOutput || isGitHubActions()) && (setGitHubOutput("value", value || ""), setGitHubOutput("found", value ? "true" : "false")), value ? console.info(value) : process.exit(1);
283
- break;
284
- }
285
- case "kv-set": {
286
- const key = subcommand, value = args[0];
287
- (!key || !value) && (console.error("Error: key and value are required"), process.exit(1));
288
- const kv = getKVCredentials();
289
- await saveFingerprintToKV(kv, key, value), console.info("OK");
290
- break;
291
- }
292
- default:
293
- console.error(`Unknown command: ${command}`), console.info(HELP), process.exit(1);
294
- }
295
- } catch (error) {
296
- console.error("Error:", error.message), process.exit(1);
297
- }
298
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/cli.ts"],
4
- "mappings": "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",
5
- "names": ["args", "options"]
6
- }
package/dist/constants.js DELETED
@@ -1,12 +0,0 @@
1
- const METRO_HOST = "127.0.0.1", METRO_PORT = 8081, METRO_URL = `http://${METRO_HOST}:8081`, DETOX_SERVER_PORT = 8099, DEFAULT_METRO_WAIT_ATTEMPTS = 60, DEFAULT_METRO_WAIT_INTERVAL_MS = 2e3, DEFAULT_METRO_TIMEOUT_MS = DEFAULT_METRO_WAIT_ATTEMPTS * DEFAULT_METRO_WAIT_INTERVAL_MS, DEFAULT_KV_TTL_SECONDS = 2592e3;
2
- export {
3
- DEFAULT_KV_TTL_SECONDS,
4
- DEFAULT_METRO_TIMEOUT_MS,
5
- DEFAULT_METRO_WAIT_ATTEMPTS,
6
- DEFAULT_METRO_WAIT_INTERVAL_MS,
7
- DETOX_SERVER_PORT,
8
- METRO_HOST,
9
- METRO_PORT,
10
- METRO_URL
11
- };
12
- //# sourceMappingURL=constants.js.map
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/constants.ts"],
4
- "mappings": "AAKO,MAAM,aAAa,aACb,aAAa,MACb,YAAY,UAAU,UAAU,SAGhC,oBAAoB,MAGpB,8BAA8B,IAC9B,iCAAiC,KACjC,2BACX,8BAA8B,gCAGnB,yBAAyB;",
5
- "names": []
6
- }
package/dist/deps.js DELETED
@@ -1,44 +0,0 @@
1
- import { execSync, spawnSync } from "node:child_process";
2
- import { platform } from "node:os";
3
- function checkDeps() {
4
- return {
5
- bun: commandExists("bun"),
6
- detoxCli: commandExists("detox"),
7
- applesimutils: commandExists("applesimutils"),
8
- maestro: commandExists("maestro")
9
- };
10
- }
11
- function commandExists(cmd) {
12
- return spawnSync("which", [cmd], { encoding: "utf-8" }).status === 0;
13
- }
14
- async function ensureIosDeps() {
15
- if (platform() !== "darwin") {
16
- console.info("iOS testing requires macOS");
17
- return;
18
- }
19
- const deps = checkDeps();
20
- deps.bun || (console.info("Installing Bun..."), execSync("curl -fsSL https://bun.sh/install | bash", { stdio: "inherit" })), deps.detoxCli || (console.info("Installing Detox CLI..."), execSync("npm install -g detox-cli", { stdio: "inherit" })), deps.applesimutils || (console.info("Installing applesimutils..."), execSync("brew tap wix/brew && brew install applesimutils", { stdio: "inherit" })), console.info("All iOS dependencies installed");
21
- }
22
- async function ensureAndroidDeps() {
23
- const deps = checkDeps();
24
- deps.bun || (console.info("Installing Bun..."), execSync("curl -fsSL https://bun.sh/install | bash", { stdio: "inherit" })), deps.detoxCli || (console.info("Installing Detox CLI..."), execSync("npm install -g detox-cli", { stdio: "inherit" })), console.info("All Android dependencies installed");
25
- }
26
- async function ensureMaestro() {
27
- if (checkDeps().maestro) {
28
- console.info("Maestro is already installed");
29
- return;
30
- }
31
- console.info("Installing Maestro..."), execSync('curl -Ls "https://get.maestro.mobile.dev" | bash', { stdio: "inherit" });
32
- }
33
- function printDepsStatus() {
34
- const deps = checkDeps(), check = (ok) => ok ? "\u2713" : "\u2717";
35
- console.info("Dependency Status:"), console.info(` ${check(deps.bun)} Bun`), console.info(` ${check(deps.detoxCli)} Detox CLI`), console.info(` ${check(deps.applesimutils)} applesimutils (macOS)`), console.info(` ${check(deps.maestro)} Maestro`);
36
- }
37
- export {
38
- checkDeps,
39
- ensureAndroidDeps,
40
- ensureIosDeps,
41
- ensureMaestro,
42
- printDepsStatus
43
- };
44
- //# sourceMappingURL=deps.js.map
package/dist/deps.js.map DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/deps.ts"],
4
- "mappings": "AAMA,SAAS,UAAU,iBAAiB;AACpC,SAAS,gBAAgB;AAYlB,SAAS,YAA6B;AAC3C,SAAO;AAAA,IACL,KAAK,cAAc,KAAK;AAAA,IACxB,UAAU,cAAc,OAAO;AAAA,IAC/B,eAAe,cAAc,eAAe;AAAA,IAC5C,SAAS,cAAc,SAAS;AAAA,EAClC;AACF;AAEA,SAAS,cAAc,KAAsB;AAE3C,SADe,UAAU,SAAS,CAAC,GAAG,GAAG,EAAE,UAAU,QAAQ,CAAC,EAChD,WAAW;AAC3B;AAKA,eAAsB,gBAA+B;AACnD,MAAI,SAAS,MAAM,UAAU;AAC3B,YAAQ,KAAK,4BAA4B;AACzC;AAAA,EACF;AAEA,QAAM,OAAO,UAAU;AAEvB,EAAK,KAAK,QACR,QAAQ,KAAK,mBAAmB,GAChC,SAAS,4CAA4C,EAAE,OAAO,UAAU,CAAC,IAGtE,KAAK,aACR,QAAQ,KAAK,yBAAyB,GACtC,SAAS,4BAA4B,EAAE,OAAO,UAAU,CAAC,IAGtD,KAAK,kBACR,QAAQ,KAAK,6BAA6B,GAC1C,SAAS,mDAAmD,EAAE,OAAO,UAAU,CAAC,IAGlF,QAAQ,KAAK,gCAAgC;AAC/C;AAKA,eAAsB,oBAAmC;AACvD,QAAM,OAAO,UAAU;AAEvB,EAAK,KAAK,QACR,QAAQ,KAAK,mBAAmB,GAChC,SAAS,4CAA4C,EAAE,OAAO,UAAU,CAAC,IAGtE,KAAK,aACR,QAAQ,KAAK,yBAAyB,GACtC,SAAS,4BAA4B,EAAE,OAAO,UAAU,CAAC,IAG3D,QAAQ,KAAK,oCAAoC;AACnD;AAKA,eAAsB,gBAA+B;AAGnD,MAFa,UAAU,EAEd,SAAS;AAChB,YAAQ,KAAK,8BAA8B;AAC3C;AAAA,EACF;AAEA,UAAQ,KAAK,uBAAuB,GACpC,SAAS,oDAAoD,EAAE,OAAO,UAAU,CAAC;AACnF;AAKO,SAAS,kBAAwB;AACtC,QAAM,OAAO,UAAU,GACjB,QAAQ,CAAC,OAAiB,KAAK,WAAM;AAE3C,UAAQ,KAAK,oBAAoB,GACjC,QAAQ,KAAK,KAAK,MAAM,KAAK,GAAG,CAAC,MAAM,GACvC,QAAQ,KAAK,KAAK,MAAM,KAAK,QAAQ,CAAC,YAAY,GAClD,QAAQ,KAAK,KAAK,MAAM,KAAK,aAAa,CAAC,wBAAwB,GACnE,QAAQ,KAAK,KAAK,MAAM,KAAK,OAAO,CAAC,UAAU;AACjD;",
5
- "names": []
6
- }
package/dist/detox.js DELETED
@@ -1,73 +0,0 @@
1
- import { parseArgs } from "node:util";
2
- import { DETOX_SERVER_PORT } from "./constants";
3
- function parseDetoxArgs(platform) {
4
- const defaultConfig = platform === "ios" ? "ios.sim.debug" : "android.emu.ci.debug", { values } = parseArgs({
5
- options: {
6
- config: { type: "string", default: defaultConfig },
7
- "project-root": { type: "string", default: process.cwd() },
8
- headless: { type: "boolean", default: !1 },
9
- "record-logs": { type: "string", default: "all" },
10
- retries: { type: "string", default: "0" },
11
- workers: { type: "string", default: "1" }
12
- }
13
- }), retriesNum = Number.parseInt(values.retries, 10);
14
- (Number.isNaN(retriesNum) || retriesNum < 0) && (console.error("Error: retries must be a non-negative integer"), process.exit(1));
15
- const workersNum = Number.parseInt(values.workers, 10);
16
- return (Number.isNaN(workersNum) || workersNum < 1) && (console.error("Error: workers must be a positive integer"), process.exit(1)), {
17
- config: values.config,
18
- projectRoot: values["project-root"],
19
- headless: values.headless,
20
- recordLogs: values["record-logs"],
21
- retries: retriesNum,
22
- workers: workersNum
23
- };
24
- }
25
- function buildDetoxArgs(options) {
26
- const args = [
27
- "detox",
28
- "test",
29
- "--configuration",
30
- options.config,
31
- "--record-logs",
32
- options.recordLogs,
33
- "--retries",
34
- String(options.retries),
35
- // force jest to exit after tests complete (prevents hanging on open handles)
36
- "--forceExit"
37
- ];
38
- return options.headless && args.push("--headless"), options.workers && options.workers > 1 && args.push("--workers", String(options.workers)), args;
39
- }
40
- const DETOX_TIMEOUT_MS = 2700 * 1e3;
41
- async function resetDetoxLockFile() {
42
- console.info("Resetting Detox lock file..."), await Bun.spawn(["npx", "detox", "reset-lock-file"], {
43
- stdout: "inherit",
44
- stderr: "inherit"
45
- }).exited;
46
- }
47
- async function runDetoxTests(options) {
48
- await resetDetoxLockFile();
49
- const detoxArgs = buildDetoxArgs(options);
50
- console.info(`
51
- --- Running Detox tests ---`), console.info(`Using fixed Detox server port: ${DETOX_SERVER_PORT}`), console.info(`Command: npx ${detoxArgs.join(" ")}`);
52
- const proc = Bun.spawn(["npx", ...detoxArgs], {
53
- env: { ...process.env, DETOX_SERVER_PORT: String(DETOX_SERVER_PORT) },
54
- stdout: "inherit",
55
- stderr: "inherit"
56
- }), timeoutPromise = new Promise((resolve) => {
57
- setTimeout(() => resolve("timeout"), DETOX_TIMEOUT_MS);
58
- }), result = await Promise.race([proc.exited, timeoutPromise]);
59
- if (result === "timeout")
60
- return console.info(`
61
- Detox timed out, killing process...`), proc.kill("SIGKILL"), 1;
62
- const exitCode = result;
63
- return console.info(exitCode === 0 ? `
64
- All tests passed!` : `
65
- Tests failed with exit code: ${exitCode}`), exitCode;
66
- }
67
- export {
68
- buildDetoxArgs,
69
- parseDetoxArgs,
70
- resetDetoxLockFile,
71
- runDetoxTests
72
- };
73
- //# sourceMappingURL=detox.js.map
package/dist/detox.js.map DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/detox.ts"],
4
- "mappings": "AAMA,SAAS,iBAAiB;AAE1B,SAAS,yBAAyB;AAoB3B,SAAS,eAAe,UAAoB;AACjD,QAAM,gBAAgB,aAAa,QAAQ,kBAAkB,wBAEvD,EAAE,OAAO,IAAI,UAAU;AAAA,IAC3B,SAAS;AAAA,MACP,QAAQ,EAAE,MAAM,UAAU,SAAS,cAAc;AAAA,MACjD,gBAAgB,EAAE,MAAM,UAAU,SAAS,QAAQ,IAAI,EAAE;AAAA,MACzD,UAAU,EAAE,MAAM,WAAW,SAAS,GAAM;AAAA,MAC5C,eAAe,EAAE,MAAM,UAAU,SAAS,MAAM;AAAA,MAChD,SAAS,EAAE,MAAM,UAAU,SAAS,IAAI;AAAA,MACxC,SAAS,EAAE,MAAM,UAAU,SAAS,IAAI;AAAA,IAC1C;AAAA,EACF,CAAC,GAGK,aAAa,OAAO,SAAS,OAAO,SAAU,EAAE;AACtD,GAAI,OAAO,MAAM,UAAU,KAAK,aAAa,OAC3C,QAAQ,MAAM,+CAA+C,GAC7D,QAAQ,KAAK,CAAC;AAIhB,QAAM,aAAa,OAAO,SAAS,OAAO,SAAU,EAAE;AACtD,UAAI,OAAO,MAAM,UAAU,KAAK,aAAa,OAC3C,QAAQ,MAAM,2CAA2C,GACzD,QAAQ,KAAK,CAAC,IAGT;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,aAAa,OAAO,cAAc;AAAA,IAClC,UAAU,OAAO;AAAA,IACjB,YAAY,OAAO,aAAa;AAAA,IAChC,SAAS;AAAA,IACT,SAAS;AAAA,EACX;AACF;AAKO,SAAS,eAAe,SAAuC;AACpE,QAAM,OAAO;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,OAAO,QAAQ,OAAO;AAAA;AAAA,IAEtB;AAAA,EACF;AAEA,SAAI,QAAQ,YACV,KAAK,KAAK,YAAY,GAIpB,QAAQ,WAAW,QAAQ,UAAU,KACvC,KAAK,KAAK,aAAa,OAAO,QAAQ,OAAO,CAAC,GAGzC;AACT;AAGA,MAAM,mBAAmB,OAAU;AAMnC,eAAsB,qBAAoC;AACxD,UAAQ,KAAK,8BAA8B,GAK3C,MAJa,IAAI,MAAM,CAAC,OAAO,SAAS,iBAAiB,GAAG;AAAA,IAC1D,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC,EACU;AACb;AAOA,eAAsB,cAAc,SAA8C;AAGhF,QAAM,mBAAmB;AAEzB,QAAM,YAAY,eAAe,OAAO;AAExC,UAAQ,KAAK;AAAA,4BAA+B,GAC5C,QAAQ,KAAK,kCAAkC,iBAAiB,EAAE,GAClE,QAAQ,KAAK,gBAAgB,UAAU,KAAK,GAAG,CAAC,EAAE;AAGlD,QAAM,OAAO,IAAI,MAAM,CAAC,OAAO,GAAG,SAAS,GAAG;AAAA,IAC5C,KAAK,EAAE,GAAG,QAAQ,KAAK,mBAAmB,OAAO,iBAAiB,EAAE;AAAA,IACpE,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC,GAGK,iBAAiB,IAAI,QAAmB,CAAC,YAAY;AACzD,eAAW,MAAM,QAAQ,SAAS,GAAG,gBAAgB;AAAA,EACvD,CAAC,GAEK,SAAS,MAAM,QAAQ,KAAK,CAAC,KAAK,QAAQ,cAAc,CAAC;AAE/D,MAAI,WAAW;AACb,mBAAQ,KAAK;AAAA,oCAAuC,GACpD,KAAK,KAAK,SAAS,GACZ;AAGT,QAAM,WAAW;AAEjB,SACE,QAAQ,KADN,aAAa,IACF;AAAA,qBAEA;AAAA,+BAAkC,QAAQ,EAFrB,GAK7B;AACT;",
5
- "names": []
6
- }