stim 1.13.0 → 1.15.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 (133) hide show
  1. package/README.md +2 -0
  2. package/dist/{activity-DfVKZTEB.mjs → activity-B2-kb7k0.mjs} +281 -41
  3. package/dist/{android-BHfAu2mf.mjs → android-CYmq0jNi.mjs} +2 -2
  4. package/dist/{android-CD8pr8Q2.mjs → android-Cu_L4RpL.mjs} +524 -412
  5. package/dist/{android-qx_31wJo.mjs → android-Db2eEMaf.mjs} +152 -65
  6. package/dist/android-cas-PnKfAdB2.mjs +167 -0
  7. package/dist/android-cas-compiler.mjs +2 -2
  8. package/dist/{app-install-CDFY2nUL.mjs → app-install-CAAplXAt.mjs} +162 -173
  9. package/dist/{budget-E5o91NR1.mjs → budget-CMiqghig.mjs} +1048 -77
  10. package/dist/{build-plan-BTa93o_r.mjs → build-plan-aeGMFX7e.mjs} +193 -650
  11. package/dist/build-progress-C2Jv1AtA.mjs +872 -0
  12. package/dist/build-slots-Df1ApSuH.mjs +127 -0
  13. package/dist/{cache-manifest-DWPF4RKJ.mjs → cache-manifest-DnUHBJaU.mjs} +2 -2
  14. package/dist/cache-manifest.mjs +1 -1
  15. package/dist/{chrome-B5hWgQJS.mjs → chrome-BrcVWQyD.mjs} +4 -4
  16. package/dist/cli-0cX5s4NM.mjs +45 -0
  17. package/dist/cli.mjs +6 -42
  18. package/dist/client-C2IS36Qf.mjs +1333 -0
  19. package/dist/collector-run.mjs +8 -7
  20. package/dist/{command-output-BIL7rlX7.mjs → command-output-CliHHn7a.mjs} +1 -1
  21. package/dist/{config-0jCcMM0E.mjs → config-D0DbpZtM.mjs} +29 -29
  22. package/dist/{created-devices-Cd558h31.mjs → created-devices-BwVb3liH.mjs} +2 -2
  23. package/dist/{dependency-state-DNN0yfx6.mjs → dependency-state-BmsjKZ2H.mjs} +2 -2
  24. package/dist/{deps-2Wo81np9.mjs → deps-BFlKbOIp.mjs} +3 -3
  25. package/dist/{detached-entry-DJHoca49.mjs → detached-entry-CiTEgMR1.mjs} +1 -1
  26. package/dist/dev-client-CjzLoNs0.mjs +80 -0
  27. package/dist/{device-Cf7vl-so.mjs → device-BZ1IyS5A.mjs} +7 -7
  28. package/dist/device-capacity-DMuKC7nx.mjs +136 -0
  29. package/dist/device-host-worker.d.mts +1 -0
  30. package/dist/device-host-worker.mjs +769 -0
  31. package/dist/device-ios-DMQBUPus.mjs +381 -0
  32. package/dist/{device-lease-CL9dZf73.mjs → device-lease-W5Pi1q38.mjs} +43 -36
  33. package/dist/{device-pool-MuoiyRcu.mjs → device-pool-B2r38YjS.mjs} +4 -4
  34. package/dist/{device-remote-DT9ngZiD.mjs → device-remote-9ulPsdhY.mjs} +68 -162
  35. package/dist/{doctor-D2iysNNH.mjs → doctor-BcE5xsBn.mjs} +191 -99
  36. package/dist/{error-diagnostics-BoiOhck8.mjs → error-diagnostics-Cb0P1WLS.mjs} +12 -11
  37. package/dist/{exec-DK8KaVHK.mjs → exec-CaErVv7t.mjs} +5 -1
  38. package/dist/{gc-eA-PRBX8.mjs → gc-BuL1Genr.mjs} +430 -102
  39. package/dist/{android-cas-B9Kv9aIy.mjs → gradle-CmdOBq1d.mjs} +8 -294
  40. package/dist/{guide-BfZ0OmiP.mjs → guide-cCSGRFd3.mjs} +2052 -240
  41. package/dist/{guide-status-BaMYu55M.mjs → guide-status-CIoWK6mG.mjs} +3 -3
  42. package/dist/hosted-macos-DwowNU7W.mjs +447 -0
  43. package/dist/idle-shutdown-B5LPaNyY.mjs +122 -0
  44. package/dist/in-use-CndPMilN.mjs +110 -0
  45. package/dist/{ios-CmEzZiOj.mjs → ios-3CtCRhwr.mjs} +201 -10
  46. package/dist/{ios-CcfCeZ19.mjs → ios-Chob8ny7.mjs} +560 -259
  47. package/dist/{ios-device-BW-t_Lkv.mjs → ios-device-DERmMmk-.mjs} +12 -7
  48. package/dist/{ios-device-BiOsSVzd.mjs → ios-device-Ee7sDXfp.mjs} +1 -1
  49. package/dist/{launch-verify-CuJaBpEa.mjs → launch-verify-CLlofxRt.mjs} +42 -11
  50. package/dist/{logs-DcSRbC2t.mjs → logs-h9h6MUvE.mjs} +95 -13
  51. package/dist/machine-usage-D_YYMzfR.mjs +283 -0
  52. package/dist/machines-CYtOCqcj.mjs +259 -0
  53. package/dist/macos-BwtbUtTN.mjs +468 -0
  54. package/dist/macos-run.d.mts +5 -0
  55. package/dist/macos-run.mjs +2 -0
  56. package/dist/{merge-state-ytFQCeh4.mjs → merge-state-BnxLNQiM.mjs} +22 -12
  57. package/dist/{metro-BPeY1YMh.mjs → metro-Di8EN2Tb.mjs} +20 -120
  58. package/dist/{named-ports-n7tnJsI8.mjs → named-ports-Dj_XBNaL.mjs} +8 -64
  59. package/dist/native-run-DFDoIRbY.mjs +147 -0
  60. package/dist/{native-runtime-CiiFHt0e.mjs → native-runtime-i6OkVg-w.mjs} +11 -6
  61. package/dist/offload-worker.d.mts +121 -0
  62. package/dist/offload-worker.mjs +601 -0
  63. package/dist/{ownership-Bz2kETAS.mjs → ownership-BkYxUtuj.mjs} +3 -2
  64. package/dist/{page-BTu7I60K.mjs → page-QF_Ke10s.mjs} +7 -2
  65. package/dist/{ports-C5UutqpJ.mjs → ports-DddwttKM.mjs} +3 -3
  66. package/dist/prebuild-BvxDlD6C.mjs +213 -0
  67. package/dist/process-identity-BmRm1qV0.mjs +12 -0
  68. package/dist/{project-DGeclhvO.mjs → project-CV3tDFHl.mjs} +9 -18
  69. package/dist/pull-request-pxnDCQzn.mjs +322 -0
  70. package/dist/pull-requests.d.mts +120 -0
  71. package/dist/pull-requests.mjs +2 -0
  72. package/dist/recordings-GEXp4iBT.mjs +37 -0
  73. package/dist/{reload-C-cV5yy_.mjs → reload-ChPiwvot.mjs} +70 -22
  74. package/dist/{remote-cache--aehr4Pr.mjs → remote-cache-CO2elm_b.mjs} +4 -4
  75. package/dist/run-B-xqRrsg.mjs +119 -0
  76. package/dist/{server-bare-Bq8BpSIo.mjs → server-bare-X7PUgizL.mjs} +60 -13
  77. package/dist/{server-expo-DUCg52-K.mjs → server-expo-DhtX6bom.mjs} +6 -10
  78. package/dist/server-expo-KJeD109I.mjs +2 -0
  79. package/dist/{settings-xB0Frkg6.mjs → settings-CduVcoxj.mjs} +77 -26
  80. package/dist/{settings-ssVBToDR.mjs → settings-DbL6uhH8.mjs} +16 -10
  81. package/dist/settings.schema.json +357 -2
  82. package/dist/{simslim-Bbg9UWrt.mjs → simslim-Ciluxlq4.mjs} +8 -132
  83. package/dist/slot-launch-BY0BrOLh.mjs +65 -0
  84. package/dist/{spawn-claims-PT8aQpCa.mjs → spawn-claims-D0XfSe8u.mjs} +1 -1
  85. package/dist/spawn-entry-DncpJvWL.mjs +16 -0
  86. package/dist/stage-CzaiwFsI.mjs +143 -0
  87. package/dist/start-CPO4wRg7.mjs +2 -0
  88. package/dist/{start-BZhItkiL.mjs → start-CUD9nasA.mjs} +108 -61
  89. package/dist/state-B4PQFXMW.d.mts +12 -0
  90. package/dist/state-BxCgeTQu.mjs +41 -0
  91. package/dist/{state-DwAU2_-D.mjs → state-CaeaHbDA.mjs} +7 -4
  92. package/dist/{state-l1pYwOre.mjs → state-DFm77wRn.mjs} +67 -5
  93. package/dist/stats-DBLLFmKd.mjs +66 -0
  94. package/dist/{status-TJlL0HWo.mjs → status-DYXxNOT0.mjs} +425 -260
  95. package/dist/{status-sszP4XKU.mjs → status-l84Gbvp2.mjs} +122 -20
  96. package/dist/stdout-reader-C8yjre1x.mjs +23 -0
  97. package/dist/stim-desktop-Cnz8CPnl.mjs +63 -0
  98. package/dist/stim-footprint.swift +32 -0
  99. package/dist/{stim-installations-CINXy_su.mjs → stim-installations-QMEI32v1.mjs} +1 -1
  100. package/dist/{stop-BZ2qMiBP.mjs → stop-Bad61z_2.mjs} +128 -19
  101. package/dist/stop-Bvf1MflS.mjs +48 -0
  102. package/dist/{stop-DskDKNTU.mjs → stop-CceYh1yG.mjs} +2 -2
  103. package/dist/stop-cause-CZ_Mr-v9.mjs +665 -0
  104. package/dist/supervisor-run.d.mts +44 -12
  105. package/dist/supervisor-run.mjs +276 -33
  106. package/dist/support-CDQbDkL5.mjs +315 -0
  107. package/dist/support-WLOzVKUv.mjs +176 -0
  108. package/dist/teardown-BYuQafiA.mjs +718 -0
  109. package/dist/{xcode-LM6A8cNZ.mjs → toolchain-DmeYjXD9.mjs} +363 -13
  110. package/dist/warm-progress-DVHLN4uC.mjs +463 -0
  111. package/dist/{idle-DxLi5OkN.mjs → watchman-Bx0wceoF.mjs} +55 -8
  112. package/dist/{web-sWXd5iek.mjs → web-k6w8-HnE.mjs} +39 -22
  113. package/dist/web-run.mjs +326 -13
  114. package/dist/workspace-process-lock-BL7Q0HCO.mjs +57 -0
  115. package/dist/workspace-state-CL2V2Ons.mjs +371 -0
  116. package/dist/worktree-BT_uULFx.mjs +2 -0
  117. package/dist/{worktree-DeBQSVtR.mjs → worktree-C0c5Udwa.mjs} +55 -54
  118. package/dist/{worktree-D4Do_XiQ.mjs → worktree-qXKzADSC.mjs} +161 -255
  119. package/package.json +10 -5
  120. package/shim/bundle-response.cjs +55 -10
  121. package/shim/bundle-response.d.cts +1 -0
  122. package/shim/expo-metro-config.cjs +10 -2
  123. package/dist/build-progress-l7d-X-ZP.mjs +0 -247
  124. package/dist/in-use-wYEaKQM9.mjs +0 -249
  125. package/dist/ownership-PUP4Dwai.mjs +0 -1138
  126. package/dist/server-expo-BeYwP_Xy.mjs +0 -2
  127. package/dist/slot-launch-BIWEW-wI.mjs +0 -19
  128. package/dist/start-Rw2GD3nV.mjs +0 -2
  129. package/dist/stats-CaSwmsSZ.mjs +0 -62
  130. package/dist/stats-D8rUTPHd.mjs +0 -368
  131. package/dist/stim-desktop-CXt8-Z3J.mjs +0 -40
  132. package/dist/worktree-3cBa-bQt.mjs +0 -2
  133. package/dist/{metro-store-DzeWkfqW.mjs → metro-store-CDDZHtPl.mjs} +1 -1
@@ -1,13 +1,144 @@
1
- import { _ as loadConfig$1 } from "./config-0jCcMM0E.mjs";
2
- import { t as getExecutor } from "./exec-DK8KaVHK.mjs";
1
+ import { t as getExecutor } from "./exec-CaErVv7t.mjs";
2
+ import { _ as loadConfig$1 } from "./config-D0DbpZtM.mjs";
3
3
  import { n as stripAnsi, r as waitForChild, t as createLineReader } from "./process-output-Fpl8PYi8.mjs";
4
- import { n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-CXt8-Z3J.mjs";
5
- import { nt as isStimOwnedSim } from "./android-qx_31wJo.mjs";
6
- import { r as recordCreatedDevice, t as forgetCreatedDevice } from "./created-devices-Cd558h31.mjs";
7
- import { existsSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
4
+ import { n as settingDefault, t as STIM_DESKTOP_OPEN_OPTIONS } from "./stim-desktop-Cnz8CPnl.mjs";
5
+ import { it as isStimOwnedSim } from "./android-Db2eEMaf.mjs";
6
+ import { r as recordCreatedDevice, t as forgetCreatedDevice } from "./created-devices-BwVb3liH.mjs";
7
+ import { createHash } from "node:crypto";
8
+ import { closeSync, existsSync, lstatSync, mkdtempSync, openSync, readSync, readdirSync, rmSync, writeFileSync } from "node:fs";
9
+ import { dirname, isAbsolute, join, resolve } from "node:path";
8
10
  import { IOS_SIMULATOR_APPS, settingDefinition } from "@stim-cli/core/state";
9
- import { dirname, join, resolve } from "node:path";
10
11
  import { tmpdir } from "node:os";
12
+ //#region src/engine/installed-artifact.ts
13
+ const READ_CHUNK_BYTES = 1048576;
14
+ const DEVICE_PATH_TIMEOUT_MS = 3e4;
15
+ const DEVICE_HASH_TIMEOUT_MS = 12e4;
16
+ const SHA256_HEX = /^[0-9a-f]{64}$/;
17
+ function parseInstalledApkPath(text) {
18
+ if (typeof text !== "string") return null;
19
+ const paths = [];
20
+ for (const raw of text.split("\n")) {
21
+ const line = raw.trim();
22
+ if (!line.startsWith("package:")) continue;
23
+ const path = line.slice(8);
24
+ if (path.startsWith("/")) paths.push(path);
25
+ }
26
+ return paths.length === 1 ? paths[0] : null;
27
+ }
28
+ function parseDeviceSha256(text) {
29
+ if (typeof text !== "string") return null;
30
+ const first = text.trim().split(/\s+/)[0] ?? "";
31
+ return SHA256_HEX.test(first) ? first : null;
32
+ }
33
+ function parseAppContainerPath(text) {
34
+ if (typeof text !== "string") return null;
35
+ const lines = text.split("\n").map((line) => line.trim()).filter(Boolean);
36
+ return lines.length === 1 && isAbsolute(lines[0]) ? lines[0] : null;
37
+ }
38
+ function artifactsMatch(local, installed) {
39
+ return Boolean(local) && local === installed;
40
+ }
41
+ function hashFile(file) {
42
+ let fd = null;
43
+ try {
44
+ fd = openSync(file, "r");
45
+ const digest = createHash("sha256");
46
+ const buffer = Buffer.allocUnsafe(READ_CHUNK_BYTES);
47
+ for (;;) {
48
+ const read = readSync(fd, buffer, 0, READ_CHUNK_BYTES, null);
49
+ if (read <= 0) break;
50
+ digest.update(buffer.subarray(0, read));
51
+ }
52
+ return digest.digest("hex");
53
+ } catch {
54
+ return null;
55
+ } finally {
56
+ if (fd !== null) try {
57
+ closeSync(fd);
58
+ } catch {}
59
+ }
60
+ }
61
+ function hashBundle(dir) {
62
+ const digest = createHash("sha256");
63
+ const walk = (abs, rel) => {
64
+ let names;
65
+ try {
66
+ names = readdirSync(abs);
67
+ } catch {
68
+ return false;
69
+ }
70
+ for (const name of names.toSorted()) {
71
+ const child = join(abs, name);
72
+ const path = rel === "" ? name : `${rel}/${name}`;
73
+ let stat;
74
+ try {
75
+ stat = lstatSync(child);
76
+ } catch {
77
+ return false;
78
+ }
79
+ if (stat.isDirectory()) {
80
+ if (!walk(child, path)) return false;
81
+ continue;
82
+ }
83
+ if (!stat.isFile()) return false;
84
+ const file = hashFile(child);
85
+ if (file === null) return false;
86
+ digest.update(`${path}\0${file}\n`);
87
+ }
88
+ return true;
89
+ };
90
+ return walk(dir, "") ? digest.digest("hex") : null;
91
+ }
92
+ function deviceHoldsApk({ serial, packageName, apkPath }, { exec = null } = {}) {
93
+ const e = exec || getExecutor();
94
+ let path;
95
+ try {
96
+ path = parseInstalledApkPath(e.runFile("adb", [
97
+ "-s",
98
+ serial,
99
+ "shell",
100
+ "pm",
101
+ "path",
102
+ packageName
103
+ ], { timeoutMs: DEVICE_PATH_TIMEOUT_MS }));
104
+ } catch {
105
+ return false;
106
+ }
107
+ if (!path) return false;
108
+ let installed;
109
+ try {
110
+ installed = parseDeviceSha256(e.runFile("adb", [
111
+ "-s",
112
+ serial,
113
+ "shell",
114
+ "sha256sum",
115
+ path
116
+ ], { timeoutMs: DEVICE_HASH_TIMEOUT_MS }));
117
+ } catch {
118
+ return false;
119
+ }
120
+ if (!installed) return false;
121
+ return artifactsMatch(hashFile(apkPath), installed);
122
+ }
123
+ function deviceHoldsBundle({ udid, bundleId, appPath }, { exec = null } = {}) {
124
+ const e = exec || getExecutor();
125
+ let container;
126
+ try {
127
+ container = parseAppContainerPath(e.runFile("xcrun", [
128
+ "simctl",
129
+ "get_app_container",
130
+ udid,
131
+ bundleId
132
+ ], { timeoutMs: DEVICE_PATH_TIMEOUT_MS }));
133
+ } catch {
134
+ return false;
135
+ }
136
+ if (!container) return false;
137
+ const installed = hashBundle(container);
138
+ if (!installed) return false;
139
+ return artifactsMatch(hashBundle(appPath), installed);
140
+ }
141
+ //#endregion
11
142
  //#region src/host-memory.ts
12
143
  function readHostMemoryPressure(exec = getExecutor(), platform = process.platform) {
13
144
  if (platform !== "darwin") return null;
@@ -201,7 +332,7 @@ async function awaitBootCommand(args, attemptMs, onLine) {
201
332
  const detail = lines.length ? `: ${lines.join(" | ")}` : "";
202
333
  throw new Error(`${command} failed with exit code ${result.code ?? "unknown"}${detail}`);
203
334
  }
204
- async function bootIosSim(udid, { timeoutMs = IOS_BOOT_TIMEOUT_MS, attemptMs = BOOTSTATUS_ATTEMPT_MS, simulatorApp, label = udid, out = () => {} } = {}) {
335
+ async function bootIosSim(udid, { timeoutMs = IOS_BOOT_TIMEOUT_MS, attemptMs = BOOTSTATUS_ATTEMPT_MS, simulatorApp, openViewer = true, label = udid, out = () => {} } = {}) {
205
336
  const exec = getExecutor();
206
337
  const viewer = configuredIosSimulatorViewer(simulatorApp);
207
338
  const started = Date.now();
@@ -280,7 +411,7 @@ async function bootIosSim(udid, { timeoutMs = IOS_BOOT_TIMEOUT_MS, attemptMs = B
280
411
  } finally {
281
412
  clearInterval(monitor);
282
413
  }
283
- viewer.open(udid);
414
+ if (openViewer) viewer.open(udid);
284
415
  }
285
416
  function shutdownIosSim(udid) {
286
417
  getExecutor().runQuiet(`xcrun simctl shutdown ${udid}`, SIMCTL_OPTIONS);
@@ -432,6 +563,66 @@ function resetIosKeychain(udid) {
432
563
  "reset"
433
564
  ], SIMCTL_OPTIONS);
434
565
  }
566
+ const CLEARED_CONTAINER_DIRS = [
567
+ "Documents",
568
+ "Library",
569
+ "tmp",
570
+ "SystemData"
571
+ ];
572
+ function clearIosAppData(udid, bundleId, { defaultsPlist = null } = {}) {
573
+ const exec = getExecutor();
574
+ if (defaultsPlist) exec.runFile("xcrun", [
575
+ "simctl",
576
+ "spawn",
577
+ udid,
578
+ "defaults",
579
+ "import",
580
+ bundleId,
581
+ "-"
582
+ ], {
583
+ ...SIMCTL_OPTIONS,
584
+ input: defaultsPlist
585
+ });
586
+ else try {
587
+ exec.runFile("xcrun", [
588
+ "simctl",
589
+ "spawn",
590
+ udid,
591
+ "defaults",
592
+ "delete",
593
+ bundleId
594
+ ], SIMCTL_OPTIONS);
595
+ } catch (error) {
596
+ if (!/Domain .* not found/.test(String(error?.message))) throw error;
597
+ }
598
+ const output = exec.runFile("xcrun", [
599
+ "simctl",
600
+ "get_app_container",
601
+ udid,
602
+ bundleId,
603
+ "data"
604
+ ], SIMCTL_OPTIONS);
605
+ const container = parseAppContainerPath(output);
606
+ if (!container) throw new Error(`simctl get_app_container returned no data container for ${bundleId}: ${JSON.stringify(output)}`);
607
+ for (const name of CLEARED_CONTAINER_DIRS) {
608
+ const dir = join(container, name);
609
+ let stat;
610
+ try {
611
+ stat = lstatSync(dir);
612
+ } catch (error) {
613
+ if (error?.code === "ENOENT") continue;
614
+ throw error;
615
+ }
616
+ if (!stat.isDirectory()) {
617
+ rmSync(dir, { force: true });
618
+ continue;
619
+ }
620
+ for (const child of readdirSync(dir)) rmSync(join(dir, child), {
621
+ recursive: true,
622
+ force: true
623
+ });
624
+ }
625
+ }
435
626
  function uninstallIosApp(udid, bundleId) {
436
627
  getExecutor().runFile("xcrun", [
437
628
  "simctl",
@@ -526,4 +717,4 @@ function listIosRuntimes() {
526
717
  }));
527
718
  }
528
719
  //#endregion
529
- export { sanitizeDeviceLabel as C, parseIosSimulatorApp as D, configuredIosSimulatorViewer as E, hostMemoryPressureAdvice as O, resolveOwnedIosSim as S, uninstallIosApp as T, parseSimctlList as _, deleteParkedIosSim as a, resetIosPrivacy as b, iosSimulatorFailureAdvice as c, listIosDeviceTypes as d, listIosRuntimes as f, parseRuntimeVersion as g, parkedSimName as h, deleteIosSim as i, readHostMemoryPressure as k, listAllIosSims as l, ownedSimName as m, bootIosSim as n, eraseIosSim as o, listUserApps as p, createOwnedIosSim as r, iosRuntimeMatches as s, IOS_BOOT_TIMEOUT_MS as t, listAllIosSimsAsync as u, renameIosSim as v, shutdownIosSim as w, resolveIosCreation as x, resetIosKeychain as y };
720
+ export { hostMemoryPressureAdvice as A, resolveIosCreation as C, uninstallIosApp as D, shutdownIosSim as E, deviceHoldsApk as M, deviceHoldsBundle as N, configuredIosSimulatorViewer as O, resetIosPrivacy as S, sanitizeDeviceLabel as T, parseRuntimeVersion as _, deleteIosSim as a, renameIosSim as b, iosRuntimeMatches as c, listAllIosSimsAsync as d, listIosDeviceTypes as f, parkedSimName as g, ownedSimName as h, createOwnedIosSim as i, readHostMemoryPressure as j, parseIosSimulatorApp as k, iosSimulatorFailureAdvice as l, listUserApps as m, bootIosSim as n, deleteParkedIosSim as o, listIosRuntimes as p, clearIosAppData as r, eraseIosSim as s, IOS_BOOT_TIMEOUT_MS as t, listAllIosSims as u, parseSimctlList as v, resolveOwnedIosSim as w, resetIosKeychain as x, pickDefaultIosCreation as y };