sootsim 0.1.82 → 0.1.84

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 (209) hide show
  1. package/README.md +0 -1
  2. package/detox/colors.ts +54 -0
  3. package/detox/config-loader.ts +135 -0
  4. package/detox/expectations.ts +477 -0
  5. package/detox/gestures.ts +442 -0
  6. package/detox/index.ts +1436 -0
  7. package/detox/jest-environment.ts +86 -0
  8. package/detox/jest-preset.cjs +50 -0
  9. package/detox/matchers.ts +29 -0
  10. package/detox/navigation.ts +43 -0
  11. package/detox/run-test.ts +113 -0
  12. package/detox/screenshots/animated-color-test-rest-norngh.png +0 -0
  13. package/detox/screenshots/color-test-after-drag-norngh.png +0 -0
  14. package/detox/screenshots/color-test-rest-norngh.png +0 -0
  15. package/detox/screenshots/theme-blue-toggle.png +0 -0
  16. package/detox/screenshots/theme-blue.png +0 -0
  17. package/detox/screenshots/theme-red-toggle.png +0 -0
  18. package/detox/screenshots/theme-red.png +0 -0
  19. package/dist-cli/bin.js +3 -3
  20. package/dist-cli/chunks/{agent-3C6Z6YXA.js → agent-2CWD6W6P.js} +2 -2
  21. package/dist-cli/chunks/{agent-wrapper-7Z4UFACX.js → agent-wrapper-5W3LOX6S.js} +2 -2
  22. package/dist-cli/chunks/{assert-XYBIZRDK.js → assert-ZOMAMKRT.js} +2 -2
  23. package/dist-cli/chunks/auto-bootstrap-NYYSMTIM.js +2 -0
  24. package/dist-cli/chunks/beta-4K2SQACK.js +2 -0
  25. package/dist-cli/chunks/chunk-3HXQ7MJK.js +79 -0
  26. package/dist-cli/chunks/{chunk-EJGEDUOC.js → chunk-4K7BH2D4.js} +3 -3
  27. package/dist-cli/chunks/{chunk-2EFQQWEC.js → chunk-4OPRODFA.js} +2 -2
  28. package/dist-cli/chunks/{chunk-Z6G5SDG7.js → chunk-4OWVPRZV.js} +2 -2
  29. package/dist-cli/chunks/{chunk-DCFGNIJC.js → chunk-5XCXOLG2.js} +2 -2
  30. package/dist-cli/chunks/chunk-67ZZ2CM5.js +1 -0
  31. package/dist-cli/chunks/{chunk-M3OULYY3.js → chunk-73UZXB4B.js} +2 -2
  32. package/dist-cli/chunks/{chunk-QPDWMYCA.js → chunk-7NWNTUJF.js} +1 -1
  33. package/dist-cli/chunks/chunk-7YHDJLO2.js +119 -0
  34. package/dist-cli/chunks/{chunk-EX6IOT23.js → chunk-AJVTY6KY.js} +2 -2
  35. package/dist-cli/chunks/chunk-AWSQUOAS.js +67 -0
  36. package/dist-cli/chunks/{chunk-JVNGH5S7.js → chunk-BCBNVJVG.js} +1 -1
  37. package/dist-cli/chunks/{chunk-WZLKUS54.js → chunk-BKBL6K2G.js} +1 -1
  38. package/dist-cli/chunks/{chunk-DSYW2NOW.js → chunk-C3DPQZ4J.js} +2 -2
  39. package/dist-cli/chunks/chunk-D3ZSBIIY.js +2 -0
  40. package/dist-cli/chunks/{chunk-PYDAVGCZ.js → chunk-D4HUVLZR.js} +1 -1
  41. package/dist-cli/chunks/{chunk-H6NBDJIO.js → chunk-DUUSJDES.js} +1 -1
  42. package/dist-cli/chunks/{chunk-BVXP2GDN.js → chunk-ELJLF4SG.js} +3 -3
  43. package/dist-cli/chunks/{chunk-TR7NIFSL.js → chunk-EQ7TFQ2F.js} +1 -1
  44. package/dist-cli/chunks/{chunk-UOWBKSSI.js → chunk-EQCKGC4B.js} +1 -1
  45. package/dist-cli/chunks/chunk-FUCGLWNN.js +1 -0
  46. package/dist-cli/chunks/{chunk-BISEHRNE.js → chunk-HYPJW65U.js} +2 -2
  47. package/dist-cli/chunks/chunk-IILJQCZA.js +2 -0
  48. package/dist-cli/chunks/{chunk-2XULSYS6.js → chunk-KU6MSPAH.js} +2 -2
  49. package/dist-cli/chunks/{chunk-QTJJHBCI.js → chunk-OOOR7NT2.js} +1 -1
  50. package/dist-cli/chunks/{chunk-U3XCDQRH.js → chunk-P7WDNKOS.js} +3 -3
  51. package/dist-cli/chunks/{chunk-C7JOLDDQ.js → chunk-PPKKA5VW.js} +2 -2
  52. package/dist-cli/chunks/{chunk-JUCV3VHM.js → chunk-PS2G44GT.js} +2 -2
  53. package/dist-cli/chunks/{chunk-PO64TMRT.js → chunk-QMSJR5R2.js} +2 -2
  54. package/dist-cli/chunks/{chunk-4QUAOBUB.js → chunk-RF4R2U46.js} +2 -2
  55. package/dist-cli/chunks/{chunk-D3SM2JYB.js → chunk-RIXUH3NK.js} +2 -2
  56. package/dist-cli/chunks/{chunk-2JQIKL3B.js → chunk-SFGUPL2X.js} +2 -2
  57. package/dist-cli/chunks/{chunk-GI5MF6LP.js → chunk-SQX5CAYG.js} +1 -1
  58. package/dist-cli/chunks/{chunk-Q4JNA5VO.js → chunk-SQZAC7C4.js} +1 -1
  59. package/dist-cli/chunks/{chunk-M4ERVRM4.js → chunk-SV7FOGJ3.js} +2 -2
  60. package/dist-cli/chunks/{chunk-ZN2C7V5R.js → chunk-TK3OJSEO.js} +2 -2
  61. package/dist-cli/chunks/{chunk-7SCQEPXK.js → chunk-TL7SIZ7S.js} +1 -1
  62. package/dist-cli/chunks/{chunk-IZ2OO47Y.js → chunk-V2GQ4WXJ.js} +2 -2
  63. package/dist-cli/chunks/{chunk-JUDJXJSE.js → chunk-VH7F45CN.js} +1 -1
  64. package/dist-cli/chunks/chunk-WNVNU2OW.js +4 -0
  65. package/dist-cli/chunks/{chunk-O3AOQP3V.js → chunk-XQ2OBHBE.js} +2 -2
  66. package/dist-cli/chunks/{chunk-MQXYJTXM.js → chunk-YCIA4BHJ.js} +2 -2
  67. package/dist-cli/chunks/chunk-ZSMMJMPA.js +1 -0
  68. package/dist-cli/chunks/cli-version-QB4VH24H.js +2 -0
  69. package/dist-cli/chunks/{compat-2DVSCCR7.js → compat-FWSEEGEH.js} +3 -3
  70. package/dist-cli/chunks/{config-YDX4Q4XM.js → config-CYI2WAGP.js} +2 -2
  71. package/dist-cli/chunks/control-UXY7YQVX.js +2 -0
  72. package/dist-cli/chunks/{cpu-profile-GU62WVZZ.js → cpu-profile-IKAE3KTY.js} +2 -2
  73. package/dist-cli/chunks/{daemon-V5NLDTSB.js → daemon-ZUMF53YB.js} +2 -2
  74. package/dist-cli/chunks/{debug-HAOCONNB.js → debug-P6KULKKS.js} +3 -3
  75. package/dist-cli/chunks/{detox-YLC4DLXB.js → detox-SPWAZCYG.js} +2 -2
  76. package/dist-cli/chunks/{device-ZQ4DN4H6.js → device-JWEPK6I2.js} +2 -2
  77. package/dist-cli/chunks/{diagnose-HNUO3Z5F.js → diagnose-IZODTXV2.js} +2 -2
  78. package/dist-cli/chunks/drivers-MK6WJKBC.js +2 -0
  79. package/dist-cli/chunks/{electron-ZAASAHSW.js → electron-R5GP6RVB.js} +3 -3
  80. package/dist-cli/chunks/flow-6O4GEOPJ.js +2 -0
  81. package/dist-cli/chunks/{hints-BA3GE5W5.js → hints-DYDNYX7N.js} +2 -2
  82. package/dist-cli/chunks/{home-paths-MQXRHBTW.js → home-paths-GLMX5OKL.js} +2 -2
  83. package/dist-cli/chunks/{inspect-T4RMS5KX.js → inspect-FJOPCTY2.js} +3 -3
  84. package/dist-cli/chunks/install-A3TUGGHN.js +2 -0
  85. package/dist-cli/chunks/{install-desktop-MH26VONS.js → install-desktop-YPJZMZM5.js} +3 -3
  86. package/dist-cli/chunks/{keys-IELIDRGB.js → keys-GSYPHWNY.js} +2 -2
  87. package/dist-cli/chunks/{launch-VMT3OWOB.js → launch-4G2PKW5X.js} +3 -3
  88. package/dist-cli/chunks/{login-VZBANVLU.js → login-KJQGHA64.js} +4 -4
  89. package/dist-cli/chunks/{logout-GWXBTQ4H.js → logout-XM2SYH5C.js} +2 -2
  90. package/dist-cli/chunks/{maestro-JYHR4HFR.js → maestro-EOWGI7DG.js} +2 -2
  91. package/dist-cli/chunks/{preview-RPZ4UQ2B.js → preview-F73TKK37.js} +2 -2
  92. package/dist-cli/chunks/{profile-7FLDF2AP.js → profile-22FDKBUO.js} +2 -2
  93. package/dist-cli/chunks/{react-3RC4CNDZ.js → react-5L6VPFUP.js} +2 -2
  94. package/dist-cli/chunks/record-JZXCQ4IN.js +70 -0
  95. package/dist-cli/chunks/runtime-EEBX7CFV.js +2 -0
  96. package/dist-cli/chunks/{runtime-delivery-Z7I2KIRB.js → runtime-delivery-LXUM3R4A.js} +2 -2
  97. package/dist-cli/chunks/{screenshot-GRCZ6AM4.js → screenshot-HDRRG33Q.js} +2 -2
  98. package/dist-cli/chunks/{screenshot-mode-E4YHXHH5.js → screenshot-mode-WY63LZIX.js} +2 -2
  99. package/dist-cli/chunks/{screenshots-7SXMX2AY.js → screenshots-MPV2ENL5.js} +2 -2
  100. package/dist-cli/chunks/{server-GDJ2TCRV.js → server-5LBMCJ3G.js} +2 -2
  101. package/dist-cli/chunks/setup-repo-SZSYNKNI.js +2 -0
  102. package/dist-cli/chunks/{skills-62E7NDRC.js → skills-BQ73YOBF.js} +2 -2
  103. package/dist-cli/chunks/{start-Y7KR5ZQ3.js → start-2WU4W6ZU.js} +4 -4
  104. package/dist-cli/chunks/store-RE45SUBF.js +2 -0
  105. package/dist-cli/chunks/telemetry-DG6GJLCP.js +2 -0
  106. package/dist-cli/chunks/{test-IYMSUPVC.js → test-OVO4CQTG.js} +3 -3
  107. package/dist-cli/chunks/{three-mode-QKKXCCC2.js → three-mode-BKM3KFM7.js} +2 -2
  108. package/dist-cli/chunks/{timeline-PF6NQ7RT.js → timeline-MDXGEDQL.js} +2 -2
  109. package/dist-cli/chunks/{upgrade-CE2Y3TAN.js → upgrade-JGQABWVF.js} +2 -2
  110. package/dist-cli/chunks/upload-UJNUA4ZV.js +2 -0
  111. package/dist-cli/chunks/{web-XEO3ZCPF.js → web-WYFAYQ72.js} +2 -2
  112. package/dist-cli/chunks/{what-happened-372J7YF7.js → what-happened-PZW2KW6A.js} +2 -2
  113. package/dist-cli/chunks/{whoami-B4E7KCT5.js → whoami-7ATWJQS6.js} +2 -2
  114. package/dist-lib/agent-daemon-client.cjs +1 -1
  115. package/dist-lib/agent-events.cjs +1 -1
  116. package/dist-lib/agent-sessions.cjs +1 -1
  117. package/dist-lib/attached-projects.cjs +1 -1
  118. package/dist-lib/auth/shared-session.cjs +1 -1
  119. package/dist-lib/backend-origin.cjs +1 -1
  120. package/dist-lib/beta.cjs +44 -0
  121. package/dist-lib/bridge-constants.cjs +1 -1
  122. package/dist-lib/cli-constants.cjs +1 -1
  123. package/dist-lib/config.cjs +1 -1
  124. package/dist-lib/detox/index.cjs +1770 -0
  125. package/dist-lib/detox/jest-preset.cjs +50 -0
  126. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  127. package/dist-lib/home-paths.cjs +1 -1
  128. package/dist-lib/host/bridge-host.cjs +1 -1
  129. package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
  130. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  131. package/dist-lib/index.cjs +1 -1
  132. package/dist-lib/metro.cjs +1 -1
  133. package/dist-lib/profiles.cjs +1 -1
  134. package/dist-lib/render-mode.cjs +1 -1
  135. package/dist-lib/scripts/demo-app-registry.cjs +809 -0
  136. package/dist-lib/scripts/dev-server-scanner.cjs +1269 -0
  137. package/dist-lib/skills.cjs +8322 -0
  138. package/dist-lib/vite-base.cjs +3 -3
  139. package/dist-lib/vite.cjs +1 -1
  140. package/package.json +39 -10
  141. package/scripts/demo-app-registry.ts +989 -0
  142. package/scripts/dev-server-scanner.ts +674 -0
  143. package/src/agent-daemon-client.ts +390 -0
  144. package/src/agent-events.ts +71 -0
  145. package/src/agent-prompt.ts +71 -0
  146. package/src/agent-sessions.ts +572 -0
  147. package/src/attached-projects.ts +536 -0
  148. package/src/auth/shared-session.ts +199 -0
  149. package/src/backend-origin.ts +49 -0
  150. package/src/beta.ts +21 -0
  151. package/src/bridge-constants.ts +10 -0
  152. package/src/cli-constants.ts +1 -0
  153. package/src/cli-version.ts +30 -0
  154. package/src/codex-client.ts +215 -0
  155. package/src/config.ts +110 -0
  156. package/src/dev-bundle-resolution.ts +180 -0
  157. package/src/home-paths.ts +382 -0
  158. package/src/host/agent-host.ts +576 -0
  159. package/src/host/bridge-host.ts +2293 -0
  160. package/src/host/fetch-proxy-handler.ts +288 -0
  161. package/src/host/fetch-proxy-overrides.ts +39 -0
  162. package/src/host/open-url.ts +234 -0
  163. package/src/index.ts +9 -0
  164. package/src/metro-plugin.ts +207 -0
  165. package/src/native-dev-bundle-url.ts +62 -0
  166. package/src/native-seam-manifest.ts +313 -0
  167. package/src/profiles.ts +179 -0
  168. package/src/render-mode.ts +27 -0
  169. package/src/runtime-delivery.ts +334 -0
  170. package/src/screenshots/compose.ts +422 -0
  171. package/src/screenshots/frame-compose.ts +438 -0
  172. package/src/screenshots/orchestrate.ts +244 -0
  173. package/src/screenshots/registry.ts +58 -0
  174. package/src/screenshots/schema.ts +364 -0
  175. package/src/skills/builtin/a11y-review.ts +126 -0
  176. package/src/skills/builtin/compat-check.ts +104 -0
  177. package/src/skills/builtin/perf-profile.ts +84 -0
  178. package/src/skills/builtin/screenshot-all.ts +46 -0
  179. package/src/skills/builtin/test-flow.ts +118 -0
  180. package/src/skills/builtin/visual-diff.ts +94 -0
  181. package/src/skills/registry.ts +107 -0
  182. package/src/skills/types.ts +41 -0
  183. package/src/vite-plugin-one.ts +187 -0
  184. package/src/vite-plugin.ts +1381 -0
  185. package/src/worklets-babel.ts +132 -0
  186. package/dist-cli/chunks/auto-bootstrap-D2EQVL7R.js +0 -2
  187. package/dist-cli/chunks/beta-VHPXECZY.js +0 -2
  188. package/dist-cli/chunks/chunk-27HBWBE6.js +0 -4
  189. package/dist-cli/chunks/chunk-2W5C5J4O.js +0 -64
  190. package/dist-cli/chunks/chunk-3OH4VCJA.js +0 -1
  191. package/dist-cli/chunks/chunk-45HLFQRI.js +0 -2
  192. package/dist-cli/chunks/chunk-7YLCK5HG.js +0 -5
  193. package/dist-cli/chunks/chunk-BRDUKIZI.js +0 -119
  194. package/dist-cli/chunks/chunk-GADW2Q5S.js +0 -1
  195. package/dist-cli/chunks/chunk-HST43CVE.js +0 -2
  196. package/dist-cli/chunks/chunk-QJBQOGTK.js +0 -73
  197. package/dist-cli/chunks/chunk-V26REV7G.js +0 -1
  198. package/dist-cli/chunks/cli-version-WF7T6IKI.js +0 -2
  199. package/dist-cli/chunks/control-EAK2OPGB.js +0 -2
  200. package/dist-cli/chunks/demo-app-registry-52A2MI72.js +0 -2
  201. package/dist-cli/chunks/drivers-B4QPIZ4B.js +0 -2
  202. package/dist-cli/chunks/flow-PFLHFNVM.js +0 -2
  203. package/dist-cli/chunks/install-ZCPEMK6U.js +0 -2
  204. package/dist-cli/chunks/record-CZ33G5FT.js +0 -70
  205. package/dist-cli/chunks/runtime-AZKHZHJ4.js +0 -2
  206. package/dist-cli/chunks/setup-repo-3Y2QAZRK.js +0 -2
  207. package/dist-cli/chunks/store-TDTFZMGA.js +0 -2
  208. package/dist-cli/chunks/telemetry-G3NIU5NP.js +0 -2
  209. package/dist-cli/chunks/upload-CLWFS7IL.js +0 -2
@@ -0,0 +1,809 @@
1
+ /*! sootsim v0.1.84 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
2
+ let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
3
+ "use strict";
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
+
22
+ // scripts/demo-app-registry.ts
23
+ var demo_app_registry_exports = {};
24
+ __export(demo_app_registry_exports, {
25
+ APPS: () => APPS
26
+ });
27
+ module.exports = __toCommonJS(demo_app_registry_exports);
28
+ var import_node_fs = require("node:fs");
29
+ var import_node_os = require("node:os");
30
+ var import_node_path = require("node:path");
31
+ var HOME = (0, import_node_os.homedir)();
32
+ function findWorkspaceRoot(startDir) {
33
+ let dir = startDir;
34
+ while (true) {
35
+ if ((0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "pnpm-workspace.yaml")) || (0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "turbo.json")) || (0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "nx.json")) || (0, import_node_fs.existsSync)((0, import_node_path.join)(dir, "lerna.json"))) {
36
+ return dir;
37
+ }
38
+ const packageJsonPath = (0, import_node_path.join)(dir, "package.json");
39
+ if ((0, import_node_fs.existsSync)(packageJsonPath)) {
40
+ try {
41
+ const pkg = JSON.parse((0, import_node_fs.readFileSync)(packageJsonPath, "utf8"));
42
+ if (pkg.workspaces) return dir;
43
+ } catch {
44
+ }
45
+ }
46
+ const parent = (0, import_node_path.dirname)(dir);
47
+ if (parent === dir) return null;
48
+ dir = parent;
49
+ }
50
+ }
51
+ function resolveWorkspaceScriptPath(workspaceRelativePath, packageRelativePath) {
52
+ const workspaceRoot = findWorkspaceRoot(process.cwd());
53
+ const candidates = [
54
+ workspaceRoot ? (0, import_node_path.resolve)(workspaceRoot, workspaceRelativePath) : null,
55
+ (0, import_node_path.resolve)(process.cwd(), workspaceRelativePath),
56
+ (0, import_node_path.resolve)(process.cwd(), packageRelativePath)
57
+ ].filter((candidate) => Boolean(candidate));
58
+ for (const candidate of candidates) {
59
+ if ((0, import_node_fs.existsSync)(candidate)) return candidate;
60
+ }
61
+ return candidates[0] ?? (0, import_node_path.resolve)(process.cwd(), workspaceRelativePath);
62
+ }
63
+ var getExpensifyProxyScript = () => resolveWorkspaceScriptPath(
64
+ "packages/sootsim-engine/scripts/expensify-web-proxy.ts",
65
+ "scripts/expensify-web-proxy.ts"
66
+ );
67
+ var getRainbowMetadataProxyScript = () => resolveWorkspaceScriptPath(
68
+ "packages/sootsim-engine/scripts/rainbow-metadata-proxy.ts",
69
+ "scripts/rainbow-metadata-proxy.ts"
70
+ );
71
+ var getMattermostRNUtilsNativeModule = () => resolveWorkspaceScriptPath(
72
+ "packages/compat/src/stubs/mattermost-rnutils-native.ts",
73
+ "../compat/src/stubs/mattermost-rnutils-native.ts"
74
+ );
75
+ var getMattermostKeychainNativeModule = () => resolveWorkspaceScriptPath(
76
+ "packages/compat/src/stubs/native-seams/react-native-keychain-manager.ts",
77
+ "../compat/src/stubs/native-seams/react-native-keychain-manager.ts"
78
+ );
79
+ var getMattermostNetworkClientNativeModule = () => resolveWorkspaceScriptPath(
80
+ "packages/compat/src/stubs/mattermost-network-client-native.ts",
81
+ "../compat/src/stubs/mattermost-network-client-native.ts"
82
+ );
83
+ var getMattermostPreviewServerScript = () => resolveWorkspaceScriptPath(
84
+ "packages/sootsim-engine/scripts/mattermost-preview-server.ts",
85
+ "scripts/mattermost-preview-server.ts"
86
+ );
87
+ var EXPENSIFY_NATIVE_PROXY_ENV = {
88
+ USE_NGROK: "true",
89
+ NGROK_URL: "http://localhost:9000/",
90
+ SECURE_NGROK_URL: "http://localhost:9000/"
91
+ };
92
+ var MATTERMOST_DIR = (0, import_node_path.join)(HOME, "github/mattermost-mobile");
93
+ var UNISWAP_REPO_DIR = (0, import_node_path.join)(HOME, "github/uniswap-interface");
94
+ var UNISWAP_APP_DIR = (0, import_node_path.join)(UNISWAP_REPO_DIR, "apps/mobile");
95
+ var UNISWAP_ENV_LOCAL_FILE = (0, import_node_path.join)(UNISWAP_REPO_DIR, ".env.defaults.local");
96
+ var UNISWAP_PLACEHOLDER = "stored-in-.env.local";
97
+ var UNISWAP_DEMO_ENV_MARKER = "# sootsim demo env overrides";
98
+ var UNISWAP_FORCE_UPGRADE_HOOK_FILE = (0, import_node_path.join)(
99
+ UNISWAP_REPO_DIR,
100
+ "packages/uniswap/src/features/forceUpgrade/hooks/useForceUpgradeStatus.ts"
101
+ );
102
+ var UNISWAP_FORCE_UPGRADE_NOTIFICATION_FILE = (0, import_node_path.join)(
103
+ UNISWAP_REPO_DIR,
104
+ "apps/mobile/src/notification-service/data-sources/createForceUpgradeNotificationDataSource.ts"
105
+ );
106
+ var UNISWAP_FORCE_UPGRADE_PATCH_MARKER = "SOOTSIM_DEMO_DISABLE_FORCE_UPGRADE";
107
+ function parseEnvFile(filePath) {
108
+ if (!(0, import_node_fs.existsSync)(filePath)) return {};
109
+ const env = {};
110
+ const source = (0, import_node_fs.readFileSync)(filePath, "utf8");
111
+ for (const rawLine of source.split(/\r?\n/)) {
112
+ const line = rawLine.trim();
113
+ if (!line || line.startsWith("#")) continue;
114
+ const match = line.match(/^([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.*)$/);
115
+ if (!match) continue;
116
+ let value = match[2].trim();
117
+ if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
118
+ value = value.slice(1, -1);
119
+ }
120
+ env[match[1]] = value;
121
+ }
122
+ return env;
123
+ }
124
+ function isUsableUniswapEnvValue(value) {
125
+ if (!value) return false;
126
+ const trimmed = value.trim();
127
+ if (!trimmed) return false;
128
+ if (trimmed.includes(UNISWAP_PLACEHOLDER)) return false;
129
+ if (trimmed === "TRADING_API_KEY" || trimmed === "UNISWAP_API_KEY") return false;
130
+ return true;
131
+ }
132
+ function pickEnvValue(sources, keys) {
133
+ for (const source of sources) {
134
+ for (const key of keys) {
135
+ const value = source[key];
136
+ if (isUsableUniswapEnvValue(value)) return value.trim();
137
+ }
138
+ }
139
+ return void 0;
140
+ }
141
+ function resolveUniswapDemoEnv() {
142
+ const localEnv = parseEnvFile(UNISWAP_ENV_LOCAL_FILE);
143
+ const webEnv = parseEnvFile((0, import_node_path.join)(UNISWAP_REPO_DIR, "apps/web/.env"));
144
+ const sources = [
145
+ process.env,
146
+ localEnv,
147
+ webEnv
148
+ ];
149
+ const env = {};
150
+ const bindings = [
151
+ ["AMPLITUDE_PROXY_URL_OVERRIDE", ["REACT_APP_AMPLITUDE_PROXY_URL"]],
152
+ ["QUICKNODE_ENDPOINT_NAME", ["REACT_APP_QUICKNODE_ENDPOINT_NAME"]],
153
+ ["QUICKNODE_ENDPOINT_TOKEN", ["REACT_APP_QUICKNODE_ENDPOINT_TOKEN"]],
154
+ ["INFURA_KEY", ["REACT_APP_INFURA_KEY"]],
155
+ ["STATSIG_API_KEY", ["REACT_APP_STATSIG_API_KEY"]],
156
+ ["STATSIG_PROXY_URL_OVERRIDE", ["REACT_APP_STATSIG_PROXY_URL"]],
157
+ ["WALLETCONNECT_PROJECT_ID", ["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],
158
+ ["WALLETCONNECT_PROJECT_ID_BETA", ["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],
159
+ ["WALLETCONNECT_PROJECT_ID_DEV", ["REACT_APP_WALLET_CONNECT_PROJECT_ID"]],
160
+ ["TRADING_API_KEY", ["REACT_APP_TRADING_API_KEY"]],
161
+ ["UNISWAP_API_KEY", []]
162
+ ];
163
+ for (const [target, aliases] of bindings) {
164
+ const value = pickEnvValue(sources, [target, ...aliases]);
165
+ if (!value) continue;
166
+ env[target] = value;
167
+ for (const alias of aliases) {
168
+ env[alias] = value;
169
+ }
170
+ }
171
+ const hasPrivateGatewayKeys = isUsableUniswapEnvValue(env.TRADING_API_KEY) && isUsableUniswapEnvValue(env.UNISWAP_API_KEY);
172
+ if (!hasPrivateGatewayKeys) {
173
+ const publicGraphqlUrl = pickEnvValue(sources, ["GRAPHQL_URL_OVERRIDE", "REACT_APP_AWS_API_ENDPOINT"]) || "https://interface.gateway.uniswap.org/v1/graphql";
174
+ env.API_BASE_URL_OVERRIDE = "https://interface.gateway.uniswap.org";
175
+ env.API_BASE_URL_V2_OVERRIDE = "https://interface.gateway.uniswap.org/v2";
176
+ env.GRAPHQL_URL_OVERRIDE = publicGraphqlUrl;
177
+ env.TRADING_API_URL_OVERRIDE = "https://trading-api-labs.interface.gateway.uniswap.org";
178
+ env.FOR_API_URL_OVERRIDE = "https://for.interface.gateway.uniswap.org/v2/FOR.v1.FORService";
179
+ }
180
+ return env;
181
+ }
182
+ function ensureUniswapDemoEnvLocal() {
183
+ const existingSource = (0, import_node_fs.existsSync)(UNISWAP_ENV_LOCAL_FILE) ? (0, import_node_fs.readFileSync)(UNISWAP_ENV_LOCAL_FILE, "utf8") : "";
184
+ if (existingSource && !existingSource.includes(UNISWAP_DEMO_ENV_MARKER)) {
185
+ return;
186
+ }
187
+ const env = resolveUniswapDemoEnv();
188
+ const lines = [UNISWAP_DEMO_ENV_MARKER];
189
+ for (const [key, value] of Object.entries(env).sort(([a], [b]) => a.localeCompare(b))) {
190
+ lines.push(`${key}=${JSON.stringify(value)}`);
191
+ }
192
+ lines.push("");
193
+ (0, import_node_fs.writeFileSync)(UNISWAP_ENV_LOCAL_FILE, `${lines.join("\n")}
194
+ `);
195
+ }
196
+ function ensureUniswapForceUpgradePatched() {
197
+ const hookNeedle = `export function useForceUpgradeStatus(): ForceUpgradeStatus {
198
+ `;
199
+ const hookPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
200
+ return 'not-required'
201
+
202
+ `;
203
+ const hookLegacyPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
204
+ if (process.env.${UNISWAP_FORCE_UPGRADE_PATCH_MARKER} === 'true') {
205
+ return 'not-required'
206
+ }
207
+
208
+ `;
209
+ const notificationNeedle = ` const getForceUpgradeStatus = (): ForceUpgradeStatus => {
210
+ `;
211
+ const notificationPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
212
+ return 'not-required'
213
+
214
+ `;
215
+ const notificationLegacyPatch = ` // sootsim demo: bypass the force-upgrade gate during local engine demos.
216
+ if (process.env.${UNISWAP_FORCE_UPGRADE_PATCH_MARKER} === 'true') {
217
+ return 'not-required'
218
+ }
219
+
220
+ `;
221
+ const patchWithMigration = (filePath, needle, patch, legacyPatch) => {
222
+ const source = (0, import_node_fs.readFileSync)(filePath, "utf8");
223
+ if (source.includes(patch)) return;
224
+ if (source.includes(legacyPatch)) {
225
+ (0, import_node_fs.writeFileSync)(filePath, source.replace(legacyPatch, patch));
226
+ return;
227
+ }
228
+ if (!source.includes(needle)) {
229
+ throw new Error(
230
+ `uniswap demo patch failed: expected snippet not found in ${filePath}`
231
+ );
232
+ }
233
+ (0, import_node_fs.writeFileSync)(filePath, source.replace(needle, `${needle}${patch}`));
234
+ };
235
+ patchWithMigration(
236
+ UNISWAP_FORCE_UPGRADE_HOOK_FILE,
237
+ hookNeedle,
238
+ hookPatch,
239
+ hookLegacyPatch
240
+ );
241
+ patchWithMigration(
242
+ UNISWAP_FORCE_UPGRADE_NOTIFICATION_FILE,
243
+ notificationNeedle,
244
+ notificationPatch,
245
+ notificationLegacyPatch
246
+ );
247
+ }
248
+ var JOPLIN_DIR = (0, import_node_path.join)(HOME, "github/joplin");
249
+ var JOPLIN_APP_DIR = (0, import_node_path.join)(JOPLIN_DIR, "packages/app-mobile");
250
+ var JOPLIN_WATCH_ROOTS = [
251
+ "packages/lib",
252
+ "packages/renderer",
253
+ "packages/turndown",
254
+ "packages/turndown-plugin-gfm",
255
+ "packages/editor",
256
+ "packages/tools",
257
+ "packages/utils",
258
+ "packages/fork-htmlparser2",
259
+ "packages/fork-uslug",
260
+ "packages/fork-sax",
261
+ "packages/htmlpack",
262
+ "packages/react-native-saf-x",
263
+ "packages/react-native-alarm-notification"
264
+ ];
265
+ function ensureJoplinWatchmanConfigs() {
266
+ if (!(0, import_node_fs.existsSync)(JOPLIN_DIR)) return;
267
+ for (const rel of JOPLIN_WATCH_ROOTS) {
268
+ const dir = (0, import_node_path.join)(JOPLIN_DIR, rel);
269
+ if (!(0, import_node_fs.existsSync)(dir)) continue;
270
+ const cfg = (0, import_node_path.join)(dir, ".watchmanconfig");
271
+ if (!(0, import_node_fs.existsSync)(cfg)) (0, import_node_fs.writeFileSync)(cfg, "{}\n");
272
+ }
273
+ }
274
+ var JOPLIN_BUILD_SENTINELS = [
275
+ "packages/lib/models/Setting.js",
276
+ "packages/turndown/lib/turndown.cjs.js",
277
+ "packages/app-mobile/pluginAssets/index.js"
278
+ ];
279
+ function ensureJoplinBuilt() {
280
+ if (!(0, import_node_fs.existsSync)(JOPLIN_DIR)) return;
281
+ const missing = JOPLIN_BUILD_SENTINELS.filter(
282
+ (rel) => !(0, import_node_fs.existsSync)((0, import_node_path.join)(JOPLIN_DIR, rel))
283
+ );
284
+ if (missing.length === 0) return;
285
+ const { execSync } = require("node:child_process");
286
+ execSync("yarn buildParallel", {
287
+ cwd: JOPLIN_DIR,
288
+ stdio: "inherit",
289
+ env: { ...process.env, NO_FLIPPER: "1", CI: "" }
290
+ });
291
+ const stillMissing = JOPLIN_BUILD_SENTINELS.filter(
292
+ (rel) => !(0, import_node_fs.existsSync)((0, import_node_path.join)(JOPLIN_DIR, rel))
293
+ );
294
+ if (stillMissing.length > 0) {
295
+ throw new Error(
296
+ `joplin demo: yarn buildParallel did not produce: ${stillMissing.join(", ")}`
297
+ );
298
+ }
299
+ }
300
+ var RAINBOW_DIR = (0, import_node_path.join)(HOME, "github/rainbow");
301
+ var RAINBOW_GRAPHQL_DIR = (0, import_node_path.join)(RAINBOW_DIR, "src/graphql");
302
+ var RAINBOW_GRAPHQL_CONFIG_FILE = (0, import_node_path.join)(RAINBOW_GRAPHQL_DIR, "config.js");
303
+ var RAINBOW_NETWORKS_FILE = (0, import_node_path.join)(RAINBOW_DIR, "src/references/networks.json");
304
+ var RAINBOW_METADATA_BASE_URL = "https://metadata.p.rainbow.me";
305
+ var RAINBOW_METADATA_PROXY_PORT = 9011;
306
+ var RAINBOW_DEMO_METADATA_BASE_URL = `http://127.0.0.1:${RAINBOW_METADATA_PROXY_PORT}`;
307
+ var RAINBOW_PUBLIC_ENS_GRAPHQL_URL = "https://api.thegraph.com/subgraphs/name/ensdomains/ens";
308
+ var RAINBOW_DEMO_QUOTE_SIGNER = "0x0000000000000000000000000000000000000000";
309
+ var RAINBOW_DEMO_RELAY_URL = "https://relay.rainbow.me";
310
+ var RAINBOW_DEMO_MASTER_KEY = "sootsim-rainbow-demo-master-key-do-not-use-for-real-wallets";
311
+ var RAINBOW_DEMO_RPC_PROXY_BASE_URL = "https://rpc.rainbow.me/v1";
312
+ var RAINBOW_DEMO_RPC_API_KEY = "";
313
+ var RAINBOW_DEMO_PUBLIC_RPC_URLS = {
314
+ "1": "https://ethereum-rpc.publicnode.com"
315
+ };
316
+ var RAINBOW_DEMO_SERVICE_API_KEY = "sootsim-rainbow-demo-api-key";
317
+ var RAINBOW_DEMO_SECURE_WALLET_HASH_KEY = "0x736f6f7473696d2d7261696e626f772d64656d6f2d686173682d6b6579000000";
318
+ var RAINBOW_GRAPHQL_SENTINELS = [
319
+ "src/graphql/__generated__/ens.ts",
320
+ "src/graphql/__generated__/metadata.ts",
321
+ "src/graphql/__generated__/metadataPOST.ts"
322
+ ];
323
+ function runRainbowSetupCommand(command, cwd) {
324
+ const { execSync } = require("node:child_process");
325
+ execSync(command, {
326
+ cwd,
327
+ stdio: "inherit",
328
+ env: {
329
+ ...process.env,
330
+ METADATA_BASE_URL: RAINBOW_METADATA_BASE_URL,
331
+ RAINBOW_RELAY_QUOTE_SIGNER: process.env.RAINBOW_RELAY_QUOTE_SIGNER ?? RAINBOW_DEMO_QUOTE_SIGNER
332
+ }
333
+ });
334
+ }
335
+ function ensureRainbowGraphqlConfig() {
336
+ if (!(0, import_node_fs.existsSync)(RAINBOW_GRAPHQL_DIR)) return;
337
+ const source = (0, import_node_fs.existsSync)(RAINBOW_GRAPHQL_CONFIG_FILE) ? (0, import_node_fs.readFileSync)(RAINBOW_GRAPHQL_CONFIG_FILE, "utf8") : "";
338
+ if (source.includes(RAINBOW_PUBLIC_ENS_GRAPHQL_URL) && source.includes(RAINBOW_METADATA_BASE_URL)) {
339
+ return;
340
+ }
341
+ (0, import_node_fs.writeFileSync)(
342
+ RAINBOW_GRAPHQL_CONFIG_FILE,
343
+ `exports.config = {
344
+ ens: {
345
+ __name: 'ens',
346
+ document: './queries/ens.graphql',
347
+ schema: {
348
+ method: 'POST',
349
+ url: '${RAINBOW_PUBLIC_ENS_GRAPHQL_URL}',
350
+ },
351
+ },
352
+ metadata: {
353
+ __name: 'metadata',
354
+ document: './queries/metadata.graphql',
355
+ schema: { method: 'GET', url: '${RAINBOW_METADATA_BASE_URL}/v1/graph' },
356
+ },
357
+ metadataPOST: {
358
+ __name: 'metadataPOST',
359
+ document: './queries/metadata.graphql',
360
+ schema: { method: 'POST', url: '${RAINBOW_METADATA_BASE_URL}/v1/graph' },
361
+ },
362
+ arc: {
363
+ __name: 'arc',
364
+ document: './queries/arc.graphql',
365
+ schema: {
366
+ method: 'GET',
367
+ url: 'https://arc-graphql.rainbow.me/graphql',
368
+ headers: {
369
+ 'x-api-key': 'ARC_GRAPHQL_API_KEY',
370
+ },
371
+ },
372
+ },
373
+ arcDev: {
374
+ __name: 'arcDev',
375
+ document: './queries/arc.graphql',
376
+ schema: {
377
+ method: 'GET',
378
+ url: 'https://arc-graphql.rainbowdotme.workers.dev/graphql',
379
+ headers: {},
380
+ },
381
+ },
382
+ };
383
+ `
384
+ );
385
+ }
386
+ function resolveRainbowDemoEnv() {
387
+ const env = {
388
+ ENABLE_DEV_MODE: "1",
389
+ IS_TESTING: "false",
390
+ METADATA_BASE_URL: process.env.RAINBOW_METADATA_BASE_URL ?? RAINBOW_DEMO_METADATA_BASE_URL,
391
+ ADDYS_API_KEY: process.env.ADDYS_API_KEY ?? RAINBOW_DEMO_SERVICE_API_KEY,
392
+ ADDYS_BASE_URL: process.env.ADDYS_BASE_URL ?? RAINBOW_DEMO_METADATA_BASE_URL,
393
+ PLATFORM_API_KEY: process.env.PLATFORM_API_KEY ?? RAINBOW_DEMO_SERVICE_API_KEY,
394
+ PLATFORM_BASE_URL: process.env.PLATFORM_BASE_URL ?? RAINBOW_DEMO_METADATA_BASE_URL,
395
+ RAINBOW_MASTER_KEY: process.env.RAINBOW_MASTER_KEY ?? RAINBOW_DEMO_MASTER_KEY,
396
+ RAINBOW_RELAY_QUOTE_SIGNER: process.env.RAINBOW_RELAY_QUOTE_SIGNER ?? RAINBOW_DEMO_QUOTE_SIGNER,
397
+ RAINBOW_RELAY_URL: process.env.RAINBOW_RELAY_URL ?? RAINBOW_DEMO_RELAY_URL,
398
+ RPC_PROXY_API_KEY_PROD: RAINBOW_DEMO_RPC_API_KEY,
399
+ RPC_PROXY_BASE_URL_PROD: process.env.RAINBOW_RPC_PROXY_BASE_URL ?? process.env.RPC_PROXY_BASE_URL_PROD ?? RAINBOW_DEMO_RPC_PROXY_BASE_URL,
400
+ SECURE_WALLET_HASH_KEY: process.env.SECURE_WALLET_HASH_KEY ?? RAINBOW_DEMO_SECURE_WALLET_HASH_KEY
401
+ };
402
+ const optionalEnvVars = [
403
+ "ADDYS_API_KEY",
404
+ "ADDYS_BASE_URL",
405
+ "IMGIX_DOMAIN",
406
+ "IMGIX_TOKEN",
407
+ "PLATFORM_API_KEY",
408
+ "PLATFORM_BASE_URL",
409
+ "RAINBOW_TEST_WALLET",
410
+ "RAINBOW_RELAY_API_KEY",
411
+ "RAINBOW_RELAY_URL",
412
+ "SECURE_WALLET_HASH_KEY",
413
+ "TOKEN_SEARCH_URL",
414
+ "WC_PROJECT_ID"
415
+ ];
416
+ for (const key of optionalEnvVars) {
417
+ const value = process.env[key];
418
+ if (value) env[key] = value;
419
+ }
420
+ if (!env.WC_PROJECT_ID && process.env.RAINBOW_WALLETCONNECT_PROJECT_ID) {
421
+ env.WC_PROJECT_ID = process.env.RAINBOW_WALLETCONNECT_PROJECT_ID;
422
+ }
423
+ return env;
424
+ }
425
+ function ensureRainbowDemoNetworks() {
426
+ if (!(0, import_node_fs.existsSync)(RAINBOW_NETWORKS_FILE)) return;
427
+ const payload = JSON.parse((0, import_node_fs.readFileSync)(RAINBOW_NETWORKS_FILE, "utf8"));
428
+ if (!Array.isArray(payload.networks)) return;
429
+ let changed = false;
430
+ for (const network of payload.networks) {
431
+ const url = network.id ? RAINBOW_DEMO_PUBLIC_RPC_URLS[network.id] : void 0;
432
+ if (!url || !network.defaultRPC) continue;
433
+ if (network.defaultRPC.url === url) continue;
434
+ network.defaultRPC.url = url;
435
+ changed = true;
436
+ }
437
+ if (changed) {
438
+ (0, import_node_fs.writeFileSync)(RAINBOW_NETWORKS_FILE, `${JSON.stringify(payload)}
439
+ `);
440
+ }
441
+ }
442
+ function ensureRainbowSetup() {
443
+ if (!(0, import_node_fs.existsSync)(RAINBOW_DIR)) return;
444
+ ensureRainbowGraphqlConfig();
445
+ if (!(0, import_node_fs.existsSync)((0, import_node_path.join)(RAINBOW_GRAPHQL_DIR, "node_modules/.bin/graphql-codegen"))) {
446
+ runRainbowSetupCommand("fnm exec --using=22 yarn install", RAINBOW_GRAPHQL_DIR);
447
+ }
448
+ const missingGraphql = RAINBOW_GRAPHQL_SENTINELS.some(
449
+ (rel) => !(0, import_node_fs.existsSync)((0, import_node_path.join)(RAINBOW_DIR, rel))
450
+ );
451
+ if (missingGraphql) {
452
+ runRainbowSetupCommand("fnm exec --using=22 yarn codegen", RAINBOW_GRAPHQL_DIR);
453
+ }
454
+ if (!(0, import_node_fs.existsSync)(RAINBOW_NETWORKS_FILE)) {
455
+ runRainbowSetupCommand("fnm exec --using=22 yarn fetch:networks", RAINBOW_DIR);
456
+ }
457
+ ensureRainbowDemoNetworks();
458
+ }
459
+ var ARTSY_DIR = (0, import_node_path.join)(HOME, "github/eigen");
460
+ var ARTSY_KEYS_FILE = (0, import_node_path.join)(ARTSY_DIR, "keys.shared.json");
461
+ var ARTSY_METAFLAGS_FILE = (0, import_node_path.join)(ARTSY_DIR, "metaflags.json");
462
+ var ARTSY_RELAY_SENTINEL = (0, import_node_path.join)(ARTSY_DIR, "src/__generated__/.relay-complete");
463
+ function readArtsyKeysPayload() {
464
+ if (!(0, import_node_fs.existsSync)(ARTSY_KEYS_FILE)) return void 0;
465
+ try {
466
+ const parsed = JSON.parse((0, import_node_fs.readFileSync)(ARTSY_KEYS_FILE, "utf8"));
467
+ if (!parsed || typeof parsed !== "object") return void 0;
468
+ const secure = parsed.secure && typeof parsed.secure === "object" ? parsed.secure : void 0;
469
+ const publicKeys = parsed.public && typeof parsed.public === "object" ? parsed.public : void 0;
470
+ if (!secure && !publicKeys) return void 0;
471
+ return { secure, public: publicKeys };
472
+ } catch {
473
+ return void 0;
474
+ }
475
+ }
476
+ function resolveArtsyRuntimeConfig() {
477
+ const email = process.env.SOOTSIM_ARTSY_EMAIL ?? process.env.MAESTRO_TEST_EMAIL;
478
+ const password = process.env.SOOTSIM_ARTSY_PASSWORD ?? process.env.MAESTRO_TEST_PASSWORD;
479
+ const keys = readArtsyKeysPayload();
480
+ const env = {};
481
+ if (email && password) {
482
+ env.SOOTSIM_LAUNCH_ARGUMENTS = JSON.stringify({
483
+ email,
484
+ password,
485
+ useMaestroInit: true
486
+ });
487
+ }
488
+ if (keys) {
489
+ env.SOOTSIM_REACT_NATIVE_KEYS_JSON = JSON.stringify(keys);
490
+ }
491
+ if (Object.keys(env).length === 0) return void 0;
492
+ return {
493
+ env
494
+ };
495
+ }
496
+ function ensureArtsySetup() {
497
+ if (!(0, import_node_fs.existsSync)(ARTSY_DIR)) return;
498
+ const { execSync } = require("node:child_process");
499
+ const yarnRelease = (0, import_node_path.join)(ARTSY_DIR, ".yarn/releases/yarn-4.10.3.cjs");
500
+ if ((0, import_node_fs.existsSync)(yarnRelease)) {
501
+ const src = (0, import_node_fs.readFileSync)(yarnRelease, "utf8");
502
+ const needle = '["clone","-c core.autocrlf=false",';
503
+ if (src.includes(needle)) {
504
+ (0, import_node_fs.writeFileSync)(
505
+ yarnRelease,
506
+ src.replace(needle, '["clone","-c","core.autocrlf=false",')
507
+ );
508
+ }
509
+ }
510
+ if (!(0, import_node_fs.existsSync)((0, import_node_path.join)(ARTSY_DIR, "node_modules/.yarn-state.yml"))) {
511
+ execSync("yarn install", {
512
+ cwd: ARTSY_DIR,
513
+ stdio: "inherit",
514
+ env: { ...process.env, YARN_CHECKSUM_BEHAVIOR: "update" }
515
+ });
516
+ }
517
+ if (!(0, import_node_fs.existsSync)(ARTSY_KEYS_FILE) || !(0, import_node_fs.existsSync)(ARTSY_METAFLAGS_FILE)) {
518
+ try {
519
+ execSync("yarn setup:oss", { cwd: ARTSY_DIR, stdio: "inherit" });
520
+ } catch {
521
+ if (!(0, import_node_fs.existsSync)(ARTSY_KEYS_FILE) || !(0, import_node_fs.existsSync)(ARTSY_METAFLAGS_FILE)) {
522
+ throw new Error("artsy demo: setup:oss did not create keys/metaflags");
523
+ }
524
+ }
525
+ }
526
+ const rnlaPkgJson = (0, import_node_path.join)(
527
+ ARTSY_DIR,
528
+ "node_modules/react-native-launch-arguments/package.json"
529
+ );
530
+ if ((0, import_node_fs.existsSync)(rnlaPkgJson)) {
531
+ const raw = (0, import_node_fs.readFileSync)(rnlaPkgJson, "utf8");
532
+ if (raw.includes('"dist/index.js"')) {
533
+ (0, import_node_fs.writeFileSync)(rnlaPkgJson, raw.replace('"dist/index.js"', '"src/index.ts"'));
534
+ }
535
+ }
536
+ if (!(0, import_node_fs.existsSync)(ARTSY_RELAY_SENTINEL)) {
537
+ execSync("yarn relay", { cwd: ARTSY_DIR, stdio: "inherit" });
538
+ (0, import_node_fs.writeFileSync)(ARTSY_RELAY_SENTINEL, "");
539
+ }
540
+ }
541
+ var APPS = [
542
+ {
543
+ name: "bluesky",
544
+ label: "Bluesky",
545
+ dir: (0, import_node_path.join)(HOME, "github/bluesky"),
546
+ preferredPort: 8082,
547
+ framework: "expo",
548
+ command: (p) => ({ cmd: `npx expo start --port ${p}` }),
549
+ credentials: {
550
+ envVars: ["SOOTSIM_BLUESKY_PASSWORD"],
551
+ known: { HANDLE: "natew.bsky.social" }
552
+ }
553
+ },
554
+ {
555
+ name: "3pc",
556
+ label: "3PunchConvo",
557
+ dir: (0, import_node_path.join)(HOME, "lightstrike-labs/three-punch-convo-app/apps/one"),
558
+ preferredPort: 8081,
559
+ framework: "one",
560
+ command: (p) => ({ cmd: "npx one dev", env: { ONE_PORT: String(p) } })
561
+ },
562
+ {
563
+ name: "uniswap",
564
+ label: "Uniswap",
565
+ dir: UNISWAP_APP_DIR,
566
+ preferredPort: 8085,
567
+ framework: "expo",
568
+ prepare: () => {
569
+ ensureUniswapDemoEnvLocal();
570
+ ensureUniswapForceUpgradePatched();
571
+ },
572
+ command: (p) => ({
573
+ cmd: `npx expo start --clear --port ${p}`,
574
+ // prefer the real local mobile env when present, otherwise fall back
575
+ // to Uniswap's checked-in public web RPC settings so demo boots cleanly.
576
+ env: resolveUniswapDemoEnv()
577
+ })
578
+ },
579
+ {
580
+ name: "takeout",
581
+ label: "Takeout",
582
+ dir: (0, import_node_path.join)(HOME, "takeout"),
583
+ preferredPort: 8086,
584
+ framework: "one",
585
+ // takeout needs more than Metro for the demo to actually work: better-auth
586
+ // (login), zero-cache (sync), and a postgres for both. `bun lite` brings
587
+ // up the orez-backed stack (PG + zero + s3 in one binary) plus the One
588
+ // dev server. takeout's env system shifts every port (web, pg, zero,
589
+ // minio) uniformly by PORT_OFFSET, so we derive offset = port - 8081
590
+ // (the base web port) to keep all backend ports clear of the default
591
+ // dev stack while pinning One to the demo slot. OREZ_DATA_DIR is isolated
592
+ // to a per-demo path so we don't fight a soot dev orez that may already
593
+ // be holding pglite locks on ~/takeout/.orez (soot can attach takeout as
594
+ // a project and spin up its own orez against the same data dir).
595
+ readyTimeoutMs: 24e4,
596
+ command: (p) => ({
597
+ cmd: "bun lite",
598
+ env: {
599
+ PORT_OFFSET: String(p - 8081),
600
+ OREZ_DATA_DIR: `${HOME}/.cache/sootsim-demo/takeout-orez`
601
+ }
602
+ })
603
+ },
604
+ {
605
+ name: "expensify",
606
+ label: "Expensify",
607
+ dir: (0, import_node_path.join)(HOME, "github/expensify"),
608
+ preferredPort: 8087,
609
+ framework: "rock",
610
+ runtimeConfig: {
611
+ env: EXPENSIFY_NATIVE_PROXY_ENV
612
+ },
613
+ sidecars: [
614
+ {
615
+ name: "web-proxy",
616
+ port: 9e3,
617
+ readyPath: "/api/Ping",
618
+ command: () => ({
619
+ cmd: `bun ${JSON.stringify(getExpensifyProxyScript())}`,
620
+ env: EXPENSIFY_NATIVE_PROXY_ENV
621
+ })
622
+ }
623
+ ],
624
+ command: (p) => ({
625
+ cmd: `fnm exec --using=20.20.0 npx rock start --port ${p} --no-interactive`,
626
+ env: EXPENSIFY_NATIVE_PROXY_ENV
627
+ })
628
+ },
629
+ {
630
+ name: "artsy",
631
+ label: "Artsy",
632
+ dir: ARTSY_DIR,
633
+ preferredPort: 8088,
634
+ framework: "expo",
635
+ runtimeConfig: resolveArtsyRuntimeConfig(),
636
+ prepare: () => {
637
+ ensureArtsySetup();
638
+ },
639
+ command: (p) => ({
640
+ // eigen's `yarn start` wraps `react-native start` with a relay watcher
641
+ // via concurrently; for the demo we run relay once in prepare and
642
+ // invoke the metro server directly so --port is respected.
643
+ cmd: `npx react-native start --port ${p}`
644
+ }),
645
+ credentials: {
646
+ envVars: ["SOOTSIM_ARTSY_EMAIL", "SOOTSIM_ARTSY_PASSWORD"],
647
+ note: "auto-login reuses Artsy\u2019s built-in Maestro launch-arguments hook"
648
+ }
649
+ },
650
+ {
651
+ name: "rainbow",
652
+ label: "Rainbow",
653
+ dir: RAINBOW_DIR,
654
+ preferredPort: 8089,
655
+ framework: "rock",
656
+ sidecars: [
657
+ {
658
+ name: "metadata-proxy",
659
+ port: RAINBOW_METADATA_PROXY_PORT,
660
+ readyPath: "/health",
661
+ command: () => ({
662
+ cmd: `bun ${JSON.stringify(getRainbowMetadataProxyScript())}`,
663
+ env: {
664
+ PORT: String(RAINBOW_METADATA_PROXY_PORT),
665
+ RAINBOW_PUBLIC_RPC_URLS: JSON.stringify(RAINBOW_DEMO_PUBLIC_RPC_URLS),
666
+ RAINBOW_UPSTREAM_METADATA_BASE_URL: RAINBOW_METADATA_BASE_URL
667
+ }
668
+ })
669
+ }
670
+ ],
671
+ prepare: () => {
672
+ ensureRainbowSetup();
673
+ },
674
+ command: (p) => ({
675
+ cmd: `fnm exec --using=22 yarn start --port ${p} --reset-cache`,
676
+ env: resolveRainbowDemoEnv()
677
+ }),
678
+ credentials: {
679
+ envVars: [
680
+ "RAINBOW_TEST_WALLET",
681
+ "RAINBOW_WALLETCONNECT_PROJECT_ID",
682
+ "WC_PROJECT_ID",
683
+ "IMGIX_DOMAIN",
684
+ "IMGIX_TOKEN"
685
+ ],
686
+ note: "launcher supplies a demo encryption key and public mainnet RPC; use only a public throwaway mnemonic for RAINBOW_TEST_WALLET"
687
+ }
688
+ },
689
+ {
690
+ name: "rocket-chat",
691
+ label: "Rocket.Chat",
692
+ dir: (0, import_node_path.join)(HOME, "github/Rocket.Chat.ReactNative"),
693
+ preferredPort: 8093,
694
+ framework: "expo",
695
+ command: (p) => ({
696
+ cmd: `npx react-native start --port ${p}`,
697
+ env: { RUNNING_E2E_TESTS: "true" }
698
+ }),
699
+ credentials: {
700
+ envVars: [
701
+ "ROCKET_CHAT_DEMO_SERVER",
702
+ "ROCKET_CHAT_DEMO_USERNAME",
703
+ "ROCKET_CHAT_DEMO_PASSWORD"
704
+ ],
705
+ known: { SERVER: "https://mobile.qa.rocket.chat" },
706
+ note: "use packages/sootsim-engine/scripts/rocket-chat-demo-auth.ts to create/login a disposable QA user and print the rocketchat://auth deep link"
707
+ }
708
+ },
709
+ {
710
+ name: "mattermost",
711
+ label: "Mattermost",
712
+ dir: MATTERMOST_DIR,
713
+ preferredPort: 8090,
714
+ framework: "expo",
715
+ sidecars: [
716
+ {
717
+ name: "preview-server",
718
+ port: 8065,
719
+ readyPath: "/api/v4/system/ping",
720
+ command: () => ({
721
+ cmd: `bun ${JSON.stringify(getMattermostPreviewServerScript())}`
722
+ })
723
+ }
724
+ ],
725
+ runtimeConfig: {
726
+ modules: {
727
+ // mattermost patches react-native-keychain's JS entry in its own
728
+ // repo; run that package and provide only the native manager seam.
729
+ "react-native-keychain": false,
730
+ "dist/assets/config.json": {
731
+ inline: {
732
+ AuthUrlScheme: "mmauth://",
733
+ AuthUrlSchemeDev: "mmauthbeta://",
734
+ DefaultServerUrl: "http://localhost:8065",
735
+ DefaultServerName: "Mattermost Demo",
736
+ TestServerUrl: "http://localhost:8065",
737
+ AutoSelectServerUrl: true,
738
+ WebsiteURL: "https://mattermost.com",
739
+ ServerNoticeURL: "https://github.com/mattermost/mattermost-server/blob/master/NOTICE.txt",
740
+ MobileNoticeURL: "https://github.com/mattermost/mattermost-mobile/blob/master/NOTICE.txt",
741
+ RudderApiKey: "",
742
+ SentryEnabled: false,
743
+ SentryDsnIos: "",
744
+ SentryDsnAndroid: "",
745
+ SentryOptions: {
746
+ deactivateStacktraceMerging: true,
747
+ autoBreadcrumbs: {
748
+ xhr: false,
749
+ console: true
750
+ },
751
+ severityLevelFilter: ["fatal"]
752
+ },
753
+ ShowReview: false,
754
+ ShowOnboarding: false,
755
+ ExperimentalNormalizeMarkdownLinks: false,
756
+ CustomRequestHeaders: {},
757
+ CollectNetworkMetrics: false
758
+ }
759
+ }
760
+ },
761
+ nativeModules: {
762
+ RNKeychainManager: { file: getMattermostKeychainNativeModule() },
763
+ RNUtils: { file: getMattermostRNUtilsNativeModule() },
764
+ GenericClient: { file: getMattermostNetworkClientNativeModule() },
765
+ ApiClient: { file: getMattermostNetworkClientNativeModule() },
766
+ WebSocketClient: { file: getMattermostNetworkClientNativeModule() }
767
+ }
768
+ },
769
+ command: (p) => ({
770
+ cmd: `npx react-native start --host 127.0.0.1 --port ${p}`
771
+ }),
772
+ credentials: {
773
+ known: {
774
+ SERVER: "http://localhost:8065",
775
+ USERNAME: "demo",
776
+ PASSWORD: "DemoPassword1!"
777
+ },
778
+ note: "local mattermost-preview seeded through the real REST API; no signup or OTP needed"
779
+ }
780
+ },
781
+ {
782
+ name: "joplin",
783
+ label: "Joplin",
784
+ dir: JOPLIN_APP_DIR,
785
+ preferredPort: 8084,
786
+ framework: "expo",
787
+ // joplin is local-first: sync.target defaults to 0 ("None") and the
788
+ // mobile startup runs WelcomeUtils.install() on first launch, which
789
+ // seeds a "Welcome!" folder + welcome notes. no login or external
790
+ // credentials are needed for a usable demo — just boot it. tenant
791
+ // bedrock SQLite (via react-native-sqlite-storage stub) carries the
792
+ // seeded notes across reloads.
793
+ prepare: () => {
794
+ ensureJoplinWatchmanConfigs();
795
+ ensureJoplinBuilt();
796
+ },
797
+ command: (p) => ({
798
+ cmd: `npx expo start --port ${p}`,
799
+ env: { BROWSERSLIST_IGNORE_OLD_DATA: "true" }
800
+ }),
801
+ credentials: {
802
+ note: "no login required \u2014 sync.target=0 (None), seed via WelcomeUtils"
803
+ }
804
+ }
805
+ ];
806
+ // Annotate the CommonJS export names for ESM import in node:
807
+ 0 && (module.exports = {
808
+ APPS
809
+ });