local-expo-build 0.2.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 (58) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/LICENSE +21 -0
  3. package/README.md +372 -0
  4. package/bin/local-expo-build.js +2 -0
  5. package/dist/cli.js +33 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/build.js +121 -0
  8. package/dist/commands/build.js.map +1 -0
  9. package/dist/commands/doctor.js +606 -0
  10. package/dist/commands/doctor.js.map +1 -0
  11. package/dist/commands/init.js +125 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/keystore.js +47 -0
  14. package/dist/commands/keystore.js.map +1 -0
  15. package/dist/core/bumpVersion.js +70 -0
  16. package/dist/core/bumpVersion.js.map +1 -0
  17. package/dist/core/easLink.js +64 -0
  18. package/dist/core/easLink.js.map +1 -0
  19. package/dist/core/expoConfig.js +71 -0
  20. package/dist/core/expoConfig.js.map +1 -0
  21. package/dist/core/gradleRun.js +31 -0
  22. package/dist/core/gradleRun.js.map +1 -0
  23. package/dist/core/keystore/easFetch.js +109 -0
  24. package/dist/core/keystore/easFetch.js.map +1 -0
  25. package/dist/core/keystore/existing.js +135 -0
  26. package/dist/core/keystore/existing.js.map +1 -0
  27. package/dist/core/keystore/generate.js +72 -0
  28. package/dist/core/keystore/generate.js.map +1 -0
  29. package/dist/core/keystore/index.js +62 -0
  30. package/dist/core/keystore/index.js.map +1 -0
  31. package/dist/core/keystore/rehydrate.js +88 -0
  32. package/dist/core/keystore/rehydrate.js.map +1 -0
  33. package/dist/core/pinGradle.js +50 -0
  34. package/dist/core/pinGradle.js.map +1 -0
  35. package/dist/core/prebuild.js +16 -0
  36. package/dist/core/prebuild.js.map +1 -0
  37. package/dist/core/sdkDetect.js +26 -0
  38. package/dist/core/sdkDetect.js.map +1 -0
  39. package/dist/core/setupSigning.js +168 -0
  40. package/dist/core/setupSigning.js.map +1 -0
  41. package/dist/core/syncEasVersion.js +97 -0
  42. package/dist/core/syncEasVersion.js.map +1 -0
  43. package/dist/core/writeCredentialsJson.js +51 -0
  44. package/dist/core/writeCredentialsJson.js.map +1 -0
  45. package/dist/util/ctx.js +17 -0
  46. package/dist/util/ctx.js.map +1 -0
  47. package/dist/util/gitignore.js +23 -0
  48. package/dist/util/gitignore.js.map +1 -0
  49. package/dist/util/log.js +16 -0
  50. package/dist/util/log.js.map +1 -0
  51. package/package.json +64 -0
  52. package/templates/keystore.properties.example +4 -0
  53. package/templates/scripts/build.js +79 -0
  54. package/templates/scripts/bump-version.js +65 -0
  55. package/templates/scripts/pin-gradle.js +45 -0
  56. package/templates/scripts/print-artifact.js +36 -0
  57. package/templates/scripts/setup-signing.js +137 -0
  58. package/templates/scripts/sync-eas-version.js +59 -0
@@ -0,0 +1,606 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runDoctor = runDoctor;
7
+ exports.registerDoctorCommand = registerDoctorCommand;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const execa_1 = require("execa");
11
+ const kleur_1 = __importDefault(require("kleur"));
12
+ const prompts_1 = require("@inquirer/prompts");
13
+ const ctx_1 = require("../util/ctx");
14
+ const log_1 = require("../util/log");
15
+ const sdkDetect_1 = require("../core/sdkDetect");
16
+ const pinGradle_1 = require("../core/pinGradle");
17
+ const easLink_1 = require("../core/easLink");
18
+ const setupSigning_1 = require("../core/setupSigning");
19
+ const keystore_1 = require("../core/keystore");
20
+ const rehydrate_1 = require("../core/keystore/rehydrate");
21
+ const expoConfig_1 = require("../core/expoConfig");
22
+ function replaceResultByName(results, name, newRow) {
23
+ const i = results.findIndex((r) => r.name === name);
24
+ if (i !== -1)
25
+ results[i] = newRow;
26
+ else
27
+ results.push(newRow);
28
+ }
29
+ async function which(cmd, args = ['-version']) {
30
+ try {
31
+ const { stdout, stderr } = await (0, execa_1.execa)(cmd, args, { reject: false, timeout: 10_000 });
32
+ return (stdout || stderr || '').split('\n')[0]?.trim() || cmd;
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ function easLinkCheck(easLink) {
39
+ switch (easLink.kind) {
40
+ case 'linked':
41
+ return easLink.hasEasJson
42
+ ? { name: 'EAS project linked', ok: true, detail: easLink.projectId }
43
+ : {
44
+ name: 'EAS project linked',
45
+ ok: true,
46
+ warn: true,
47
+ detail: `${easLink.projectId} — but eas.json missing; run \`eas build:configure -p android\``,
48
+ };
49
+ case 'not-linked':
50
+ return {
51
+ name: 'EAS project linked',
52
+ ok: true,
53
+ warn: true,
54
+ detail: easLink.hasAppJson
55
+ ? 'no expo.extra.eas.projectId — run `eas init` for managed JKS'
56
+ : 'no app.json — run `eas init` to link this project',
57
+ };
58
+ case 'dynamic-unreadable':
59
+ return {
60
+ name: 'EAS project linked',
61
+ ok: true,
62
+ warn: true,
63
+ detail: easLink.hasEasJson
64
+ ? "app.config.* couldn't be resolved — run `npm install` in this project"
65
+ : "app.config.* couldn't be resolved + no eas.json — run `npm install` then re-run doctor",
66
+ };
67
+ case 'no-expo-config':
68
+ return {
69
+ name: 'EAS project linked',
70
+ ok: true,
71
+ warn: true,
72
+ detail: 'skipped (no app.json or app.config.*)',
73
+ };
74
+ }
75
+ }
76
+ // Loose Android applicationId validator: lower-case Java package style.
77
+ // Real Android rules: each segment starts with a letter, only letters/digits/underscore,
78
+ // at least two segments. Gradle is the authoritative checker — we just flag obvious typos.
79
+ const ANDROID_PKG_RE = /^[a-zA-Z][a-zA-Z0-9_]*(\.[a-zA-Z][a-zA-Z0-9_]*)+$/;
80
+ function androidPackageCheck(cwd) {
81
+ const resolved = (0, expoConfig_1.readExpoConfig)(cwd);
82
+ const hasDynamicConfig = fs_1.default.existsSync(path_1.default.join(cwd, 'app.config.js')) ||
83
+ fs_1.default.existsSync(path_1.default.join(cwd, 'app.config.ts')) ||
84
+ fs_1.default.existsSync(path_1.default.join(cwd, 'app.config.cjs')) ||
85
+ fs_1.default.existsSync(path_1.default.join(cwd, 'app.config.mjs'));
86
+ if (resolved) {
87
+ const pkg = resolved.config?.android?.package;
88
+ const rowName = resolved.source === 'app.json' ? 'Android package (app.json)' : 'Android package (app.config.*)';
89
+ const source = resolved.source === 'app.json' ? 'app.json' : 'dynamic';
90
+ if (!pkg) {
91
+ return {
92
+ result: {
93
+ name: rowName,
94
+ ok: false,
95
+ detail: 'missing expo.android.package — Gradle and EAS sync will fail',
96
+ },
97
+ pkg: null,
98
+ source,
99
+ };
100
+ }
101
+ if (!ANDROID_PKG_RE.test(pkg)) {
102
+ return {
103
+ result: {
104
+ name: rowName,
105
+ ok: false,
106
+ detail: `"${pkg}" is not a valid Android applicationId (need at least two dot-separated segments)`,
107
+ },
108
+ pkg,
109
+ source,
110
+ };
111
+ }
112
+ return {
113
+ result: { name: rowName, ok: true, detail: pkg },
114
+ pkg,
115
+ source,
116
+ };
117
+ }
118
+ if (hasDynamicConfig) {
119
+ return {
120
+ result: {
121
+ name: 'Android package (app.config.*)',
122
+ ok: true,
123
+ warn: true,
124
+ detail: "app.config.* couldn't be resolved — run `npm install` in this project",
125
+ },
126
+ pkg: null,
127
+ source: 'dynamic-unreadable',
128
+ };
129
+ }
130
+ return {
131
+ result: {
132
+ name: 'Android package (app.json)',
133
+ ok: false,
134
+ detail: 'no app.json or app.config.* — is this an Expo project?',
135
+ },
136
+ pkg: null,
137
+ source: 'none',
138
+ };
139
+ }
140
+ function keystorePropsCheck(cwd) {
141
+ const propsPath = path_1.default.join(cwd, 'keystore.properties');
142
+ const fileExists = fs_1.default.existsSync(propsPath);
143
+ if (!fileExists) {
144
+ return {
145
+ result: {
146
+ name: 'keystore.properties',
147
+ ok: true,
148
+ warn: true,
149
+ detail: 'not present — run `keystore setup` to create',
150
+ },
151
+ props: null,
152
+ fileExists,
153
+ };
154
+ }
155
+ const props = (0, setupSigning_1.readKeystoreProps)(cwd);
156
+ if (!props) {
157
+ return {
158
+ result: {
159
+ name: 'keystore.properties',
160
+ ok: true,
161
+ warn: true,
162
+ detail: 'present but incomplete (FILL_IN or missing fields)',
163
+ },
164
+ props: null,
165
+ fileExists,
166
+ };
167
+ }
168
+ return {
169
+ result: {
170
+ name: 'keystore.properties',
171
+ ok: true,
172
+ detail: `storeFile=${props.storeFile}, alias=${props.keyAlias}`,
173
+ },
174
+ props,
175
+ fileExists,
176
+ };
177
+ }
178
+ function jksCheck(cwd, props) {
179
+ if (!props) {
180
+ // No keystore.properties — but if credentials.json + a real .jks exist,
181
+ // that's a recoverable state via `keystore rehydrate`.
182
+ const cand = (0, rehydrate_1.findRehydrateCandidate)(cwd);
183
+ if (cand) {
184
+ const rel = path_1.default.relative(cwd, cand.jksSourceAbs).replace(/\\/g, '/');
185
+ return {
186
+ name: 'Signing keystore (.jks)',
187
+ ok: true,
188
+ warn: true,
189
+ detail: `found ${rel} via credentials.json — run \`keystore rehydrate\` to bind it`,
190
+ };
191
+ }
192
+ return {
193
+ name: 'Signing keystore (.jks)',
194
+ ok: true,
195
+ warn: true,
196
+ detail: 'skipped (no valid keystore.properties)',
197
+ };
198
+ }
199
+ const jksPath = path_1.default.join(cwd, 'android', 'app', props.storeFile);
200
+ const rel = path_1.default.relative(cwd, jksPath).replace(/\\/g, '/');
201
+ if (!fs_1.default.existsSync(jksPath)) {
202
+ return {
203
+ name: 'Signing keystore (.jks)',
204
+ ok: true,
205
+ warn: true,
206
+ detail: `not found at ${rel} — run \`keystore create|import|fetch|rehydrate\``,
207
+ };
208
+ }
209
+ const stat = fs_1.default.statSync(jksPath);
210
+ if (stat.size === 0) {
211
+ return { name: 'Signing keystore (.jks)', ok: true, warn: true, detail: `${rel} is empty` };
212
+ }
213
+ return { name: 'Signing keystore (.jks)', ok: true, detail: `${rel} (${(stat.size / 1024).toFixed(1)} KB)` };
214
+ }
215
+ function credentialsJsonCheck(cwd, props, easLink) {
216
+ const credPath = path_1.default.join(cwd, 'credentials.json');
217
+ const exists = fs_1.default.existsSync(credPath);
218
+ const easRelevant = easLink.kind === 'linked';
219
+ if (!exists) {
220
+ return {
221
+ result: {
222
+ name: 'credentials.json (EAS)',
223
+ ok: true,
224
+ warn: easRelevant,
225
+ detail: easRelevant
226
+ ? 'not present — needed if EAS submit/cloud should use the local JKS'
227
+ : 'not present (skipped; project not linked to EAS)',
228
+ },
229
+ exists,
230
+ valid: false,
231
+ };
232
+ }
233
+ let cred;
234
+ try {
235
+ cred = JSON.parse(fs_1.default.readFileSync(credPath, 'utf8'));
236
+ }
237
+ catch (err) {
238
+ return {
239
+ result: {
240
+ name: 'credentials.json (EAS)',
241
+ ok: false,
242
+ detail: `invalid JSON: ${err?.message || err}`,
243
+ },
244
+ exists,
245
+ valid: false,
246
+ };
247
+ }
248
+ const ksPath = cred?.android?.keystore?.keystorePath;
249
+ if (!ksPath) {
250
+ return {
251
+ result: {
252
+ name: 'credentials.json (EAS)',
253
+ ok: true,
254
+ warn: true,
255
+ detail: 'missing android.keystore.keystorePath',
256
+ },
257
+ exists,
258
+ valid: false,
259
+ };
260
+ }
261
+ const absKs = path_1.default.resolve(cwd, ksPath);
262
+ if (!fs_1.default.existsSync(absKs)) {
263
+ return {
264
+ result: {
265
+ name: 'credentials.json (EAS)',
266
+ ok: true,
267
+ warn: true,
268
+ detail: `keystorePath "${ksPath}" not found on disk`,
269
+ },
270
+ exists,
271
+ valid: false,
272
+ };
273
+ }
274
+ if (props) {
275
+ const propsAbs = path_1.default.resolve(cwd, 'android', 'app', props.storeFile);
276
+ if (path_1.default.resolve(absKs) !== propsAbs) {
277
+ return {
278
+ result: {
279
+ name: 'credentials.json (EAS)',
280
+ ok: true,
281
+ warn: true,
282
+ detail: `points to ${ksPath} but keystore.properties uses ${props.storeFile}`,
283
+ },
284
+ exists,
285
+ valid: false,
286
+ };
287
+ }
288
+ }
289
+ return {
290
+ result: { name: 'credentials.json (EAS)', ok: true, detail: ksPath },
291
+ exists,
292
+ valid: true,
293
+ };
294
+ }
295
+ function suggestPackageName(appJson) {
296
+ const ios = appJson?.expo?.ios?.bundleIdentifier;
297
+ if (typeof ios === 'string' && ANDROID_PKG_RE.test(ios))
298
+ return ios;
299
+ const seed = appJson?.expo?.slug || appJson?.expo?.name || 'myapp';
300
+ const cleaned = String(seed).toLowerCase().replace(/[^a-z0-9]/g, '');
301
+ const safe = cleaned && /^[a-z]/.test(cleaned) ? cleaned : `app${cleaned || 'name'}`;
302
+ return `com.example.${safe}`;
303
+ }
304
+ async function offerAndroidPackageFix(cwd, androidPkg, results, dryRun) {
305
+ // Only offer when we can safely write app.json and the field is genuinely missing.
306
+ // Skip malformed values (don't overwrite intentional input) and dynamic configs.
307
+ if (!process.stdin.isTTY || dryRun)
308
+ return false;
309
+ if (androidPkg.source !== 'app.json')
310
+ return false;
311
+ if (androidPkg.pkg !== null)
312
+ return false;
313
+ const appJsonPath = path_1.default.join(cwd, 'app.json');
314
+ let appJson;
315
+ try {
316
+ appJson = JSON.parse(fs_1.default.readFileSync(appJsonPath, 'utf8'));
317
+ }
318
+ catch {
319
+ return false; // malformed JSON — caller already showed an error row
320
+ }
321
+ log_1.log.warn('expo.android.package is missing in app.json. Gradle and EAS sync will both fail without it.');
322
+ const yes = await (0, prompts_1.confirm)({
323
+ message: 'Add `expo.android.package` to app.json now?',
324
+ default: true,
325
+ });
326
+ if (!yes) {
327
+ log_1.log.dim('Skipped. Add expo.android.package to app.json manually before building.');
328
+ return false;
329
+ }
330
+ const suggested = suggestPackageName(appJson);
331
+ const pkg = (await (0, prompts_1.input)({
332
+ message: 'Android applicationId (e.g. com.yourcompany.yourapp):',
333
+ default: suggested,
334
+ validate: (v) => ANDROID_PKG_RE.test(v.trim()) ||
335
+ 'Need at least two dot-separated segments, each starting with a letter (e.g. com.yourcompany.yourapp)',
336
+ })).trim();
337
+ appJson.expo = appJson.expo || {};
338
+ appJson.expo.android = appJson.expo.android || {};
339
+ appJson.expo.android.package = pkg;
340
+ fs_1.default.writeFileSync(appJsonPath, JSON.stringify(appJson, null, 2) + '\n', 'utf8');
341
+ (0, expoConfig_1.invalidateExpoConfigCache)(cwd);
342
+ log_1.log.ok(`Wrote expo.android.package = "${pkg}" to app.json`);
343
+ const idx = results.indexOf(androidPkg.result);
344
+ if (idx !== -1) {
345
+ results[idx] = { name: 'Android package (app.json)', ok: true, detail: pkg };
346
+ }
347
+ return true;
348
+ }
349
+ function buildSuggestions({ androidPkg, easLink, ks, jks, cred }) {
350
+ const out = [];
351
+ if (!androidPkg.result.ok && androidPkg.source === 'app.json') {
352
+ out.push('Set the Android applicationId in app.json:\n' +
353
+ ' { "expo": { "android": { "package": "com.yourcompany.yourapp" } } }');
354
+ }
355
+ else if (!androidPkg.result.ok && androidPkg.source === 'none') {
356
+ out.push('Run inside an Expo project root (no app.json or app.config.* detected).');
357
+ }
358
+ if (easLink.kind === 'not-linked') {
359
+ out.push('Link this project to EAS: eas init');
360
+ }
361
+ if (easLink.kind === 'linked' && !easLink.hasEasJson) {
362
+ out.push('Create eas.json: eas build:configure --platform android');
363
+ }
364
+ if (!ks.fileExists) {
365
+ // Prefer rehydrate when credentials.json + .jks are already on disk —
366
+ // it's one prompt and no password re-entry.
367
+ if (jks.warn && /keystore rehydrate/.test(jks.detail || '')) {
368
+ out.push('Rehydrate from credentials.json: npx local-expo-build keystore rehydrate');
369
+ }
370
+ else {
371
+ out.push('Set up the signing keystore: npx local-expo-build keystore setup');
372
+ }
373
+ }
374
+ else if (!ks.props) {
375
+ out.push('Finish keystore.properties: fill in storePassword / keyPassword (no FILL_IN)');
376
+ }
377
+ else if (jks.warn) {
378
+ out.push('Add the .jks file: npx local-expo-build keystore create | import | fetch | rehydrate');
379
+ }
380
+ if (cred.result.warn && !cred.exists) {
381
+ out.push('(Optional) Create credentials.json so EAS submit/cloud reuses your local JKS — see\n' +
382
+ ' https://docs.expo.dev/app-signing/local-credentials/');
383
+ }
384
+ else if (cred.result.warn && cred.exists) {
385
+ out.push('Fix credentials.json: align keystorePath with keystore.properties');
386
+ }
387
+ return out;
388
+ }
389
+ /**
390
+ * Runs the full doctor flow: checks the environment, prints results, offers
391
+ * interactive auto-fixes, and returns a summary. Callers (e.g. `init`) decide
392
+ * whether to exit on failure — this function never calls process.exit.
393
+ */
394
+ async function runDoctor({ cwd, dryRun, title }) {
395
+ log_1.log.step(title || 'local-expo-build doctor');
396
+ const results = [];
397
+ const nodeMajor = parseInt(process.versions.node.split('.')[0], 10);
398
+ results.push({
399
+ name: 'Node >= 18',
400
+ ok: nodeMajor >= 18,
401
+ detail: `v${process.versions.node}`,
402
+ });
403
+ const java = await which('java', ['-version']);
404
+ results.push({ name: 'JDK (java)', ok: !!java, detail: java || 'not found' });
405
+ const keytool = await which('keytool', ['-help']);
406
+ results.push({ name: 'keytool', ok: !!keytool, detail: keytool ? 'present' : 'not found' });
407
+ const androidHome = process.env.ANDROID_HOME || process.env.ANDROID_SDK_ROOT;
408
+ results.push({
409
+ name: 'ANDROID_HOME / ANDROID_SDK_ROOT',
410
+ ok: !!androidHome,
411
+ detail: androidHome || 'not set',
412
+ });
413
+ if (androidHome) {
414
+ const sdkmanager = path_1.default.join(androidHome, 'cmdline-tools', 'latest', 'bin', process.platform === 'win32' ? 'sdkmanager.bat' : 'sdkmanager');
415
+ results.push({
416
+ name: 'sdkmanager',
417
+ ok: fs_1.default.existsSync(sdkmanager),
418
+ detail: sdkmanager,
419
+ warn: !fs_1.default.existsSync(sdkmanager),
420
+ });
421
+ }
422
+ const eas = await which('eas', ['--version']);
423
+ results.push({
424
+ name: 'eas-cli',
425
+ ok: !!eas,
426
+ detail: eas || 'not found (optional; needed for EAS sync)',
427
+ warn: !eas,
428
+ });
429
+ const expoBin = await which('npx', ['--no-install', 'expo', '--version']);
430
+ results.push({
431
+ name: 'expo CLI (in project)',
432
+ ok: !!expoBin,
433
+ detail: expoBin || 'not found — run `npm install` in your project',
434
+ });
435
+ try {
436
+ const sdk = (0, sdkDetect_1.detectExpoSdk)(cwd);
437
+ const supported = sdk.major in pinGradle_1.GRADLE_PIN;
438
+ results.push({
439
+ name: `Expo SDK detected`,
440
+ ok: true,
441
+ detail: `${sdk.major} (${sdk.raw})${supported ? '' : ' — not in GRADLE_PIN table'}`,
442
+ warn: !supported,
443
+ });
444
+ }
445
+ catch (err) {
446
+ results.push({ name: 'Expo SDK detected', ok: false, detail: err?.message || String(err) });
447
+ }
448
+ const androidPkg = androidPackageCheck(cwd);
449
+ results.push(androidPkg.result);
450
+ const easLink = (0, easLink_1.detectEasLink)(cwd);
451
+ results.push(easLinkCheck(easLink));
452
+ const ksProps = keystorePropsCheck(cwd);
453
+ results.push(ksProps.result);
454
+ const jksResult = jksCheck(cwd, ksProps.props);
455
+ results.push(jksResult);
456
+ const credResult = credentialsJsonCheck(cwd, ksProps.props, easLink);
457
+ results.push(credResult.result);
458
+ console.log('');
459
+ for (const r of results) {
460
+ const icon = r.ok ? (r.warn ? kleur_1.default.yellow('!') : kleur_1.default.green('✓')) : kleur_1.default.red('✗');
461
+ console.log(` ${icon} ${r.name.padEnd(35)} ${kleur_1.default.gray(r.detail || '')}`);
462
+ }
463
+ console.log('');
464
+ const suggestions = buildSuggestions({
465
+ androidPkg,
466
+ easLink,
467
+ ks: ksProps,
468
+ jks: jksResult,
469
+ cred: credResult,
470
+ });
471
+ if (suggestions.length) {
472
+ console.log(kleur_1.default.bold('Suggested next steps to complete setup:'));
473
+ suggestions.forEach((s, i) => console.log(` ${kleur_1.default.cyan(`${i + 1}.`)} ${s}`));
474
+ console.log('');
475
+ }
476
+ await offerAndroidPackageFix(cwd, androidPkg, results, dryRun);
477
+ const interactive = process.stdin.isTTY && !dryRun;
478
+ let currentEasLink = easLink;
479
+ // Step 1 — Link EAS project (`eas init`)
480
+ if (interactive &&
481
+ !!eas &&
482
+ currentEasLink.kind !== 'linked' &&
483
+ currentEasLink.kind !== 'no-expo-config') {
484
+ log_1.log.warn('This project is not linked to EAS. Linking enables managed keystore storage, ' +
485
+ 'remote credentials, and `local-expo-build keystore fetch`.');
486
+ const yes = await (0, prompts_1.confirm)({
487
+ message: 'Run `eas init` now to link this project?',
488
+ default: true,
489
+ });
490
+ if (yes) {
491
+ try {
492
+ await (0, execa_1.execa)('eas', ['init'], { cwd, stdio: 'inherit' });
493
+ log_1.log.ok('EAS link complete.');
494
+ currentEasLink = (0, easLink_1.detectEasLink)(cwd);
495
+ replaceResultByName(results, 'EAS project linked', easLinkCheck(currentEasLink));
496
+ }
497
+ catch (err) {
498
+ log_1.log.error(`eas init failed: ${err?.shortMessage || err?.message || err}`);
499
+ }
500
+ }
501
+ else {
502
+ log_1.log.dim('Skipped. You can link later with `eas init`.');
503
+ }
504
+ console.log('');
505
+ }
506
+ else if (!eas && currentEasLink.kind !== 'linked' && currentEasLink.kind !== 'no-expo-config') {
507
+ log_1.log.dim('Install eas-cli (npm i -g eas-cli) to link this project for managed keystores.');
508
+ console.log('');
509
+ }
510
+ // Step 2 — Create eas.json (`eas build:configure`)
511
+ if (interactive &&
512
+ !!eas &&
513
+ currentEasLink.kind === 'linked' &&
514
+ !currentEasLink.hasEasJson) {
515
+ log_1.log.warn('eas.json is missing — required by `eas credentials` and EAS submit/cloud builds.');
516
+ const yes = await (0, prompts_1.confirm)({
517
+ message: 'Run `eas build:configure --platform android` now to create eas.json?',
518
+ default: true,
519
+ });
520
+ if (yes) {
521
+ try {
522
+ await (0, execa_1.execa)('eas', ['build:configure', '--platform', 'android'], { cwd, stdio: 'inherit' });
523
+ log_1.log.ok('eas.json created.');
524
+ currentEasLink = (0, easLink_1.detectEasLink)(cwd);
525
+ replaceResultByName(results, 'EAS project linked', easLinkCheck(currentEasLink));
526
+ }
527
+ catch (err) {
528
+ log_1.log.error(`eas build:configure failed: ${err?.shortMessage || err?.message || err}`);
529
+ }
530
+ }
531
+ else {
532
+ log_1.log.dim('Skipped. Run later: eas build:configure --platform android');
533
+ }
534
+ console.log('');
535
+ }
536
+ // Step 3a — Rehydrate from credentials.json if possible (skips picker + password re-entry)
537
+ if (interactive && !(0, setupSigning_1.readKeystoreProps)(cwd) && (0, rehydrate_1.findRehydrateCandidate)(cwd)) {
538
+ log_1.log.warn('Found credentials.json + .jks but no keystore.properties.');
539
+ log_1.log.dim('We can bind them by copying the .jks into android/app/ and writing keystore.properties.');
540
+ const yes = await (0, prompts_1.confirm)({
541
+ message: 'Rehydrate keystore.properties from credentials.json now? (no password re-entry)',
542
+ default: true,
543
+ });
544
+ if (yes) {
545
+ try {
546
+ await (0, keystore_1.ensureKeystore)(cwd, 'rehydrate');
547
+ const after = keystorePropsCheck(cwd);
548
+ replaceResultByName(results, 'keystore.properties', after.result);
549
+ replaceResultByName(results, 'Signing keystore (.jks)', jksCheck(cwd, after.props));
550
+ replaceResultByName(results, 'credentials.json (EAS)', credentialsJsonCheck(cwd, after.props, currentEasLink).result);
551
+ }
552
+ catch (err) {
553
+ log_1.log.error(`Rehydrate failed: ${err?.message || err}`);
554
+ }
555
+ }
556
+ else {
557
+ log_1.log.dim('Skipped. Run later: npx local-expo-build keystore rehydrate');
558
+ }
559
+ console.log('');
560
+ }
561
+ // Step 3b — Generic keystore setup (only if 3a didn't already establish keystore.properties)
562
+ const ksFresh = keystorePropsCheck(cwd);
563
+ if (interactive && !ksFresh.fileExists) {
564
+ log_1.log.warn('No keystore.properties yet — release builds need a signing keystore.');
565
+ const yes = await (0, prompts_1.confirm)({
566
+ message: 'Set up the Android signing keystore now?',
567
+ default: true,
568
+ });
569
+ if (yes) {
570
+ try {
571
+ await (0, keystore_1.ensureKeystore)(cwd);
572
+ const after = keystorePropsCheck(cwd);
573
+ replaceResultByName(results, 'keystore.properties', after.result);
574
+ replaceResultByName(results, 'Signing keystore (.jks)', jksCheck(cwd, after.props));
575
+ replaceResultByName(results, 'credentials.json (EAS)', credentialsJsonCheck(cwd, after.props, currentEasLink).result);
576
+ }
577
+ catch (err) {
578
+ log_1.log.error(`Keystore setup failed: ${err?.message || err}`);
579
+ }
580
+ }
581
+ else {
582
+ log_1.log.dim('Skipped. Run later: npx local-expo-build keystore setup');
583
+ }
584
+ console.log('');
585
+ }
586
+ const failed = results.filter((r) => !r.ok);
587
+ if (failed.length) {
588
+ log_1.log.error(`${failed.length} check(s) failed.`);
589
+ }
590
+ else {
591
+ log_1.log.ok('Environment looks good.');
592
+ }
593
+ return { results, failedCount: failed.length };
594
+ }
595
+ function registerDoctorCommand(program) {
596
+ program
597
+ .command('doctor')
598
+ .description('Check your local environment for Expo Android builds')
599
+ .action(async (_opts, cmd) => {
600
+ const { cwd, dryRun } = (0, ctx_1.getCtx)(cmd);
601
+ const { failedCount } = await runDoctor({ cwd, dryRun });
602
+ if (failedCount > 0)
603
+ process.exit(1);
604
+ });
605
+ }
606
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}