@tamagui/native-ci 2.0.0-rc.3 → 2.0.0-rc.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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": ";AAUA,SAAS,qBAAqB,kCAAkC;AAChE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,iBAAiB,YAAY;AACvD;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB;AAC1B,SAAyB,qBAAqB;AAC9C,SAAS,iBAAiB,oBAAoB;AAC9C,SAAS,oBAAoB,2BAA2B;AAGxD,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsEb,SAAS,UAAU,MAA4B;AAC7C,QAAMA,QAAiB,CAAC,GAClBC,WAAU;AAAA,IACd,aAAa,QAAQ,IAAI;AAAA,IACzB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAEA,MAAI,IAAI;AACR,SAAO,IAAI,KAAK,UAAQ;AACtB,UAAM,MAAM,KAAK,CAAC;AAElB,QAAI,QAAQ,oBAAoB,KAAK,IAAI,CAAC;AACxC,MAAAA,SAAQ,cAAc,KAAK,EAAE,CAAC;AAAA,aACrB,QAAQ,cAAc,KAAK,IAAI,CAAC;AACzC,MAAAA,SAAQ,SAAS,KAAK,EAAE,CAAC;AAAA,aAChB,QAAQ,mBAAmB,KAAK,IAAI,CAAC;AAC9C,MAAAA,SAAQ,aAAa,KAAK,EAAE,CAAC;AAAA,aACpB,QAAQ,eAAe,KAAK,IAAI,CAAC,GAAG;AAC7C,YAAM,MAAM,OAAO,SAAS,KAAK,EAAE,CAAC,GAAG,EAAE;AACzC,MAAI,CAAC,OAAO,MAAM,GAAG,KAAK,OAAO,MAC/BA,SAAQ,UAAU;AAAA,IAEtB,MAAO,CAAI,QAAQ,cAAc,KAAK,IAAI,CAAC,IACzCA,SAAQ,SAAS,KAAK,EAAE,CAAC,IAChB,QAAQ,oBACjBA,SAAQ,eAAe,KACd,QAAQ,WACjBA,SAAQ,OAAO,KACN,QAAQ,YAAY,QAAQ,OACrCA,SAAQ,OAAO,KACL,IAAI,WAAW,GAAG,KAC5BD,MAAK,KAAK,GAAG;AAGf;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAASA,MAAK,CAAC,KAAK;AAAA,IACpB,YAAYA,MAAK,CAAC,KAAK;AAAA,IACvB,MAAMA,MAAK,MAAM,CAAC;AAAA,IAClB,SAAAC;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,OAAyB;AACjD,SAAI,UAAU,SAAS,UAAU,cAC/B,QAAQ,MAAM,4CAA4C,GAC1D,QAAQ,KAAK,CAAC,IAET;AACT;AAEA,SAAS,mBAAmD;AAC1D,QAAM,MAAM,QAAQ,IAAI,yBAClB,QAAQ,QAAQ,IAAI;AAE1B,UAAI,CAAC,OAAO,CAAC,WACX,QAAQ,MAAM,uEAAuE,GACrF,QAAQ,KAAK,CAAC,IAGT,EAAE,KAAK,MAAM;AACtB;AAGA,MAAM,EAAE,SAAS,YAAY,MAAM,QAAQ,IAAI,UAAU,QAAQ,KAAK,MAAM,CAAC,CAAC;AAAA,CAE1E,QAAQ,QAAQ,CAAC,aACnB,QAAQ,KAAK,IAAI,GACjB,QAAQ,KAAK,QAAQ,OAAO,IAAI,CAAC;AAGnC,IAAI;AACF,UAAQ,SAAS;AAAA;AAAA;AAAA;AAAA,IAIf,KAAK,QAAQ;AAEX,MAAI,KAAK,KAAK,CAAC,QAAQ,IAAI,wBACzB,QAAQ,KAAK,4DAA4D,GACzE,QAAQ,KAAK,wCAAwC,GACrD,QAAQ,KAAK,CAAC;AAGhB,YAAM,WAAW,cAAc;AAE/B,UAAI,aAAa,OAAO;AAEtB,cAAM,cAAc;AAEpB,cAAM,SAAS,QAAQ,UAAU;AACjC,gBAAQ,KAAK,+BAA+B,GAC5C,QAAQ,KAAK,WAAW,MAAM,EAAE,GAChC,QAAQ,KAAK,iBAAiB,QAAQ,WAAW,EAAE,GAEnD,QAAQ,MAAM,QAAQ,WAAW,GACjC,MAAM,gBAAgB,GACtB,MAAM,aAAa,MAAM;AAEzB,cAAM,WAAW,MAAM,UAAU,OAAO,YAC/B,cAAc;AAAA,UACnB;AAAA,UACA,aAAa,QAAQ;AAAA,UACrB,YAAY,QAAQ;AAAA,UACpB,SAAS,QAAQ;AAAA,QACnB,CAAC,CACF;AACD,gBAAQ,KAAK,QAAQ;AAAA,MACvB,WAAW,aAAa,WAAW;AAEjC,cAAM,kBAAkB;AAExB,cAAM,SAAS,QAAQ,UAAU;AACjC,gBAAQ,KAAK,mCAAmC,GAChD,QAAQ,KAAK,WAAW,MAAM,EAAE,GAChC,QAAQ,KAAK,iBAAiB,QAAQ,WAAW,EAAE,GACnD,QAAQ,KAAK,aAAa,QAAQ,QAAQ,EAAE,GAE5C,QAAQ,MAAM,QAAQ,WAAW,GACjC,MAAM,oBAAoB,GAG1B,MAAM,mBAAmB;AAEzB,cAAM,WAAW,MAAM,UAAU,WAAW,YACnC,cAAc;AAAA,UACnB;AAAA,UACA,aAAa,QAAQ;AAAA,UACrB,YAAY,QAAQ;AAAA,UACpB,SAAS,QAAQ;AAAA,UACjB,UAAU,QAAQ;AAAA,QACpB,CAAC,CACF;AACD,gBAAQ,KAAK,QAAQ;AAAA,MACvB,WAAW,aAAa,WAAW;AAEjC,cAAM,cAAc;AAEpB,cAAM,OAAO,KAAK,CAAC,KAAK;AACxB,gBAAQ,KAAK,6BAA6B,GAC1C,QAAQ,KAAK,SAAS,QAAQ,KAAK,EAAE,GACrC,QAAQ,KAAK,iBAAiB,QAAQ,WAAW,EAAE,GAEnD,QAAQ,MAAM,QAAQ,WAAW;AAGjC,cAAM,WAAW,MAAM,UAAU,OAAO,YAAY;AAClD,gBAAM,EAAE,EAAE,IAAI,MAAM,OAAO,KAAK,GAE1B,UAAU,OAAO,WAAW,IAAI,KAAK;AAG3C,kBADE,MAAM,iBAAiB,OAAO,iCAAiC,QAAQ,GAC3D;AAAA,QAChB,CAAC;AACD,gBAAQ,KAAK,QAAQ;AAAA,MACvB,WAAW,aAAa,OAAO;AAC7B,gBAAQ,KAAK;AAAA,CAAoC,GAGjD,MAAM,cAAc,GACpB,QAAQ,KAAK;AAAA;AAAA,CAAuB,GACpC,QAAQ,MAAM,QAAQ,WAAW,GACjC,MAAM,gBAAgB,GACtB,MAAM,aAAa,QAAQ,UAAU,eAAe;AAEpD,YAAI,UAAU;AACd,YAAI;AACF,oBAAU,MAAM,UAAU,OAAO,YACxB,cAAc;AAAA,YACnB,QAAQ,QAAQ,UAAU;AAAA,YAC1B,aAAa,QAAQ;AAAA,YACrB,YAAY,QAAQ;AAAA,YACpB,SAAS,QAAQ;AAAA,UACnB,CAAC,CACF;AAAA,QACH,SAAS,KAAK;AACZ,kBAAQ,MAAM,qBAAqB,GAAG,GACtC,UAAU;AAAA,QACZ;AAGA,cAAM,kBAAkB,GACxB,QAAQ,KAAK;AAAA;AAAA,CAA2B,GACxC,MAAM,oBAAoB,GAC1B,MAAM,mBAAmB;AAEzB,YAAI,cAAc;AAClB,YAAI;AACF,wBAAc,MAAM,UAAU,WAAW,YAChC,cAAc;AAAA,YACnB,QAAQ,QAAQ,UAAU;AAAA,YAC1B,aAAa,QAAQ;AAAA,YACrB,YAAY,QAAQ;AAAA,YACpB,SAAS,QAAQ;AAAA,YACjB,UAAU,QAAQ;AAAA,UACpB,CAAC,CACF;AAAA,QACH,SAAS,KAAK;AACZ,kBAAQ,MAAM,yBAAyB,GAAG,GAC1C,cAAc;AAAA,QAChB;AAEA,cAAM,UAAU,YAAY,KAAK,gBAAgB;AACjD,gBAAQ,KAAK;AAAA,qBAAwB,GACrC,QAAQ,KAAK,QAAQ,YAAY,IAAI,WAAW,QAAQ,EAAE,GAC1D,QAAQ,KAAK,YAAY,gBAAgB,IAAI,WAAW,QAAQ,EAAE,GAClE,QAAQ,KAAK,UAAU,IAAI,CAAC;AAAA,MAC9B;AACE,gBAAQ,MAAM,0BAA0B,QAAQ,EAAE,GAClD,QAAQ,KAAK,iDAAiD,GAC9D,QAAQ,KAAK,CAAC;AAEhB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,KAAK,QAAQ;AACX,MAAI,CAAC,cAAc,eAAe,WAChC,gBAAgB,IACP,eAAe,aACxB,QAAQ,KAAK;AAAA,CAAkC,GAC/C,MAAM,cAAc,GACpB,MAAM,cAAc,GACpB,QAAQ,KAAK;AAAA,4BAA+B,KACnC,eAAe,gBACxB,MAAM,cAAc,IACX,eAAe,oBACxB,MAAM,kBAAkB,IACf,eAAe,oBACxB,MAAM,cAAc,KAEpB,QAAQ,MAAM,4BAA4B,UAAU,EAAE,GACtD,QAAQ,KAAK,CAAC;AAEhB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,KAAK,eAAe;AAClB,YAAM,WAAW,iBAAiB,UAAU,GAEtC,SAAS,MAAM,oBAAoB;AAAA,QACvC;AAAA,QACA,aAAa,QAAQ;AAAA,MACvB,CAAC;AAED,OAAI,QAAQ,gBAAgB,gBAAgB,OAC1C,gBAAgB,eAAe,OAAO,IAAI,GAC1C;AAAA,QACE;AAAA,QACA,eAAe;AAAA,UACb;AAAA,UACA,aAAa,OAAO;AAAA,UACpB,QAAQ,QAAQ;AAAA,QAClB,CAAC;AAAA,MACH,IAGE,QAAQ,OACV,QAAQ,KAAK,KAAK,UAAU,QAAQ,MAAM,CAAC,CAAC,IAE5C,QAAQ,KAAK,OAAO,IAAI;AAE1B;AAAA,IACF;AAAA,IAEA,KAAK,oBAAoB;AACvB,YAAM,aAAa;AAEnB,cAAQ,KAAK;AAAA,CAA8B;AAE3C,YAAM,YAAY,MAAM,oBAAoB;AAAA,QAC1C,UAAU;AAAA,QACV,aAAa,QAAQ;AAAA,MACvB,CAAC,GACK,gBAAgB,MAAM,oBAAoB;AAAA,QAC9C,UAAU;AAAA,QACV,aAAa,QAAQ;AAAA,MACvB,CAAC,GAEK,iBAAiB,UAAU,MAC3B,qBAAqB,cAAc;AAEzC,cAAQ,KAAK,uBAAuB,GACpC,QAAQ,KAAK,cAAc,cAAc,EAAE,GAC3C,QAAQ,KAAK,cAAc,kBAAkB,EAAE,GAC/C,QAAQ,KAAK,EAAE;AAEf,YAAM,QAAQ,UAAU,UAAU;AAElC,UAAI,OAAO,OAAO,OAAO,SAAS;AAChC,gBAAQ,KAAK,qCAAqC,GAClD,QAAQ,KAAK,cAAc,MAAM,GAAG,EAAE,GACtC,QAAQ,KAAK,cAAc,MAAM,OAAO,EAAE,GAC1C,QAAQ,KAAK,EAAE;AAEf,cAAM,aAAa,MAAM,QAAQ,gBAC3B,iBAAiB,MAAM,YAAY;AAEzC,QAAI,cAAc,kBAChB,QAAQ,KAAK,uBAAuB,GAChC,cACF,QAAQ,KAAK,0DAA0D,GACrE,kBACF,QAAQ;AAAA,UACN;AAAA,QACF,KAEF,QAAQ,KAAK,wCAAwC;AAAA,MAEzD;AACE,gBAAQ,KAAK,kCAAkC;AAIjD,gBAAU,YAAY;AAAA,QACpB,KAAK;AAAA,QACL,SAAS;AAAA,QACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,CAAC,GACD,QAAQ,KAAK;AAAA,wBAA2B,UAAU,EAAE,GAEpD,QAAQ,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAOlB;AACK;AAAA,IACF;AAAA,IAEA,KAAK,YAAY;AACf,YAAM,QAAQ,CAAC,YAAY,GAAG,IAAI,EAAE,OAAO,OAAO;AAClD,MAAI,MAAM,WAAW,MACnB,QAAQ,MAAM,mCAAmC,GACjD,QAAQ,KAAK,CAAC;AAGhB,YAAM,OAAO,2BAA2B,OAAO,QAAQ,WAAW;AAElE,OAAI,QAAQ,gBAAgB,gBAAgB,MAC1C,gBAAgB,wBAAwB,IAAI,GAG1C,QAAQ,OACV,QAAQ,KAAK,KAAK,UAAU,EAAE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAErD,QAAQ,KAAK,IAAI;AAEnB;AAAA,IACF;AAAA,IAEA,KAAK,aAAa;AAChB,YAAM,WAAW,iBAAiB,UAAU,GACtC,cAAc,KAAK,CAAC;AAE1B,MAAK,gBACH,QAAQ,MAAM,gCAAgC,GAC9C,QAAQ,KAAK,CAAC;AAGhB,YAAM,WAAW,eAAe;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,QAAQ,QAAQ;AAAA,MAClB,CAAC;AAED,OAAI,QAAQ,gBAAgB,gBAAgB,MAC1C,gBAAgB,aAAa,QAAQ,GAGvC,QAAQ,KAAK,QAAQ;AACrB;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,KAAK,UAAU;AACb,YAAM,MAAM;AACZ,MAAK,QACH,QAAQ,MAAM,wBAAwB,GACtC,QAAQ,KAAK,CAAC;AAGhB,YAAM,KAAK,iBAAiB,GACtB,QAAQ,MAAM,qBAAqB,IAAI,GAAG;AAEhD,OAAI,QAAQ,gBAAgB,gBAAgB,OAC1C,gBAAgB,SAAS,SAAS,EAAE,GACpC,gBAAgB,SAAS,QAAQ,SAAS,OAAO,IAG/C,QACF,QAAQ,KAAK,KAAK,IAElB,QAAQ,KAAK,CAAC;AAEhB;AAAA,IACF;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,MAAM,YACN,QAAQ,KAAK,CAAC;AAEpB,OAAI,CAAC,OAAO,CAAC,WACX,QAAQ,MAAM,mCAAmC,GACjD,QAAQ,KAAK,CAAC;AAGhB,YAAM,KAAK,iBAAiB;AAC5B,YAAM,oBAAoB,IAAI,KAAK,KAAK,GACxC,QAAQ,KAAK,IAAI;AACjB;AAAA,IACF;AAAA,IAEA;AACE,cAAQ,MAAM,oBAAoB,OAAO,EAAE,GAC3C,QAAQ,KAAK,IAAI,GACjB,QAAQ,KAAK,CAAC;AAAA,EAClB;AACF,SAAS,OAAO;AACd,UAAQ,MAAM,UAAW,MAAgB,OAAO,GAChD,QAAQ,KAAK,CAAC;AAChB;",
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
- }
@@ -1,43 +0,0 @@
1
- import { execSync } from "node:child_process";
2
- import { createHash } from "node:crypto";
3
- import { existsSync, readFileSync } from "node:fs";
4
- import { join } from "node:path";
5
- async function generateFingerprint(options) {
6
- const { platform, projectRoot = process.cwd(), debug = !1 } = options, appJsonPath = join(projectRoot, "app.json");
7
- if (!existsSync(appJsonPath))
8
- throw new Error(`No app.json found at ${projectRoot}. Is this an Expo project?`);
9
- const execOptions = {
10
- cwd: projectRoot,
11
- encoding: "utf-8",
12
- stdio: debug ? "inherit" : ["pipe", "pipe", "pipe"]
13
- };
14
- try {
15
- const result = execSync(
16
- `npx @expo/fingerprint fingerprint:generate --platform ${platform}`,
17
- execOptions
18
- ), parsed = JSON.parse(result);
19
- return {
20
- hash: parsed.hash,
21
- sources: parsed.sources || []
22
- };
23
- } catch (error) {
24
- const err = error;
25
- throw new Error(
26
- `Failed to generate ${platform} fingerprint: ${err.message}${err.stderr ? `
27
- ${err.stderr}` : ""}`
28
- );
29
- }
30
- }
31
- function generatePreFingerprintHash(files, projectRoot = process.cwd()) {
32
- const hash = createHash("sha256");
33
- for (const file of files) {
34
- const filePath = join(projectRoot, file);
35
- existsSync(filePath) && hash.update(readFileSync(filePath));
36
- }
37
- return hash.digest("hex").slice(0, 16);
38
- }
39
- export {
40
- generateFingerprint,
41
- generatePreFingerprintHash
42
- };
43
- //# sourceMappingURL=fingerprint.js.map
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/fingerprint.ts"],
4
- "mappings": "AAAA,SAAS,gBAAsC;AAC/C,SAAS,kBAAkB;AAC3B,SAAS,YAAY,oBAAoB;AACzC,SAAS,YAAY;AAkBrB,eAAsB,oBACpB,SAC4B;AAC5B,QAAM,EAAE,UAAU,cAAc,QAAQ,IAAI,GAAG,QAAQ,GAAM,IAAI,SAG3D,cAAc,KAAK,aAAa,UAAU;AAChD,MAAI,CAAC,WAAW,WAAW;AACzB,UAAM,IAAI,MAAM,wBAAwB,WAAW,4BAA4B;AAGjF,QAAM,cAA+B;AAAA,IACnC,KAAK;AAAA,IACL,UAAU;AAAA,IACV,OAAO,QAAQ,YAAY,CAAC,QAAQ,QAAQ,MAAM;AAAA,EACpD;AAEA,MAAI;AACF,UAAM,SAAS;AAAA,MACb,yDAAyD,QAAQ;AAAA,MACjE;AAAA,IACF,GAEM,SAAS,KAAK,MAAM,MAAM;AAEhC,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,SAAS,OAAO,WAAW,CAAC;AAAA,IAC9B;AAAA,EACF,SAAS,OAAO;AACd,UAAM,MAAM;AACZ,UAAM,IAAI;AAAA,MACR,sBAAsB,QAAQ,iBAAiB,IAAI,OAAO,GAAG,IAAI,SAAS;AAAA,EAAK,IAAI,MAAM,KAAK,EAAE;AAAA,IAClG;AAAA,EACF;AACF;AAMO,SAAS,2BACd,OACA,cAAsB,QAAQ,IAAI,GAC1B;AACR,QAAM,OAAO,WAAW,QAAQ;AAEhC,aAAW,QAAQ,OAAO;AACxB,UAAM,WAAW,KAAK,aAAa,IAAI;AACvC,IAAI,WAAW,QAAQ,KACrB,KAAK,OAAO,aAAa,QAAQ,CAAC;AAAA,EAEtC;AAEA,SAAO,KAAK,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AACvC;",
5
- "names": []
6
- }
package/dist/metro.js DELETED
@@ -1,102 +0,0 @@
1
- import {
2
- METRO_URL,
3
- DEFAULT_METRO_WAIT_ATTEMPTS,
4
- DEFAULT_METRO_WAIT_INTERVAL_MS
5
- } from "./constants";
6
- async function waitForMetro(options) {
7
- const {
8
- platform,
9
- maxAttempts = DEFAULT_METRO_WAIT_ATTEMPTS,
10
- intervalMs = DEFAULT_METRO_WAIT_INTERVAL_MS
11
- } = options;
12
- console.info("Waiting for Metro to start...");
13
- for (let i = 1; i <= maxAttempts; i++) {
14
- try {
15
- if ((await fetch(`${METRO_URL}/`, {
16
- headers: { "Expo-Platform": platform }
17
- })).ok)
18
- return console.info("Metro is responding!"), !0;
19
- } catch {
20
- }
21
- console.info(`Waiting for Metro... (${i}/${maxAttempts})`), await Bun.sleep(intervalMs);
22
- }
23
- return !1;
24
- }
25
- async function prewarmBundle(platform) {
26
- console.info("Pre-warming bundle...");
27
- try {
28
- const response = await fetch(`${METRO_URL}/`, {
29
- headers: { "Expo-Platform": platform }
30
- });
31
- if (response.ok) {
32
- const bundleUrl = (await response.json())?.launchAsset?.url;
33
- bundleUrl ? (console.info(`Fetching bundle from: ${bundleUrl}`), await fetch(bundleUrl), console.info("Bundle pre-warmed!")) : console.info("No bundle URL found in manifest, skipping pre-warm");
34
- }
35
- } catch {
36
- console.info("Bundle pre-warm completed (with error, continuing)");
37
- }
38
- }
39
- function startMetro() {
40
- console.info(`
41
- --- Starting Metro bundler ---`);
42
- const isCI = !!process.env.CI, args = ["bun", "expo", "start", "--dev-client", "--offline"];
43
- isCI && (args.push("--clear"), console.info("CI detected: clearing Metro cache"));
44
- const proc = Bun.spawn(args, {
45
- env: { ...process.env, EXPO_NO_TELEMETRY: "true" },
46
- stdout: "inherit",
47
- stderr: "inherit"
48
- });
49
- return {
50
- proc,
51
- kill: async () => {
52
- const pid = proc.pid;
53
- if (pid)
54
- try {
55
- await Bun.spawn(["pkill", "-P", String(pid)], {
56
- stdout: "ignore",
57
- stderr: "ignore"
58
- }).exited;
59
- } catch {
60
- }
61
- proc.kill("SIGKILL"), console.info("Metro stopped");
62
- }
63
- };
64
- }
65
- function setupSignalHandlers(metro) {
66
- const cleanup = async (signal) => {
67
- console.info(`
68
- Received ${signal}, cleaning up...`), await metro.kill(), process.exit(signal === "SIGINT" ? 130 : 143);
69
- };
70
- process.on("SIGINT", () => cleanup("SIGINT")), process.on("SIGTERM", () => cleanup("SIGTERM"));
71
- }
72
- async function isMetroRunning(platform) {
73
- try {
74
- return (await fetch(`${METRO_URL}/`, {
75
- headers: { "Expo-Platform": platform }
76
- })).ok;
77
- } catch {
78
- return !1;
79
- }
80
- }
81
- async function withMetro(platform, fn) {
82
- if (await isMetroRunning(platform))
83
- return console.info(`
84
- --- Metro already running, reusing existing instance ---`), await prewarmBundle(platform), await fn();
85
- const metro = startMetro();
86
- setupSignalHandlers(metro);
87
- try {
88
- if (!await waitForMetro({ platform }))
89
- throw new Error("Metro failed to start within timeout");
90
- return await prewarmBundle(platform), await fn();
91
- } finally {
92
- await metro.kill();
93
- }
94
- }
95
- export {
96
- prewarmBundle,
97
- setupSignalHandlers,
98
- startMetro,
99
- waitForMetro,
100
- withMetro
101
- };
102
- //# sourceMappingURL=metro.js.map
package/dist/metro.js.map DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/metro.ts"],
4
- "mappings": "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",
5
- "names": []
6
- }