peachsim 0.1.527
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 +22 -0
- package/README.md +640 -0
- package/cli/app-config.ts +82 -0
- package/cli/app-fonts.ts +388 -0
- package/cli/app-project.ts +59 -0
- package/cli/app-splash.ts +171 -0
- package/cli/app-state-reset.ts +26 -0
- package/cli/auth.ts +184 -0
- package/cli/bin.ts +59 -0
- package/cli/bridge-diagnostics.ts +226 -0
- package/cli/bridge-flow-runner.ts +2806 -0
- package/cli/browser-backend.ts +44 -0
- package/cli/browser-evals.ts +96 -0
- package/cli/cli-update.ts +261 -0
- package/cli/cloud-client.ts +1530 -0
- package/cli/cloud-dispatch.ts +206 -0
- package/cli/cloud-session.ts +227 -0
- package/cli/command-contract.ts +221 -0
- package/cli/command-registry.ts +304 -0
- package/cli/commands/agent-wrapper.ts +1048 -0
- package/cli/commands/agent.ts +439 -0
- package/cli/commands/app-fonts.ts +99 -0
- package/cli/commands/assert.ts +542 -0
- package/cli/commands/auth.ts +71 -0
- package/cli/commands/box/bundle-plane.ts +71 -0
- package/cli/commands/box/checkout-plane.ts +256 -0
- package/cli/commands/box/plane-share.ts +208 -0
- package/cli/commands/box/rnx-command.ts +60 -0
- package/cli/commands/box/search-command.ts +157 -0
- package/cli/commands/box.ts +925 -0
- package/cli/commands/camera.ts +266 -0
- package/cli/commands/cleanup.ts +169 -0
- package/cli/commands/compat.ts +176 -0
- package/cli/commands/config.ts +34 -0
- package/cli/commands/control.ts +2154 -0
- package/cli/commands/cpu-profile.ts +941 -0
- package/cli/commands/daemon-mac-app.ts +165 -0
- package/cli/commands/daemon.ts +800 -0
- package/cli/commands/debug.ts +751 -0
- package/cli/commands/desktop.ts +39 -0
- package/cli/commands/detect.ts +201 -0
- package/cli/commands/detox.ts +481 -0
- package/cli/commands/device.ts +134 -0
- package/cli/commands/diagnose.ts +589 -0
- package/cli/commands/do-chain.ts +408 -0
- package/cli/commands/electron.ts +94 -0
- package/cli/commands/film.ts +379 -0
- package/cli/commands/flow.ts +1240 -0
- package/cli/commands/inspect/actions.ts +516 -0
- package/cli/commands/inspect/core.ts +2086 -0
- package/cli/commands/inspect/count.ts +17 -0
- package/cli/commands/inspect/describe.ts +119 -0
- package/cli/commands/inspect/env.ts +25 -0
- package/cli/commands/inspect/find.ts +169 -0
- package/cli/commands/inspect/get-layout.ts +53 -0
- package/cli/commands/inspect/keyboard.ts +54 -0
- package/cli/commands/inspect/list.ts +175 -0
- package/cli/commands/inspect/memory.ts +215 -0
- package/cli/commands/inspect/redaction.ts +39 -0
- package/cli/commands/inspect/resolve-target.ts +77 -0
- package/cli/commands/inspect/screens.ts +78 -0
- package/cli/commands/inspect/settle.ts +32 -0
- package/cli/commands/inspect/settling.ts +197 -0
- package/cli/commands/inspect/shared.ts +259 -0
- package/cli/commands/inspect/sleep.ts +15 -0
- package/cli/commands/inspect/tree.ts +23 -0
- package/cli/commands/inspect/url.ts +17 -0
- package/cli/commands/inspect/wait-event.ts +211 -0
- package/cli/commands/inspect/wait-idle.ts +25 -0
- package/cli/commands/inspect/wait-ready.ts +87 -0
- package/cli/commands/inspect/wait-selector.ts +59 -0
- package/cli/commands/inspect/wait.ts +32 -0
- package/cli/commands/inspect.ts +4738 -0
- package/cli/commands/install-cli.ts +275 -0
- package/cli/commands/install-desktop.ts +385 -0
- package/cli/commands/login.ts +357 -0
- package/cli/commands/logout.ts +24 -0
- package/cli/commands/maestro-generate.ts +375 -0
- package/cli/commands/maestro.ts +536 -0
- package/cli/commands/mode.ts +58 -0
- package/cli/commands/no-bridge-hint.ts +80 -0
- package/cli/commands/perf.ts +67 -0
- package/cli/commands/permissions.ts +203 -0
- package/cli/commands/platform.ts +410 -0
- package/cli/commands/preview.ts +103 -0
- package/cli/commands/profile.ts +106 -0
- package/cli/commands/react.ts +353 -0
- package/cli/commands/record.ts +1435 -0
- package/cli/commands/report-issue.ts +305 -0
- package/cli/commands/reset.ts +89 -0
- package/cli/commands/runtime.ts +348 -0
- package/cli/commands/screenshot-command.ts +106 -0
- package/cli/commands/screenshot-layers.ts +144 -0
- package/cli/commands/screenshot-mode.ts +38 -0
- package/cli/commands/screenshot.ts +492 -0
- package/cli/commands/screenshots-capture.ts +608 -0
- package/cli/commands/screenshots.ts +127 -0
- package/cli/commands/serve.ts +139 -0
- package/cli/commands/setup.ts +416 -0
- package/cli/commands/shell-boolean-mode.ts +82 -0
- package/cli/commands/skills.ts +468 -0
- package/cli/commands/slides.ts +357 -0
- package/cli/commands/state.ts +94 -0
- package/cli/commands/storage.ts +58 -0
- package/cli/commands/telemetry.ts +55 -0
- package/cli/commands/test.ts +535 -0
- package/cli/commands/three-mode.ts +771 -0
- package/cli/commands/timeline.ts +121 -0
- package/cli/commands/upgrade.ts +167 -0
- package/cli/commands/upload.ts +1203 -0
- package/cli/commands/version.ts +63 -0
- package/cli/commands/welcome.ts +17 -0
- package/cli/commands/what-happened.ts +328 -0
- package/cli/current-sim.ts +217 -0
- package/cli/desktop-companion.ts +315 -0
- package/cli/drivers/electron.ts +70 -0
- package/cli/drivers/index.ts +20 -0
- package/cli/drivers/playwright-provisioning.ts +184 -0
- package/cli/drivers/playwright-sim-host.ts +537 -0
- package/cli/drivers/playwright.ts +209 -0
- package/cli/drivers/registry.ts +65 -0
- package/cli/drivers/types.ts +102 -0
- package/cli/flow-export.ts +55 -0
- package/cli/flow-file.ts +142 -0
- package/cli/flow-live-status.ts +126 -0
- package/cli/flow-session.ts +140 -0
- package/cli/help-core.ts +143 -0
- package/cli/help.ts +44 -0
- package/cli/hidden-runtime-alias.ts +19 -0
- package/cli/hints.ts +214 -0
- package/cli/inspect-notice-state.ts +114 -0
- package/cli/internal-child.ts +176 -0
- package/cli/maestro-js.ts +323 -0
- package/cli/main.ts +704 -0
- package/cli/open-url.ts +8 -0
- package/cli/outbound-endpoints.ts +830 -0
- package/cli/parent-pid.ts +204 -0
- package/cli/parse-args.ts +189 -0
- package/cli/privacy.ts +53 -0
- package/cli/prompt.ts +56 -0
- package/cli/recording-access.ts +108 -0
- package/cli/registry.ts +2 -0
- package/cli/resolve-assets.ts +63 -0
- package/cli/rnx-in-process.ts +98 -0
- package/cli/run-registry.ts +226 -0
- package/cli/run-rnx-core.ts +148 -0
- package/cli/run-rnx.ts +137 -0
- package/cli/runtime-notes.ts +66 -0
- package/cli/runtime-summary.ts +25 -0
- package/cli/secure-file.ts +31 -0
- package/cli/self-invocation.ts +58 -0
- package/cli/send-to-box.ts +109 -0
- package/cli/setup-repository.ts +191 -0
- package/cli/shell-init.ts +98 -0
- package/cli/standalone.ts +4 -0
- package/cli/telemetry.ts +84 -0
- package/cli/ui.ts +68 -0
- package/cli/ws-bridge.ts +1020 -0
- package/detox/attempt-events.cjs +23 -0
- package/detox/colors.ts +54 -0
- package/detox/config-loader.ts +135 -0
- package/detox/element-types.ts +48 -0
- package/detox/expectations.ts +534 -0
- package/detox/gestures.ts +501 -0
- package/detox/index.ts +2694 -0
- package/detox/jest-preset.cjs +29 -0
- package/detox/jest-setup-after-env.cjs +22 -0
- package/detox/matchers.ts +30 -0
- package/detox/motion-change.cjs +109 -0
- package/detox/motion-change.d.cts +35 -0
- package/detox/navigation-lifecycle.ts +290 -0
- package/detox/navigation.ts +43 -0
- package/detox/proof-frame.cjs +114 -0
- package/detox/record-block-execution.cjs +78 -0
- package/detox/screenshots/animated-color-test-rest-norngh.png +0 -0
- package/detox/screenshots/color-test-after-drag-norngh.png +0 -0
- package/detox/screenshots/color-test-rest-norngh.png +0 -0
- package/detox/screenshots/theme-blue-toggle.png +0 -0
- package/detox/screenshots/theme-blue.png +0 -0
- package/detox/screenshots/theme-red-toggle.png +0 -0
- package/detox/screenshots/theme-red.png +0 -0
- package/dist-lib/agent-daemon-client.cjs +502 -0
- package/dist-lib/agent-events.cjs +48 -0
- package/dist-lib/agent-identity.cjs +53 -0
- package/dist-lib/agent-sessions.cjs +759 -0
- package/dist-lib/attached-projects.cjs +526 -0
- package/dist-lib/auth/shared-session.cjs +208 -0
- package/dist-lib/backend-origin.cjs +88 -0
- package/dist-lib/beta.cjs +41 -0
- package/dist-lib/beta.mjs +13 -0
- package/dist-lib/bridge-constants.cjs +161 -0
- package/dist-lib/bridge-contract-input.cjs +451 -0
- package/dist-lib/bridge-contract-input.mjs +414 -0
- package/dist-lib/bridge-contract.cjs +130 -0
- package/dist-lib/bridge-contract.mjs +94 -0
- package/dist-lib/capture-contract.cjs +220 -0
- package/dist-lib/capture-contract.mjs +190 -0
- package/dist-lib/cli-constants.cjs +32 -0
- package/dist-lib/cloud-contract.cjs +194 -0
- package/dist-lib/cloud-contract.mjs +145 -0
- package/dist-lib/cloud.cjs +670 -0
- package/dist-lib/cloud.mjs +639 -0
- package/dist-lib/config.cjs +96 -0
- package/dist-lib/detox/index.cjs +3789 -0
- package/dist-lib/detox/jest-preset.cjs +29 -0
- package/dist-lib/dev-bundle-resolution.cjs +290 -0
- package/dist-lib/home-paths.cjs +638 -0
- package/dist-lib/host/bridge-host.cjs +10903 -0
- package/dist-lib/host/fetch-proxy-handler.cjs +421 -0
- package/dist-lib/host/fetch-proxy-overrides.cjs +63 -0
- package/dist-lib/host/fetch-proxy-overrides.mjs +37 -0
- package/dist-lib/host/replacement-module-handler.cjs +469 -0
- package/dist-lib/host/websocket-proxy.cjs +298 -0
- package/dist-lib/index.cjs +4268 -0
- package/dist-lib/jump-to-source-babel.cjs +93 -0
- package/dist-lib/jump-to-source-native.cjs +112 -0
- package/dist-lib/menu.cjs +646 -0
- package/dist-lib/menu.mjs +604 -0
- package/dist-lib/metro-fingerprint-registry.cjs +186 -0
- package/dist-lib/metro-fingerprint-registry.mjs +156 -0
- package/dist-lib/metro-production-bundle.cjs +329 -0
- package/dist-lib/metro-production-bundle.mjs +295 -0
- package/dist-lib/metro.cjs +904 -0
- package/dist-lib/profiles.cjs +246 -0
- package/dist-lib/public-brand.cjs +39 -0
- package/dist-lib/react-native-host-modules.cjs +51 -0
- package/dist-lib/react-native-host-modules.mjs +25 -0
- package/dist-lib/render-mode.cjs +54 -0
- package/dist-lib/scripts/dev-server-scanner.cjs +1232 -0
- package/dist-lib/sdk.cjs +2433 -0
- package/dist-lib/sdk.mjs +2336 -0
- package/dist-lib/skills.cjs +39132 -0
- package/dist-lib/swift-submit.cjs +92 -0
- package/dist-lib/swift-submit.mjs +65 -0
- package/dist-lib/swift.cjs +1646 -0
- package/dist-lib/vite.cjs +1591 -0
- package/package.json +290 -0
- package/scripts/dev-server-scanner.ts +1291 -0
- package/scripts/optional-demo-registry.ts +113 -0
- package/skills/contrast/SKILL.md +165 -0
- package/skills/rnx-debug/SKILL.md +433 -0
- package/skills/rnx-perf/SKILL.md +399 -0
- package/skills/rnx-setup/SKILL.md +172 -0
- package/skills/rnx-test/SKILL.md +321 -0
- package/skills/rnx-visual/SKILL.md +126 -0
- package/src/agent-daemon-client.ts +410 -0
- package/src/agent-events.ts +71 -0
- package/src/agent-identity.ts +23 -0
- package/src/agent-prompt.ts +71 -0
- package/src/agent-sessions.ts +580 -0
- package/src/app-url.ts +39 -0
- package/src/attached-projects.ts +539 -0
- package/src/auth/shared-session.ts +235 -0
- package/src/backend-origin.ts +70 -0
- package/src/beta.ts +19 -0
- package/src/bridge-constants.ts +175 -0
- package/src/bridge-contract-input.ts +502 -0
- package/src/bridge-contract.ts +558 -0
- package/src/browser-cache.ts +16 -0
- package/src/capture-contract.ts +587 -0
- package/src/cli-constants.ts +1 -0
- package/src/cli-version.ts +40 -0
- package/src/cloud-contract.ts +274 -0
- package/src/cloud.ts +762 -0
- package/src/codex-client.ts +234 -0
- package/src/config.ts +132 -0
- package/src/connect.ts +101 -0
- package/src/dev-bundle-resolution.ts +346 -0
- package/src/dev-server-open.ts +198 -0
- package/src/disk-cleanup.ts +540 -0
- package/src/flow-timeout-scale.ts +15 -0
- package/src/home-paths.ts +806 -0
- package/src/host/agent-host.ts +666 -0
- package/src/host/bridge-host.ts +2788 -0
- package/src/host/fetch-proxy-handler.ts +449 -0
- package/src/host/fetch-proxy-overrides.ts +51 -0
- package/src/host/open-url.ts +89 -0
- package/src/host/plane-host.ts +203 -0
- package/src/host/replacement-module-handler.ts +158 -0
- package/src/host/websocket-proxy.ts +315 -0
- package/src/index.ts +71 -0
- package/src/jump-to-source-babel.ts +135 -0
- package/src/jump-to-source-native.ts +102 -0
- package/src/menu.ts +777 -0
- package/src/metro-fingerprint-registry.ts +302 -0
- package/src/metro-plugin.ts +341 -0
- package/src/metro-production-bundle.ts +471 -0
- package/src/native-dev-bundle-url.ts +118 -0
- package/src/native-seam-manifest.ts +341 -0
- package/src/playwright-host-log.ts +16 -0
- package/src/plist.ts +27 -0
- package/src/poll-until.ts +123 -0
- package/src/profiles.ts +179 -0
- package/src/public-brand.ts +9 -0
- package/src/react-native-host-modules.ts +26 -0
- package/src/render-mode.ts +27 -0
- package/src/rolldown-plugin-swift.ts +240 -0
- package/src/runtime-assets.ts +233 -0
- package/src/runtime-delivery.ts +54 -0
- package/src/screenshots/compose.ts +422 -0
- package/src/screenshots/frame-compose.ts +514 -0
- package/src/screenshots/orchestrate.ts +256 -0
- package/src/screenshots/org-deck.ts +91 -0
- package/src/screenshots/registry.ts +58 -0
- package/src/screenshots/schema.ts +364 -0
- package/src/sdk.ts +15 -0
- package/src/settings-bundle.ts +418 -0
- package/src/shell-bridge-identity.ts +15 -0
- package/src/sim-client.ts +697 -0
- package/src/skills/builtin/a11y-review.ts +132 -0
- package/src/skills/builtin/compat-check.ts +71 -0
- package/src/skills/builtin/maestro-test.ts +121 -0
- package/src/skills/builtin/perf-profile.ts +90 -0
- package/src/skills/builtin/screenshot-all.ts +52 -0
- package/src/skills/builtin/visual-diff.ts +100 -0
- package/src/skills/registry.ts +107 -0
- package/src/skills/types.ts +41 -0
- package/src/swift-submit.ts +185 -0
- package/src/swift.ts +7 -0
- package/src/team-machine-prompt.ts +73 -0
- package/src/vite-plugin-one.ts +264 -0
- package/src/vite-plugin-swift.ts +620 -0
- package/src/vite-plugin.ts +1946 -0
- package/src/worklets-babel.ts +250 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/*! rnx v0.1.527 | (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
|
+
// src/capture-contract.ts
|
|
23
|
+
var capture_contract_exports = {};
|
|
24
|
+
__export(capture_contract_exports, {
|
|
25
|
+
RNX_SCREEN_CAPTURE_VERSION: () => RNX_SCREEN_CAPTURE_VERSION,
|
|
26
|
+
isRnxCaptureRegionAtlas: () => isRnxCaptureRegionAtlas,
|
|
27
|
+
isRnxScreenCapture: () => isRnxScreenCapture,
|
|
28
|
+
rnxCaptureRasterRegions: () => rnxCaptureRasterRegions,
|
|
29
|
+
rnxRasterFrames: () => rnxRasterFrames,
|
|
30
|
+
selectRnxRasterNodeIds: () => selectRnxRasterNodeIds
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(capture_contract_exports);
|
|
33
|
+
var RNX_SCREEN_CAPTURE_VERSION = 1;
|
|
34
|
+
function selectRnxRasterNodeIds(tree) {
|
|
35
|
+
const nodesById = new Map(tree.nodes.map((node) => [node.nodeId, node]));
|
|
36
|
+
const unsupported = /* @__PURE__ */ new Set();
|
|
37
|
+
for (const node of tree.nodes) {
|
|
38
|
+
const visibleFrame = node.visibleFrame ?? node.frame;
|
|
39
|
+
if (!visibleFrame || visibleFrame.width <= 0 || visibleFrame.height <= 0) continue;
|
|
40
|
+
if (node.type === "masked-view" || node.type === "text" && typeof node.text === "string" && (new RegExp("\\p{Emoji_Presentation}", "u").test(node.text) || new RegExp("\\uFE0F|\\u200D|\\u20E3|\\p{Emoji_Modifier}|\\p{Regional_Indicator}", "u").test(
|
|
41
|
+
node.text
|
|
42
|
+
)) || node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0) {
|
|
43
|
+
unsupported.add(node.nodeId);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
for (const nodeId of [...unsupported]) {
|
|
47
|
+
let parentNodeId = nodesById.get(nodeId)?.parentNodeId ?? null;
|
|
48
|
+
while (parentNodeId !== null) {
|
|
49
|
+
if (unsupported.has(parentNodeId)) {
|
|
50
|
+
unsupported.delete(nodeId);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
parentNodeId = nodesById.get(parentNodeId)?.parentNodeId ?? null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
const screenArea = tree.width * tree.height;
|
|
57
|
+
const maxLayerArea = screenArea * 0.25;
|
|
58
|
+
const maxAtlasArea = screenArea * 0.5;
|
|
59
|
+
const candidates = [...unsupported].map((nodeId) => {
|
|
60
|
+
const node = nodesById.get(nodeId);
|
|
61
|
+
const frame = node?.visibleFrame ?? node?.frame;
|
|
62
|
+
return frame ? { nodeId, area: frame.width * frame.height } : null;
|
|
63
|
+
}).filter(
|
|
64
|
+
(candidate) => candidate !== null && candidate.area <= maxLayerArea
|
|
65
|
+
).sort((left, right) => left.area - right.area || left.nodeId - right.nodeId);
|
|
66
|
+
const selected = /* @__PURE__ */ new Set();
|
|
67
|
+
let atlasArea = 0;
|
|
68
|
+
for (const candidate of candidates) {
|
|
69
|
+
if (atlasArea + candidate.area > maxAtlasArea) continue;
|
|
70
|
+
selected.add(candidate.nodeId);
|
|
71
|
+
atlasArea += candidate.area;
|
|
72
|
+
}
|
|
73
|
+
return selected;
|
|
74
|
+
}
|
|
75
|
+
function rnxRasterFrames(tree, nodeIds) {
|
|
76
|
+
const frames = /* @__PURE__ */ new Map();
|
|
77
|
+
for (const node of tree.nodes) {
|
|
78
|
+
if (!nodeIds.has(node.nodeId)) continue;
|
|
79
|
+
const frame = node.frame ?? {
|
|
80
|
+
x: node.absolutePosition.x,
|
|
81
|
+
y: node.absolutePosition.y,
|
|
82
|
+
width: node.layout.width,
|
|
83
|
+
height: node.layout.height
|
|
84
|
+
};
|
|
85
|
+
const liquidGlass = node.style._liquidGlass;
|
|
86
|
+
const capturePadding = liquidGlass && typeof liquidGlass === "object" && typeof Reflect.get(liquidGlass, "capturePadding") === "number" ? Reflect.get(liquidGlass, "capturePadding") : 0;
|
|
87
|
+
const shadowRadius = typeof node.style.shadowRadius === "number" ? node.style.shadowRadius : 0;
|
|
88
|
+
const shadowOffset = node.style.shadowOffset;
|
|
89
|
+
const shadowOffsetX = shadowOffset && typeof shadowOffset === "object" && typeof Reflect.get(shadowOffset, "width") === "number" ? Reflect.get(shadowOffset, "width") : 0;
|
|
90
|
+
const shadowOffsetY = shadowOffset && typeof shadowOffset === "object" && typeof Reflect.get(shadowOffset, "height") === "number" ? Reflect.get(shadowOffset, "height") : 0;
|
|
91
|
+
const left = Math.max(
|
|
92
|
+
0,
|
|
93
|
+
frame.x - Math.max(capturePadding, shadowRadius - shadowOffsetX)
|
|
94
|
+
);
|
|
95
|
+
const top = Math.max(
|
|
96
|
+
0,
|
|
97
|
+
frame.y - Math.max(capturePadding, shadowRadius - shadowOffsetY)
|
|
98
|
+
);
|
|
99
|
+
const right = Math.min(
|
|
100
|
+
tree.width,
|
|
101
|
+
frame.x + frame.width + Math.max(capturePadding, shadowRadius + shadowOffsetX)
|
|
102
|
+
);
|
|
103
|
+
const bottom = Math.min(
|
|
104
|
+
tree.height,
|
|
105
|
+
frame.y + frame.height + Math.max(capturePadding, shadowRadius + shadowOffsetY)
|
|
106
|
+
);
|
|
107
|
+
if (right > left && bottom > top) {
|
|
108
|
+
frames.set(node.nodeId, {
|
|
109
|
+
x: left,
|
|
110
|
+
y: top,
|
|
111
|
+
width: right - left,
|
|
112
|
+
height: bottom - top
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return frames;
|
|
117
|
+
}
|
|
118
|
+
function rnxCaptureRasterRegions(capture) {
|
|
119
|
+
const tree = {
|
|
120
|
+
width: capture.tree.viewport.width,
|
|
121
|
+
height: capture.tree.viewport.height,
|
|
122
|
+
nodes: capture.tree.nodes.map((node) => ({
|
|
123
|
+
nodeId: node.nodeId,
|
|
124
|
+
parentNodeId: node.parentNodeId,
|
|
125
|
+
type: node.type,
|
|
126
|
+
text: node.text,
|
|
127
|
+
style: node.style.resolved,
|
|
128
|
+
layout: node.layout.local,
|
|
129
|
+
frame: node.layout.frame,
|
|
130
|
+
absolutePosition: node.layout.absolutePosition,
|
|
131
|
+
visibleFrame: node.layout.visibleFrame
|
|
132
|
+
}))
|
|
133
|
+
};
|
|
134
|
+
const nodeIds = selectRnxRasterNodeIds(tree);
|
|
135
|
+
const frames = rnxRasterFrames(tree, nodeIds);
|
|
136
|
+
return [...nodeIds].flatMap((nodeId) => {
|
|
137
|
+
const frame = frames.get(nodeId);
|
|
138
|
+
return frame ? [{ key: String(nodeId), nodeId, frame }] : [];
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
function captureRecord(value) {
|
|
142
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
143
|
+
}
|
|
144
|
+
function captureInteger(value) {
|
|
145
|
+
return typeof value === "number" && Number.isSafeInteger(value);
|
|
146
|
+
}
|
|
147
|
+
function captureNumber(value) {
|
|
148
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
149
|
+
}
|
|
150
|
+
function captureNullableString(value) {
|
|
151
|
+
return value === null || typeof value === "string";
|
|
152
|
+
}
|
|
153
|
+
function captureRect(value) {
|
|
154
|
+
return captureRecord(value) && captureNumber(value.x) && captureNumber(value.y) && captureNumber(value.width) && captureNumber(value.height);
|
|
155
|
+
}
|
|
156
|
+
function captureOptionalString(value) {
|
|
157
|
+
return value === void 0 || typeof value === "string";
|
|
158
|
+
}
|
|
159
|
+
function captureOptionalNullableString(value) {
|
|
160
|
+
return value === void 0 || captureNullableString(value);
|
|
161
|
+
}
|
|
162
|
+
function captureFontRegistration(value) {
|
|
163
|
+
return captureRecord(value) && typeof value.family === "string" && value.family.length > 0 && captureOptionalString(value.url) && captureOptionalString(value.sourceLabel) && captureOptionalNullableString(value.parsedFamily) && captureOptionalNullableString(value.parsedPostScript) && captureOptionalNullableString(value.fullName);
|
|
164
|
+
}
|
|
165
|
+
function capturePoint(value) {
|
|
166
|
+
return captureRecord(value) && captureNumber(value.x) && captureNumber(value.y);
|
|
167
|
+
}
|
|
168
|
+
function captureNode(value) {
|
|
169
|
+
if (!captureRecord(value) || !captureInteger(value.nodeId) || !(value.parentNodeId === null || captureInteger(value.parentNodeId)) || !Array.isArray(value.childNodeIds) || !value.childNodeIds.every(captureInteger) || !captureInteger(value.paintIndex) || typeof value.type !== "string" || !captureNullableString(value.id) || !captureNullableString(value.testID) || !captureNullableString(value.text) || !captureInteger(value.childCount) || !captureRecord(value.accessibility) || !captureRecord(value.interaction) || !captureRecord(value.layout) || !captureRecord(value.style) || !captureRecord(value.source) || !captureRecord(value.props) || !captureRecord(value.inspection)) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
const accessibility = value.accessibility;
|
|
173
|
+
if (typeof accessibility.accessible !== "boolean" || !captureNullableString(accessibility.label) || !captureNullableString(accessibility.role) || !captureNullableString(accessibility.hint) || !(accessibility.liveRegion === null || accessibility.liveRegion === "none" || accessibility.liveRegion === "polite" || accessibility.liveRegion === "assertive") || !(accessibility.state === null || captureRecord(accessibility.state)) || !(accessibility.value === null || captureRecord(accessibility.value))) {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
const interaction = value.interaction;
|
|
177
|
+
if (typeof interaction.pressed !== "boolean" || typeof interaction.pressable !== "boolean" || typeof interaction.textInput !== "boolean" || !(interaction.textSelection === null || captureRecord(interaction.textSelection)) || typeof interaction.secureTextEntry !== "boolean" || !captureNullableString(interaction.placeholder) || !capturePoint(interaction.scrollOffset) || !(interaction.zoomScale === null || captureNumber(interaction.zoomScale)) || typeof interaction.nativePinchEnabled !== "boolean" || !(interaction.contentOffsetProp === null || captureRecord(interaction.contentOffsetProp)) || !(interaction.strokeDashoffsetProp === null || captureNumber(interaction.strokeDashoffsetProp))) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
const layout = value.layout;
|
|
181
|
+
if (!captureRect(layout.local) || !(layout.frame === null || captureRect(layout.frame)) || !capturePoint(layout.absolutePosition) || !(layout.visibleFrame === null || captureRect(layout.visibleFrame))) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
const style = value.style;
|
|
185
|
+
return captureRecord(style.resolved) && captureRecord(style.authored) && captureRecord(style.computed) && captureRecord(style.tokenBindings) && (value.textLines === void 0 || Array.isArray(value.textLines));
|
|
186
|
+
}
|
|
187
|
+
function isRnxScreenCapture(value) {
|
|
188
|
+
if (!captureRecord(value) || value.contractVersion !== RNX_SCREEN_CAPTURE_VERSION || !captureInteger(value.capturedAt) || !captureRecord(value.tree) || !(value.fonts === void 0 || Array.isArray(value.fonts) && value.fonts.length <= 200 && value.fonts.every(captureFontRegistration)) || !(value.visual === void 0 || captureRecord(value.visual))) {
|
|
189
|
+
return false;
|
|
190
|
+
}
|
|
191
|
+
const tree = value.tree;
|
|
192
|
+
const visual = value.visual;
|
|
193
|
+
return captureRecord(tree.viewport) && captureInteger(tree.viewport.width) && tree.viewport.width > 0 && captureInteger(tree.viewport.height) && tree.viewport.height > 0 && captureInteger(tree.rootNodeId) && (tree.commitRevision === void 0 || captureInteger(tree.commitRevision)) && Array.isArray(tree.nodes) && tree.nodes.every(captureNode) && (visual === void 0 || visual.kind === "png" && (visual.producer === "headless-cpu-app-surface" || visual.producer === "browser-compositor-app-surface") && typeof visual.dataUri === "string" && visual.dataUri.startsWith("data:image/png;base64,") && captureInteger(visual.pixelWidth) && visual.pixelWidth > 0 && captureInteger(visual.pixelHeight) && visual.pixelHeight > 0);
|
|
194
|
+
}
|
|
195
|
+
function isRnxCaptureRegionAtlas(value) {
|
|
196
|
+
if (!captureRecord(value) || value.kind !== "png-atlas" || value.producer !== "headless-cpu-app-surface" || typeof value.dataUri !== "string" || !value.dataUri.startsWith("data:image/png;base64,") || !captureNumber(value.width) || value.width <= 0 || !captureNumber(value.height) || value.height <= 0 || !captureInteger(value.pixelWidth) || value.pixelWidth <= 0 || !captureInteger(value.pixelHeight) || value.pixelHeight <= 0 || !Array.isArray(value.regions) || value.regions.length === 0 || value.regions.length > 256) {
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
const scale = value.pixelWidth / value.width;
|
|
200
|
+
if (!Number.isInteger(scale) || scale < 1 || scale > 4 || Math.abs(value.height * scale - value.pixelHeight) > 1e-6) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
const keys = /* @__PURE__ */ new Set();
|
|
204
|
+
for (const region of value.regions) {
|
|
205
|
+
if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
keys.add(region.key);
|
|
209
|
+
}
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
213
|
+
0 && (module.exports = {
|
|
214
|
+
RNX_SCREEN_CAPTURE_VERSION,
|
|
215
|
+
isRnxCaptureRegionAtlas,
|
|
216
|
+
isRnxScreenCapture,
|
|
217
|
+
rnxCaptureRasterRegions,
|
|
218
|
+
rnxRasterFrames,
|
|
219
|
+
selectRnxRasterNodeIds
|
|
220
|
+
});
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
/*! rnx v0.1.527 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
+
|
|
3
|
+
// src/capture-contract.ts
|
|
4
|
+
var RNX_SCREEN_CAPTURE_VERSION = 1;
|
|
5
|
+
function selectRnxRasterNodeIds(tree) {
|
|
6
|
+
const nodesById = new Map(tree.nodes.map((node) => [node.nodeId, node]));
|
|
7
|
+
const unsupported = /* @__PURE__ */ new Set();
|
|
8
|
+
for (const node of tree.nodes) {
|
|
9
|
+
const visibleFrame = node.visibleFrame ?? node.frame;
|
|
10
|
+
if (!visibleFrame || visibleFrame.width <= 0 || visibleFrame.height <= 0) continue;
|
|
11
|
+
if (node.type === "masked-view" || node.type === "text" && typeof node.text === "string" && (/\p{Emoji_Presentation}/u.test(node.text) || /\uFE0F|\u200D|\u20E3|\p{Emoji_Modifier}|\p{Regional_Indicator}/u.test(
|
|
12
|
+
node.text
|
|
13
|
+
)) || node.style._liquidGlass !== void 0 || node.style._liquidGlassEdge !== void 0) {
|
|
14
|
+
unsupported.add(node.nodeId);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
for (const nodeId of [...unsupported]) {
|
|
18
|
+
let parentNodeId = nodesById.get(nodeId)?.parentNodeId ?? null;
|
|
19
|
+
while (parentNodeId !== null) {
|
|
20
|
+
if (unsupported.has(parentNodeId)) {
|
|
21
|
+
unsupported.delete(nodeId);
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
parentNodeId = nodesById.get(parentNodeId)?.parentNodeId ?? null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const screenArea = tree.width * tree.height;
|
|
28
|
+
const maxLayerArea = screenArea * 0.25;
|
|
29
|
+
const maxAtlasArea = screenArea * 0.5;
|
|
30
|
+
const candidates = [...unsupported].map((nodeId) => {
|
|
31
|
+
const node = nodesById.get(nodeId);
|
|
32
|
+
const frame = node?.visibleFrame ?? node?.frame;
|
|
33
|
+
return frame ? { nodeId, area: frame.width * frame.height } : null;
|
|
34
|
+
}).filter(
|
|
35
|
+
(candidate) => candidate !== null && candidate.area <= maxLayerArea
|
|
36
|
+
).sort((left, right) => left.area - right.area || left.nodeId - right.nodeId);
|
|
37
|
+
const selected = /* @__PURE__ */ new Set();
|
|
38
|
+
let atlasArea = 0;
|
|
39
|
+
for (const candidate of candidates) {
|
|
40
|
+
if (atlasArea + candidate.area > maxAtlasArea) continue;
|
|
41
|
+
selected.add(candidate.nodeId);
|
|
42
|
+
atlasArea += candidate.area;
|
|
43
|
+
}
|
|
44
|
+
return selected;
|
|
45
|
+
}
|
|
46
|
+
function rnxRasterFrames(tree, nodeIds) {
|
|
47
|
+
const frames = /* @__PURE__ */ new Map();
|
|
48
|
+
for (const node of tree.nodes) {
|
|
49
|
+
if (!nodeIds.has(node.nodeId)) continue;
|
|
50
|
+
const frame = node.frame ?? {
|
|
51
|
+
x: node.absolutePosition.x,
|
|
52
|
+
y: node.absolutePosition.y,
|
|
53
|
+
width: node.layout.width,
|
|
54
|
+
height: node.layout.height
|
|
55
|
+
};
|
|
56
|
+
const liquidGlass = node.style._liquidGlass;
|
|
57
|
+
const capturePadding = liquidGlass && typeof liquidGlass === "object" && typeof Reflect.get(liquidGlass, "capturePadding") === "number" ? Reflect.get(liquidGlass, "capturePadding") : 0;
|
|
58
|
+
const shadowRadius = typeof node.style.shadowRadius === "number" ? node.style.shadowRadius : 0;
|
|
59
|
+
const shadowOffset = node.style.shadowOffset;
|
|
60
|
+
const shadowOffsetX = shadowOffset && typeof shadowOffset === "object" && typeof Reflect.get(shadowOffset, "width") === "number" ? Reflect.get(shadowOffset, "width") : 0;
|
|
61
|
+
const shadowOffsetY = shadowOffset && typeof shadowOffset === "object" && typeof Reflect.get(shadowOffset, "height") === "number" ? Reflect.get(shadowOffset, "height") : 0;
|
|
62
|
+
const left = Math.max(
|
|
63
|
+
0,
|
|
64
|
+
frame.x - Math.max(capturePadding, shadowRadius - shadowOffsetX)
|
|
65
|
+
);
|
|
66
|
+
const top = Math.max(
|
|
67
|
+
0,
|
|
68
|
+
frame.y - Math.max(capturePadding, shadowRadius - shadowOffsetY)
|
|
69
|
+
);
|
|
70
|
+
const right = Math.min(
|
|
71
|
+
tree.width,
|
|
72
|
+
frame.x + frame.width + Math.max(capturePadding, shadowRadius + shadowOffsetX)
|
|
73
|
+
);
|
|
74
|
+
const bottom = Math.min(
|
|
75
|
+
tree.height,
|
|
76
|
+
frame.y + frame.height + Math.max(capturePadding, shadowRadius + shadowOffsetY)
|
|
77
|
+
);
|
|
78
|
+
if (right > left && bottom > top) {
|
|
79
|
+
frames.set(node.nodeId, {
|
|
80
|
+
x: left,
|
|
81
|
+
y: top,
|
|
82
|
+
width: right - left,
|
|
83
|
+
height: bottom - top
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return frames;
|
|
88
|
+
}
|
|
89
|
+
function rnxCaptureRasterRegions(capture) {
|
|
90
|
+
const tree = {
|
|
91
|
+
width: capture.tree.viewport.width,
|
|
92
|
+
height: capture.tree.viewport.height,
|
|
93
|
+
nodes: capture.tree.nodes.map((node) => ({
|
|
94
|
+
nodeId: node.nodeId,
|
|
95
|
+
parentNodeId: node.parentNodeId,
|
|
96
|
+
type: node.type,
|
|
97
|
+
text: node.text,
|
|
98
|
+
style: node.style.resolved,
|
|
99
|
+
layout: node.layout.local,
|
|
100
|
+
frame: node.layout.frame,
|
|
101
|
+
absolutePosition: node.layout.absolutePosition,
|
|
102
|
+
visibleFrame: node.layout.visibleFrame
|
|
103
|
+
}))
|
|
104
|
+
};
|
|
105
|
+
const nodeIds = selectRnxRasterNodeIds(tree);
|
|
106
|
+
const frames = rnxRasterFrames(tree, nodeIds);
|
|
107
|
+
return [...nodeIds].flatMap((nodeId) => {
|
|
108
|
+
const frame = frames.get(nodeId);
|
|
109
|
+
return frame ? [{ key: String(nodeId), nodeId, frame }] : [];
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function captureRecord(value) {
|
|
113
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
114
|
+
}
|
|
115
|
+
function captureInteger(value) {
|
|
116
|
+
return typeof value === "number" && Number.isSafeInteger(value);
|
|
117
|
+
}
|
|
118
|
+
function captureNumber(value) {
|
|
119
|
+
return typeof value === "number" && Number.isFinite(value);
|
|
120
|
+
}
|
|
121
|
+
function captureNullableString(value) {
|
|
122
|
+
return value === null || typeof value === "string";
|
|
123
|
+
}
|
|
124
|
+
function captureRect(value) {
|
|
125
|
+
return captureRecord(value) && captureNumber(value.x) && captureNumber(value.y) && captureNumber(value.width) && captureNumber(value.height);
|
|
126
|
+
}
|
|
127
|
+
function captureOptionalString(value) {
|
|
128
|
+
return value === void 0 || typeof value === "string";
|
|
129
|
+
}
|
|
130
|
+
function captureOptionalNullableString(value) {
|
|
131
|
+
return value === void 0 || captureNullableString(value);
|
|
132
|
+
}
|
|
133
|
+
function captureFontRegistration(value) {
|
|
134
|
+
return captureRecord(value) && typeof value.family === "string" && value.family.length > 0 && captureOptionalString(value.url) && captureOptionalString(value.sourceLabel) && captureOptionalNullableString(value.parsedFamily) && captureOptionalNullableString(value.parsedPostScript) && captureOptionalNullableString(value.fullName);
|
|
135
|
+
}
|
|
136
|
+
function capturePoint(value) {
|
|
137
|
+
return captureRecord(value) && captureNumber(value.x) && captureNumber(value.y);
|
|
138
|
+
}
|
|
139
|
+
function captureNode(value) {
|
|
140
|
+
if (!captureRecord(value) || !captureInteger(value.nodeId) || !(value.parentNodeId === null || captureInteger(value.parentNodeId)) || !Array.isArray(value.childNodeIds) || !value.childNodeIds.every(captureInteger) || !captureInteger(value.paintIndex) || typeof value.type !== "string" || !captureNullableString(value.id) || !captureNullableString(value.testID) || !captureNullableString(value.text) || !captureInteger(value.childCount) || !captureRecord(value.accessibility) || !captureRecord(value.interaction) || !captureRecord(value.layout) || !captureRecord(value.style) || !captureRecord(value.source) || !captureRecord(value.props) || !captureRecord(value.inspection)) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
const accessibility = value.accessibility;
|
|
144
|
+
if (typeof accessibility.accessible !== "boolean" || !captureNullableString(accessibility.label) || !captureNullableString(accessibility.role) || !captureNullableString(accessibility.hint) || !(accessibility.liveRegion === null || accessibility.liveRegion === "none" || accessibility.liveRegion === "polite" || accessibility.liveRegion === "assertive") || !(accessibility.state === null || captureRecord(accessibility.state)) || !(accessibility.value === null || captureRecord(accessibility.value))) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
const interaction = value.interaction;
|
|
148
|
+
if (typeof interaction.pressed !== "boolean" || typeof interaction.pressable !== "boolean" || typeof interaction.textInput !== "boolean" || !(interaction.textSelection === null || captureRecord(interaction.textSelection)) || typeof interaction.secureTextEntry !== "boolean" || !captureNullableString(interaction.placeholder) || !capturePoint(interaction.scrollOffset) || !(interaction.zoomScale === null || captureNumber(interaction.zoomScale)) || typeof interaction.nativePinchEnabled !== "boolean" || !(interaction.contentOffsetProp === null || captureRecord(interaction.contentOffsetProp)) || !(interaction.strokeDashoffsetProp === null || captureNumber(interaction.strokeDashoffsetProp))) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
const layout = value.layout;
|
|
152
|
+
if (!captureRect(layout.local) || !(layout.frame === null || captureRect(layout.frame)) || !capturePoint(layout.absolutePosition) || !(layout.visibleFrame === null || captureRect(layout.visibleFrame))) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
const style = value.style;
|
|
156
|
+
return captureRecord(style.resolved) && captureRecord(style.authored) && captureRecord(style.computed) && captureRecord(style.tokenBindings) && (value.textLines === void 0 || Array.isArray(value.textLines));
|
|
157
|
+
}
|
|
158
|
+
function isRnxScreenCapture(value) {
|
|
159
|
+
if (!captureRecord(value) || value.contractVersion !== RNX_SCREEN_CAPTURE_VERSION || !captureInteger(value.capturedAt) || !captureRecord(value.tree) || !(value.fonts === void 0 || Array.isArray(value.fonts) && value.fonts.length <= 200 && value.fonts.every(captureFontRegistration)) || !(value.visual === void 0 || captureRecord(value.visual))) {
|
|
160
|
+
return false;
|
|
161
|
+
}
|
|
162
|
+
const tree = value.tree;
|
|
163
|
+
const visual = value.visual;
|
|
164
|
+
return captureRecord(tree.viewport) && captureInteger(tree.viewport.width) && tree.viewport.width > 0 && captureInteger(tree.viewport.height) && tree.viewport.height > 0 && captureInteger(tree.rootNodeId) && (tree.commitRevision === void 0 || captureInteger(tree.commitRevision)) && Array.isArray(tree.nodes) && tree.nodes.every(captureNode) && (visual === void 0 || visual.kind === "png" && (visual.producer === "headless-cpu-app-surface" || visual.producer === "browser-compositor-app-surface") && typeof visual.dataUri === "string" && visual.dataUri.startsWith("data:image/png;base64,") && captureInteger(visual.pixelWidth) && visual.pixelWidth > 0 && captureInteger(visual.pixelHeight) && visual.pixelHeight > 0);
|
|
165
|
+
}
|
|
166
|
+
function isRnxCaptureRegionAtlas(value) {
|
|
167
|
+
if (!captureRecord(value) || value.kind !== "png-atlas" || value.producer !== "headless-cpu-app-surface" || typeof value.dataUri !== "string" || !value.dataUri.startsWith("data:image/png;base64,") || !captureNumber(value.width) || value.width <= 0 || !captureNumber(value.height) || value.height <= 0 || !captureInteger(value.pixelWidth) || value.pixelWidth <= 0 || !captureInteger(value.pixelHeight) || value.pixelHeight <= 0 || !Array.isArray(value.regions) || value.regions.length === 0 || value.regions.length > 256) {
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
const scale = value.pixelWidth / value.width;
|
|
171
|
+
if (!Number.isInteger(scale) || scale < 1 || scale > 4 || Math.abs(value.height * scale - value.pixelHeight) > 1e-6) {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
const keys = /* @__PURE__ */ new Set();
|
|
175
|
+
for (const region of value.regions) {
|
|
176
|
+
if (!captureRecord(region) || typeof region.key !== "string" || region.key.length === 0 || keys.has(region.key) || !captureInteger(region.nodeId) || region.nodeId <= 0 || !captureRect(region.frame) || region.frame.width <= 0 || region.frame.height <= 0 || !captureRect(region.source) || region.source.x < 0 || region.source.y < 0 || region.source.width !== region.frame.width || region.source.height !== region.frame.height || region.source.x + region.source.width > value.width || region.source.y + region.source.height > value.height) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
keys.add(region.key);
|
|
180
|
+
}
|
|
181
|
+
return true;
|
|
182
|
+
}
|
|
183
|
+
export {
|
|
184
|
+
RNX_SCREEN_CAPTURE_VERSION,
|
|
185
|
+
isRnxCaptureRegionAtlas,
|
|
186
|
+
isRnxScreenCapture,
|
|
187
|
+
rnxCaptureRasterRegions,
|
|
188
|
+
rnxRasterFrames,
|
|
189
|
+
selectRnxRasterNodeIds
|
|
190
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*! rnx v0.1.527 | (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
|
+
// src/cli-constants.ts
|
|
23
|
+
var cli_constants_exports = {};
|
|
24
|
+
__export(cli_constants_exports, {
|
|
25
|
+
DEFAULT_SOOTSIM_SHELL_URL: () => DEFAULT_SOOTSIM_SHELL_URL
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(cli_constants_exports);
|
|
28
|
+
var DEFAULT_SOOTSIM_SHELL_URL = "http://localhost:5173/";
|
|
29
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
30
|
+
0 && (module.exports = {
|
|
31
|
+
DEFAULT_SOOTSIM_SHELL_URL
|
|
32
|
+
});
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/*! rnx v0.1.527 | (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
|
+
// src/cloud-contract.ts
|
|
23
|
+
var cloud_contract_exports = {};
|
|
24
|
+
__export(cloud_contract_exports, {
|
|
25
|
+
RNX_CLOUD_ALL_COMMAND_SCOPES: () => RNX_CLOUD_ALL_COMMAND_SCOPES,
|
|
26
|
+
RNX_CLOUD_COMMAND_SCOPES: () => RNX_CLOUD_COMMAND_SCOPES,
|
|
27
|
+
RNX_CLOUD_COMMAND_TYPES: () => RNX_CLOUD_COMMAND_TYPES,
|
|
28
|
+
RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES: () => RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
|
|
29
|
+
RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES: () => RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
|
|
30
|
+
RNX_CLOUD_LABELS_MAX_COUNT: () => RNX_CLOUD_LABELS_MAX_COUNT,
|
|
31
|
+
RNX_CLOUD_LABEL_MAX_LENGTH: () => RNX_CLOUD_LABEL_MAX_LENGTH,
|
|
32
|
+
RNX_CLOUD_MAX_ARTIFACT_BYTES: () => RNX_CLOUD_MAX_ARTIFACT_BYTES,
|
|
33
|
+
RNX_CLOUD_SCOPED_TOKEN_DEFAULT_TTL_SECONDS: () => RNX_CLOUD_SCOPED_TOKEN_DEFAULT_TTL_SECONDS,
|
|
34
|
+
RNX_CLOUD_SCOPED_TOKEN_MAX_ORIGINS: () => RNX_CLOUD_SCOPED_TOKEN_MAX_ORIGINS,
|
|
35
|
+
RNX_CLOUD_SCOPED_TOKEN_MAX_TTL_SECONDS: () => RNX_CLOUD_SCOPED_TOKEN_MAX_TTL_SECONDS,
|
|
36
|
+
RNX_CLOUD_SCOPED_TOKEN_MIN_TTL_SECONDS: () => RNX_CLOUD_SCOPED_TOKEN_MIN_TTL_SECONDS,
|
|
37
|
+
RNX_CLOUD_SCOPED_TOKEN_PREFIX: () => RNX_CLOUD_SCOPED_TOKEN_PREFIX,
|
|
38
|
+
RNX_CLOUD_TEST_FILES_MAX_BYTES: () => RNX_CLOUD_TEST_FILES_MAX_BYTES,
|
|
39
|
+
RNX_CLOUD_TEST_FILES_MAX_COUNT: () => RNX_CLOUD_TEST_FILES_MAX_COUNT,
|
|
40
|
+
RNX_CLOUD_TOKEN_SCOPES: () => RNX_CLOUD_TOKEN_SCOPES,
|
|
41
|
+
isRnxCloudCommandScope: () => isRnxCloudCommandScope,
|
|
42
|
+
isRnxCloudCommandType: () => isRnxCloudCommandType,
|
|
43
|
+
isRnxCloudSimStatus: () => isRnxCloudSimStatus,
|
|
44
|
+
isValidRnxCloudLabel: () => isValidRnxCloudLabel,
|
|
45
|
+
matchesRnxCloudLabels: () => matchesRnxCloudLabels,
|
|
46
|
+
parseRnxCloudLabels: () => parseRnxCloudLabels,
|
|
47
|
+
readRnxCloudLabels: () => readRnxCloudLabels,
|
|
48
|
+
rnxCloudCommandScope: () => rnxCloudCommandScope,
|
|
49
|
+
rnxCloudScopesAllowCommand: () => rnxCloudScopesAllowCommand
|
|
50
|
+
});
|
|
51
|
+
module.exports = __toCommonJS(cloud_contract_exports);
|
|
52
|
+
var RNX_CLOUD_MAX_ARTIFACT_BYTES = 20 * 1024 * 1024;
|
|
53
|
+
var RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES = 256;
|
|
54
|
+
var RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES = 1024 * 1024;
|
|
55
|
+
var RNX_CLOUD_TEST_FILES_MAX_COUNT = 256;
|
|
56
|
+
var RNX_CLOUD_TEST_FILES_MAX_BYTES = 5e5;
|
|
57
|
+
var RNX_CLOUD_COMMAND_SCOPE_SET = /* @__PURE__ */ new Set([
|
|
58
|
+
"read",
|
|
59
|
+
"drive",
|
|
60
|
+
"reset",
|
|
61
|
+
"media",
|
|
62
|
+
"debug",
|
|
63
|
+
"watch"
|
|
64
|
+
]);
|
|
65
|
+
function isRnxCloudCommandScope(value) {
|
|
66
|
+
return RNX_CLOUD_COMMAND_SCOPE_SET.has(value);
|
|
67
|
+
}
|
|
68
|
+
var RNX_CLOUD_SCOPED_TOKEN_PREFIX = "sk_rnx_sim_";
|
|
69
|
+
var RNX_CLOUD_SCOPED_TOKEN_DEFAULT_TTL_SECONDS = 3600;
|
|
70
|
+
var RNX_CLOUD_SCOPED_TOKEN_MIN_TTL_SECONDS = 1;
|
|
71
|
+
var RNX_CLOUD_SCOPED_TOKEN_MAX_TTL_SECONDS = 14400;
|
|
72
|
+
var RNX_CLOUD_SCOPED_TOKEN_MAX_ORIGINS = 16;
|
|
73
|
+
var RNX_CLOUD_COMMAND_SCOPES = {
|
|
74
|
+
state: "read",
|
|
75
|
+
tree: "read",
|
|
76
|
+
query: "read",
|
|
77
|
+
resolve: "read",
|
|
78
|
+
screenshot: "read",
|
|
79
|
+
capture: "read",
|
|
80
|
+
captureRegions: "read",
|
|
81
|
+
memory: "read",
|
|
82
|
+
diagnostics: "read",
|
|
83
|
+
storageSnapshot: "read",
|
|
84
|
+
perform: "drive",
|
|
85
|
+
waitFor: "drive",
|
|
86
|
+
tap: "drive",
|
|
87
|
+
longPress: "drive",
|
|
88
|
+
settle: "drive",
|
|
89
|
+
openUrl: "drive",
|
|
90
|
+
setAppearance: "drive",
|
|
91
|
+
keyboard: "drive",
|
|
92
|
+
focus: "drive",
|
|
93
|
+
flowStatus: "drive",
|
|
94
|
+
reset: "reset",
|
|
95
|
+
camera: "media",
|
|
96
|
+
// string evaluation and arbitrary bridge calls are maestro's boundary: the
|
|
97
|
+
// customer sdk never carries this scope, and the service grants it only to
|
|
98
|
+
// the account api key caller. close rides along, since ending the page ends
|
|
99
|
+
// the sim and belongs to the sim's owner rather than any driver.
|
|
100
|
+
evaluate: "debug",
|
|
101
|
+
call: "debug",
|
|
102
|
+
close: "debug"
|
|
103
|
+
};
|
|
104
|
+
function scopeTableKeys() {
|
|
105
|
+
return Object.keys(RNX_CLOUD_COMMAND_SCOPES).filter(
|
|
106
|
+
(key) => Object.prototype.hasOwnProperty.call(RNX_CLOUD_COMMAND_SCOPES, key)
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
var RNX_CLOUD_COMMAND_TYPES = Object.freeze(scopeTableKeys());
|
|
110
|
+
var RNX_CLOUD_COMMAND_TYPE_SET = new Set(RNX_CLOUD_COMMAND_TYPES);
|
|
111
|
+
function isRnxCloudCommandType(value) {
|
|
112
|
+
return RNX_CLOUD_COMMAND_TYPE_SET.has(value);
|
|
113
|
+
}
|
|
114
|
+
function rnxCloudCommandScope(type) {
|
|
115
|
+
return RNX_CLOUD_COMMAND_SCOPES[type];
|
|
116
|
+
}
|
|
117
|
+
var RNX_CLOUD_TOKEN_SCOPES = Object.freeze([
|
|
118
|
+
"read",
|
|
119
|
+
"drive",
|
|
120
|
+
"reset",
|
|
121
|
+
"media"
|
|
122
|
+
]);
|
|
123
|
+
var RNX_CLOUD_ALL_COMMAND_SCOPES = Object.freeze(["read", "drive", "reset", "media", "debug"]);
|
|
124
|
+
function rnxCloudScopesAllowCommand(scopes, type) {
|
|
125
|
+
return scopes.includes(RNX_CLOUD_COMMAND_SCOPES[type]);
|
|
126
|
+
}
|
|
127
|
+
var RNX_CLOUD_LABELS_MAX_COUNT = 16;
|
|
128
|
+
var RNX_CLOUD_LABEL_MAX_LENGTH = 63;
|
|
129
|
+
var RNX_CLOUD_LABEL_CONTROL = /[\u0000-\u001f\u007f]/;
|
|
130
|
+
function isValidRnxCloudLabel(key, value) {
|
|
131
|
+
return key.length > 0 && key.length <= RNX_CLOUD_LABEL_MAX_LENGTH && value.length <= RNX_CLOUD_LABEL_MAX_LENGTH && !key.includes(",") && !key.includes("=") && !value.includes(",") && !RNX_CLOUD_LABEL_CONTROL.test(key) && !RNX_CLOUD_LABEL_CONTROL.test(value);
|
|
132
|
+
}
|
|
133
|
+
function parseRnxCloudLabels(value) {
|
|
134
|
+
if (value === "") return {};
|
|
135
|
+
const entries = value.split(",");
|
|
136
|
+
if (entries.length > RNX_CLOUD_LABELS_MAX_COUNT) return null;
|
|
137
|
+
const labels = {};
|
|
138
|
+
for (const entry of entries) {
|
|
139
|
+
const separator = entry.indexOf("=");
|
|
140
|
+
if (separator < 1) return null;
|
|
141
|
+
const key = entry.slice(0, separator).trim();
|
|
142
|
+
const label = entry.slice(separator + 1).trim();
|
|
143
|
+
if (!isValidRnxCloudLabel(key, label)) return null;
|
|
144
|
+
if (Object.hasOwn(labels, key)) return null;
|
|
145
|
+
labels[key] = label;
|
|
146
|
+
}
|
|
147
|
+
return labels;
|
|
148
|
+
}
|
|
149
|
+
function readRnxCloudLabels(value) {
|
|
150
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return null;
|
|
151
|
+
const entries = Object.entries(value);
|
|
152
|
+
if (entries.length > RNX_CLOUD_LABELS_MAX_COUNT) return null;
|
|
153
|
+
const labels = {};
|
|
154
|
+
for (const [key, label] of entries) {
|
|
155
|
+
if (typeof label !== "string") return null;
|
|
156
|
+
if (!isValidRnxCloudLabel(key, label)) return null;
|
|
157
|
+
labels[key] = label;
|
|
158
|
+
}
|
|
159
|
+
return labels;
|
|
160
|
+
}
|
|
161
|
+
function matchesRnxCloudLabels(labels, selector) {
|
|
162
|
+
return Object.entries(selector).every(([key, value]) => labels[key] === value);
|
|
163
|
+
}
|
|
164
|
+
function isRnxCloudSimStatus(value) {
|
|
165
|
+
return value === "creating" || value === "open" || value === "hibernated" || value === "deleting" || value === "deleted";
|
|
166
|
+
}
|
|
167
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
168
|
+
0 && (module.exports = {
|
|
169
|
+
RNX_CLOUD_ALL_COMMAND_SCOPES,
|
|
170
|
+
RNX_CLOUD_COMMAND_SCOPES,
|
|
171
|
+
RNX_CLOUD_COMMAND_TYPES,
|
|
172
|
+
RNX_CLOUD_DESIGN_MAX_STORAGE_BYTES,
|
|
173
|
+
RNX_CLOUD_DESIGN_MAX_STORAGE_ENTRIES,
|
|
174
|
+
RNX_CLOUD_LABELS_MAX_COUNT,
|
|
175
|
+
RNX_CLOUD_LABEL_MAX_LENGTH,
|
|
176
|
+
RNX_CLOUD_MAX_ARTIFACT_BYTES,
|
|
177
|
+
RNX_CLOUD_SCOPED_TOKEN_DEFAULT_TTL_SECONDS,
|
|
178
|
+
RNX_CLOUD_SCOPED_TOKEN_MAX_ORIGINS,
|
|
179
|
+
RNX_CLOUD_SCOPED_TOKEN_MAX_TTL_SECONDS,
|
|
180
|
+
RNX_CLOUD_SCOPED_TOKEN_MIN_TTL_SECONDS,
|
|
181
|
+
RNX_CLOUD_SCOPED_TOKEN_PREFIX,
|
|
182
|
+
RNX_CLOUD_TEST_FILES_MAX_BYTES,
|
|
183
|
+
RNX_CLOUD_TEST_FILES_MAX_COUNT,
|
|
184
|
+
RNX_CLOUD_TOKEN_SCOPES,
|
|
185
|
+
isRnxCloudCommandScope,
|
|
186
|
+
isRnxCloudCommandType,
|
|
187
|
+
isRnxCloudSimStatus,
|
|
188
|
+
isValidRnxCloudLabel,
|
|
189
|
+
matchesRnxCloudLabels,
|
|
190
|
+
parseRnxCloudLabels,
|
|
191
|
+
readRnxCloudLabels,
|
|
192
|
+
rnxCloudCommandScope,
|
|
193
|
+
rnxCloudScopesAllowCommand
|
|
194
|
+
});
|