lakebed-native-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. package/dist/cli/apple/branding.d.ts +9 -0
  2. package/dist/cli/apple/branding.d.ts.map +1 -0
  3. package/dist/cli/apple/branding.js +40 -0
  4. package/dist/cli/apple/branding.js.map +1 -0
  5. package/dist/cli/apple/build-cloud.d.ts +6 -0
  6. package/dist/cli/apple/build-cloud.d.ts.map +1 -0
  7. package/dist/cli/apple/build-cloud.js +34 -0
  8. package/dist/cli/apple/build-cloud.js.map +1 -0
  9. package/dist/cli/apple/build-local.d.ts +16 -0
  10. package/dist/cli/apple/build-local.d.ts.map +1 -0
  11. package/dist/cli/apple/build-local.js +97 -0
  12. package/dist/cli/apple/build-local.js.map +1 -0
  13. package/dist/cli/apple/choose-path.d.ts +23 -0
  14. package/dist/cli/apple/choose-path.d.ts.map +1 -0
  15. package/dist/cli/apple/choose-path.js +78 -0
  16. package/dist/cli/apple/choose-path.js.map +1 -0
  17. package/dist/cli/apple/device-pack.d.ts +36 -0
  18. package/dist/cli/apple/device-pack.d.ts.map +1 -0
  19. package/dist/cli/apple/device-pack.js +210 -0
  20. package/dist/cli/apple/device-pack.js.map +1 -0
  21. package/dist/cli/apple/devices.d.ts +6 -0
  22. package/dist/cli/apple/devices.d.ts.map +1 -0
  23. package/dist/cli/apple/devices.js +49 -0
  24. package/dist/cli/apple/devices.js.map +1 -0
  25. package/dist/cli/apple/eas-delegate.d.ts +25 -0
  26. package/dist/cli/apple/eas-delegate.d.ts.map +1 -0
  27. package/dist/cli/apple/eas-delegate.js +63 -0
  28. package/dist/cli/apple/eas-delegate.js.map +1 -0
  29. package/dist/cli/apple/index.d.ts +9 -0
  30. package/dist/cli/apple/index.d.ts.map +1 -0
  31. package/dist/cli/apple/index.js +12 -0
  32. package/dist/cli/apple/index.js.map +1 -0
  33. package/dist/cli/apple/route-device-build.d.ts +16 -0
  34. package/dist/cli/apple/route-device-build.d.ts.map +1 -0
  35. package/dist/cli/apple/route-device-build.js +54 -0
  36. package/dist/cli/apple/route-device-build.js.map +1 -0
  37. package/dist/cli/apple/setup.d.ts +5 -0
  38. package/dist/cli/apple/setup.d.ts.map +1 -0
  39. package/dist/cli/apple/setup.js +69 -0
  40. package/dist/cli/apple/setup.js.map +1 -0
  41. package/dist/cli/apple/shell-ipa.d.ts +7 -0
  42. package/dist/cli/apple/shell-ipa.d.ts.map +1 -0
  43. package/dist/cli/apple/shell-ipa.js +73 -0
  44. package/dist/cli/apple/shell-ipa.js.map +1 -0
  45. package/dist/cli/apple/sign-ios.d.ts +24 -0
  46. package/dist/cli/apple/sign-ios.d.ts.map +1 -0
  47. package/dist/cli/apple/sign-ios.js +148 -0
  48. package/dist/cli/apple/sign-ios.js.map +1 -0
  49. package/dist/cli/apple/status.d.ts +64 -0
  50. package/dist/cli/apple/status.d.ts.map +1 -0
  51. package/dist/cli/apple/status.js +249 -0
  52. package/dist/cli/apple/status.js.map +1 -0
  53. package/dist/cli/bin.d.ts +3 -0
  54. package/dist/cli/bin.d.ts.map +1 -0
  55. package/dist/cli/bin.js +7 -0
  56. package/dist/cli/bin.js.map +1 -0
  57. package/dist/cli/bundler.d.ts +16 -0
  58. package/dist/cli/bundler.d.ts.map +1 -0
  59. package/dist/cli/bundler.js +109 -0
  60. package/dist/cli/bundler.js.map +1 -0
  61. package/dist/cli/capsule-eas.d.ts +27 -0
  62. package/dist/cli/capsule-eas.d.ts.map +1 -0
  63. package/dist/cli/capsule-eas.js +131 -0
  64. package/dist/cli/capsule-eas.js.map +1 -0
  65. package/dist/cli/cloud/index.d.ts +14 -0
  66. package/dist/cli/cloud/index.d.ts.map +1 -0
  67. package/dist/cli/cloud/index.js +118 -0
  68. package/dist/cli/cloud/index.js.map +1 -0
  69. package/dist/cli/cloud-client.d.ts +38 -0
  70. package/dist/cli/cloud-client.d.ts.map +1 -0
  71. package/dist/cli/cloud-client.js +71 -0
  72. package/dist/cli/cloud-client.js.map +1 -0
  73. package/dist/cli/commands/auth.d.ts +2 -0
  74. package/dist/cli/commands/auth.d.ts.map +1 -0
  75. package/dist/cli/commands/auth.js +18 -0
  76. package/dist/cli/commands/auth.js.map +1 -0
  77. package/dist/cli/commands/build-native.d.ts +18 -0
  78. package/dist/cli/commands/build-native.d.ts.map +1 -0
  79. package/dist/cli/commands/build-native.js +156 -0
  80. package/dist/cli/commands/build-native.js.map +1 -0
  81. package/dist/cli/commands/build.d.ts +6 -0
  82. package/dist/cli/commands/build.d.ts.map +1 -0
  83. package/dist/cli/commands/build.js +57 -0
  84. package/dist/cli/commands/build.js.map +1 -0
  85. package/dist/cli/commands/claim.d.ts +2 -0
  86. package/dist/cli/commands/claim.d.ts.map +1 -0
  87. package/dist/cli/commands/claim.js +2 -0
  88. package/dist/cli/commands/claim.js.map +1 -0
  89. package/dist/cli/commands/db.d.ts +7 -0
  90. package/dist/cli/commands/db.d.ts.map +1 -0
  91. package/dist/cli/commands/db.js +18 -0
  92. package/dist/cli/commands/db.js.map +1 -0
  93. package/dist/cli/commands/deploy.d.ts +10 -0
  94. package/dist/cli/commands/deploy.d.ts.map +1 -0
  95. package/dist/cli/commands/deploy.js +101 -0
  96. package/dist/cli/commands/deploy.js.map +1 -0
  97. package/dist/cli/commands/dev.d.ts +5 -0
  98. package/dist/cli/commands/dev.d.ts.map +1 -0
  99. package/dist/cli/commands/dev.js +46 -0
  100. package/dist/cli/commands/dev.js.map +1 -0
  101. package/dist/cli/commands/devices.d.ts +4 -0
  102. package/dist/cli/commands/devices.d.ts.map +1 -0
  103. package/dist/cli/commands/devices.js +27 -0
  104. package/dist/cli/commands/devices.js.map +1 -0
  105. package/dist/cli/commands/domains.d.ts +5 -0
  106. package/dist/cli/commands/domains.d.ts.map +1 -0
  107. package/dist/cli/commands/domains.js +36 -0
  108. package/dist/cli/commands/domains.js.map +1 -0
  109. package/dist/cli/commands/inspect.d.ts +7 -0
  110. package/dist/cli/commands/inspect.d.ts.map +1 -0
  111. package/dist/cli/commands/inspect.js +15 -0
  112. package/dist/cli/commands/inspect.js.map +1 -0
  113. package/dist/cli/commands/logs.d.ts +7 -0
  114. package/dist/cli/commands/logs.d.ts.map +1 -0
  115. package/dist/cli/commands/logs.js +15 -0
  116. package/dist/cli/commands/logs.js.map +1 -0
  117. package/dist/cli/commands/new.d.ts +6 -0
  118. package/dist/cli/commands/new.d.ts.map +1 -0
  119. package/dist/cli/commands/new.js +17 -0
  120. package/dist/cli/commands/new.js.map +1 -0
  121. package/dist/cli/commands/open.d.ts +5 -0
  122. package/dist/cli/commands/open.d.ts.map +1 -0
  123. package/dist/cli/commands/open.js +14 -0
  124. package/dist/cli/commands/open.js.map +1 -0
  125. package/dist/cli/commands/pack.d.ts +32 -0
  126. package/dist/cli/commands/pack.d.ts.map +1 -0
  127. package/dist/cli/commands/pack.js +273 -0
  128. package/dist/cli/commands/pack.js.map +1 -0
  129. package/dist/cli/commands/screenshot.d.ts +5 -0
  130. package/dist/cli/commands/screenshot.d.ts.map +1 -0
  131. package/dist/cli/commands/screenshot.js +8 -0
  132. package/dist/cli/commands/screenshot.js.map +1 -0
  133. package/dist/cli/commands/shell-fetch.d.ts +5 -0
  134. package/dist/cli/commands/shell-fetch.d.ts.map +1 -0
  135. package/dist/cli/commands/shell-fetch.js +123 -0
  136. package/dist/cli/commands/shell-fetch.js.map +1 -0
  137. package/dist/cli/commands/shell.d.ts +2 -0
  138. package/dist/cli/commands/shell.d.ts.map +1 -0
  139. package/dist/cli/commands/shell.js +2 -0
  140. package/dist/cli/commands/shell.js.map +1 -0
  141. package/dist/cli/commands/submit.d.ts +2 -0
  142. package/dist/cli/commands/submit.d.ts.map +1 -0
  143. package/dist/cli/commands/submit.js +2 -0
  144. package/dist/cli/commands/submit.js.map +1 -0
  145. package/dist/cli/commands/tree.d.ts +5 -0
  146. package/dist/cli/commands/tree.d.ts.map +1 -0
  147. package/dist/cli/commands/tree.js +23 -0
  148. package/dist/cli/commands/tree.js.map +1 -0
  149. package/dist/cli/deploy-metadata.d.ts +10 -0
  150. package/dist/cli/deploy-metadata.d.ts.map +1 -0
  151. package/dist/cli/deploy-metadata.js +50 -0
  152. package/dist/cli/deploy-metadata.js.map +1 -0
  153. package/dist/cli/deploy-runtime.d.ts +4 -0
  154. package/dist/cli/deploy-runtime.d.ts.map +1 -0
  155. package/dist/cli/deploy-runtime.js +14 -0
  156. package/dist/cli/deploy-runtime.js.map +1 -0
  157. package/dist/cli/dev-config.d.ts +2 -0
  158. package/dist/cli/dev-config.d.ts.map +1 -0
  159. package/dist/cli/dev-config.js +36 -0
  160. package/dist/cli/dev-config.js.map +1 -0
  161. package/dist/cli/hosted-client.d.ts +39 -0
  162. package/dist/cli/hosted-client.d.ts.map +1 -0
  163. package/dist/cli/hosted-client.js +275 -0
  164. package/dist/cli/hosted-client.js.map +1 -0
  165. package/dist/cli/hosted-v1-store.d.ts +73 -0
  166. package/dist/cli/hosted-v1-store.d.ts.map +1 -0
  167. package/dist/cli/hosted-v1-store.js +96 -0
  168. package/dist/cli/hosted-v1-store.js.map +1 -0
  169. package/dist/cli/hosted.d.ts +13 -0
  170. package/dist/cli/hosted.d.ts.map +1 -0
  171. package/dist/cli/hosted.js +337 -0
  172. package/dist/cli/hosted.js.map +1 -0
  173. package/dist/cli/index.d.ts +2 -0
  174. package/dist/cli/index.d.ts.map +1 -0
  175. package/dist/cli/index.js +261 -0
  176. package/dist/cli/index.js.map +1 -0
  177. package/dist/cli/kit-paths.d.ts +8 -0
  178. package/dist/cli/kit-paths.d.ts.map +1 -0
  179. package/dist/cli/kit-paths.js +67 -0
  180. package/dist/cli/kit-paths.js.map +1 -0
  181. package/dist/cli/loader.d.ts +2 -0
  182. package/dist/cli/loader.d.ts.map +1 -0
  183. package/dist/cli/loader.js +5 -0
  184. package/dist/cli/loader.js.map +1 -0
  185. package/dist/cli/native-deploy-payload.d.ts +17 -0
  186. package/dist/cli/native-deploy-payload.d.ts.map +1 -0
  187. package/dist/cli/native-deploy-payload.js +29 -0
  188. package/dist/cli/native-deploy-payload.js.map +1 -0
  189. package/dist/cli/platform-detect.d.ts +11 -0
  190. package/dist/cli/platform-detect.d.ts.map +1 -0
  191. package/dist/cli/platform-detect.js +54 -0
  192. package/dist/cli/platform-detect.js.map +1 -0
  193. package/dist/cli/site.d.ts +6 -0
  194. package/dist/cli/site.d.ts.map +1 -0
  195. package/dist/cli/site.js +9 -0
  196. package/dist/cli/site.js.map +1 -0
  197. package/dist/cli/util.d.ts +12 -0
  198. package/dist/cli/util.d.ts.map +1 -0
  199. package/dist/cli/util.js +118 -0
  200. package/dist/cli/util.js.map +1 -0
  201. package/dist/cli/web-deploy-envelope.d.ts +15 -0
  202. package/dist/cli/web-deploy-envelope.d.ts.map +1 -0
  203. package/dist/cli/web-deploy-envelope.js +156 -0
  204. package/dist/cli/web-deploy-envelope.js.map +1 -0
  205. package/metro.lakebed-native.cjs +94 -0
  206. package/package.json +38 -0
  207. package/templates/camera-note/.env.lakebed.native.server +1 -0
  208. package/templates/camera-note/.lakebed-native/dev.json +6 -0
  209. package/templates/camera-note/.lakebed-native/metro/.expo/README.md +8 -0
  210. package/templates/camera-note/.lakebed-native/metro/.expo/devices.json +3 -0
  211. package/templates/camera-note/.lakebed-native/metro/index.js +2 -0
  212. package/templates/camera-note/.lakebed-native/metro/metro.config.js +4 -0
  213. package/templates/camera-note/.lakebed-native/metro/package.json +4 -0
  214. package/templates/camera-note/AGENTS.md +1 -0
  215. package/templates/camera-note/README.md +1 -0
  216. package/templates/camera-note/app/index.tsx +64 -0
  217. package/templates/camera-note/server/index.ts +23 -0
  218. package/templates/error-fixture/.env.lakebed.native.server +1 -0
  219. package/templates/error-fixture/.lakebed-native/dev.json +6 -0
  220. package/templates/error-fixture/.lakebed-native/metro/.expo/README.md +8 -0
  221. package/templates/error-fixture/.lakebed-native/metro/.expo/devices.json +3 -0
  222. package/templates/error-fixture/.lakebed-native/metro/index.js +2 -0
  223. package/templates/error-fixture/.lakebed-native/metro/metro.config.js +4 -0
  224. package/templates/error-fixture/.lakebed-native/metro/package.json +4 -0
  225. package/templates/error-fixture/AGENTS.md +1 -0
  226. package/templates/error-fixture/README.md +1 -0
  227. package/templates/error-fixture/app/index.tsx +31 -0
  228. package/templates/error-fixture/server/index.ts +19 -0
  229. package/templates/form/.env.lakebed.native.server +1 -0
  230. package/templates/form/.lakebed-native/dev.json +6 -0
  231. package/templates/form/.lakebed-native/metro/.expo/README.md +8 -0
  232. package/templates/form/.lakebed-native/metro/.expo/devices.json +3 -0
  233. package/templates/form/.lakebed-native/metro/index.js +2 -0
  234. package/templates/form/.lakebed-native/metro/metro.config.js +4 -0
  235. package/templates/form/.lakebed-native/metro/package.json +4 -0
  236. package/templates/form/AGENTS.md +1 -0
  237. package/templates/form/README.md +1 -0
  238. package/templates/form/app/index.tsx +56 -0
  239. package/templates/form/server/index.ts +27 -0
  240. package/templates/guestbook/.env.lakebed.native.server +1 -0
  241. package/templates/guestbook/AGENTS.md +1 -0
  242. package/templates/guestbook/README.md +3 -0
  243. package/templates/guestbook/app/index.tsx +45 -0
  244. package/templates/guestbook/server/index.ts +31 -0
  245. package/templates/location-checkin/.env.lakebed.native.server +1 -0
  246. package/templates/location-checkin/.lakebed-native/dev.json +6 -0
  247. package/templates/location-checkin/.lakebed-native/metro/.expo/README.md +8 -0
  248. package/templates/location-checkin/.lakebed-native/metro/.expo/devices.json +3 -0
  249. package/templates/location-checkin/.lakebed-native/metro/index.js +2 -0
  250. package/templates/location-checkin/.lakebed-native/metro/metro.config.js +4 -0
  251. package/templates/location-checkin/.lakebed-native/metro/package.json +4 -0
  252. package/templates/location-checkin/AGENTS.md +1 -0
  253. package/templates/location-checkin/README.md +1 -0
  254. package/templates/location-checkin/app/index.tsx +52 -0
  255. package/templates/location-checkin/server/index.ts +34 -0
  256. package/templates/tabs/.env.lakebed.native.server +1 -0
  257. package/templates/tabs/AGENTS.md +1 -0
  258. package/templates/tabs/README.md +1 -0
  259. package/templates/tabs/app/index.tsx +39 -0
  260. package/templates/tabs/server/index.ts +9 -0
  261. package/templates/todo/.env.lakebed.native.server +1 -0
  262. package/templates/todo/AGENTS.md +27 -0
  263. package/templates/todo/README.md +18 -0
  264. package/templates/todo/app/index.tsx +112 -0
  265. package/templates/todo/server/index.ts +51 -0
@@ -0,0 +1,49 @@
1
+ import { runEas, runEasCapture } from "./eas-delegate.js";
2
+ import { DEVICE_REGISTER_INTRO } from "./branding.js";
3
+ export function parseDeviceListPayload(stdout) {
4
+ const trimmed = stdout.trim();
5
+ if (!trimmed)
6
+ return [];
7
+ const parsed = JSON.parse(trimmed);
8
+ if (Array.isArray(parsed))
9
+ return parsed;
10
+ if (parsed && typeof parsed === "object" && "devices" in parsed) {
11
+ return parsed.devices;
12
+ }
13
+ return parsed;
14
+ }
15
+ export async function cmdAppleDevicesRegister() {
16
+ console.log(DEVICE_REGISTER_INTRO);
17
+ const code = runEas(["device:create"]);
18
+ if (code !== 0)
19
+ process.exitCode = code;
20
+ else {
21
+ console.log("");
22
+ console.log("Device registered with Lakebed Native. Rebuild device installs to refresh provisioning.");
23
+ }
24
+ }
25
+ export async function cmdAppleDevicesList(opts) {
26
+ const { status, stdout, stderr } = runEasCapture(opts.json ? ["device:list", "--json", "--non-interactive"] : ["device:list", "--non-interactive"]);
27
+ if (status !== 0) {
28
+ if (opts.json)
29
+ console.log(JSON.stringify({ ok: false, error: stderr || stdout }));
30
+ else
31
+ console.error(stderr || stdout);
32
+ process.exitCode = status;
33
+ return;
34
+ }
35
+ if (opts.json) {
36
+ try {
37
+ console.log(JSON.stringify({ ok: true, devices: parseDeviceListPayload(stdout) }));
38
+ }
39
+ catch {
40
+ console.log(JSON.stringify({ ok: false, error: "Could not parse device list output" }));
41
+ process.exitCode = 1;
42
+ }
43
+ }
44
+ else {
45
+ console.log("Registered devices (Lakebed Native / Apple ad-hoc):");
46
+ console.log(stdout.trim() || "(none)");
47
+ }
48
+ }
49
+ //# sourceMappingURL=devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../../src/cli/apple/devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEtD,MAAM,UAAU,sBAAsB,CAAC,MAAc;IACnD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACzC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;QAChE,OAAQ,MAA+B,CAAC,OAAO,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC;IACvC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;SACnC,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,yFAAyF,CAAC,CAAC;IACzG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAwB;IAChE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,aAAa,CAC9C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAClG,CAAC;IACF,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,IAAI,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;;YAC9E,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;QACrC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC;QAC1B,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QACrF,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,oCAAoC,EAAE,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ /** EAS build profile for physical iOS devices (internal ad-hoc, remote credentials). */
2
+ export declare const IOS_DEVICE_BUILD_PROFILE = "device-preview";
3
+ /** EAS CLI v20+ uses `credentials:configure-build -e PROFILE` (not `credentials --profile`). */
4
+ export declare function easConfigureBuildCredentialsArgs(profile: string): string[];
5
+ export declare function runEasConfigureBuildCredentials(profile: string, opts?: {
6
+ interactive?: boolean;
7
+ cwd?: string;
8
+ capsuleDir?: string;
9
+ }): number;
10
+ export declare function runEas(args: string[], opts?: {
11
+ interactive?: boolean;
12
+ cwd?: string;
13
+ capsuleDir?: string;
14
+ }): number;
15
+ export declare function runEasCapture(args: string[], cwdOrCapsuleDir?: string): {
16
+ status: number;
17
+ stdout: string;
18
+ stderr: string;
19
+ cwd: string;
20
+ };
21
+ export declare function hasAscApiKeyEnv(): boolean;
22
+ export declare function appleAuthHint(): string;
23
+ /** Repo universal shell — used only for maintainer template builds, not per-capsule device packs. */
24
+ export declare function getMaintainerShellDir(): string;
25
+ //# sourceMappingURL=eas-delegate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eas-delegate.d.ts","sourceRoot":"","sources":["../../../src/cli/apple/eas-delegate.ts"],"names":[],"mappings":"AAKA,wFAAwF;AACxF,eAAO,MAAM,wBAAwB,mBAAmB,CAAC;AAEzD,gGAAgG;AAChG,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1E;AAED,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE,MAAM,CAER;AAED,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAClE,MAAM,CASR;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EAAE,EACd,eAAe,CAAC,EAAE,MAAM,GACvB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAoBjE;AAED,wBAAgB,eAAe,IAAI,OAAO,CAKzC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAUtC;AAED,qGAAqG;AACrG,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C"}
@@ -0,0 +1,63 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { getShellDir } from "../util.js";
3
+ import { resolveEasCwd } from "../capsule-eas.js";
4
+ import { sanitizeVendorOutput } from "./branding.js";
5
+ /** EAS build profile for physical iOS devices (internal ad-hoc, remote credentials). */
6
+ export const IOS_DEVICE_BUILD_PROFILE = "device-preview";
7
+ /** EAS CLI v20+ uses `credentials:configure-build -e PROFILE` (not `credentials --profile`). */
8
+ export function easConfigureBuildCredentialsArgs(profile) {
9
+ return ["credentials:configure-build", "-p", "ios", "-e", profile];
10
+ }
11
+ export function runEasConfigureBuildCredentials(profile, opts) {
12
+ return runEas(easConfigureBuildCredentialsArgs(profile), opts);
13
+ }
14
+ export function runEas(args, opts) {
15
+ const cwd = opts?.cwd ?? resolveEasCwd(opts?.capsuleDir);
16
+ const result = spawnSync("eas", args, {
17
+ cwd,
18
+ stdio: opts?.interactive === false ? "pipe" : "inherit",
19
+ encoding: "utf8",
20
+ env: process.env,
21
+ });
22
+ return result.status ?? 1;
23
+ }
24
+ export function runEasCapture(args, cwdOrCapsuleDir) {
25
+ const cwd = cwdOrCapsuleDir && cwdOrCapsuleDir.includes("app.json")
26
+ ? cwdOrCapsuleDir
27
+ : resolveEasCwd(cwdOrCapsuleDir);
28
+ const result = spawnSync("eas", args, {
29
+ cwd,
30
+ stdio: "pipe",
31
+ encoding: "utf8",
32
+ env: process.env,
33
+ });
34
+ const machineReadable = args.includes("--json");
35
+ const stdout = result.stdout ?? "";
36
+ const stderr = result.stderr ?? "";
37
+ return {
38
+ status: result.status ?? 1,
39
+ stdout: machineReadable ? stdout : sanitizeVendorOutput(stdout),
40
+ stderr: machineReadable ? stderr : sanitizeVendorOutput(stderr),
41
+ cwd,
42
+ };
43
+ }
44
+ export function hasAscApiKeyEnv() {
45
+ return !!(process.env.EXPO_ASC_API_KEY_PATH ||
46
+ (process.env.EXPO_ASC_KEY_ID && process.env.EXPO_ASC_ISSUER_ID));
47
+ }
48
+ export function appleAuthHint() {
49
+ if (hasAscApiKeyEnv()) {
50
+ return "App Store Connect API key detected. Lakebed Native will use it for automated signing setup.";
51
+ }
52
+ return [
53
+ "For cloud/CI signing, set App Store Connect API key env vars (recommended):",
54
+ " EXPO_ASC_API_KEY_PATH, EXPO_ASC_KEY_ID, EXPO_ASC_ISSUER_ID",
55
+ "Or run setup interactively with your Apple Developer account.",
56
+ "See docs/apple-credentials.md",
57
+ ].join("\n");
58
+ }
59
+ /** Repo universal shell — used only for maintainer template builds, not per-capsule device packs. */
60
+ export function getMaintainerShellDir() {
61
+ return getShellDir();
62
+ }
63
+ //# sourceMappingURL=eas-delegate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eas-delegate.js","sourceRoot":"","sources":["../../../src/cli/apple/eas-delegate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAErD,wFAAwF;AACxF,MAAM,CAAC,MAAM,wBAAwB,GAAG,gBAAgB,CAAC;AAEzD,gGAAgG;AAChG,MAAM,UAAU,gCAAgC,CAAC,OAAe;IAC9D,OAAO,CAAC,6BAA6B,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,OAAe,EACf,IAAmE;IAEnE,OAAO,MAAM,CAAC,gCAAgC,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,IAAc,EACd,IAAmE;IAEnE,MAAM,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;QACpC,GAAG;QACH,KAAK,EAAE,IAAI,EAAE,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACvD,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAc,EACd,eAAwB;IAExB,MAAM,GAAG,GACP,eAAe,IAAI,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC;QACrD,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACrC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;QACpC,GAAG;QACH,KAAK,EAAE,MAAM;QACb,QAAQ,EAAE,MAAM;QAChB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,CAAC;QAC1B,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC;QAC/D,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC;QAC/D,GAAG;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,CAAC,CACP,OAAO,CAAC,GAAG,CAAC,qBAAqB;QACjC,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,IAAI,eAAe,EAAE,EAAE,CAAC;QACtB,OAAO,6FAA6F,CAAC;IACvG,CAAC;IACD,OAAO;QACL,6EAA6E;QAC7E,8DAA8D;QAC9D,+DAA+D;QAC/D,+BAA+B;KAChC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,qBAAqB;IACnC,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { cmdAppleSetup } from "./setup.js";
2
+ import { cmdAppleDevicesRegister, cmdAppleDevicesList } from "./devices.js";
3
+ import { cmdAppleStatus } from "./status.js";
4
+ import { cmdAppleBuildLocal, cmdAppleBuildAuto } from "./build-local.js";
5
+ import { cmdAppleBuildCloud } from "./build-cloud.js";
6
+ import { cmdAppleFetchShellIpa } from "./device-pack.js";
7
+ export declare function cmdAppleGuide(): Promise<void>;
8
+ export { cmdAppleSetup, cmdAppleDevicesRegister, cmdAppleDevicesList, cmdAppleStatus, cmdAppleBuildLocal, cmdAppleBuildAuto, cmdAppleBuildCloud, cmdAppleFetchShellIpa, };
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/apple/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEnD;AAED,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,GACtB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { cmdAppleSetup } from "./setup.js";
2
+ import { cmdAppleDevicesRegister, cmdAppleDevicesList } from "./devices.js";
3
+ import { cmdAppleStatus } from "./status.js";
4
+ import { cmdAppleBuildLocal, cmdAppleBuildAuto } from "./build-local.js";
5
+ import { cmdAppleBuildCloud } from "./build-cloud.js";
6
+ import { cmdAppleFetchShellIpa } from "./device-pack.js";
7
+ import { printIosBuildPathGuide, recommendIosDeviceBuildPath } from "./choose-path.js";
8
+ export async function cmdAppleGuide() {
9
+ printIosBuildPathGuide(recommendIosDeviceBuildPath());
10
+ }
11
+ export { cmdAppleSetup, cmdAppleDevicesRegister, cmdAppleDevicesList, cmdAppleStatus, cmdAppleBuildLocal, cmdAppleBuildAuto, cmdAppleBuildCloud, cmdAppleFetchShellIpa, };
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/apple/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAEvF,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,sBAAsB,CAAC,2BAA2B,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,GACtB,CAAC"}
@@ -0,0 +1,16 @@
1
+ export type IosDeviceRoute = "fast-pack" | "eas-cloud";
2
+ export type IosDeviceRouteDecision = {
3
+ route: IosDeviceRoute;
4
+ canFastPack: boolean;
5
+ canEasCloud: boolean;
6
+ summary: string;
7
+ details: string[];
8
+ shellIpa?: string;
9
+ };
10
+ export declare function resolveIosDeviceRoute(opts?: {
11
+ force?: IosDeviceRoute;
12
+ shellIpa?: string;
13
+ credentialsConfigured?: boolean;
14
+ capsuleDir?: string;
15
+ }): IosDeviceRouteDecision;
16
+ //# sourceMappingURL=route-device-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-device-build.d.ts","sourceRoot":"","sources":["../../../src/cli/apple/route-device-build.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,WAAW,CAAC;AAEvD,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,cAAc,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IAC3C,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,sBAAsB,CAiDzB"}
@@ -0,0 +1,54 @@
1
+ import { detectPlatform } from "../platform-detect.js";
2
+ import { checkAppleReadiness, resolveRouteSigningReady } from "./status.js";
3
+ import { hasCodesignTools, hasRelevantSigningIdentity } from "./sign-ios.js";
4
+ import { deviceShellIpaHint, resolveDeviceShellIpa } from "./shell-ipa.js";
5
+ export function resolveIosDeviceRoute(opts) {
6
+ const platform = detectPlatform();
7
+ const apple = checkAppleReadiness(opts?.capsuleDir);
8
+ const creds = resolveRouteSigningReady(opts?.credentialsConfigured, opts?.capsuleDir);
9
+ const shellIpa = resolveDeviceShellIpa(opts?.shellIpa, opts?.capsuleDir);
10
+ const hasIdentity = hasRelevantSigningIdentity();
11
+ const canFastPack = platform.isMac &&
12
+ platform.hasXcode &&
13
+ hasCodesignTools() &&
14
+ !!shellIpa &&
15
+ creds &&
16
+ hasIdentity;
17
+ const canEasCloud = platform.hasEasCli && apple.shellLinked && apple.devicePreviewProfile && creds;
18
+ const details = [];
19
+ if (platform.isMac && platform.hasXcode) {
20
+ details.push(`Mac + Xcode (${platform.xcodeVersion ?? "ok"})`);
21
+ if (shellIpa)
22
+ details.push(` Shell IPA: ${shellIpa}`);
23
+ else
24
+ details.push(` Shell IPA: missing — ${deviceShellIpaHint(opts?.capsuleDir).split("\n")[0]}`);
25
+ if (!hasIdentity)
26
+ details.push(" Keychain: no distribution identity for this Apple team (run apple setup)");
27
+ }
28
+ else if (platform.isMac) {
29
+ details.push("Mac without Xcode — install Xcode for fast device pack");
30
+ }
31
+ else {
32
+ details.push("Not on macOS — fast IPA pack unavailable");
33
+ }
34
+ if (canEasCloud) {
35
+ details.push("Lakebed Native cloud: full device shell build (~12 min)");
36
+ }
37
+ else {
38
+ details.push("Lakebed Native cloud: complete lakebed-native apple setup first");
39
+ }
40
+ let route = "eas-cloud";
41
+ if (opts?.force)
42
+ route = opts.force;
43
+ else if (canFastPack)
44
+ route = "fast-pack";
45
+ else if (canEasCloud)
46
+ route = "eas-cloud";
47
+ else if (platform.isMac && platform.hasXcode)
48
+ route = "fast-pack";
49
+ const summary = route === "fast-pack"
50
+ ? "Fast device pack: inject JS bundle into prebuilt shell IPA + re-sign (seconds)"
51
+ : "Lakebed Native cloud build: compile + sign device shell (~12 min)";
52
+ return { route, canFastPack, canEasCloud, summary, details, shellIpa: shellIpa ?? undefined };
53
+ }
54
+ //# sourceMappingURL=route-device-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-device-build.js","sourceRoot":"","sources":["../../../src/cli/apple/route-device-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAa3E,MAAM,UAAU,qBAAqB,CAAC,IAKrC;IACC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,EAAE,qBAAqB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACtF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,0BAA0B,EAAE,CAAC;IAEjD,MAAM,WAAW,GACf,QAAQ,CAAC,KAAK;QACd,QAAQ,CAAC,QAAQ;QACjB,gBAAgB,EAAE;QAClB,CAAC,CAAC,QAAQ;QACV,KAAK;QACL,WAAW,CAAC;IAEd,MAAM,WAAW,GACf,QAAQ,CAAC,SAAS,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC;IAEjF,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,gBAAgB,QAAQ,CAAC,YAAY,IAAI,IAAI,GAAG,CAAC,CAAC;QAC/D,IAAI,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,QAAQ,EAAE,CAAC,CAAC;;YAClD,OAAO,CAAC,IAAI,CAAC,0BAA0B,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,4EAA4E,CAAC,CAAC;IAC/G,CAAC;SAAM,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,KAAK,GAAmB,WAAW,CAAC;IACxC,IAAI,IAAI,EAAE,KAAK;QAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;SAC/B,IAAI,WAAW;QAAE,KAAK,GAAG,WAAW,CAAC;SACrC,IAAI,WAAW;QAAE,KAAK,GAAG,WAAW,CAAC;SACrC,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,QAAQ;QAAE,KAAK,GAAG,WAAW,CAAC;IAElE,MAAM,OAAO,GACX,KAAK,KAAK,WAAW;QACnB,CAAC,CAAC,gFAAgF;QAClF,CAAC,CAAC,mEAAmE,CAAC;IAE1E,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,IAAI,SAAS,EAAE,CAAC;AAChG,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function cmdAppleSetup(opts: {
2
+ json?: boolean;
3
+ capsuleDir?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/apple/setup.ts"],"names":[],"mappings":"AAOA,wBAAsB,aAAa,CACjC,IAAI,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5C,OAAO,CAAC,IAAI,CAAC,CA8Df"}
@@ -0,0 +1,69 @@
1
+ import { detectPlatform } from "../platform-detect.js";
2
+ import { IOS_DEVICE_BUILD_PROFILE, appleAuthHint, runEasConfigureBuildCredentials } from "./eas-delegate.js";
3
+ import { ensureCapsuleEasProject } from "../capsule-eas.js";
4
+ import { resolveCapsuleDir } from "../util.js";
5
+ import { APPLE_SETUP_INTRO, IOS_BUILD_TOOLS_HINT } from "./branding.js";
6
+ import { writeSigningConfiguredMarker } from "./status.js";
7
+ export async function cmdAppleSetup(opts) {
8
+ const platform = detectPlatform();
9
+ const capsuleDir = opts.capsuleDir ? resolveCapsuleDir(opts.capsuleDir) : undefined;
10
+ if (!platform.hasEasCli) {
11
+ const msg = IOS_BUILD_TOOLS_HINT;
12
+ if (opts.json) {
13
+ console.log(JSON.stringify({ ok: false, error: msg }));
14
+ }
15
+ else {
16
+ console.error(msg);
17
+ }
18
+ process.exitCode = 1;
19
+ return;
20
+ }
21
+ if (capsuleDir) {
22
+ try {
23
+ await ensureCapsuleEasProject(capsuleDir, { json: opts.json });
24
+ }
25
+ catch (err) {
26
+ const msg = err instanceof Error ? err.message : String(err);
27
+ if (opts.json)
28
+ console.log(JSON.stringify({ ok: false, error: msg }));
29
+ else
30
+ console.error(msg);
31
+ process.exitCode = 1;
32
+ return;
33
+ }
34
+ }
35
+ if (opts.json) {
36
+ console.log(JSON.stringify({
37
+ ok: true,
38
+ action: "apple-signing-setup",
39
+ profile: IOS_DEVICE_BUILD_PROFILE,
40
+ capsuleDir,
41
+ hint: appleAuthHint(),
42
+ }));
43
+ }
44
+ else {
45
+ console.log(APPLE_SETUP_INTRO);
46
+ if (capsuleDir) {
47
+ console.log("Using a dedicated signing identity for this capsule.");
48
+ console.log("");
49
+ }
50
+ console.log(appleAuthHint());
51
+ console.log("");
52
+ console.log(`Configuring Lakebed Native device build profile "${IOS_DEVICE_BUILD_PROFILE}"...`);
53
+ console.log("");
54
+ }
55
+ const code = runEasConfigureBuildCredentials(IOS_DEVICE_BUILD_PROFILE, {
56
+ interactive: !opts.json,
57
+ capsuleDir,
58
+ });
59
+ if (code !== 0)
60
+ process.exitCode = code;
61
+ else {
62
+ writeSigningConfiguredMarker(capsuleDir);
63
+ if (!opts.json) {
64
+ console.log("");
65
+ console.log("Apple signing setup complete. Register devices: lakebed-native apple devices register");
66
+ }
67
+ }
68
+ }
69
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/apple/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare const DEVICE_SHELL_IPA_NAME = "LakebedNative-device.ipa";
2
+ /** Resolve prebuilt ad-hoc shell IPA (from a prior EAS device-preview build). */
3
+ export declare function resolveDeviceShellIpa(explicit?: string, capsuleDir?: string): string | null;
4
+ export declare function deviceShellIpaHint(capsuleDir?: string): string;
5
+ /** Download latest finished device-preview IPA for the capsule EAS project. */
6
+ export declare function fetchLatestDeviceShellIpa(dest?: string, capsuleDir?: string): Promise<string>;
7
+ //# sourceMappingURL=shell-ipa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-ipa.d.ts","sourceRoot":"","sources":["../../../src/cli/apple/shell-ipa.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAEhE,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAW3F;AAED,wBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAS9D;AAQD,+EAA+E;AAC/E,wBAAsB,yBAAyB,CAC7C,IAAI,CAAC,EAAE,MAAM,EACb,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAgDjB"}
@@ -0,0 +1,73 @@
1
+ import { createWriteStream, existsSync, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { pipeline } from "node:stream/promises";
4
+ import { getShellDir } from "../util.js";
5
+ import { runEasCapture } from "./eas-delegate.js";
6
+ import { IOS_DEVICE_BUILD_PROFILE } from "./eas-delegate.js";
7
+ import { deviceShellIpaPath } from "../capsule-eas.js";
8
+ export const DEVICE_SHELL_IPA_NAME = "LakebedNative-device.ipa";
9
+ /** Resolve prebuilt ad-hoc shell IPA (from a prior EAS device-preview build). */
10
+ export function resolveDeviceShellIpa(explicit, capsuleDir) {
11
+ const candidates = [
12
+ explicit,
13
+ process.env.LAKEBED_IOS_SHELL_IPA,
14
+ capsuleDir ? deviceShellIpaPath(capsuleDir) : undefined,
15
+ join(getShellDir(), DEVICE_SHELL_IPA_NAME),
16
+ ].filter(Boolean);
17
+ for (const path of candidates) {
18
+ if (existsSync(path))
19
+ return path;
20
+ }
21
+ return null;
22
+ }
23
+ export function deviceShellIpaHint(capsuleDir) {
24
+ return [
25
+ "Device shell IPA not found. Build once via Lakebed Native cloud, then save the artifact:",
26
+ ` npx lakebed-native apple fetch-shell-ipa${capsuleDir ? " ." : ""}`,
27
+ capsuleDir
28
+ ? ` # saves to ${deviceShellIpaPath(capsuleDir)}`
29
+ : ` # or copy the .ipa to shell/${DEVICE_SHELL_IPA_NAME}`,
30
+ " npx lakebed-native pack --platform ios --device --cloud --wait",
31
+ ].join("\n");
32
+ }
33
+ /** Download latest finished device-preview IPA for the capsule EAS project. */
34
+ export async function fetchLatestDeviceShellIpa(dest, capsuleDir) {
35
+ const outPath = dest ?? (capsuleDir ? deviceShellIpaPath(capsuleDir) : join(getShellDir(), DEVICE_SHELL_IPA_NAME));
36
+ mkdirSync(join(outPath, ".."), { recursive: true });
37
+ const { status, stdout, stderr } = runEasCapture([
38
+ "build:list",
39
+ "--platform",
40
+ "ios",
41
+ "--profile",
42
+ IOS_DEVICE_BUILD_PROFILE,
43
+ "--status",
44
+ "finished",
45
+ "--limit",
46
+ "1",
47
+ "--json",
48
+ "--non-interactive",
49
+ ], capsuleDir);
50
+ if (status !== 0) {
51
+ throw new Error(`Device build list failed: ${stderr || stdout}`);
52
+ }
53
+ let rows = [];
54
+ try {
55
+ const parsed = JSON.parse(stdout.trim());
56
+ rows = Array.isArray(parsed) ? parsed : (parsed.builds ?? []);
57
+ }
58
+ catch {
59
+ throw new Error(`Could not parse device build list: ${stdout.slice(0, 400)}`);
60
+ }
61
+ const build = rows[0];
62
+ const url = build?.artifacts?.buildUrl;
63
+ if (!url) {
64
+ throw new Error("No finished device-preview build found. Run: lakebed-native pack --platform ios --device --cloud --wait");
65
+ }
66
+ const res = await fetch(url);
67
+ if (!res.ok || !res.body) {
68
+ throw new Error(`Failed to download shell IPA (${res.status})`);
69
+ }
70
+ await pipeline(res.body, createWriteStream(outPath));
71
+ return outPath;
72
+ }
73
+ //# sourceMappingURL=shell-ipa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell-ipa.js","sourceRoot":"","sources":["../../../src/cli/apple/shell-ipa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { StandaloneManifest } from "@lakebed-native/shared";
2
+ export declare function hasCodesignTools(): boolean;
3
+ export declare function listSigningIdentities(): string[];
4
+ /** Distribution identity for the configured Apple team (device-preview / ad-hoc). */
5
+ export declare function hasRelevantSigningIdentity(): boolean;
6
+ export declare function pickSigningIdentity(preferredTeamId?: string): string | null;
7
+ export declare function parseTeamIdFromMobileProvision(provisionPath: string): string | undefined;
8
+ export declare function findAppBundleInPayload(payloadDir: string): string;
9
+ export declare function extractEntitlements(appPath: string, destPlist: string): void;
10
+ /** Deep-sign an .app bundle (frameworks first, then app). */
11
+ export declare function resignAppBundle(appPath: string, identity: string, entitlementsPath?: string): void;
12
+ export declare function injectLakebedIntoApp(appPath: string, manifest: StandaloneManifest, bundle: string): void;
13
+ /** Unpack IPA, inject capsule assets, re-sign, repack. Mac + codesign only. */
14
+ export declare function packIosDeviceIpa(opts: {
15
+ templateIpa: string;
16
+ outIpa: string;
17
+ manifest: StandaloneManifest;
18
+ bundle: string;
19
+ identity?: string;
20
+ }): {
21
+ appName: string;
22
+ identity: string;
23
+ };
24
+ //# sourceMappingURL=sign-ios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-ios.d.ts","sourceRoot":"","sources":["../../../src/cli/apple/sign-ios.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAMjE,wBAAgB,gBAAgB,IAAI,OAAO,CAS1C;AAED,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAahD;AAED,qFAAqF;AACrF,wBAAgB,0BAA0B,IAAI,OAAO,CAOpD;AAED,wBAAgB,mBAAmB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB3E;AAED,wBAAgB,8BAA8B,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAYxF;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAQjE;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAI5E;AAED,6DAA6D;AAC7D,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CA4BlG;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,kBAAkB,EAC5B,MAAM,EAAE,MAAM,GACb,IAAI,CAKN;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAyCxC"}
@@ -0,0 +1,148 @@
1
+ import { execSync } from "node:child_process";
2
+ import { existsSync, mkdirSync, mkdtempSync, readdirSync, rmSync, statSync, writeFileSync, } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ function run(cmd, cwd) {
6
+ execSync(cmd, { cwd, stdio: "pipe" });
7
+ }
8
+ export function hasCodesignTools() {
9
+ if (process.platform !== "darwin")
10
+ return false;
11
+ try {
12
+ execSync("xcodebuild -version", { stdio: "pipe" });
13
+ execSync("which codesign", { stdio: "pipe" });
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ export function listSigningIdentities() {
21
+ if (!hasCodesignTools())
22
+ return [];
23
+ try {
24
+ const raw = execSync("security find-identity -v -p codesigning", { encoding: "utf8" });
25
+ const ids = [];
26
+ for (const line of raw.split("\n")) {
27
+ const m = line.match(/^\s*\d+\)\s+(.+?)\s+"(.+)"$/);
28
+ if (m)
29
+ ids.push(m[2]);
30
+ }
31
+ return ids;
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ /** Distribution identity for the configured Apple team (device-preview / ad-hoc). */
38
+ export function hasRelevantSigningIdentity() {
39
+ const teamId = process.env.EXPO_APPLE_TEAM_ID;
40
+ const distribution = listSigningIdentities().filter((id) => /Apple Distribution|iPhone Distribution/i.test(id));
41
+ if (teamId)
42
+ return distribution.some((id) => id.includes(teamId));
43
+ return distribution.length > 0;
44
+ }
45
+ export function pickSigningIdentity(preferredTeamId) {
46
+ const ids = listSigningIdentities();
47
+ if (!ids.length)
48
+ return null;
49
+ const prefer = (pattern) => ids.find((id) => pattern.test(id));
50
+ if (preferredTeamId) {
51
+ const teamMatch = ids.find((id) => id.includes(preferredTeamId));
52
+ if (teamMatch)
53
+ return teamMatch;
54
+ }
55
+ return (prefer(/Apple Development/i) ??
56
+ prefer(/iPhone Developer/i) ??
57
+ prefer(/Apple Distribution/i) ??
58
+ prefer(/iPhone Distribution/i) ??
59
+ ids[0] ??
60
+ null);
61
+ }
62
+ export function parseTeamIdFromMobileProvision(provisionPath) {
63
+ try {
64
+ const xml = execSync(`security cms -D -i ${JSON.stringify(provisionPath)}`, {
65
+ encoding: "utf8",
66
+ });
67
+ return (xml.match(/<key>TeamIdentifier<\/key>\s*<array>\s*<string>([^<]+)<\/string>/i)?.[1] ??
68
+ xml.match(/<key>ApplicationIdentifierPrefix<\/key>\s*<array>\s*<string>([^<]+)<\/string>/i)?.[1]);
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ }
74
+ export function findAppBundleInPayload(payloadDir) {
75
+ const apps = readdirSync(payloadDir).filter((n) => n.endsWith(".app"));
76
+ if (apps.length !== 1) {
77
+ throw new Error(`Expected one .app in Payload/, found ${apps.length}: ${apps.join(", ") || "(none)"}`);
78
+ }
79
+ return join(payloadDir, apps[0]);
80
+ }
81
+ export function extractEntitlements(appPath, destPlist) {
82
+ run(`/usr/bin/codesign -d --entitlements :- ${JSON.stringify(appPath)} > ${JSON.stringify(destPlist)}`);
83
+ }
84
+ /** Deep-sign an .app bundle (frameworks first, then app). */
85
+ export function resignAppBundle(appPath, identity, entitlementsPath) {
86
+ const fwDir = join(appPath, "Frameworks");
87
+ if (existsSync(fwDir)) {
88
+ for (const name of readdirSync(fwDir)) {
89
+ const path = join(fwDir, name);
90
+ if (statSync(path).isDirectory() && (name.endsWith(".framework") || name.endsWith(".appex"))) {
91
+ run(`/usr/bin/codesign --force --sign ${JSON.stringify(identity)} ${JSON.stringify(path)}`);
92
+ }
93
+ }
94
+ }
95
+ const plugIns = join(appPath, "PlugIns");
96
+ if (existsSync(plugIns)) {
97
+ for (const name of readdirSync(plugIns)) {
98
+ const path = join(plugIns, name);
99
+ if (statSync(path).isDirectory() && name.endsWith(".appex")) {
100
+ run(`/usr/bin/codesign --force --sign ${JSON.stringify(identity)} ${JSON.stringify(path)}`);
101
+ }
102
+ }
103
+ }
104
+ const entFlag = entitlementsPath && existsSync(entitlementsPath)
105
+ ? `--entitlements ${JSON.stringify(entitlementsPath)} `
106
+ : "";
107
+ run(`/usr/bin/codesign --force --sign ${JSON.stringify(identity)} ${entFlag}${JSON.stringify(appPath)}`);
108
+ }
109
+ export function injectLakebedIntoApp(appPath, manifest, bundle) {
110
+ const assetDir = join(appPath, "lakebed");
111
+ mkdirSync(assetDir, { recursive: true });
112
+ writeFileSync(join(assetDir, "manifest.json"), JSON.stringify(manifest, null, 2));
113
+ writeFileSync(join(assetDir, "capsule.bundle"), bundle);
114
+ }
115
+ /** Unpack IPA, inject capsule assets, re-sign, repack. Mac + codesign only. */
116
+ export function packIosDeviceIpa(opts) {
117
+ if (!hasCodesignTools()) {
118
+ throw new Error("iOS device IPA pack requires macOS with Xcode Command Line Tools (codesign).");
119
+ }
120
+ const work = mkdtempSync(join(tmpdir(), "lb-ipa-pack-"));
121
+ const payloadDir = join(work, "Payload");
122
+ try {
123
+ run(`unzip -q -o ${JSON.stringify(opts.templateIpa)} -d ${JSON.stringify(work)}`);
124
+ if (!existsSync(payloadDir)) {
125
+ throw new Error("Invalid IPA: missing Payload/");
126
+ }
127
+ const appPath = findAppBundleInPayload(payloadDir);
128
+ const appName = appPath.split("/").pop();
129
+ const entitlementsPath = join(work, "entitlements.plist");
130
+ extractEntitlements(appPath, entitlementsPath);
131
+ injectLakebedIntoApp(appPath, opts.manifest, opts.bundle);
132
+ const provision = join(appPath, "embedded.mobileprovision");
133
+ const teamId = existsSync(provision) ? parseTeamIdFromMobileProvision(provision) : undefined;
134
+ const identity = opts.identity ?? pickSigningIdentity(teamId);
135
+ if (!identity) {
136
+ throw new Error("No code signing identity in keychain. Run lakebed-native apple setup (Lakebed Native installs certs locally) or import your distribution certificate.");
137
+ }
138
+ resignAppBundle(appPath, identity, entitlementsPath);
139
+ const outIpa = opts.outIpa.endsWith(".ipa") ? opts.outIpa : `${opts.outIpa}.ipa`;
140
+ mkdirSync(join(outIpa, ".."), { recursive: true });
141
+ run(`cd ${JSON.stringify(work)} && zip -qr ${JSON.stringify(outIpa)} Payload`);
142
+ return { appName, identity };
143
+ }
144
+ finally {
145
+ rmSync(work, { recursive: true, force: true });
146
+ }
147
+ }
148
+ //# sourceMappingURL=sign-ios.js.map