peachsim 0.1.571 → 0.1.573
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +106 -106
- package/cli/app-config.ts +1 -1
- package/cli/app-fonts.ts +4 -4
- package/cli/auth.ts +11 -11
- package/cli/bin.ts +4 -4
- package/cli/bridge-flow-runner.ts +13 -13
- package/cli/browser-evals.ts +2 -2
- package/cli/cli-update.ts +6 -6
- package/cli/cloud-client.ts +16 -16
- package/cli/cloud-dispatch.ts +2 -2
- package/cli/cloud-session.ts +12 -12
- package/cli/cloud-test-tunnel.ts +4 -4
- package/cli/command-registry.ts +7 -7
- package/cli/commands/agent-wrapper.ts +7 -7
- package/cli/commands/agent.ts +16 -16
- package/cli/commands/app-fonts.ts +3 -3
- package/cli/commands/assert.ts +10 -10
- package/cli/commands/auth.ts +5 -5
- package/cli/commands/box/checkout-plane.ts +1 -1
- package/cli/commands/box/plane-share.ts +2 -2
- package/cli/commands/box/rnx-command.ts +5 -5
- package/cli/commands/box.ts +38 -38
- package/cli/commands/camera.ts +13 -13
- package/cli/commands/cleanup.ts +13 -13
- package/cli/commands/compat.ts +7 -7
- package/cli/commands/config.ts +5 -5
- package/cli/commands/control.ts +63 -63
- package/cli/commands/cpu-profile.ts +11 -11
- package/cli/commands/daemon-mac-app.ts +10 -10
- package/cli/commands/daemon.ts +29 -27
- package/cli/commands/debug.ts +35 -35
- package/cli/commands/desktop.ts +3 -3
- package/cli/commands/detox.ts +33 -33
- package/cli/commands/device.ts +9 -9
- package/cli/commands/diagnose.ts +17 -17
- package/cli/commands/do-chain.ts +4 -4
- package/cli/commands/electron.ts +9 -9
- package/cli/commands/film.ts +9 -9
- package/cli/commands/flow.ts +49 -49
- package/cli/commands/inspect/core.ts +12 -12
- package/cli/commands/inspect/count.ts +1 -1
- package/cli/commands/inspect/describe.ts +1 -1
- package/cli/commands/inspect/env.ts +2 -2
- package/cli/commands/inspect/find.ts +2 -2
- package/cli/commands/inspect/get-layout.ts +2 -2
- package/cli/commands/inspect/keyboard.ts +1 -1
- package/cli/commands/inspect/list.ts +4 -4
- package/cli/commands/inspect/memory.ts +1 -1
- package/cli/commands/inspect/resolve-target.ts +1 -1
- package/cli/commands/inspect/screens.ts +1 -1
- package/cli/commands/inspect/shared.ts +1 -1
- package/cli/commands/inspect/tree.ts +1 -1
- package/cli/commands/inspect/url.ts +1 -1
- package/cli/commands/inspect/wait-event.ts +5 -5
- package/cli/commands/inspect.ts +82 -82
- package/cli/commands/install-cli.ts +16 -16
- package/cli/commands/install-desktop.ts +26 -26
- package/cli/commands/login.ts +11 -11
- package/cli/commands/maestro-generate.ts +10 -10
- package/cli/commands/maestro.ts +77 -67
- package/cli/commands/mode.ts +4 -4
- package/cli/commands/no-bridge-hint.ts +12 -12
- package/cli/commands/perf.ts +11 -11
- package/cli/commands/permissions.ts +5 -5
- package/cli/commands/platform.ts +21 -21
- package/cli/commands/preview.ts +5 -5
- package/cli/commands/profile.ts +12 -12
- package/cli/commands/react.ts +15 -15
- package/cli/commands/record.ts +31 -31
- package/cli/commands/report-issue.ts +4 -4
- package/cli/commands/reset.ts +2 -2
- package/cli/commands/runtime.ts +23 -23
- package/cli/commands/screenshot-command.ts +2 -2
- package/cli/commands/screenshot-layers.ts +5 -5
- package/cli/commands/screenshot-mode.ts +7 -7
- package/cli/commands/screenshot.ts +24 -24
- package/cli/commands/screenshots-capture.ts +13 -13
- package/cli/commands/screenshots.ts +6 -6
- package/cli/commands/serve.ts +12 -12
- package/cli/commands/setup.ts +25 -25
- package/cli/commands/skills.ts +30 -23
- package/cli/commands/slides.ts +20 -20
- package/cli/commands/state.ts +2 -2
- package/cli/commands/storage.ts +3 -3
- package/cli/commands/telemetry.ts +2 -2
- package/cli/commands/test.ts +15 -15
- package/cli/commands/three-mode.ts +17 -17
- package/cli/commands/timeline.ts +12 -12
- package/cli/commands/upgrade.ts +11 -11
- package/cli/commands/upload.ts +26 -26
- package/cli/commands/version.ts +7 -7
- package/cli/commands/what-happened.ts +20 -20
- package/cli/current-sim.ts +3 -3
- package/cli/desktop-companion.ts +16 -16
- package/cli/drivers/electron.ts +4 -4
- package/cli/drivers/playwright-sim-host.ts +7 -7
- package/cli/drivers/playwright.ts +4 -4
- package/cli/drivers/registry.ts +1 -1
- package/cli/drivers/types.ts +5 -5
- package/cli/flow-export.ts +1 -1
- package/cli/flow-file.ts +5 -5
- package/cli/flow-session.ts +1 -1
- package/cli/help-core.ts +13 -13
- package/cli/hints.ts +14 -14
- package/cli/inspect-notice-state.ts +1 -1
- package/cli/internal-child.ts +2 -2
- package/cli/maestro-js.ts +4 -4
- package/cli/maestro-report.ts +1 -1
- package/cli/main.ts +14 -14
- package/cli/outbound-endpoints.ts +30 -30
- package/cli/parse-args.ts +7 -7
- package/cli/privacy.ts +1 -1
- package/cli/recording-access.ts +10 -10
- package/cli/resolve-assets.ts +2 -2
- package/cli/rnx-in-process.ts +5 -5
- package/cli/run-registry.ts +1 -1
- package/cli/run-rnx-core.ts +3 -3
- package/cli/run-rnx.ts +1 -1
- package/cli/runtime-notes.ts +1 -1
- package/cli/self-invocation.ts +1 -1
- package/cli/send-to-box.ts +1 -1
- package/cli/shell-init.ts +40 -40
- package/cli/ui.ts +1 -1
- package/cli/ws-bridge.ts +22 -22
- package/detox/config-loader.ts +1 -1
- package/detox/index.ts +28 -28
- package/detox/navigation.ts +2 -2
- package/dist-lib/agent-daemon-client.cjs +12 -12
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +2 -2
- package/dist-lib/agent-sessions.cjs +12 -12
- package/dist-lib/attached-projects.cjs +4 -4
- package/dist-lib/auth/shared-session.cjs +4 -4
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +4 -4
- package/dist-lib/bridge-contract-input.cjs +1 -1
- package/dist-lib/bridge-contract-input.mjs +1 -1
- package/dist-lib/bridge-contract.cjs +2 -2
- package/dist-lib/bridge-contract.mjs +2 -2
- package/dist-lib/capture-contract.cjs +1 -1
- package/dist-lib/capture-contract.mjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/cloud-contract.cjs +1 -1
- package/dist-lib/cloud-contract.mjs +1 -1
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +42 -42
- package/dist-lib/cloud.mjs +42 -42
- package/dist-lib/config.cjs +2 -2
- package/dist-lib/detox/index.cjs +29 -29
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +12 -12
- package/dist-lib/host/bridge-host.cjs +72 -71
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/replacement-module-handler.cjs +6 -6
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +48 -48
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/menu.cjs +5 -5
- package/dist-lib/menu.mjs +5 -5
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +1 -1
- package/dist-lib/metro-production-bundle.mjs +1 -1
- package/dist-lib/metro.cjs +15 -15
- package/dist-lib/profiles.cjs +4 -4
- package/dist-lib/public-brand.cjs +3 -3
- package/dist-lib/react-native-host-modules.cjs +1 -1
- package/dist-lib/react-native-host-modules.mjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +2 -1
- package/dist-lib/sdk.cjs +9 -9
- package/dist-lib/sdk.mjs +9 -9
- package/dist-lib/skills.cjs +416 -415
- package/dist-lib/swift-compile.cjs +1 -1
- package/dist-lib/swift-compile.mjs +1 -1
- package/dist-lib/swift-package.cjs +1 -1
- package/dist-lib/swift-package.mjs +1 -1
- package/dist-lib/swift-submit.cjs +1 -1
- package/dist-lib/swift-submit.mjs +1 -1
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite.cjs +24 -24
- package/package.json +1 -1
- package/scripts/dev-server-scanner.ts +4 -3
- package/skills/contrast/SKILL.md +75 -75
- package/skills/{rnx-debug → peach-debug}/SKILL.md +90 -90
- package/skills/{rnx-perf → peach-perf}/SKILL.md +13 -13
- package/skills/{rnx-setup → peach-setup}/SKILL.md +60 -60
- package/skills/{rnx-test → peach-test}/SKILL.md +44 -44
- package/skills/{rnx-visual → peach-visual}/SKILL.md +26 -26
- package/src/agent-daemon-client.ts +5 -5
- package/src/agent-events.ts +1 -1
- package/src/agent-identity.ts +1 -1
- package/src/agent-sessions.ts +13 -13
- package/src/attached-projects.ts +1 -1
- package/src/auth/shared-session.ts +1 -1
- package/src/bridge-constants.ts +3 -3
- package/src/bridge-contract-input.ts +1 -1
- package/src/bridge-contract.ts +3 -3
- package/src/cli-version.ts +6 -6
- package/src/cloud.ts +40 -40
- package/src/config.ts +1 -1
- package/src/connect.ts +6 -6
- package/src/dev-server-open.ts +8 -8
- package/src/disk-cleanup.ts +3 -3
- package/src/home-paths.ts +26 -26
- package/src/host/agent-host.ts +3 -3
- package/src/host/bridge-host.ts +33 -33
- package/src/host/fetch-proxy-handler.ts +1 -1
- package/src/host/plane-host.ts +2 -2
- package/src/host/replacement-module-handler.ts +2 -2
- package/src/menu.ts +2 -2
- package/src/metro-plugin.ts +7 -7
- package/src/metro-production-bundle.ts +2 -2
- package/src/native-dev-bundle-url.ts +2 -2
- package/src/playwright-host-log.ts +1 -1
- package/src/public-brand.ts +2 -2
- package/src/react-native-host-modules.ts +1 -1
- package/src/rolldown-plugin-swift.ts +3 -3
- package/src/runtime-assets.ts +11 -11
- package/src/runtime-delivery.ts +6 -6
- package/src/screenshots/orchestrate.ts +1 -1
- package/src/screenshots/org-deck.ts +1 -1
- package/src/screenshots/schema.ts +2 -2
- package/src/sim-client.ts +1 -1
- package/src/skills/builtin/compat-check.ts +2 -2
- package/src/vite-plugin-one.ts +8 -8
- package/src/vite-plugin-swift.ts +3 -3
- package/src/vite-plugin.ts +6 -19
package/dist-lib/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -160,11 +160,11 @@ ${RNXSIM_METRO_SOURCE_MAP_COMMENT}${detached.sourceMappingUrl}`;
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
// src/public-brand.ts
|
|
163
|
-
var name = "
|
|
163
|
+
var name = "Peach";
|
|
164
164
|
var rnxPublicBrand = Object.freeze({
|
|
165
165
|
name,
|
|
166
166
|
packageName: "peachsim",
|
|
167
|
-
commandName: "
|
|
167
|
+
commandName: "peach",
|
|
168
168
|
domain: "rnxsim.com",
|
|
169
169
|
origin: "https://rnxsim.com"
|
|
170
170
|
});
|
|
@@ -173,15 +173,15 @@ var rnxPublicBrand = Object.freeze({
|
|
|
173
173
|
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
174
174
|
var import_node_os = require("node:os");
|
|
175
175
|
var import_node_path = __toESM(require("node:path"), 1);
|
|
176
|
-
var
|
|
176
|
+
var PEACH_HOME_ENV = "PEACH_HOME";
|
|
177
177
|
var ACTIVE_RUNTIME_FILE = "active";
|
|
178
178
|
var DAEMON_LOCKFILE = "daemon.json";
|
|
179
179
|
var DEV_BRIDGES_DIR = "dev-bridges";
|
|
180
180
|
var DAEMON_HEARTBEAT_STALE_MS = 3e4;
|
|
181
181
|
function rnxHomeDir() {
|
|
182
|
-
const override = process.env[
|
|
182
|
+
const override = process.env[PEACH_HOME_ENV];
|
|
183
183
|
if (override && override.length > 0) return import_node_path.default.resolve(override);
|
|
184
|
-
return import_node_path.default.join((0, import_node_os.homedir)(), ".
|
|
184
|
+
return import_node_path.default.join((0, import_node_os.homedir)(), ".peach");
|
|
185
185
|
}
|
|
186
186
|
function runtimesDir() {
|
|
187
187
|
return import_node_path.default.join(rnxHomeDir(), "runtimes");
|
|
@@ -293,12 +293,12 @@ var import_node_async_hooks = require("node:async_hooks");
|
|
|
293
293
|
var sinks = new import_node_async_hooks.AsyncLocalStorage();
|
|
294
294
|
|
|
295
295
|
// cli/auth.ts
|
|
296
|
-
var CHOOSE_ACCOUNT_HINT = "this sign-in belongs to several accounts; run `
|
|
296
|
+
var CHOOSE_ACCOUNT_HINT = "this sign-in belongs to several accounts; run `peach login --account <name>` to choose the one to bill";
|
|
297
297
|
|
|
298
298
|
// cli/cloud-session.ts
|
|
299
299
|
var CLOUD_SESSION_VERSION = 3;
|
|
300
300
|
var MAX_ENCODED_SESSION_BYTES = 32 * 1024;
|
|
301
|
-
var
|
|
301
|
+
var PEACH_CLOUD_SESSION_ENV = "PEACH_CLOUD_SESSION";
|
|
302
302
|
var RNX_SHELL_UPDATE_PREFIX = "__RNX_SHELL_UPDATE_V1__";
|
|
303
303
|
var RNX_SHELL_UPDATE_SET_PREFIX = `${RNX_SHELL_UPDATE_PREFIX}set:`;
|
|
304
304
|
var RNX_SHELL_UPDATE_UNSET = `${RNX_SHELL_UPDATE_PREFIX}unset`;
|
|
@@ -363,7 +363,7 @@ function createCloudBoxSession(input) {
|
|
|
363
363
|
function parseCloudSession(encoded) {
|
|
364
364
|
const value = encoded.trim();
|
|
365
365
|
if (!value || value.length > MAX_ENCODED_SESSION_BYTES || !/^[A-Za-z0-9_-]+$/.test(value)) {
|
|
366
|
-
throw new Error(`${
|
|
366
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
367
367
|
}
|
|
368
368
|
let parsed;
|
|
369
369
|
try {
|
|
@@ -373,14 +373,14 @@ function parseCloudSession(encoded) {
|
|
|
373
373
|
}
|
|
374
374
|
parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
375
375
|
} catch {
|
|
376
|
-
throw new Error(`${
|
|
376
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
377
377
|
}
|
|
378
378
|
if (!isRecord(parsed) || parsed.version !== CLOUD_SESSION_VERSION) {
|
|
379
|
-
throw new Error(`${
|
|
379
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
380
380
|
}
|
|
381
381
|
const apiOrigin = parsed.apiOrigin;
|
|
382
382
|
if (typeof apiOrigin !== "string") {
|
|
383
|
-
throw new Error(`${
|
|
383
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
384
384
|
}
|
|
385
385
|
const platform = parsed.platform === "ios" || parsed.platform === "android" ? parsed.platform : void 0;
|
|
386
386
|
const device = typeof parsed.device === "string" ? parsed.device : void 0;
|
|
@@ -422,11 +422,11 @@ function parseCloudSession(encoded) {
|
|
|
422
422
|
boxToken
|
|
423
423
|
});
|
|
424
424
|
} catch {
|
|
425
|
-
throw new Error(`${
|
|
425
|
+
throw new Error(`${PEACH_CLOUD_SESSION_ENV} is invalid`);
|
|
426
426
|
}
|
|
427
427
|
}
|
|
428
428
|
function readCloudSession(environment = process.env) {
|
|
429
|
-
const encoded = environment[
|
|
429
|
+
const encoded = environment[PEACH_CLOUD_SESSION_ENV];
|
|
430
430
|
return encoded?.trim() ? parseCloudSession(encoded) : null;
|
|
431
431
|
}
|
|
432
432
|
|
|
@@ -625,7 +625,7 @@ var CloudBoxBridge = class {
|
|
|
625
625
|
return Promise.resolve(null);
|
|
626
626
|
}
|
|
627
627
|
closeSim() {
|
|
628
|
-
return Promise.reject(new Error("close a box simulator with
|
|
628
|
+
return Promise.reject(new Error("close a box simulator with peach box stop"));
|
|
629
629
|
}
|
|
630
630
|
claim() {
|
|
631
631
|
return Promise.reject(
|
|
@@ -827,7 +827,7 @@ function writeSecureJsonAtomic(filepath, value) {
|
|
|
827
827
|
var CURRENT_SIM_VERSION = 2;
|
|
828
828
|
var CURRENT_SIM_PATH_ENV = "SOOTSIM_CLI_CURRENT_SIM_PATH";
|
|
829
829
|
var IDENTITY_ENV_VARS = [
|
|
830
|
-
"
|
|
830
|
+
"PEACH_CLI_IDENTITY",
|
|
831
831
|
// explicit override — fastest path, skips all pid lookups
|
|
832
832
|
"TM_SESSION",
|
|
833
833
|
// Team Machine session id; routes prompt-bar followups back to this agent
|
|
@@ -895,7 +895,7 @@ function getCurrentSimPath() {
|
|
|
895
895
|
return (0, import_path.resolve)(process.env[CURRENT_SIM_PATH_ENV]);
|
|
896
896
|
}
|
|
897
897
|
const key = getCliIdentityKey();
|
|
898
|
-
return (0, import_path.join)((0, import_os.tmpdir)(), `
|
|
898
|
+
return (0, import_path.join)((0, import_os.tmpdir)(), `peach-current-sim-${key}.json`);
|
|
899
899
|
}
|
|
900
900
|
function legacyCloudCredentialDirectory(filepath) {
|
|
901
901
|
return (0, import_path.join)((0, import_path.dirname)(filepath), `${(0, import_path.basename)(filepath)}.credentials`);
|
|
@@ -1073,7 +1073,7 @@ var BridgeSimLockedError = class extends Error {
|
|
|
1073
1073
|
};
|
|
1074
1074
|
function describeSimIdSource(source) {
|
|
1075
1075
|
if (source === "flag") return "via --sim";
|
|
1076
|
-
if (source === "saved") return "saved via `
|
|
1076
|
+
if (source === "saved") return "saved via `peach use`";
|
|
1077
1077
|
return "primary fallback \u2014 no sim pinned";
|
|
1078
1078
|
}
|
|
1079
1079
|
var BRIDGE_VALUE_FLAGS_TABLE = [
|
|
@@ -1094,7 +1094,7 @@ var BRIDGE_VALUE_FLAGS_TABLE = [
|
|
|
1094
1094
|
},
|
|
1095
1095
|
{
|
|
1096
1096
|
// `--sim` is the canonical target flag; `--session` / `--tab` are
|
|
1097
|
-
// documented aliases (CLAUDE.md, the
|
|
1097
|
+
// documented aliases (CLAUDE.md, the peach agent skills, and engine docs all
|
|
1098
1098
|
// say `--session <id>`). without these aliases an agent following the docs
|
|
1099
1099
|
// would have `--session ef` silently ignored and get the *currently
|
|
1100
1100
|
// pinned* sim's tree instead — wrong-app data with no error.
|
|
@@ -1185,7 +1185,7 @@ function createBridge(wsPort, opts = {}) {
|
|
|
1185
1185
|
\u26A0 ${msg._otherCliCount} other CLI identity/identities are driving this sim
|
|
1186
1186
|
taps, scrolls, and keyboard input from multiple agents will collide on
|
|
1187
1187
|
the same screen state (this is not a bridge throughput limit).
|
|
1188
|
-
use \`
|
|
1188
|
+
use \`peach open --new\` for an isolated sim per agent.
|
|
1189
1189
|
|
|
1190
1190
|
`
|
|
1191
1191
|
);
|
|
@@ -1289,7 +1289,7 @@ function createBridge(wsPort, opts = {}) {
|
|
|
1289
1289
|
}
|
|
1290
1290
|
clearCurrentSimId();
|
|
1291
1291
|
throw new Error(
|
|
1292
|
-
`saved sim ${sentSimId} is gone${message.slice(missingSimMessage.length)}; run \`
|
|
1292
|
+
`saved sim ${sentSimId} is gone${message.slice(missingSimMessage.length)}; run \`peach list\` and \`peach use <sim>\`, or open a fresh sim`
|
|
1293
1293
|
);
|
|
1294
1294
|
}
|
|
1295
1295
|
throw error;
|
|
@@ -1339,7 +1339,7 @@ function createBridge(wsPort, opts = {}) {
|
|
|
1339
1339
|
}
|
|
1340
1340
|
|
|
1341
1341
|
// src/bridge-contract.ts
|
|
1342
|
-
var PUBLIC_NO_NETWORK_MARKER = "public
|
|
1342
|
+
var PUBLIC_NO_NETWORK_MARKER = "public Peach Cloud simulators have no network";
|
|
1343
1343
|
var HEADLESS_TENANT_FETCH_HUNG_MARKER = "headless tenant fetch hung";
|
|
1344
1344
|
|
|
1345
1345
|
// cli/commands/inspect/core.ts
|
|
@@ -1688,7 +1688,7 @@ function layoutGetNativeEval(opts = {}) {
|
|
|
1688
1688
|
|
|
1689
1689
|
const screenshot = window.SootSim && window.SootSim.bridges && window.SootSim.bridges.screenshot
|
|
1690
1690
|
if (typeof screenshot !== 'function') {
|
|
1691
|
-
throw new Error('styled native layout requires the
|
|
1691
|
+
throw new Error('styled native layout requires the peach capture bridge')
|
|
1692
1692
|
}
|
|
1693
1693
|
const device = list.find((node) => node && node.device)?.device || {}
|
|
1694
1694
|
const width = Math.round(Number(device.width) || window.innerWidth || 0)
|
|
@@ -1810,7 +1810,7 @@ function waitReadyReason(status) {
|
|
|
1810
1810
|
if (status.bridgeError.includes(HEADLESS_TENANT_FETCH_HUNG_MARKER) || status.bridgeError.includes(PUBLIC_NO_NETWORK_MARKER)) {
|
|
1811
1811
|
return status.bridgeError;
|
|
1812
1812
|
}
|
|
1813
|
-
return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`
|
|
1813
|
+
return `sim unreachable: ${status.bridgeError} \u2014 the target tab is closed or no sim is connected (check \`peach list\`, reopen with \`peach open\`)`;
|
|
1814
1814
|
}
|
|
1815
1815
|
const waitingOnGuestFetch = status.externalReady === false && /https?:\/\//.test(status.externalStatus);
|
|
1816
1816
|
const base = status.externalError ? `guest app errored: ${status.externalError}` : waitingOnGuestFetch ? `waiting on a guest fetch: ${status.externalStatus}` : status.loadingText ? `still showing "${status.loadingText}"` : status.externalReady === false ? "guest app is still loading" : status.flag !== true && status.targets > 0 ? "native content is rendered but the ready signal has not settled" : status.flag !== true ? "guest app has not emitted sootsim:externalAppReady" : status.targets <= 0 ? "ready flag emitted but no visible app content is inspectable yet" : "node tree is still changing";
|
|
@@ -1927,7 +1927,7 @@ async function inspectLogs(bridge) {
|
|
|
1927
1927
|
return [
|
|
1928
1928
|
{
|
|
1929
1929
|
id: `cloud-${ts}-${index}`,
|
|
1930
|
-
source: "
|
|
1930
|
+
source: "peach-cloud",
|
|
1931
1931
|
level,
|
|
1932
1932
|
ts,
|
|
1933
1933
|
args: [text],
|
|
@@ -1970,7 +1970,7 @@ function filterLogEntries(entries, opts = {}) {
|
|
|
1970
1970
|
if (!opts.showInternal) {
|
|
1971
1971
|
out = out.filter((e) => {
|
|
1972
1972
|
const first = e.args[0];
|
|
1973
|
-
return !(typeof first === "string" && /^\[(?:
|
|
1973
|
+
return !(typeof first === "string" && /^\[(?:peach|sootsim)(?:\s[^\]]*)?\]/.test(first));
|
|
1974
1974
|
});
|
|
1975
1975
|
}
|
|
1976
1976
|
if (opts.level) out = out.filter((e) => opts.level.has(e.level));
|
|
@@ -3042,7 +3042,7 @@ function pickSim(sims, wanted, port) {
|
|
|
3042
3042
|
const match = open.find((sim) => sim.id === wanted);
|
|
3043
3043
|
if (!match) {
|
|
3044
3044
|
throw new SimConnectError(
|
|
3045
|
-
`no sim connected with id ${wanted} on bridge :${port}` + (open.length ? ` \u2014 connected: ${open.map((sim) => sim.id).join(", ")}` : " \u2014 no sims connected; open one with `
|
|
3045
|
+
`no sim connected with id ${wanted} on bridge :${port}` + (open.length ? ` \u2014 connected: ${open.map((sim) => sim.id).join(", ")}` : " \u2014 no sims connected; open one with `peach open <port>`")
|
|
3046
3046
|
);
|
|
3047
3047
|
}
|
|
3048
3048
|
return match;
|
|
@@ -3055,7 +3055,7 @@ function pickSim(sims, wanted, port) {
|
|
|
3055
3055
|
const primary = open.find((sim) => sim.isPrimary) ?? open[0];
|
|
3056
3056
|
if (!primary) {
|
|
3057
3057
|
throw new SimConnectError(
|
|
3058
|
-
`no sims connected on bridge :${port} \u2014 open one with \`
|
|
3058
|
+
`no sims connected on bridge :${port} \u2014 open one with \`peach open <port>\``
|
|
3059
3059
|
);
|
|
3060
3060
|
}
|
|
3061
3061
|
return primary;
|
|
@@ -3084,7 +3084,7 @@ async function connect(options = {}) {
|
|
|
3084
3084
|
discovery.close();
|
|
3085
3085
|
if (error instanceof SimConnectError) throw error;
|
|
3086
3086
|
const message = error instanceof Error ? error.message : String(error);
|
|
3087
|
-
throw new SimConnectError(`${message} \u2014 is the
|
|
3087
|
+
throw new SimConnectError(`${message} \u2014 is the peach daemon or dev shell running?`);
|
|
3088
3088
|
}
|
|
3089
3089
|
discovery.close();
|
|
3090
3090
|
const bridge = createBridge(port, {
|
|
@@ -3381,20 +3381,20 @@ function resolveRnxDesktopAppName(open, projectRoot) {
|
|
|
3381
3381
|
if (!open) return null;
|
|
3382
3382
|
if (typeof open === "object") {
|
|
3383
3383
|
const appName = open.appName.trim();
|
|
3384
|
-
if (!appName) throw new Error("
|
|
3384
|
+
if (!appName) throw new Error("peach: open.appName must not be empty");
|
|
3385
3385
|
return appName;
|
|
3386
3386
|
}
|
|
3387
3387
|
const packageJsonPath = import_node_path4.default.join(projectRoot, "package.json");
|
|
3388
3388
|
const packageJson = JSON.parse(import_node_fs4.default.readFileSync(packageJsonPath, "utf8"));
|
|
3389
3389
|
const packageName = packageJson && typeof packageJson === "object" ? Reflect.get(packageJson, "name") : void 0;
|
|
3390
3390
|
if (typeof packageName !== "string" || !packageName.trim()) {
|
|
3391
|
-
throw new Error(`
|
|
3391
|
+
throw new Error(`peach: ${packageJsonPath} must declare a package name`);
|
|
3392
3392
|
}
|
|
3393
3393
|
return packageName.trim();
|
|
3394
3394
|
}
|
|
3395
3395
|
function tagRnxBundleForPlugin(bundleUrl, replacementOrigin, replacementToken, projectRoot, appName) {
|
|
3396
3396
|
const absolute = /^[a-z][a-z\d+.-]*:\/\//i.test(bundleUrl);
|
|
3397
|
-
const url = new URL(bundleUrl, absolute ? void 0 : "http://
|
|
3397
|
+
const url = new URL(bundleUrl, absolute ? void 0 : "http://peach.local");
|
|
3398
3398
|
if (appName) {
|
|
3399
3399
|
url.searchParams.set("rnxAppName", appName);
|
|
3400
3400
|
url.searchParams.set(
|
|
@@ -3421,22 +3421,22 @@ function observeRnxDesktopLaunch(child, appName) {
|
|
|
3421
3421
|
});
|
|
3422
3422
|
child.once("error", (error) => {
|
|
3423
3423
|
spawnFailed = true;
|
|
3424
|
-
console.error(`[
|
|
3424
|
+
console.error(`[peach] could not open ${appName}: ${error.message}`);
|
|
3425
3425
|
});
|
|
3426
3426
|
child.once("close", (code, signal) => {
|
|
3427
3427
|
if (spawnFailed) return;
|
|
3428
3428
|
if (code === 0) {
|
|
3429
|
-
console.log(`[
|
|
3429
|
+
console.log(`[peach] opened ${appName} in the desktop simulator`);
|
|
3430
3430
|
return;
|
|
3431
3431
|
}
|
|
3432
3432
|
const detail = stderr.trim() || (signal ? `signal ${signal}` : `exit ${code}`);
|
|
3433
|
-
console.error(`[
|
|
3433
|
+
console.error(`[peach] could not open ${appName}: ${detail}`);
|
|
3434
3434
|
});
|
|
3435
3435
|
}
|
|
3436
3436
|
function launchRnxDesktop(bundleUrl, appName) {
|
|
3437
3437
|
const packageRoot = import_node_path4.default.resolve(import_node_path4.default.dirname((0, import_node_url.fileURLToPath)(__sootsim_import_meta_url)), "..");
|
|
3438
3438
|
const binPath = import_node_path4.default.join(packageRoot, "dist-cli", "bin.js");
|
|
3439
|
-
console.log(`[
|
|
3439
|
+
console.log(`[peach] opening ${appName} in the desktop simulator`);
|
|
3440
3440
|
const child = (0, import_node_child_process.spawn)(
|
|
3441
3441
|
process.execPath,
|
|
3442
3442
|
[binPath, ...buildRnxDesktopOpenArgs(bundleUrl)],
|
|
@@ -3587,7 +3587,7 @@ function unsupportedSpecifier(specifier) {
|
|
|
3587
3587
|
);
|
|
3588
3588
|
}
|
|
3589
3589
|
function bridgeDeclaration(name2, specifier) {
|
|
3590
|
-
const notReady = (what) => JSON.stringify(`[
|
|
3590
|
+
const notReady = (what) => JSON.stringify(`[peach] replacement ${what} bridge is not ready`);
|
|
3591
3591
|
if (specifier === "react") {
|
|
3592
3592
|
return `const ${name2} = ${REACT_BRIDGE}; if (!${name2}) throw new Error(${notReady("React")});`;
|
|
3593
3593
|
}
|
|
@@ -3595,12 +3595,12 @@ function bridgeDeclaration(name2, specifier) {
|
|
|
3595
3595
|
return `const ${name2} = ${REACT_NATIVE_BRIDGE}; if (!${name2}) throw new Error(${notReady("React Native")});`;
|
|
3596
3596
|
}
|
|
3597
3597
|
if (isContrastKitSpecifier(specifier)) {
|
|
3598
|
-
return `const ${name2} = (globalThis.__contrast_kit_modules && globalThis.__contrast_kit_modules[${JSON.stringify(specifier)}]) || (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name2}) throw new Error(${JSON.stringify(`[
|
|
3598
|
+
return `const ${name2} = (globalThis.__contrast_kit_modules && globalThis.__contrast_kit_modules[${JSON.stringify(specifier)}]) || (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name2}) throw new Error(${JSON.stringify(`[peach] replacement package bridge ${specifier} is not ready`)});`;
|
|
3599
3599
|
}
|
|
3600
3600
|
if (JSX_RUNTIME_SPECIFIERS.has(specifier)) {
|
|
3601
3601
|
return `const ${name2} = (() => { const react = ${REACT_BRIDGE}; if (!react) throw new Error(${notReady("React")}); const jsx = (type, props, key) => react.createElement(type, key === undefined ? props : { ...props, key }); return { Fragment: react.Fragment, jsx, jsxs: jsx, jsxDEV: jsx }; })();`;
|
|
3602
3602
|
}
|
|
3603
|
-
return `const ${name2} = (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name2}) throw new Error(${JSON.stringify(`[
|
|
3603
|
+
return `const ${name2} = (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name2}) throw new Error(${JSON.stringify(`[peach] replacement package bridge ${specifier} is not ready`)});`;
|
|
3604
3604
|
}
|
|
3605
3605
|
var DEFAULT_INTEROP = "__rnxReplacementDefault";
|
|
3606
3606
|
var DEFAULT_INTEROP_DECLARATION = `const ${DEFAULT_INTEROP} = (bridge) => (bridge && bridge.__esModule ? bridge.default : bridge);`;
|
|
@@ -3760,7 +3760,7 @@ function sendJavaScript(req, res, source) {
|
|
|
3760
3760
|
function isReplacementModuleRequestUrl(rawUrl) {
|
|
3761
3761
|
if (!rawUrl) return false;
|
|
3762
3762
|
try {
|
|
3763
|
-
const pathname = new URL(rawUrl, "http://
|
|
3763
|
+
const pathname = new URL(rawUrl, "http://peach.local").pathname;
|
|
3764
3764
|
return pathname === REPLACEMENT_MODULE_ROUTE;
|
|
3765
3765
|
} catch {
|
|
3766
3766
|
return false;
|
|
@@ -3770,7 +3770,7 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
|
|
|
3770
3770
|
const rawUrl = req.url || "";
|
|
3771
3771
|
let url;
|
|
3772
3772
|
try {
|
|
3773
|
-
url = new URL(rawUrl, "http://
|
|
3773
|
+
url = new URL(rawUrl, "http://peach.local");
|
|
3774
3774
|
} catch {
|
|
3775
3775
|
return false;
|
|
3776
3776
|
}
|
|
@@ -3876,7 +3876,7 @@ function isValidRuntimeVersion(value) {
|
|
|
3876
3876
|
}
|
|
3877
3877
|
|
|
3878
3878
|
// src/runtime-assets.ts
|
|
3879
|
-
var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[
|
|
3879
|
+
var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[peach] no engine runtime installed. run `peach runtime install`";
|
|
3880
3880
|
var _monorepoRootCache;
|
|
3881
3881
|
function findMonorepoRoot() {
|
|
3882
3882
|
if (_monorepoRootCache !== void 0) return _monorepoRootCache;
|
|
@@ -3892,7 +3892,7 @@ function findMonorepoRoot() {
|
|
|
3892
3892
|
return null;
|
|
3893
3893
|
}
|
|
3894
3894
|
function resolveDevCheckoutRuntimeRoot() {
|
|
3895
|
-
if (process.env.
|
|
3895
|
+
if (process.env.PEACH_HOME && readActiveRuntime()) return null;
|
|
3896
3896
|
const root = findMonorepoRoot();
|
|
3897
3897
|
if (!root) return null;
|
|
3898
3898
|
const devBuild = import_path2.default.join(root, "public/sootsim");
|
|
@@ -4156,8 +4156,8 @@ function rnxPlugin(options = {}) {
|
|
|
4156
4156
|
});
|
|
4157
4157
|
const port = configuredPort;
|
|
4158
4158
|
const sootsimUrl = `http://localhost:${port}${prefix2}/`;
|
|
4159
|
-
console.log(`[
|
|
4160
|
-
if (appName && !process.env.CI && !process.env.
|
|
4159
|
+
console.log(`[peach] serving at ${sootsimUrl}`);
|
|
4160
|
+
if (appName && !process.env.CI && !process.env.PEACH_NO_OPEN) {
|
|
4161
4161
|
server.httpServer?.once("listening", () => {
|
|
4162
4162
|
const openPort = listeningPort();
|
|
4163
4163
|
launchRnxDesktop(
|
|
@@ -4280,7 +4280,7 @@ function withRNX(config) {
|
|
|
4280
4280
|
try {
|
|
4281
4281
|
connect2 = require("connect");
|
|
4282
4282
|
} catch {
|
|
4283
|
-
console.warn("[
|
|
4283
|
+
console.warn("[peach] connect not available");
|
|
4284
4284
|
return middleware;
|
|
4285
4285
|
}
|
|
4286
4286
|
const server = connect2();
|
|
@@ -4339,7 +4339,7 @@ function withRNX(config) {
|
|
|
4339
4339
|
next();
|
|
4340
4340
|
});
|
|
4341
4341
|
server.use(middleware);
|
|
4342
|
-
console.log(`[
|
|
4342
|
+
console.log(`[peach] serving at ${prefix}/`);
|
|
4343
4343
|
return server;
|
|
4344
4344
|
}
|
|
4345
4345
|
};
|
|
@@ -4356,7 +4356,7 @@ function resolveMetroPort(server) {
|
|
|
4356
4356
|
const rawPort = inlinePort || splitPort || process.env.RCT_METRO_PORT || server?.port || 8081;
|
|
4357
4357
|
const port = Number(rawPort);
|
|
4358
4358
|
if (!Number.isInteger(port) || port <= 0) {
|
|
4359
|
-
throw new Error(`
|
|
4359
|
+
throw new Error(`peach: Metro port must be a positive integer, got ${rawPort}`);
|
|
4360
4360
|
}
|
|
4361
4361
|
return port;
|
|
4362
4362
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/menu.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -42,11 +42,11 @@ __export(menu_exports, {
|
|
|
42
42
|
module.exports = __toCommonJS(menu_exports);
|
|
43
43
|
|
|
44
44
|
// src/public-brand.ts
|
|
45
|
-
var name = "
|
|
45
|
+
var name = "Peach";
|
|
46
46
|
var rnxPublicBrand = Object.freeze({
|
|
47
47
|
name,
|
|
48
48
|
packageName: "peachsim",
|
|
49
|
-
commandName: "
|
|
49
|
+
commandName: "peach",
|
|
50
50
|
domain: "rnxsim.com",
|
|
51
51
|
origin: "https://rnxsim.com"
|
|
52
52
|
});
|
|
@@ -129,7 +129,7 @@ function appMenu() {
|
|
|
129
129
|
},
|
|
130
130
|
{ type: "separator" },
|
|
131
131
|
{
|
|
132
|
-
label:
|
|
132
|
+
label: `Hide ${rnxPublicBrand.name}`,
|
|
133
133
|
accelerator: "CmdOrCtrl+H",
|
|
134
134
|
action: "hide",
|
|
135
135
|
hiddenIn: "browser"
|
|
@@ -143,7 +143,7 @@ function appMenu() {
|
|
|
143
143
|
{ label: "Show All", action: "unhide", hiddenIn: "browser" },
|
|
144
144
|
{ type: "separator" },
|
|
145
145
|
{
|
|
146
|
-
label:
|
|
146
|
+
label: `Quit ${rnxPublicBrand.name}`,
|
|
147
147
|
accelerator: "CmdOrCtrl+Q",
|
|
148
148
|
action: "quit",
|
|
149
149
|
hiddenIn: "browser"
|
package/dist-lib/menu.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
|
|
3
3
|
// src/public-brand.ts
|
|
4
|
-
var name = "
|
|
4
|
+
var name = "Peach";
|
|
5
5
|
var rnxPublicBrand = Object.freeze({
|
|
6
6
|
name,
|
|
7
7
|
packageName: "peachsim",
|
|
8
|
-
commandName: "
|
|
8
|
+
commandName: "peach",
|
|
9
9
|
domain: "rnxsim.com",
|
|
10
10
|
origin: "https://rnxsim.com"
|
|
11
11
|
});
|
|
@@ -88,7 +88,7 @@ function appMenu() {
|
|
|
88
88
|
},
|
|
89
89
|
{ type: "separator" },
|
|
90
90
|
{
|
|
91
|
-
label:
|
|
91
|
+
label: `Hide ${rnxPublicBrand.name}`,
|
|
92
92
|
accelerator: "CmdOrCtrl+H",
|
|
93
93
|
action: "hide",
|
|
94
94
|
hiddenIn: "browser"
|
|
@@ -102,7 +102,7 @@ function appMenu() {
|
|
|
102
102
|
{ label: "Show All", action: "unhide", hiddenIn: "browser" },
|
|
103
103
|
{ type: "separator" },
|
|
104
104
|
{
|
|
105
|
-
label:
|
|
105
|
+
label: `Quit ${rnxPublicBrand.name}`,
|
|
106
106
|
accelerator: "CmdOrCtrl+Q",
|
|
107
107
|
action: "quit",
|
|
108
108
|
hiddenIn: "browser"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/metro.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -48,7 +48,7 @@ var import_node_crypto = require("node:crypto");
|
|
|
48
48
|
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
49
49
|
function tagRnxBundleForPlugin(bundleUrl, replacementOrigin, replacementToken, projectRoot, appName) {
|
|
50
50
|
const absolute = /^[a-z][a-z\d+.-]*:\/\//i.test(bundleUrl);
|
|
51
|
-
const url = new URL(bundleUrl, absolute ? void 0 : "http://
|
|
51
|
+
const url = new URL(bundleUrl, absolute ? void 0 : "http://peach.local");
|
|
52
52
|
if (appName) {
|
|
53
53
|
url.searchParams.set("rnxAppName", appName);
|
|
54
54
|
url.searchParams.set(
|
|
@@ -200,7 +200,7 @@ function unsupportedSpecifier(specifier) {
|
|
|
200
200
|
);
|
|
201
201
|
}
|
|
202
202
|
function bridgeDeclaration(name, specifier) {
|
|
203
|
-
const notReady = (what) => JSON.stringify(`[
|
|
203
|
+
const notReady = (what) => JSON.stringify(`[peach] replacement ${what} bridge is not ready`);
|
|
204
204
|
if (specifier === "react") {
|
|
205
205
|
return `const ${name} = ${REACT_BRIDGE}; if (!${name}) throw new Error(${notReady("React")});`;
|
|
206
206
|
}
|
|
@@ -208,12 +208,12 @@ function bridgeDeclaration(name, specifier) {
|
|
|
208
208
|
return `const ${name} = ${REACT_NATIVE_BRIDGE}; if (!${name}) throw new Error(${notReady("React Native")});`;
|
|
209
209
|
}
|
|
210
210
|
if (isContrastKitSpecifier(specifier)) {
|
|
211
|
-
return `const ${name} = (globalThis.__contrast_kit_modules && globalThis.__contrast_kit_modules[${JSON.stringify(specifier)}]) || (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name}) throw new Error(${JSON.stringify(`[
|
|
211
|
+
return `const ${name} = (globalThis.__contrast_kit_modules && globalThis.__contrast_kit_modules[${JSON.stringify(specifier)}]) || (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name}) throw new Error(${JSON.stringify(`[peach] replacement package bridge ${specifier} is not ready`)});`;
|
|
212
212
|
}
|
|
213
213
|
if (JSX_RUNTIME_SPECIFIERS.has(specifier)) {
|
|
214
214
|
return `const ${name} = (() => { const react = ${REACT_BRIDGE}; if (!react) throw new Error(${notReady("React")}); const jsx = (type, props, key) => react.createElement(type, key === undefined ? props : { ...props, key }); return { Fragment: react.Fragment, jsx, jsxs: jsx, jsxDEV: jsx }; })();`;
|
|
215
215
|
}
|
|
216
|
-
return `const ${name} = (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name}) throw new Error(${JSON.stringify(`[
|
|
216
|
+
return `const ${name} = (${PACKAGE_BRIDGES} || {})[${JSON.stringify(specifier)}]; if (!${name}) throw new Error(${JSON.stringify(`[peach] replacement package bridge ${specifier} is not ready`)});`;
|
|
217
217
|
}
|
|
218
218
|
var DEFAULT_INTEROP = "__rnxReplacementDefault";
|
|
219
219
|
var DEFAULT_INTEROP_DECLARATION = `const ${DEFAULT_INTEROP} = (bridge) => (bridge && bridge.__esModule ? bridge.default : bridge);`;
|
|
@@ -382,7 +382,7 @@ function sendJavaScript(req, res, source) {
|
|
|
382
382
|
function isReplacementModuleRequestUrl(rawUrl) {
|
|
383
383
|
if (!rawUrl) return false;
|
|
384
384
|
try {
|
|
385
|
-
const pathname = new URL(rawUrl, "http://
|
|
385
|
+
const pathname = new URL(rawUrl, "http://peach.local").pathname;
|
|
386
386
|
return pathname === REPLACEMENT_MODULE_ROUTE;
|
|
387
387
|
} catch {
|
|
388
388
|
return false;
|
|
@@ -392,7 +392,7 @@ async function handleReplacementModuleRequest(req, res, options = {}) {
|
|
|
392
392
|
const rawUrl = req.url || "";
|
|
393
393
|
let url;
|
|
394
394
|
try {
|
|
395
|
-
url = new URL(rawUrl, "http://
|
|
395
|
+
url = new URL(rawUrl, "http://peach.local");
|
|
396
396
|
} catch {
|
|
397
397
|
return false;
|
|
398
398
|
}
|
|
@@ -542,12 +542,12 @@ function isValidRuntimeVersion(value) {
|
|
|
542
542
|
var import_node_fs2 = __toESM(require("node:fs"), 1);
|
|
543
543
|
var import_node_os = require("node:os");
|
|
544
544
|
var import_node_path2 = __toESM(require("node:path"), 1);
|
|
545
|
-
var
|
|
545
|
+
var PEACH_HOME_ENV = "PEACH_HOME";
|
|
546
546
|
var ACTIVE_RUNTIME_FILE = "active";
|
|
547
547
|
function rnxHomeDir() {
|
|
548
|
-
const override = process.env[
|
|
548
|
+
const override = process.env[PEACH_HOME_ENV];
|
|
549
549
|
if (override && override.length > 0) return import_node_path2.default.resolve(override);
|
|
550
|
-
return import_node_path2.default.join((0, import_node_os.homedir)(), ".
|
|
550
|
+
return import_node_path2.default.join((0, import_node_os.homedir)(), ".peach");
|
|
551
551
|
}
|
|
552
552
|
function runtimesDir() {
|
|
553
553
|
return import_node_path2.default.join(rnxHomeDir(), "runtimes");
|
|
@@ -569,7 +569,7 @@ function readActiveRuntime() {
|
|
|
569
569
|
var DAEMON_LOCKFILE_MAX_BYTES = 16 * 1024;
|
|
570
570
|
|
|
571
571
|
// src/runtime-assets.ts
|
|
572
|
-
var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[
|
|
572
|
+
var SOOTSIM_RUNTIME_MISSING_MESSAGE = "[peach] no engine runtime installed. run `peach runtime install`";
|
|
573
573
|
var _monorepoRootCache;
|
|
574
574
|
function findMonorepoRoot() {
|
|
575
575
|
if (_monorepoRootCache !== void 0) return _monorepoRootCache;
|
|
@@ -585,7 +585,7 @@ function findMonorepoRoot() {
|
|
|
585
585
|
return null;
|
|
586
586
|
}
|
|
587
587
|
function resolveDevCheckoutRuntimeRoot() {
|
|
588
|
-
if (process.env.
|
|
588
|
+
if (process.env.PEACH_HOME && readActiveRuntime()) return null;
|
|
589
589
|
const root = findMonorepoRoot();
|
|
590
590
|
if (!root) return null;
|
|
591
591
|
const devBuild = import_path.default.join(root, "public/sootsim");
|
|
@@ -815,7 +815,7 @@ function withRNX(config) {
|
|
|
815
815
|
try {
|
|
816
816
|
connect = require("connect");
|
|
817
817
|
} catch {
|
|
818
|
-
console.warn("[
|
|
818
|
+
console.warn("[peach] connect not available");
|
|
819
819
|
return middleware;
|
|
820
820
|
}
|
|
821
821
|
const server = connect();
|
|
@@ -874,7 +874,7 @@ function withRNX(config) {
|
|
|
874
874
|
next();
|
|
875
875
|
});
|
|
876
876
|
server.use(middleware);
|
|
877
|
-
console.log(`[
|
|
877
|
+
console.log(`[peach] serving at ${prefix}/`);
|
|
878
878
|
return server;
|
|
879
879
|
}
|
|
880
880
|
};
|
|
@@ -891,7 +891,7 @@ function resolveMetroPort(server) {
|
|
|
891
891
|
const rawPort = inlinePort || splitPort || process.env.RCT_METRO_PORT || server?.port || 8081;
|
|
892
892
|
const port = Number(rawPort);
|
|
893
893
|
if (!Number.isInteger(port) || port <= 0) {
|
|
894
|
-
throw new Error(`
|
|
894
|
+
throw new Error(`peach: Metro port must be a positive integer, got ${rawPort}`);
|
|
895
895
|
}
|
|
896
896
|
return port;
|
|
897
897
|
}
|
package/dist-lib/profiles.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -55,11 +55,11 @@ var import_path = __toESM(require("path"), 1);
|
|
|
55
55
|
var import_node_fs = __toESM(require("node:fs"), 1);
|
|
56
56
|
var import_node_os = require("node:os");
|
|
57
57
|
var import_node_path = __toESM(require("node:path"), 1);
|
|
58
|
-
var
|
|
58
|
+
var PEACH_HOME_ENV = "PEACH_HOME";
|
|
59
59
|
function rnxHomeDir() {
|
|
60
|
-
const override = process.env[
|
|
60
|
+
const override = process.env[PEACH_HOME_ENV];
|
|
61
61
|
if (override && override.length > 0) return import_node_path.default.resolve(override);
|
|
62
|
-
return import_node_path.default.join((0, import_node_os.homedir)(), ".
|
|
62
|
+
return import_node_path.default.join((0, import_node_os.homedir)(), ".peach");
|
|
63
63
|
}
|
|
64
64
|
function runtimesDir() {
|
|
65
65
|
return import_node_path.default.join(rnxHomeDir(), "runtimes");
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -25,11 +25,11 @@ __export(public_brand_exports, {
|
|
|
25
25
|
rnxPublicBrand: () => rnxPublicBrand
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(public_brand_exports);
|
|
28
|
-
var name = "
|
|
28
|
+
var name = "Peach";
|
|
29
29
|
var rnxPublicBrand = Object.freeze({
|
|
30
30
|
name,
|
|
31
31
|
packageName: "peachsim",
|
|
32
|
-
commandName: "
|
|
32
|
+
commandName: "peach",
|
|
33
33
|
domain: "rnxsim.com",
|
|
34
34
|
origin: "https://rnxsim.com"
|
|
35
35
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.573 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|